ip: Reference count the enabling the punt feature
[vpp.git] / src / svm / svm.c
index c087655..b844e20 100644 (file)
@@ -60,10 +60,6 @@ svm_get_root_rp (void)
 u64
 svm_get_global_region_base_va ()
 {
-#ifdef CLIB_SANITIZE_ADDR
-  return 0x200000000000;
-#endif
-
 #if __aarch64__
   /* On AArch64 VA space can have different size, from 36 to 48 bits.
      Here we are trying to detect VA bits by parsing /proc/self/maps
@@ -94,6 +90,9 @@ svm_get_global_region_base_va ()
     clib_unix_error ("unexpected va bits '%u'", bits);
 #endif
 
+#ifdef CLIB_SANITIZE_ADDR
+  return 0x200000000000;
+#endif
   /* default value */
   return 0x130000000ULL;
 }
@@ -716,12 +715,17 @@ svm_map_region (svm_map_region_args_t * a)
       pid_holding_region_lock = rp->mutex_owner_pid;
       if (pid_holding_region_lock && kill (pid_holding_region_lock, 0) < 0)
        {
+         pthread_mutexattr_t attr;
          clib_warning
            ("region %s mutex held by dead pid %d, tag %d, force unlock",
             rp->region_name, pid_holding_region_lock, rp->mutex_owner_tag);
          /* owner pid is nonexistent */
-         rp->mutex.__data.__owner = 0;
-         rp->mutex.__data.__lock = 0;
+         if (pthread_mutexattr_init (&attr))
+           clib_unix_warning ("mutexattr_init");
+         if (pthread_mutexattr_setpshared (&attr, PTHREAD_PROCESS_SHARED))
+           clib_unix_warning ("mutexattr_setpshared");
+         if (pthread_mutex_init (&rp->mutex, &attr))
+           clib_unix_warning ("mutex_init");
          dead_region_recovery = 1;
        }
 
@@ -1288,10 +1292,10 @@ svm_client_scan (const char *root_path)
    * find_or_create.
    */
   /* *INDENT-OFF* */
-  pool_foreach (subp, mp->subregions, ({
+  pool_foreach (subp, mp->subregions)  {
         name = vec_dup (subp->subregion_name);
         vec_add1(svm_names, name);
-      }));
+      }
   /* *INDENT-ON* */
 
   pthread_mutex_unlock (&root_rp->mutex);