From: sashiko-bot@kernel.org
To: "Przemek Kitszel" <przemyslaw.kitszel@intel.com>
Cc: intel-wired-lan@lists.osuosl.org
Subject: Re: [PATCH net-next v2 10/14] iavf: use new opcodes to request more than 16 queues
Date: Sat, 10 Oct 2026 12:16:07 +0000 [thread overview]
Message-ID: <sashiko-outbox-166505@kernel.org> (raw)
In-Reply-To: <20261009121433.30347-11-przemyslaw.kitszel@intel.com>
Thank you for your contribution! Sashiko AI review found 7 potential issue(s) to consider:
- [Critical] iavf: early return in iavf_parse_vf_resource_msg() skips VSI initialization causing panic
- [High] core: strict type mismatch in min() macro causing build failure
- [High] iavf: division by zero in iavf_fill_rss_lut() from unbounded qregion_width
- [High] iavf: RMW data race on adapter->flags leading to lost state updates
- [High] iavf: early success return from iavf_parse_vf_resource_msg causes BUG_ON panic
- [Medium] iavf: auto-requesting queues on every reset destroys user configuration
- [Medium] iavf: ignored ENOMEM from iavf_parse_vf_resource_msg leaves inconsistent RSS state
--
commit 30797d207471017781d2b1737aa86bb6b0ea80c5
Author: Ahmed Zaki <ahmed.zaki@intel.com>
iavf: use new opcodes to request more than 16 queues
This commit introduces new opcodes to enable the VF to request a variable
number of queues (VIRTCHNL_VF_LARGE_NUM_QPAIRS). It defines a capability
exchange using VIRTCHNL_OP_GET_MAX_RSS_QREGION and introduces V2 opcodes for
enabling/disabling queues and mapping queue vectors.
> diff --git a/drivers/net/ethernet/intel/iavf/iavf_main.c b/drivers/net/ethernet/intel/iavf/iavf_main.c
> index 8059e855dc096..f8193b0cae4ab 100644
> --- a/drivers/net/ethernet/intel/iavf/iavf_main.c
> +++ b/drivers/net/ethernet/intel/iavf/iavf_main.c
> @@ -1775,10 +1775,14 @@ int iavf_config_rss(struct iavf_adapter *adapter)
> **/
> static void iavf_fill_rss_lut(struct iavf_adapter *adapter)
> {
> - u16 i;
> + struct virtchnl_max_rss_qregion *qregion = &adapter->max_rss_qregion;
> + int max = adapter->num_active_queues;
> +
> + if (LARGE_NUM_QPAIRS_SUPPORT(adapter) && qregion->qregion_width)
> + max = min(max, (int)BIT(qregion->qregion_width));
[Severity: High]
Is it possible for a malicious or buggy PF to trigger a division by zero here?
If qregion_width is >= 32 (on 32-bit systems) or >= 64, the BIT() shift invokes
undefined behavior. On 64-bit systems, a width of 32 results in 4294967296,
which becomes 0 when cast to int. This makes max = 0 via min(), causing a
divide-by-zero panic on the subsequent modulo operation.
>
> - for (i = 0; i < adapter->rss_lut_size; i++)
> - adapter->rss_lut[i] = i % adapter->num_active_queues;
> + for (int i = 0; i < adapter->rss_lut_size; i++)
> + adapter->rss_lut[i] = i % max;
> }
[ ... ]
> @@ -2486,6 +2493,23 @@ int iavf_parse_vf_resource_msg(struct iavf_adapter *adapter)
>
> return -EAGAIN;
> }
> + /* in LARGE mode num_queue_pairs is the PF limit, not our allocation */
> + if (!num_req_queues && LARGE_NUM_QPAIRS_SUPPORT(adapter) &&
> + adapter->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_REQ_QUEUES) {
> + adapter->current_op = VIRTCHNL_OP_UNKNOWN;
> + qnum = min(adapter->vsi_res->num_queue_pairs,
> + num_online_cpus());
[Severity: High]
Does this code trigger a strict type mismatch build failure?
The min() macro requires both arguments to be of the exact same type. Here,
adapter->vsi_res->num_queue_pairs is a u16, but num_online_cpus() returns an
unsigned int.
> +
> + return iavf_request_queues(adapter, qnum);
[Severity: High]
Could returning 0 here (success) instead of -EAGAIN falsely signal the state
machine to proceed?
If it returns 0 instead of -EAGAIN, the initialization state machine falsely
believes parsing completed and advances before the PF can respond. This leads
to calling netdev_rss_key_fill() with a length of 0, hitting a BUG_ON.
[Severity: Critical]
Does this early return skip essential VSI initialization, causing a NULL pointer
dereference later?
By returning early, critical fields like adapter->vsi.back remain uninitialized
(NULL). Once the interface receives packets, a checksum error will crash the
kernel in iavf_rx_csum() when it executes vsi->back->hw_csum_rx_error++.
[Severity: Medium]
Will this unconditionally clear user configuration on every runtime reset?
Because adapter->num_req_queues is reset to 0 at the end of this function:
adapter->num_req_queues = 0;
the initial auto-request condition (!num_req_queues) will evaluate to true on
the next normal reset. This causes an unexpected auto-request to the PF,
resulting in a double-reset and persistent loss of user queue configurations.
> + }
> + /* PF could lower the limit on reset, e.g. when RSS LUT got smaller */
> + if (adapter->num_active_queues > adapter->vsi_res->num_queue_pairs) {
> + adapter->flags |= IAVF_FLAG_REINIT_MSIX_NEEDED;
> + adapter->num_req_queues = adapter->vsi_res->num_queue_pairs;
> + iavf_schedule_reset(adapter, IAVF_FLAG_RESET_NEEDED);
> +
> + return -EAGAIN;
> + }
> adapter->num_req_queues = 0;
> adapter->vsi.id = adapter->vsi_res->vsi_id;
[ ... ]
> @@ -2494,13 +2518,40 @@ int iavf_parse_vf_resource_msg(struct iavf_adapter *adapter)
> vsi->netdev = adapter->netdev;
> vsi->qs_handle = adapter->vsi_res->qset_handle;
> if (adapter->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_RSS_PF) {
> - adapter->rss_key_size = adapter->vf_res->rss_key_size;
> - adapter->rss_lut_size = adapter->rss_lut_size;
> + if ((adapter->rss_key &&
> + adapter->rss_key_size != adapter->vf_res->rss_key_size) ||
> + (adapter->rss_lut &&
> + adapter->rss_lut_size != adapter->vf_res->rss_lut_size)) {
> + reconfig_rss = true;
> + } else {
> + adapter->rss_key_size = adapter->vf_res->rss_key_size;
> + adapter->rss_lut_size = adapter->vf_res->rss_lut_size;
> + }
> } else {
> adapter->rss_key_size = IAVF_HKEY_ARRAY_SIZE;
> adapter->rss_lut_size = IAVF_HLUT_ARRAY_SIZE;
> }
>
> + if (reconfig_rss) {
> + u8 *rss_key, *rss_lut;
> +
> + rss_key = kmalloc(adapter->vf_res->rss_key_size, GFP_KERNEL);
> + rss_lut = kmalloc(adapter->vf_res->rss_lut_size, GFP_KERNEL);
> + if (!rss_lut || !rss_key) {
> + kfree(rss_key);
> + kfree(rss_lut);
> + return -ENOMEM;
[Severity: Medium]
Is it safe to ignore the -ENOMEM return value when this allocation fails?
In iavf_virtchnl_completion(), the caller ignores this return value and blindly
proceeds to iavf_process_config(). This leaves the driver's RSS state out of
sync with the PF, causing silent misconfigurations.
> + }
> diff --git a/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c b/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c
> index 3b9545d2c0217..89d95d3b564ce 100644
> --- a/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c
> +++ b/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c
> @@ -602,6 +793,40 @@ void iavf_map_queues(struct iavf_adapter *adapter)
> kfree(vimi);
> }
>
> +/**
> + * iavf_request_queues - request queues via virtchnl
> + * @adapter: adapter structure
> + * @num: number of requested queues
> + *
> + * Return: 0 on success, negative on failure.
> + */
> +int iavf_request_queues(struct iavf_adapter *adapter, int num)
> +{
> + struct virtchnl_vf_res_request vfres = { num };
> + int err;
> +
> + if (adapter->current_op != VIRTCHNL_OP_UNKNOWN) {
> + /* bail because we already have a command pending */
> + dev_err(&adapter->pdev->dev, "Cannot request queues, command %d pending\n",
> + adapter->current_op);
> + return -EBUSY;
> + }
> +
> + adapter->current_op = VIRTCHNL_OP_REQUEST_QUEUES;
> + adapter->flags |= IAVF_FLAG_REINIT_ITR_NEEDED;
[Severity: High]
Does this non-atomic read-modify-write operation on adapter->flags race with
lockless contexts?
For example, iavf_tx_timeout() updates this variable from a softirq context:
adapter->flags |= flags;
If iavf_request_queues() executes concurrently, the updates from the watchdog
timer could be lost, preventing the device from recovering from a TX hang.
> + adapter->num_req_queues = num;
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261009121433.30347-1-przemyslaw.kitszel@intel.com?part=10
next prev parent reply other threads:[~2026-10-10 12:16 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-09 12:04 [PATCH net-next v2 00/14] devlink, mlx5, iavf, ice: XLVF for iavf Przemek Kitszel
2026-10-09 12:04 ` [PATCH net-next v2 01/14] devlink, mlx5: add init/fini ops for shared devlink Przemek Kitszel
2026-10-09 12:04 ` [PATCH net-next v2 02/14] ice: use shared devlink to store ice_adapters instead of custom xarray Przemek Kitszel
2026-10-10 12:16 ` sashiko-bot
2026-10-13 12:57 ` Przemek Kitszel
2026-10-09 12:04 ` [PATCH net-next v2 03/14] ice: add VF queue ena/dis helper functions Przemek Kitszel
2026-10-09 12:04 ` [PATCH net-next v2 04/14] ice: add helpers for Global RSS LUT alloc, free, vsi_update Przemek Kitszel
2026-10-09 12:04 ` [PATCH net-next v2 05/14] ice: rename ICE_MAX_RSS_QS_PER_VF to ICE_MAX_QS_PER_VF_VCV1 Przemek Kitszel
2026-10-09 12:04 ` [PATCH net-next v2 06/14] ice: bump to 256qs for VF Przemek Kitszel
2026-10-10 12:16 ` sashiko-bot
2026-10-13 13:46 ` Przemek Kitszel
2026-10-09 12:04 ` [PATCH net-next v2 07/14] iavf: extend iavf_configure_queues() to support more queues Przemek Kitszel
2026-10-09 12:04 ` [PATCH net-next v2 08/14] iavf: temporary rename of IAVF_MAX_REQ_QUEUES to IAVF_MAX_REQ_QUEUES_VCV1 Przemek Kitszel
2026-10-10 12:16 ` sashiko-bot
2026-10-13 13:27 ` Przemek Kitszel
2026-10-09 12:04 ` [PATCH net-next v2 09/14] iavf: increase max number of queues to 256 Przemek Kitszel
2026-10-09 12:04 ` [PATCH net-next v2 10/14] iavf: use new opcodes to request more than 16 queues Przemek Kitszel
2026-10-10 12:16 ` sashiko-bot [this message]
2026-10-09 12:04 ` [PATCH net-next v2 11/14] ice: introduce handling of virtchnl LARGE VF opcodes Przemek Kitszel
2026-10-09 12:04 ` [PATCH net-next v2 12/14] devlink: give user option to allocate resources Przemek Kitszel
2026-10-09 12:04 ` [PATCH net-next v2 13/14] ice: represent RSS LUTs as devlink resources Przemek Kitszel
2026-10-10 12:16 ` sashiko-bot
2026-10-13 13:49 ` Przemek Kitszel
2026-10-09 12:04 ` [PATCH net-next v2 14/14] ice: support up to 256 VF queues Przemek Kitszel
2026-10-10 12:16 ` sashiko-bot
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=sashiko-outbox-166505@kernel.org \
--to=sashiko-bot@kernel.org \
--cc=intel-wired-lan@lists.osuosl.org \
--cc=przemyslaw.kitszel@intel.com \
--cc=sashiko-reviews@lists.linux.dev \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox