crypto-sw-scheduler: fix queue iterator 30/37430/3
authorVladimir Ratnikov <vratnikov@netgate.com>
Mon, 17 Oct 2022 07:34:14 +0000 (07:34 +0000)
committerFan Zhang <royzhang1980@hotmail.com>
Thu, 20 Oct 2022 20:47:29 +0000 (20:47 +0000)
 When there are several workers, iterator can and will skip
head iterator and it will last until BARRIER_SYNC_TIMEOUT won't
expire and will cause SIGABRT with `worker thread deadlock`

Type: fix

Signed-off-by: Vladimir Ratnikov <vratnikov@netgate.com>
Change-Id: Id4def4d5894e077ae27592367b141ecd822e86af
Signed-off-by: Matthew Smith <mgsmith@netgate.com>
src/plugins/crypto_sw_scheduler/main.c

index 47fa37d..09d4a0b 100644 (file)
@@ -471,6 +471,15 @@ crypto_sw_scheduler_process_aead (vlib_main_t *vm,
              tail = current_queue->tail;
              head = current_queue->head;
 
+             /* Skip this queue unless tail < head or head has overflowed
+              * and tail has not. At the point where tail overflows (== 0),
+              * the largest possible value of head is (queue size - 1).
+              * Prior to that, the largest possible value of head is
+              * (queue size - 2).
+              */
+             if ((tail > head) && (head >= CRYPTO_SW_SCHEDULER_QUEUE_MASK))
+               goto skip_queue;
+
              for (j = tail; j != head; j++)
                {
 
@@ -488,6 +497,7 @@ crypto_sw_scheduler_process_aead (vlib_main_t *vm,
                    }
                }
 
+           skip_queue:
              if (found || i == ptd->last_serve_lcore_id)
                {
                  CLIB_MEMORY_STORE_BARRIER ();