From: Helin Zhang Date: Tue, 8 Mar 2016 08:14:14 +0000 (+0800) Subject: i40e/base: fix missing check for stopped admin queue X-Git-Tag: spdx-start~7382 X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=9f44dd3d8ad447c7f797a9564d30a15e5ab7f72b;p=dpdk.git i40e/base: fix missing check for stopped admin queue It's possible that while waiting for the spinlock, another entity (that owns the spinlock) has shut down the admin queue. If it then attempts to use the queue, it will panic. It adds a check for this condition on the receive side. This matches an existing check on the send queue side. Fixes: 8db9e2a1b232 ("i40e: base driver") Signed-off-by: Helin Zhang Acked-by: Jingjing Wu Acked-by: Remy Horton --- diff --git a/drivers/net/i40e/base/i40e_adminq.c b/drivers/net/i40e/base/i40e_adminq.c index 998582cdee..e1a162e508 100644 --- a/drivers/net/i40e/base/i40e_adminq.c +++ b/drivers/net/i40e/base/i40e_adminq.c @@ -1035,6 +1035,13 @@ enum i40e_status_code i40e_clean_arq_element(struct i40e_hw *hw, /* take the lock before we start messing with the ring */ i40e_acquire_spinlock(&hw->aq.arq_spinlock); + if (hw->aq.arq.count == 0) { + i40e_debug(hw, I40E_DEBUG_AQ_MESSAGE, + "AQRX: Admin queue not initialized.\n"); + ret_code = I40E_ERR_QUEUE_EMPTY; + goto clean_arq_element_err; + } + /* set next_to_use to head */ #ifdef PF_DRIVER #ifdef INTEGRATED_VF @@ -1113,6 +1120,7 @@ clean_arq_element_out: /* Set pending if needed, unlock and return */ if (pending != NULL) *pending = (ntc > ntu ? hw->aq.arq.count : 0) + (ntu - ntc); +clean_arq_element_err: i40e_release_spinlock(&hw->aq.arq_spinlock); #ifdef PF_DRIVER