mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 17:47:41 +02:00
gve: skip error logging for retryable AdminQ commands
AdminQ commands may return -EAGAIN under certain transient conditions. These commands are intended to be retried by the driver, so logging a formal error to the system log is misleading and creates unnecessary noise. Modify the logging logic to skip the error message when the result is -EAGAIN, and move logging to dev_err_ratelimited() to avoid spamming the log. Reviewed-by: Jacob Keller <jacob.e.keller@intel.com> Reviewed-by: Joshua Washington <joshwash@google.com> Signed-off-by: Jordan Rhee <jordanrhee@google.com> Signed-off-by: Harshitha Ramamurthy <hramamurthy@google.com> Link: https://patch.msgid.link/20260514225842.110706-2-hramamurthy@google.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
bcdfd9fb10
commit
55687124a8
|
|
@ -416,16 +416,10 @@ static bool gve_adminq_wait_for_cmd(struct gve_priv *priv, u32 prod_cnt)
|
|||
|
||||
static int gve_adminq_parse_err(struct gve_priv *priv, u32 status)
|
||||
{
|
||||
if (status != GVE_ADMINQ_COMMAND_PASSED &&
|
||||
status != GVE_ADMINQ_COMMAND_UNSET) {
|
||||
dev_err(&priv->pdev->dev, "AQ command failed with status %d\n", status);
|
||||
priv->adminq_cmd_fail++;
|
||||
}
|
||||
switch (status) {
|
||||
case GVE_ADMINQ_COMMAND_PASSED:
|
||||
return 0;
|
||||
case GVE_ADMINQ_COMMAND_UNSET:
|
||||
dev_err(&priv->pdev->dev, "parse_aq_err: err and status both unset, this should not be possible.\n");
|
||||
return -EINVAL;
|
||||
case GVE_ADMINQ_COMMAND_ERROR_ABORTED:
|
||||
case GVE_ADMINQ_COMMAND_ERROR_CANCELLED:
|
||||
|
|
@ -455,6 +449,27 @@ static int gve_adminq_parse_err(struct gve_priv *priv, u32 status)
|
|||
}
|
||||
}
|
||||
|
||||
static bool gve_adminq_is_retryable(enum gve_adminq_opcodes opcode)
|
||||
{
|
||||
switch (opcode) {
|
||||
case GVE_ADMINQ_REPORT_NIC_TIMESTAMP:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static enum gve_adminq_opcodes gve_extract_opcode(union gve_adminq_command *cmd)
|
||||
{
|
||||
u32 opcode;
|
||||
|
||||
opcode = be32_to_cpu(READ_ONCE(cmd->opcode));
|
||||
if (opcode == GVE_ADMINQ_EXTENDED_COMMAND)
|
||||
opcode = be32_to_cpu(cmd->extended_command.inner_opcode);
|
||||
|
||||
return opcode;
|
||||
}
|
||||
|
||||
/* Flushes all AQ commands currently queued and waits for them to complete.
|
||||
* If there are failures, it will return the first error.
|
||||
*/
|
||||
|
|
@ -477,14 +492,24 @@ static int gve_adminq_kick_and_wait(struct gve_priv *priv)
|
|||
|
||||
for (i = tail; i < head; i++) {
|
||||
union gve_adminq_command *cmd;
|
||||
u32 status, err;
|
||||
u32 status;
|
||||
int err;
|
||||
|
||||
cmd = &priv->adminq[i & priv->adminq_mask];
|
||||
status = be32_to_cpu(READ_ONCE(cmd->status));
|
||||
err = gve_adminq_parse_err(priv, status);
|
||||
if (err)
|
||||
if (err) {
|
||||
enum gve_adminq_opcodes opcode = gve_extract_opcode(cmd);
|
||||
|
||||
priv->adminq_cmd_fail++;
|
||||
if (!gve_adminq_is_retryable(opcode) || err != -EAGAIN)
|
||||
dev_err_ratelimited(&priv->pdev->dev,
|
||||
"AQ command %d failed with status %d\n",
|
||||
opcode, status);
|
||||
|
||||
// Return the first error if we failed.
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user