common/cpt: fix bad shift operation

Message ID 1542258584-5779-1-git-send-email-anoob.joseph@caviumnetworks.com (mailing list archive)
State Accepted, archived
Delegated to: Thomas Monjalon
Headers
Series common/cpt: fix bad shift operation |

Checks

Context Check Description
ci/Intel-compilation success Compilation OK
ci/mellanox-Performance-Testing success Performance Testing PASS
ci/intel-Performance-Testing success Performance Testing PASS

Commit Message

Anoob Joseph Nov. 15, 2018, 5:10 a.m. UTC
  From: Ankur Dwivedi <ankur.dwivedi@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@caviumnetworks.com>
Signed-off-by: Anoob Joseph <anoob.joseph@caviumnetworks.com>
---
 drivers/common/cpt/cpt_ucode.h | 37 ++++++++++++++++---------------------
 1 file changed, 16 insertions(+), 21 deletions(-)
  

Comments

Thomas Monjalon Nov. 18, 2018, 4:36 p.m. UTC | #1
15/11/2018 06:10, Anoob Joseph:
> From: Ankur Dwivedi <ankur.dwivedi@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@caviumnetworks.com>
> Signed-off-by: Anoob Joseph <anoob.joseph@caviumnetworks.com>

Applied, thanks
  

Patch

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;
 	}
 }