> -----Original Message----- > From: Stephen Hemminger [mailto:step...@networkplumber.org] > Sent: Wednesday, July 19, 2017 2:53 PM > To: KY Srinivasan <k...@microsoft.com>; Haiyang Zhang > <haiya...@microsoft.com>; Stephen Hemminger <sthem...@microsoft.com> > Cc: de...@linuxdriverproject.org; netdev@vger.kernel.org > Subject: [PATCH net-next 3/8] netvsc: change order of steps in setting > queues > > This fixes the error unwind logic for incorrect number of queues. > If netif_set_real_num_XX_queues failed then rndis_filter_device_add > would have been called twice. Since input arguments are already > ranged checked this is a hypothetical only problem, not possible > in actual code. > > Signed-off-by: Stephen Hemminger <sthem...@microsoft.com> > --- > drivers/net/hyperv/netvsc_drv.c | 8 +++----- > 1 file changed, 3 insertions(+), 5 deletions(-) > > diff --git a/drivers/net/hyperv/netvsc_drv.c > b/drivers/net/hyperv/netvsc_drv.c > index e8e82a6a4b1a..91637336d1fb 100644 > --- a/drivers/net/hyperv/netvsc_drv.c > +++ b/drivers/net/hyperv/netvsc_drv.c > @@ -724,17 +724,15 @@ static int netvsc_set_queues(struct net_device > *net, struct hv_device *dev, > device_info.ring_size = ring_size; > device_info.max_num_vrss_chns = num_chn; > > - ret = rndis_filter_device_add(dev, &device_info); > - if (ret) > - return ret; > - > ret = netif_set_real_num_tx_queues(net, num_chn); > if (ret) > return ret; > > ret = netif_set_real_num_rx_queues(net, num_chn); > + if (ret) > + return ret; > > - return ret; > + return rndis_filter_device_add(dev, &device_info); > }
The existing code has a bug here. After rndis_filter_device_add(), the number of queues granted by the host may change: net_device->num_chn = 1 + init_packet->msg.v5_msg.subchn_comp.num_subchannels; So we should call rndis_filter_device_add() first, then assign net_device->num_chn to "real number tx queues". Thanks, - Haiyang