From 14f2544cda74bb7f80b0269fba40574c9fad6b44 Mon Sep 17 00:00:00 2001 From: Balazs Nemeth Date: Fri, 26 Sep 2014 09:37:38 +0000 Subject: [PATCH] table: fix checking extended buckets in unoptimized case If a key is not found in a bucket and the bucket has been extended, the extended buckets also have to checked for potentially matching keys. The extended buckets are checked at the end of the lookup. In most cases, this logic is skipped as it is uncommon to have buckets in an extended state. In case the lookup is performed with less than 5 packets, an unoptimized version is run instead (the optimized version requires at least 5 packets). The extended buckets should also be checked in this case instead of simply ignoring the extended buckets. Signed-off-by: Balazs Nemeth Acked-by: Cristian Dumitrescu --- lib/librte_table/rte_table_hash_key16.c | 4 ++-- lib/librte_table/rte_table_hash_key32.c | 4 ++-- lib/librte_table/rte_table_hash_key8.c | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/librte_table/rte_table_hash_key16.c b/lib/librte_table/rte_table_hash_key16.c index f5ec87d4de..f78db77c4d 100644 --- a/lib/librte_table/rte_table_hash_key16.c +++ b/lib/librte_table/rte_table_hash_key16.c @@ -968,8 +968,7 @@ rte_table_hash_lookup_key16_ext( buckets, keys, f); } - *lookup_hit_mask = pkts_mask_out; - return 0; + goto grind_next_buckets; } /* @@ -1060,6 +1059,7 @@ rte_table_hash_lookup_key16_ext( bucket20, bucket21, pkts_mask_out, entries, buckets_mask, buckets, keys, f); +grind_next_buckets: /* Grind next buckets */ for ( ; buckets_mask; ) { uint64_t buckets_mask_next = 0; diff --git a/lib/librte_table/rte_table_hash_key32.c b/lib/librte_table/rte_table_hash_key32.c index e8f481270e..10e281d7ef 100644 --- a/lib/librte_table/rte_table_hash_key32.c +++ b/lib/librte_table/rte_table_hash_key32.c @@ -988,8 +988,7 @@ rte_table_hash_lookup_key32_ext( keys, f); } - *lookup_hit_mask = pkts_mask_out; - return 0; + goto grind_next_buckets; } /* @@ -1080,6 +1079,7 @@ rte_table_hash_lookup_key32_ext( bucket20, bucket21, pkts_mask_out, entries, buckets_mask, buckets, keys, f); +grind_next_buckets: /* Grind next buckets */ for ( ; buckets_mask; ) { uint64_t buckets_mask_next = 0; diff --git a/lib/librte_table/rte_table_hash_key8.c b/lib/librte_table/rte_table_hash_key8.c index d60c96eaa3..606805d3df 100644 --- a/lib/librte_table/rte_table_hash_key8.c +++ b/lib/librte_table/rte_table_hash_key8.c @@ -1104,8 +1104,7 @@ rte_table_hash_lookup_key8_ext( keys, f); } - *lookup_hit_mask = pkts_mask_out; - return 0; + goto grind_next_buckets; } /* @@ -1196,6 +1195,7 @@ rte_table_hash_lookup_key8_ext( bucket20, bucket21, pkts_mask_out, entries, buckets_mask, buckets, keys, f); +grind_next_buckets: /* Grind next buckets */ for ( ; buckets_mask; ) { uint64_t buckets_mask_next = 0; @@ -1250,8 +1250,7 @@ rte_table_hash_lookup_key8_ext_dosig( buckets, keys, f); } - *lookup_hit_mask = pkts_mask_out; - return 0; + goto grind_next_buckets; } /* @@ -1342,6 +1341,7 @@ rte_table_hash_lookup_key8_ext_dosig( bucket20, bucket21, pkts_mask_out, entries, buckets_mask, buckets, keys, f); +grind_next_buckets: /* Grind next buckets */ for ( ; buckets_mask; ) { uint64_t buckets_mask_next = 0; -- 2.20.1