[Cc: +Michal] Dear Dawid, dear Jakub,
Am 13.01.26 um 20:38 schrieb Dawid Osuchowski:
From: Jakub Staniszewski <[email protected]> Add retry mechanism for indirect Admin Queue (AQ) commands. To do so we need to keep the command buffer. This technically reverts commit 43a630e37e25 ("ice: remove unused buffer copy code in ice_sq_send_cmd_retry()"), but combines it with a fix in the logic by using a kmemdup() call, making it more robust and less likely to break in the future due to programmer error. Cc: Michal Schmidt <[email protected]> Cc: [email protected] Fixes: 3056df93f7a8 ("ice: Re-send some AQ commands, as result of EBUSY AQ error") Signed-off-by: Jakub Staniszewski <[email protected]> Co-developed-by: Dawid Osuchowski <[email protected]> Signed-off-by: Dawid Osuchowski <[email protected]> Reviewed-by: Aleksandr Loktionov <[email protected]> Reviewed-by: Przemek Kitszel <[email protected]> --- Ccing Michal, given they are the author of the "reverted" commit.
At least Michal was not in the (visible) Cc: list
drivers/net/ethernet/intel/ice/ice_common.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/intel/ice/ice_common.c b/drivers/net/ethernet/intel/ice/ice_common.c index a400bf4f239a..aab00c44e9b2 100644 --- a/drivers/net/ethernet/intel/ice/ice_common.c +++ b/drivers/net/ethernet/intel/ice/ice_common.c @@ -1879,34 +1879,40 @@ ice_sq_send_cmd_retry(struct ice_hw *hw, struct ice_ctl_q_info *cq, { struct libie_aq_desc desc_cpy; bool is_cmd_for_retry; + u8 *buf_cpy = NULL; u8 idx = 0; u16 opcode; int status;opcode = le16_to_cpu(desc->opcode);is_cmd_for_retry = ice_should_retry_sq_send_cmd(opcode); memset(&desc_cpy, 0, sizeof(desc_cpy));if (is_cmd_for_retry) {- /* All retryable cmds are direct, without buf. */ - WARN_ON(buf); + if (buf) { + buf_cpy = kmemdup(buf, buf_size, GFP_KERNEL); + if (!buf_cpy) + return -ENOMEM; + }memcpy(&desc_cpy, desc, sizeof(desc_cpy));}do {status = ice_sq_send_cmd(hw, cq, desc, buf, buf_size, cd);if (!is_cmd_for_retry || !status ||hw->adminq.sq_last_status != LIBIE_AQ_RC_EBUSY) break;+ if (buf_cpy)+ memcpy(buf, buf_cpy, buf_size); memcpy(desc, &desc_cpy, sizeof(desc_cpy)); -
Unrelated change?
msleep(ICE_SQ_SEND_DELAY_TIME_MS);} while (++idx < ICE_SQ_SEND_MAX_EXECUTE); + kfree(buf_cpy);return status; }
The diff looks good otherwise. Reviewed-by: Paul Menzel <[email protected]> Kind regards, Paul
