From 974931f162820bd4ba41a43cae9578171cf0e3d1 Mon Sep 17 00:00:00 2001 From: Dave Barach Date: Thu, 7 Mar 2019 10:06:52 -0500 Subject: [PATCH] Honor vnet_rewrite_data_t data_bytes == 0 Avoid the cache miss consequences of spraying [functionally harmless] junk into un-prefetched rewrite space. As things stand, several tunnel encap rewrites set rewrite data_bytes = 0, and take a performance hit due to unwanted speculative copying. Should be performance-neutral in speed-path cases, which won't execute the added check. Change-Id: Id83c0325e58c0f31631b4bae5a06457dfc7ed567 Signed-off-by: Dave Barach --- src/vnet/adj/rewrite.h | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/vnet/adj/rewrite.h b/src/vnet/adj/rewrite.h index 58d47e0c737..32781134ecc 100644 --- a/src/vnet/adj/rewrite.h +++ b/src/vnet/adj/rewrite.h @@ -189,7 +189,13 @@ _vnet_rewrite_one_header (vnet_rewrite_header_t * h0, clib_memcpy (d, s, sizeof (eh_copy_t)); return; } - + /* + * Stop now if the data_bytes field is zero, to avoid the cache + * miss consequences of spraying [functionally harmless] junk into + * un-prefetched rewrite space. + */ + if (PREDICT_FALSE (h0->data_bytes == 0)) + return; #define _(i) \ do { \ @@ -244,6 +250,14 @@ _vnet_rewrite_two_headers (vnet_rewrite_header_t * h0, return; } + /* + * Stop now if both rewrite data_bytes fields are zero, to avoid the cache + * miss consequences of spraying [functionally harmless] junk into + * un-prefetched rewrite space. + */ + if (PREDICT_FALSE (h0->data_bytes + h1->data_bytes == 0)) + return; + #define _(i) \ do { \ if (most_likely_size > ((i)-1)*sizeof (vnet_rewrite_data_t)) \ -- 2.16.6