> From: Madhuker Mythri <[email protected]>
> 
> 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: [email protected]
> 
> Signed-off-by: Madhuker Mythri <[email protected]>
> ---
>  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)

Reply via email to