X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvlib%2Fthreads.c;h=1ce4dc15613bf1f1be05d58012a549203a3aee35;hb=2c8e0023f91882e53f06eb99c901b97fe013f981;hp=8a06887561785a755e2c28de7ae6808472830718;hpb=f617b145ebc2f6ea2ad9bc3b6fa26968a0493821;p=vpp.git diff --git a/src/vlib/threads.c b/src/vlib/threads.c index 8a068875617..1ce4dc15613 100644 --- a/src/vlib/threads.c +++ b/src/vlib/threads.c @@ -255,6 +255,21 @@ vlib_thread_init (vlib_main_t * vm) } avail_cpu = clib_bitmap_set (avail_cpu, tm->main_lcore, 0); + /* + * Determine if the number of workers is greater than 0. + * If so, mark CPU 0 unavailable so workers will be numbered after main. + */ + u32 n_workers = 0; + uword *p = hash_get_mem (tm->thread_registrations_by_name, "workers"); + if (p != 0) + { + vlib_thread_registration_t *tr = (vlib_thread_registration_t *) p[0]; + int worker_thread_count = tr->count; + n_workers = worker_thread_count; + } + if (tm->skip_cores == 0 && n_workers) + avail_cpu = clib_bitmap_set (avail_cpu, 0, 0); + /* assume that there is socket 0 only if there is no data from sysfs */ if (!tm->cpu_socket_bitmap) tm->cpu_socket_bitmap = clib_bitmap_set (0, 0, 1); @@ -589,9 +604,8 @@ vlib_get_thread_core_numa (vlib_worker_thread_t * w, unsigned cpu_id) p = format (p, "%s%u/topology/core_id%c", sys_cpu_path, cpu_id, 0); clib_sysfs_read ((char *) p, "%d", &core_id); vec_reset_length (p); - p = - format (p, "%s%u/topology/physical_package_id%c", sys_cpu_path, cpu_id, - 0); + p = format (p, "%s%u/topology/physical_package_id%c", sys_cpu_path, + cpu_id, 0); clib_sysfs_read ((char *) p, "%d", &numa_id); vec_free (p); @@ -608,7 +622,6 @@ vlib_launch_thread_int (void *fp, vlib_worker_thread_t * w, unsigned cpu_id) w->cpu_id = cpu_id; vlib_get_thread_core_numa (w, cpu_id); - os_set_numa_index (w->numa_id); /* Set up NUMA-bound heap if indicated */ if (clib_per_numa_mheaps[w->numa_id] == 0) @@ -617,7 +630,7 @@ vlib_launch_thread_int (void *fp, vlib_worker_thread_t * w, unsigned cpu_id) if (tm->numa_heap_size) { numa_heap = clib_mem_init_thread_safe_numa - (0 /* DIY */ , tm->numa_heap_size); + (0 /* DIY */ , tm->numa_heap_size, w->numa_id); clib_per_numa_mheaps[w->numa_id] = numa_heap; } else @@ -729,15 +742,8 @@ start_workers (vlib_main_t * vm) vec_add2 (vlib_worker_threads, w, 1); /* Currently unused, may not really work */ if (tr->mheap_size) - { -#if USE_DLMALLOC == 0 - w->thread_mheap = - mheap_alloc (0 /* use VM */ , tr->mheap_size); -#else - w->thread_mheap = create_mspace (tr->mheap_size, - 0 /* unlocked */ ); -#endif - } + w->thread_mheap = create_mspace (tr->mheap_size, + 0 /* unlocked */ ); else w->thread_mheap = main_heap; @@ -901,13 +907,8 @@ start_workers (vlib_main_t * vm) vec_add2 (vlib_worker_threads, w, 1); if (tr->mheap_size) { -#if USE_DLMALLOC == 0 - w->thread_mheap = - mheap_alloc (0 /* use VM */ , tr->mheap_size); -#else w->thread_mheap = create_mspace (tr->mheap_size, 0 /* locked */ ); -#endif } else w->thread_mheap = main_heap;