policer: add thread index to policer 85/30885/2
authorBrian Russell <brian@graphiant.com>
Tue, 19 Jan 2021 16:46:08 +0000 (16:46 +0000)
committerNeale Ranns <neale@graphiant.com>
Thu, 28 Jan 2021 10:25:41 +0000 (10:25 +0000)
Add a thread index field to the policer structure. The policer is not
thread safe. The thread index will be used to tie it to one worker
thread and other workers can use thread handoff.

Type: improvement
Signed-off-by: Brian Russell <brian@graphiant.com>
Change-Id: I650e983a9ed800bf660d6f06368717484c4a83bf

src/vnet/policer/police.h
src/vnet/policer/policer.c

index 7065adb..1005a62 100644 (file)
@@ -50,9 +50,12 @@ typedef enum
 // computes the shift amount be the largest possible that still supports the
 // burst size. This makes the rate accuracy as high as possible.
 //
-// The 64-bit last_update_time supports a 4Ghz CPU without rollover for 100 years
+// The 64-bit last_update_time supports a 4Ghz CPU without rollover for 100
+// years
 //
-// The lock field should be used for a spin-lock on the struct.
+// The lock field should be used for a spin-lock on the struct. Alternatively,
+// a thread index field is provided so that policed packets may be handed
+// off to a single worker thread.
 
 #define POLICER_TICKS_PER_PERIOD_SHIFT 17
 #define POLICER_TICKS_PER_PERIOD       (1 << POLICER_TICKS_PER_PERIOD_SHIFT)
@@ -82,7 +85,8 @@ typedef struct
   u32 extended_bucket;         // MOD
 
   u64 last_update_time;                // MOD
-  u64 pad64;
+  u32 thread_index;            // Tie policer to a thread, rather than lock
+  u32 pad32;
 
 } policer_read_response_type_st;
 
index 9611fe0..7ad87a6 100644 (file)
@@ -87,6 +87,7 @@ policer_add_del (vlib_main_t * vm,
       pi = policer - pm->policers;
       hash_set_mem (pm->policer_index_by_name, name, pi);
       *policer_index = pi;
+      policer->thread_index = ~0;
     }
   else
     {