summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/vnet/policer/police.h10
-rw-r--r--src/vnet/policer/policer.c1
2 files changed, 8 insertions, 3 deletions
diff --git a/src/vnet/policer/police.h b/src/vnet/policer/police.h
index 7065adb6e30..1005a620ccd 100644
--- a/src/vnet/policer/police.h
+++ b/src/vnet/policer/police.h
@@ -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;
diff --git a/src/vnet/policer/policer.c b/src/vnet/policer/policer.c
index 9611fe0fa4e..7ad87a6ebdf 100644
--- a/src/vnet/policer/policer.c
+++ b/src/vnet/policer/policer.c
@@ -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
{