svm: fix return for partial segment enqueue 60/34960/3
authorFlorin Coras <fcoras@cisco.com>
Tue, 18 Jan 2022 22:11:11 +0000 (14:11 -0800)
committerDamjan Marion <dmarion@me.com>
Wed, 19 Jan 2022 15:58:20 +0000 (15:58 +0000)
Type: fix

Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: I9953d9bf04e708ac8ea475127e3d2f606cc1c8d9

src/svm/svm_fifo.c

index 2150694..7197e38 100644 (file)
@@ -1010,25 +1010,26 @@ svm_fifo_enqueue_segments (svm_fifo_t * f, const svm_fifo_seg_t segs[],
     }
   else
     {
-      len = clib_min (free_count, len);
+      u32 n_left = clib_min (free_count, len);
 
-      if (f_pos_gt (tail + len, f_chunk_end (f_end_cptr (f))))
+      if (f_pos_gt (tail + n_left, f_chunk_end (f_end_cptr (f))))
        {
-         if (PREDICT_FALSE (f_try_chunk_alloc (f, head, tail, len)))
+         if (PREDICT_FALSE (f_try_chunk_alloc (f, head, tail, n_left)))
            {
-             len = f_chunk_end (f_end_cptr (f)) - tail;
-             if (!len)
+             n_left = f_chunk_end (f_end_cptr (f)) - tail;
+             if (!n_left)
                return SVM_FIFO_EGROW;
            }
        }
 
+      len = n_left;
       i = 0;
-      while (len)
+      while (n_left)
        {
-         u32 to_copy = clib_min (segs[i].len, len);
+         u32 to_copy = clib_min (segs[i].len, n_left);
          svm_fifo_copy_to_chunk (f, f_tail_cptr (f), tail, segs[i].data,
                                  to_copy, &f->shr->tail_chunk);
-         len -= to_copy;
+         n_left -= to_copy;
          tail += to_copy;
          i++;
        }