[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