From 70449b9b9bf8dbe3b4aa4d9af35c759789b03fe1 Mon Sep 17 00:00:00 2001 From: Steven Luong Date: Wed, 20 Nov 2019 11:20:08 -0800 Subject: vlib: address vlib_error_t scaling issue Encoding the vpp node index into the vlib_error_t as a 10-bit quantity limits us to 1K graph nodes. Unfortunately, a few nodes need 6 bit per-node error codes. Only a very few nodes have so many counters. It turns out that there are about 2K total error counters in the system, which is (approximately) the maximum error heap index. The current (index,code) encoding limits the number of interfaces to around 250, since each interface has two associated graph nodes and we have about 500 "normal, interior" graph node This patch adds an error-index to node-index map, so we can store error heap indices directly in the vlib_buffer_t. Type: refactor Signed-off-by: Steven Luong Change-Id: Ic2e91a5b344c9df3b98b264cacda246e06092a94 --- src/vlib/node.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'src/vlib/node.h') diff --git a/src/vlib/node.h b/src/vlib/node.h index 011709b9705..38ae4ec23c0 100644 --- a/src/vlib/node.h +++ b/src/vlib/node.h @@ -784,8 +784,27 @@ typedef struct /* Node registrations added by constructors */ vlib_node_registration_t *node_registrations; + + /* Node index from error code */ + u32 *node_by_error; } vlib_node_main_t; +typedef u16 vlib_error_t; + +always_inline u32 +vlib_error_get_node (vlib_node_main_t * nm, vlib_error_t e) +{ + return nm->node_by_error[e]; +} + +always_inline u32 +vlib_error_get_code (vlib_node_main_t * nm, vlib_error_t e) +{ + u32 node_index = nm->node_by_error[e]; + vlib_node_t *n = nm->nodes[node_index]; + u32 error_code = e - n->error_heap_index; + return error_code; +} #define FRAME_QUEUE_MAX_NELTS 32 typedef struct -- cgit 1.2.3-korg