[EXTERNAL] [PATCH v2] net/netvsc: fix race condition in RNDIS command execution
Long Li
longli at microsoft.com
Sat Jan 17 00:10:55 CET 2026
> From: Madhuker Mythri <madhukar.mythri at gmail.com>
>
> When multiple threads issue RNDIS command requests (such as device info
> queries and link status checks) simultaneously, command failures can occur
> due to concurrent access to shared resources in the RNDIS execution path.
>
> Add a spinlock to serialize RNDIS command execution and prevent data
> corruption.
This is not the correct approach as you are only protecting RNDIS_QUERY_CMPLT over RNDIS transactions. The call to hn_rndis_execute() can still fail due to other possible pending transactions over RNDIS.
Thanks,
Long
>
> Fixes: 4e9c73e96e83 ("net/netvsc: add Hyper-V network device")
> Cc: stable at dpdk.org
>
> Signed-off-by: Madhuker Mythri <madhukar.mythri at gmail.com>
> ---
> drivers/net/netvsc/hn_ethdev.c | 1 +
> drivers/net/netvsc/hn_rndis.c | 2 ++
> drivers/net/netvsc/hn_var.h | 1 +
> 3 files changed, 4 insertions(+)
>
> diff --git a/drivers/net/netvsc/hn_ethdev.c b/drivers/net/netvsc/hn_ethdev.c
> index 6584819f4f..b525e287fa 100644
> --- a/drivers/net/netvsc/hn_ethdev.c
> +++ b/drivers/net/netvsc/hn_ethdev.c
> @@ -1310,6 +1310,7 @@ eth_hn_dev_init(struct rte_eth_dev *eth_dev)
> PMD_INIT_FUNC_TRACE();
>
> rte_spinlock_init(&hv->hotadd_lock);
> + rte_spinlock_init(&hv->cmd_lock);
> LIST_INIT(&hv->hotadd_list);
>
> vmbus = container_of(device, struct rte_vmbus_device, device); diff --
> git a/drivers/net/netvsc/hn_rndis.c b/drivers/net/netvsc/hn_rndis.c index
> 7c54eebcef..8a0716df89 100644
> --- a/drivers/net/netvsc/hn_rndis.c
> +++ b/drivers/net/netvsc/hn_rndis.c
> @@ -500,8 +500,10 @@ hn_rndis_query(struct hn_data *hv, uint32_t oid,
> /* Input data immediately follows RNDIS query. */
> memcpy(req + 1, idata, idlen);
>
> + rte_spinlock_lock(&hv->cmd_lock);
> error = hn_rndis_execute(hv, rid, req, reqlen,
> comp, comp_len, RNDIS_QUERY_CMPLT);
> + rte_spinlock_unlock(&hv->cmd_lock);
>
> if (error)
> goto done;
> diff --git a/drivers/net/netvsc/hn_var.h b/drivers/net/netvsc/hn_var.h index
> 17c1d5d07b..66ed186c0a 100644
> --- a/drivers/net/netvsc/hn_var.h
> +++ b/drivers/net/netvsc/hn_var.h
> @@ -179,6 +179,7 @@ struct hn_data {
> struct vmbus_channel *channels[HN_MAX_CHANNELS];
>
> rte_spinlock_t hotadd_lock;
> + rte_spinlock_t cmd_lock;
> LIST_HEAD(hotadd_list, hv_hotadd_context) hotadd_list; };
>
> --
> 2.50.1 (Apple Git-155)
More information about the stable
mailing list