[dpdk-dev] [PATCH] common/cpt: fix bad shift operation

Anoob Joseph anoob.joseph at caviumnetworks.com
Thu Nov 15 06:10:27 CET 2018


From: Ankur Dwivedi <ankur.dwivedi at caviumnetworks.com>

Coverity Issue: 323477

Using the rte_bsf32 function to find last set bit. This avoids
the for loop and hence the bad bit shift operation.

Fixes: 351fbee21986 ("common/cpt: support hash")

Signed-off-by: Ankur Dwivedi <ankur.dwivedi at caviumnetworks.com>
Signed-off-by: Anoob Joseph <anoob.joseph at caviumnetworks.com>
---
 drivers/common/cpt/cpt_ucode.h | 37 ++++++++++++++++---------------------
 1 file changed, 16 insertions(+), 21 deletions(-)

diff --git a/drivers/common/cpt/cpt_ucode.h b/drivers/common/cpt/cpt_ucode.h
index c5a9f34..5933ea7 100644
--- a/drivers/common/cpt/cpt_ucode.h
+++ b/drivers/common/cpt/cpt_ucode.h
@@ -3449,32 +3449,27 @@ find_kasumif9_direction_and_length(uint8_t *src,
 				   uint8_t *addr_direction)
 {
 	uint8_t found = 0;
+	uint32_t pos;
+	uint8_t last_byte;
 	while (!found && counter_num_bytes > 0) {
 		counter_num_bytes--;
 		if (src[counter_num_bytes] == 0x00)
 			continue;
-		if (src[counter_num_bytes] == 0x80) {
-			*addr_direction  =  src[counter_num_bytes - 1] & 0x1;
-			*addr_length_in_bits = counter_num_bytes * 8  - 1;
-			found = 1;
-		} else {
-			int i = 0;
-			uint8_t last_byte = src[counter_num_bytes];
-			for (i = 0; i < 8 && found == 0; i++) {
-				if (last_byte & (1 << i)) {
-					*addr_direction = (last_byte >> (i+1))
-							  & 0x1;
-					if (i != 6)
-						*addr_length_in_bits =
-							counter_num_bytes * 8
-							+ (8 - (i + 2));
-					else
-						*addr_length_in_bits =
-							counter_num_bytes * 8;
-					found = 1;
-					}
-				}
+		pos = rte_bsf32(src[counter_num_bytes]);
+		if (pos == 7) {
+			if (likely(counter_num_bytes > 0)) {
+				last_byte = src[counter_num_bytes - 1];
+				*addr_direction  =  last_byte & 0x1;
+				*addr_length_in_bits = counter_num_bytes * 8
+							- 1;
 			}
+		} else {
+			last_byte = src[counter_num_bytes];
+			*addr_direction = (last_byte >> (pos + 1)) & 0x1;
+			*addr_length_in_bits = counter_num_bytes * 8
+						+ (8 - (pos + 2));
+		}
+		found = 1;
 	}
 }
 
-- 
2.7.4



More information about the dev mailing list