summaryrefslogtreecommitdiffstats
path: root/src/vnet/devices/devices.c
diff options
context:
space:
mode:
authorDamjan Marion <damarion@cisco.com>2017-04-05 19:18:20 +0200
committerDave Barach <openvpp@barachs.net>2017-04-06 11:31:39 +0000
commit586afd762bfa149f5ca167bd5fd5a0cd59ce94fe (patch)
tree808b57c61e0fe1a181871bb1ad94398c5ba42671 /src/vnet/devices/devices.c
parentbc799c92d761a2d45105aa6a1685b3663687d2a4 (diff)
Use thread local storage for thread index
This patch deprecates stack-based thread identification, Also removes requirement that thread stacks are adjacent. Finally, possibly annoying for some folks, it renames all occurences of cpu_index and cpu_number with thread index. Using word "cpu" is misleading here as thread can be migrated ti different CPU, and also it is not related to linux cpu index. Change-Id: I68cdaf661e701d2336fc953dcb9978d10a70f7c1 Signed-off-by: Damjan Marion <damarion@cisco.com>
Diffstat (limited to 'src/vnet/devices/devices.c')
-rw-r--r--src/vnet/devices/devices.c61
1 files changed, 31 insertions, 30 deletions
diff --git a/src/vnet/devices/devices.c b/src/vnet/devices/devices.c
index 4164522099e..5e5e812c48b 100644
--- a/src/vnet/devices/devices.c
+++ b/src/vnet/devices/devices.c
@@ -104,7 +104,7 @@ vnet_device_queue_sort (void *a1, void *a2)
void
vnet_device_input_assign_thread (u32 hw_if_index,
- u16 queue_id, uword cpu_index)
+ u16 queue_id, uword thread_index)
{
vnet_main_t *vnm = vnet_get_main ();
vnet_device_main_t *vdm = &vnet_device_main;
@@ -115,19 +115,19 @@ vnet_device_input_assign_thread (u32 hw_if_index,
ASSERT (hw->input_node_index > 0);
- if (vdm->first_worker_cpu_index == 0)
- cpu_index = 0;
+ if (vdm->first_worker_thread_index == 0)
+ thread_index = 0;
- if (cpu_index != 0 &&
- (cpu_index < vdm->first_worker_cpu_index ||
- cpu_index > vdm->last_worker_cpu_index))
+ if (thread_index != 0 &&
+ (thread_index < vdm->first_worker_thread_index ||
+ thread_index > vdm->last_worker_thread_index))
{
- cpu_index = vdm->next_worker_cpu_index++;
- if (vdm->next_worker_cpu_index > vdm->last_worker_cpu_index)
- vdm->next_worker_cpu_index = vdm->first_worker_cpu_index;
+ thread_index = vdm->next_worker_thread_index++;
+ if (vdm->next_worker_thread_index > vdm->last_worker_thread_index)
+ vdm->next_worker_thread_index = vdm->first_worker_thread_index;
}
- vm = vlib_mains[cpu_index];
+ vm = vlib_mains[thread_index];
rt = vlib_node_get_runtime_data (vm, hw->input_node_index);
vec_add2 (rt->devices_and_queues, dq, 1);
@@ -136,33 +136,33 @@ vnet_device_input_assign_thread (u32 hw_if_index,
dq->queue_id = queue_id;
vec_sort_with_function (rt->devices_and_queues, vnet_device_queue_sort);
- vec_validate (hw->input_node_cpu_index_by_queue, queue_id);
- hw->input_node_cpu_index_by_queue[queue_id] = cpu_index;
+ vec_validate (hw->input_node_thread_index_by_queue, queue_id);
+ hw->input_node_thread_index_by_queue[queue_id] = thread_index;
}
static int
vnet_device_input_unassign_thread (u32 hw_if_index, u16 queue_id,
- uword cpu_index)
+ uword thread_index)
{
vnet_main_t *vnm = vnet_get_main ();
vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, hw_if_index);
vnet_device_input_runtime_t *rt;
vnet_device_and_queue_t *dq;
- uword old_cpu_index;
+ uword old_thread_index;
- if (hw->input_node_cpu_index_by_queue == 0)
+ if (hw->input_node_thread_index_by_queue == 0)
return VNET_API_ERROR_INVALID_INTERFACE;
- if (vec_len (hw->input_node_cpu_index_by_queue) < queue_id + 1)
+ if (vec_len (hw->input_node_thread_index_by_queue) < queue_id + 1)
return VNET_API_ERROR_INVALID_INTERFACE;
- old_cpu_index = hw->input_node_cpu_index_by_queue[queue_id];
+ old_thread_index = hw->input_node_thread_index_by_queue[queue_id];
- if (old_cpu_index == cpu_index)
+ if (old_thread_index == thread_index)
return 0;
rt =
- vlib_node_get_runtime_data (vlib_mains[old_cpu_index],
+ vlib_node_get_runtime_data (vlib_mains[old_thread_index],
hw->input_node_index);
vec_foreach (dq, rt->devices_and_queues)
@@ -240,7 +240,7 @@ set_device_placement (vlib_main_t * vm, unformat_input_t * input,
vnet_device_main_t *vdm = &vnet_device_main;
u32 hw_if_index = (u32) ~ 0;
u32 queue_id = (u32) 0;
- u32 cpu_index = (u32) ~ 0;
+ u32 thread_index = (u32) ~ 0;
int rv;
if (!unformat_user (input, unformat_line_input, line_input))
@@ -253,10 +253,10 @@ set_device_placement (vlib_main_t * vm, unformat_input_t * input,
;
else if (unformat (line_input, "queue %d", &queue_id))
;
- else if (unformat (line_input, "main", &cpu_index))
- cpu_index = 0;
- else if (unformat (line_input, "worker %d", &cpu_index))
- cpu_index += vdm->first_worker_cpu_index;
+ else if (unformat (line_input, "main", &thread_index))
+ thread_index = 0;
+ else if (unformat (line_input, "worker %d", &thread_index))
+ thread_index += vdm->first_worker_thread_index;
else
{
error = clib_error_return (0, "parse error: '%U'",
@@ -271,16 +271,17 @@ set_device_placement (vlib_main_t * vm, unformat_input_t * input,
if (hw_if_index == (u32) ~ 0)
return clib_error_return (0, "please specify valid interface name");
- if (cpu_index > vdm->last_worker_cpu_index)
+ if (thread_index > vdm->last_worker_thread_index)
return clib_error_return (0,
"please specify valid worker thread or main");
- rv = vnet_device_input_unassign_thread (hw_if_index, queue_id, cpu_index);
+ rv =
+ vnet_device_input_unassign_thread (hw_if_index, queue_id, thread_index);
if (rv)
return clib_error_return (0, "not found");
- vnet_device_input_assign_thread (hw_if_index, queue_id, cpu_index);
+ vnet_device_input_assign_thread (hw_if_index, queue_id, thread_index);
return 0;
}
@@ -326,9 +327,9 @@ vnet_device_init (vlib_main_t * vm)
tr = p ? (vlib_thread_registration_t *) p[0] : 0;
if (tr && tr->count > 0)
{
- vdm->first_worker_cpu_index = tr->first_index;
- vdm->next_worker_cpu_index = tr->first_index;
- vdm->last_worker_cpu_index = tr->first_index + tr->count - 1;
+ vdm->first_worker_thread_index = tr->first_index;
+ vdm->next_worker_thread_index = tr->first_index;
+ vdm->last_worker_thread_index = tr->first_index + tr->count - 1;
}
return 0;
}