avf: fix adminq enqueue errors 98/20198/2
authorDamjan Marion <damarion@cisco.com>
Mon, 17 Jun 2019 20:55:44 +0000 (22:55 +0200)
committerFlorin Coras <florin.coras@gmail.com>
Tue, 18 Jun 2019 02:08:27 +0000 (02:08 +0000)
Type: fix
Fixes: b4ff07a

Change-Id: I2578ae3e093961fa8765568b5fedcf75ae9487f6
Signed-off-by: Damjan Marion <damarion@cisco.com>
src/plugins/avf/avf.h
src/plugins/avf/device.c

index b0779f2..2efdfcd 100644 (file)
@@ -22,6 +22,9 @@
 
 #include <vlib/log.h>
 
+#define AVF_AQ_ENQ_SUSPEND_TIME                50e-6
+#define AVF_AQ_ENQ_MAX_WAIT_TIME       50e-3
+
 #define AVF_RXD_STATUS(x)              (1ULL << x)
 #define AVF_RXD_STATUS_DD              AVF_RXD_STATUS(0)
 #define AVF_RXD_STATUS_EOP             AVF_RXD_STATUS(1)
index 8172c83..15af95b 100644 (file)
@@ -113,10 +113,9 @@ clib_error_t *
 avf_aq_desc_enq (vlib_main_t * vm, avf_device_t * ad, avf_aq_desc_t * dt,
                 void *data, int len)
 {
-  avf_main_t *am = &avf_main;
   clib_error_t *err = 0;
   avf_aq_desc_t *d, dc;
-  int n_retry = 5;
+  f64 t0, wait_time, suspend_time = AVF_AQ_ENQ_SUSPEND_TIME;
 
   d = &ad->atq[ad->atq_next_slot];
   clib_memcpy_fast (d, dt, sizeof (avf_aq_desc_t));
@@ -138,22 +137,24 @@ avf_aq_desc_enq (vlib_main_t * vm, avf_device_t * ad, avf_aq_desc_t * dt,
     clib_memcpy_fast (&dc, d, sizeof (avf_aq_desc_t));
 
   CLIB_MEMORY_BARRIER ();
-  vlib_log_debug (am->log_class, "%U", format_hexdump, data, len);
   ad->atq_next_slot = (ad->atq_next_slot + 1) % AVF_MBOX_LEN;
   avf_reg_write (ad, AVF_ATQT, ad->atq_next_slot);
   avf_reg_flush (ad);
 
+  t0 = vlib_time_now (vm);
 retry:
-  vlib_process_suspend (vm, 10e-6);
+  vlib_process_suspend (vm, suspend_time);
+  wait_time = vlib_time_now (vm) - t0;
 
   if (((d->flags & AVF_AQ_F_DD) == 0) || ((d->flags & AVF_AQ_F_CMP) == 0))
     {
-      if (--n_retry == 0)
+      if (wait_time > AVF_AQ_ENQ_MAX_WAIT_TIME)
        {
          err = clib_error_return (0, "adminq enqueue timeout [opcode 0x%x]",
                                   d->opcode);
          goto done;
        }
+      suspend_time *= 2;
       goto retry;
     }