From: Jakub Kicinski <kuba@kernel.org>
To: satishkh@cisco.com
Cc: Jakub Kicinski <kuba@kernel.org>,
andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com,
pabeni@redhat.com, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org, sebaddel@cisco.com
Subject: Re: [PATCH net-next v7 08/10] enic: add MBOX VF handlers for capability, register and link state
Date: Mon, 18 May 2026 18:42:10 -0700 [thread overview]
Message-ID: <20260519014210.3395909-1-kuba@kernel.org> (raw)
In-Reply-To: <20260513-enic-sriov-v2-admin-channel-v2-v7-8-68b9f4141f4c@cisco.com>
This is an AI-generated review of your patch. The human sending this
email has considered the AI review valid, or at least plausible.
---
enic: add MBOX VF handlers for capability, register and link state
This commit implements VF-side mailbox message processing for SR-IOV V2
admin channel communication, adding receive handlers for capability, register,
unregister replies, and link state notifications, along with initiation
functions for the probe-time handshake.
> diff --git a/drivers/net/ethernet/cisco/enic/enic.h b/drivers/net/ethernet/cisco/enic/enic.h
> index 9b1fa3857df5a..483053c781df7 100644
> --- a/drivers/net/ethernet/cisco/enic/enic.h
> +++ b/drivers/net/ethernet/cisco/enic/enic.h
[ ... ]
> @@ -305,9 +307,22 @@ struct enic {
> void (*admin_rq_handler)(struct enic *enic, void *buf,
> unsigned int len);
>
> - /* MBOX protocol state */
> + /* MBOX protocol state -- single-flight: on the VF, all callers
> + * that wait on mbox_comp run under RTNL or during probe/remove,
> + * so only one completion is outstanding at a time. mbox_lock
> + * protects the shared admin WQ from concurrent senders.
> + */
> struct mutex mbox_lock;
> u64 mbox_msg_num;
> + struct completion mbox_comp;
> + /* Type of reply the current waiter on mbox_comp expects. Set
> + * under mbox_lock before reinit_completion(); cleared after
> + * wait_reply returns. Reply handlers compare against the
> + * incoming reply type and drop stale replies from previously
> + * timed-out requests instead of waking the unrelated current
> + * waiter.
> + */
> + u8 mbox_expected_reply;
[ ... ]
> diff --git a/drivers/net/ethernet/cisco/enic/enic_mbox.c b/drivers/net/ethernet/cisco/enic/enic_mbox.c
> index 0f7f9d2d091f7..b555362379b35 100644
> --- a/drivers/net/ethernet/cisco/enic/enic_mbox.c
> +++ b/drivers/net/ethernet/cisco/enic/enic_mbox.c
[ ... ]
> +static void enic_mbox_vf_handle_link_state(struct enic *enic, void *payload)
> +{
> + struct enic_mbox_pf_link_state_notif_msg *notif = payload;
> + struct enic_mbox_pf_link_state_ack_msg ack = {};
> +
> + switch (le32_to_cpu(notif->link_state)) {
[ ... ]
> + default:
> + netdev_warn(enic->netdev, "MBOX: unknown link state %u\n",
> + le32_to_cpu(notif->link_state));
> + ack.ack.ret_major = cpu_to_le16(ENIC_MBOX_ERR_GENERIC);
> + break;
> + }
> +
> + enic_mbox_send_msg(enic, ENIC_MBOX_PF_LINK_STATE_ACK, ENIC_MBOX_DST_PF,
> + &ack, sizeof(ack));
> +}
Could sending this ENIC_MBOX_PF_LINK_STATE_ACK with a non-zero ret_major error
code allow an unprivileged guest VM to flood the host kernel log?
Looking at the existing PF message handler enic_mbox_pf_process_msg(), when it
receives an ENIC_MBOX_PF_LINK_STATE_ACK with an error, it logs it like this:
if (le16_to_cpu(ack->ack.ret_major))
netdev_warn(enic->netdev,
"MBOX: VF %u link state ACK error %u/%u\n",
vf_id, le16_to_cpu(ack->ack.ret_major),
le16_to_cpu(ack->ack.ret_minor));
Since there is no rate limiting (like net_ratelimit()) on this specific
warning, a malicious guest could potentially craft and continuously send
invalid ACK messages to the PF's admin channel, spamming the hypervisor's log
and causing a denial of service.
[ ... ]
> +int enic_mbox_vf_capability_check(struct enic *enic)
> +{
> + struct enic_mbox_vf_capability_msg req = {};
> + int err;
> +
> + enic->pf_cap_version = 0;
> + enic->mbox_expected_reply = ENIC_MBOX_VF_CAPABILITY_REPLY;
> + reinit_completion(&enic->mbox_comp);
> + req.version = cpu_to_le32(ENIC_MBOX_CAP_VERSION_1);
Does this code miss acquiring mbox_lock before modifying mbox_expected_reply
and calling reinit_completion()?
The comment in enic.h dictates that mbox_expected_reply must be set under
mbox_lock before reinit_completion(), but here it seems they are updated
without holding the lock.
When a request times out, the waiter clears mbox_expected_reply = 0 without
locks. A concurrent RX handler processing a delayed reply might read the
expected type before it is cleared and proceed to call
complete(&enic->mbox_comp).
If the probe path proceeds to a cleanup step and calls
enic_mbox_vf_unregister(), could this delayed complete() race with the new
reinit_completion(), leading to a TOCTOU race where the completion is
spuriously signaled?
> +
> + err = enic_mbox_send_msg(enic, ENIC_MBOX_VF_CAPABILITY_REQUEST,
> + ENIC_MBOX_DST_PF, &req, sizeof(req));
> + if (err) {
> + enic->mbox_expected_reply = 0;
> + return err;
> + }
[ ... ]
> +int enic_mbox_vf_register(struct enic *enic)
> +{
> + int err;
> +
> + enic->vf_registered = false;
> + enic->mbox_expected_reply = ENIC_MBOX_VF_REGISTER_REPLY;
> + reinit_completion(&enic->mbox_comp);
Is the same mbox_lock missing here as well?
> +
> + err = enic_mbox_send_msg(enic, ENIC_MBOX_VF_REGISTER_REQUEST,
> + ENIC_MBOX_DST_PF, NULL, 0);
[ ... ]
> +int enic_mbox_vf_unregister(struct enic *enic)
> +{
> + int err;
> +
> + if (!enic->vf_registered)
> + return 0;
> +
> + enic->mbox_expected_reply = ENIC_MBOX_VF_UNREGISTER_REPLY;
> + reinit_completion(&enic->mbox_comp);
And is it also missing here?
> +
> + err = enic_mbox_send_msg(enic, ENIC_MBOX_VF_UNREGISTER_REQUEST,
> + ENIC_MBOX_DST_PF, NULL, 0);
next prev parent reply other threads:[~2026-05-19 1:42 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-13 15:15 [PATCH net-next v7 00/10] enic: SR-IOV V2 admin channel and MBOX protocol Satish Kharat
2026-05-13 15:15 ` [PATCH net-next v7 01/10] enic: verify firmware supports V2 SR-IOV at probe time Satish Kharat
2026-05-14 9:13 ` Breno Leitao
2026-05-13 15:15 ` [PATCH net-next v7 02/10] enic: add admin channel open and close for SR-IOV Satish Kharat
2026-05-13 15:15 ` [PATCH net-next v7 03/10] enic: add admin RQ buffer management Satish Kharat
2026-05-13 15:15 ` [PATCH net-next v7 04/10] enic: add admin CQ service with MSI-X interrupt and NAPI polling Satish Kharat
2026-05-19 1:36 ` Jakub Kicinski
2026-05-13 15:15 ` [PATCH net-next v7 05/10] enic: define MBOX message types and header structures Satish Kharat
2026-05-13 15:15 ` [PATCH net-next v7 06/10] enic: add MBOX core send and receive for admin channel Satish Kharat
2026-05-19 1:38 ` Jakub Kicinski
2026-05-13 15:15 ` [PATCH net-next v7 07/10] enic: add MBOX PF handlers for VF register and capability Satish Kharat
2026-05-19 1:42 ` Jakub Kicinski
2026-05-13 15:15 ` [PATCH net-next v7 08/10] enic: add MBOX VF handlers for capability, register and link state Satish Kharat
2026-05-19 1:42 ` Jakub Kicinski [this message]
2026-05-13 15:15 ` [PATCH net-next v7 09/10] enic: wire V2 SR-IOV enable with admin channel and MBOX Satish Kharat
2026-05-13 15:15 ` [PATCH net-next v7 10/10] enic: add V2 VF probe with admin channel and PF registration Satish Kharat
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260519014210.3395909-1-kuba@kernel.org \
--to=kuba@kernel.org \
--cc=andrew+netdev@lunn.ch \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=satishkh@cisco.com \
--cc=sebaddel@cisco.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.