diff options
author | Damjan Marion <damarion@cisco.com> | 2019-06-17 22:55:44 +0200 |
---|---|---|
committer | Florin Coras <florin.coras@gmail.com> | 2019-06-18 02:08:27 +0000 |
commit | 39488c8d3064f8940ec4f826629ebb700649e6b5 (patch) | |
tree | 3168e17c74aa92d518c678dcfa619862fb0a0a32 /src/plugins/avf | |
parent | 217e7c9741596e3ad424f80b3f746faf050c2161 (diff) |
avf: fix adminq enqueue errors
Type: fix
Fixes: b4ff07a
Change-Id: I2578ae3e093961fa8765568b5fedcf75ae9487f6
Signed-off-by: Damjan Marion <damarion@cisco.com>
Diffstat (limited to 'src/plugins/avf')
-rw-r--r-- | src/plugins/avf/avf.h | 3 | ||||
-rw-r--r-- | src/plugins/avf/device.c | 11 |
2 files changed, 9 insertions, 5 deletions
diff --git a/src/plugins/avf/avf.h b/src/plugins/avf/avf.h index b0779f2706b..2efdfcd4823 100644 --- a/src/plugins/avf/avf.h +++ b/src/plugins/avf/avf.h @@ -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) diff --git a/src/plugins/avf/device.c b/src/plugins/avf/device.c index 8172c8324f7..15af95bbbff 100644 --- a/src/plugins/avf/device.c +++ b/src/plugins/avf/device.c @@ -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; } |