>From fe8850cb3b7c1051784e5587b9f79beeaf87a804 Mon Sep 17 00:00:00 2001From: 
>bullvolkan <volkan.a...@b-ulltech.com>Date: Fri, 20 Oct 2023 21:48:30 
>+0300Subject: [PATCH] distributor: enhance error handling for consistency
 
This commit improves error handling in the distributor component to 
ensureconsistency and reliability. It addresses invalid 'num' values in 
'lcore_worker',corrects 'retptr64' initialization in 
'rte_distributor_request_pkt', and checksthe validity of 'num' in 
'rte_distributor_return_pkt'. These changes enhanceerror handling and maintain 
code consistency.
 
Signed-off-by: Volkan Atli <volkan.a...@b-ulltech.com>--- .mailmap        
                  |  2 +- examples/distributor/main.c       |  9 +++++++-- 
lib/distributor/rte_distributor.c | 24 ++++++++++++++---------- 
lib/distributor/rte_distributor.h | 11 ++++++++++- 4 files changed, 32 
insertions(+), 14 deletions(-)
 
diff --git a/.mailmap b/.mailmapindex 3f5bab26a8..d0fe75fa8b 100644--- 
a/.mailmap+++ b/.mailmap@@ -63,7 +63,7 @@ Alfredo Cardigliano 
<cardigli...@ntop.org> Ali Alnubani <alia...@nvidia.com> 
<alia...@mellanox.com> Alice Michael <alice.mich...@intel.com> Alin 
Rauta <alin.ra...@intel.com>-Ali Volkan Atli 
<volkan.a...@argela.com.tr>+Ali Volkan Atli 
<volkan.a...@b-ulltech.com> Allain Legacy 
<allain.leg...@windriver.com> Allen Hubbe <allen.hu...@amd.com> 
Alok Makhariya <alok.makhar...@nxp.com>diff --git 
a/examples/distributor/main.c b/examples/distributor/main.cindex 
21304d6618..58369c3faa 100644--- a/examples/distributor/main.c+++ 
b/examples/distributor/main.c@@ -634,8 +634,8 @@ lcore_worker(struct 
lcore_params *p) {     struct rte_distributor *d = p->d;     const unsigned 
id = p->worker_id;-    unsigned int num = 0;-    unsigned int i;+    int num 
= 0;+    int i;      /*      * for single port, xor_val will be zero so we 
won't modify the output@@ -652,6 +652,11 @@ lcore_worker(struct lcore_params 
*p)     printf("\nCore %u acting as worker core.\n", rte_lcore_id());     while 
(!quit_signal_work) {         num = rte_distributor_get_pkt(d, id, buf, buf, 
num);++        if (unlikely(num < 0 || num > 8)) {+            
rte_exit(EXIT_FAILURE, "strange retcount %u\n", num);+        }+         /* Do 
a little bit of work for each packet */         for (i = 0; i < num; i++) {  
           uint64_t t = rte_rdtsc()+100;diff --git 
a/lib/distributor/rte_distributor.c b/lib/distributor/rte_distributor.cindex 
5ca80dd44f..92653dd9ca 100644--- a/lib/distributor/rte_distributor.c+++ 
b/lib/distributor/rte_distributor.c@@ -64,15 +64,16 @@ 
rte_distributor_request_pkt(struct rte_distributor *d,      * handshake bits. 
Populate the retptrs with returning packets.      */ -    for (i = count; i 
< RTE_DIST_BURST_SIZE; i++)-        buf->retptr64[i] = 0;-     /* Set 
VALID_BUF bit for each packet returned */-    for (i = count; i-- > 0; )+    
size_t arr_len = sizeof(buf->retptr64) / sizeof(buf->retptr64[0]);+    
for (i = 0; i < RTE_MIN(count, arr_len); ++i)         buf->retptr64[i] =  
           (((int64_t)(uintptr_t)(oldpkt[i])) <<             
RTE_DISTRIB_FLAG_BITS) | RTE_DISTRIB_VALID_BUF; +    for (i = count; i < 
RTE_DIST_BURST_SIZE; i++)+        buf->retptr64[i] = 0;+     /*      * 
Finally, set the GET_BUF  to signal to distributor that cache      * line is 
ready for processing@@ -161,7 +162,7 @@ rte_distributor_return_pkt(struct 
rte_distributor *d,         unsigned int worker_id, struct rte_mbuf **oldpkt, 
int num) {     struct rte_distributor_buffer *buf = 
&d->bufs[worker_id];-    unsigned int i;+    int i;      if 
(unlikely(d->alg_type == RTE_DIST_ALG_SINGLE)) {         if (num == 1)@@ 
-186,16 +187,19 @@ rte_distributor_return_pkt(struct rte_distributor *d,        
     rte_pause();     } +    if (unlikely(num > RTE_DIST_BURST_SIZE || num 
< 0)) {+        return -EINVAL;+    }+     /* Sync with distributor to 
acquire retptrs */     __atomic_thread_fence(__ATOMIC_ACQUIRE);-    for (i = 0; 
i < RTE_DIST_BURST_SIZE; i++)-        /* Switch off the return bit first */- 
       buf->retptr64[i] = 0;--    for (i = num; i-- > 0; )+    for (i = 
0; i < num; i++)         buf->retptr64[i] = 
(((int64_t)(uintptr_t)oldpkt[i]) <<             RTE_DISTRIB_FLAG_BITS) | 
RTE_DISTRIB_VALID_BUF; +    for (i = num; i < RTE_DIST_BURST_SIZE; i++)+     
   buf->retptr64[i] = 0;+     /* Use RETURN_BUF on bufptr64 to notify 
distributor that      * we won't read any mbufs from there even if GET_BUF is 
set.      * This allows distributor to retrieve in-flight already sent 
packets.diff --git a/lib/distributor/rte_distributor.h 
b/lib/distributor/rte_distributor.hindex a073e64612..337ff8e0fe 100644--- 
a/lib/distributor/rte_distributor.h+++ b/lib/distributor/rte_distributor.h@@ 
-160,7 +160,11 @@ rte_distributor_clear_returns(struct rte_distributor *d);  *  
 The number of packets being returned  *  * @return- *   The number of packets 
in the pkts array+ *   The number of packets in the pkts array or+ *   -EINVAL 
if num is greater than 1 (RTE_DIST_ALG_SINGLE)+ *   -EINVAL if num is greater 
than RTE_DIST_BURST_SIZE or+ *    less than zero (RTE_DIST_ALG_BURST)+  */ int 
rte_distributor_get_pkt(struct rte_distributor *d,@@ -180,6 +184,11 @@ 
rte_distributor_get_pkt(struct rte_distributor *d,  *   The previous packets 
being processed by the worker  * @param num  *   The number of packets in the 
oldpkt array+ *+ * @return+ *   The number of packets in the pkts array or+ *   
-EINVAL if retcount is greater than 1 (RTE_DIST_ALG_SINGLE)+ *   -EINVAL if 
retcount is greater than RTE_DIST_BURST_SIZE (RTE_DIST_ALG_BURST)  */ int 
rte_distributor_return_pkt(struct rte_distributor *d,-- 2.41.0

Reply via email to