Re: [PATCH v3] hv_netvsc: Allocate rx indirection table size dynamically
From: Simon Horman <hidden>
Date: 2023-05-26 08:15:42
Also in:
linux-hyperv, lkml
On Thu, May 25, 2023 at 11:02:29PM -0700, Shradha Gupta wrote:
Allocate the size of rx indirection table dynamically in netvsc from the value of size provided by OID_GEN_RECEIVE_SCALE_CAPABILITIES query instead of using a constant value of ITAB_NUM. Signed-off-by: Shradha Gupta <redacted>
quoted hunk ↗ jump to hunk
@@ -1548,6 +1549,17 @@ struct netvsc_device *rndis_filter_device_add(struct hv_device *dev, if (ret || rsscap.num_recv_que < 2) goto out; + if (rsscap.num_indirect_tabent && + rsscap.num_indirect_tabent <= ITAB_NUM_MAX) + ndc->rx_table_sz = rsscap.num_indirect_tabent; + else + ndc->rx_table_sz = ITAB_NUM; + + ndc->rx_table = kcalloc(ndc->rx_table_sz, sizeof(u16), + GFP_KERNEL);
nit: the above could fit on a single line.
+ if (!ndc->rx_table)
I think you need to set ret to an error value here, as err_dev_remv will call return ERR_PTR(ret).
quoted hunk ↗ jump to hunk
+ goto err_dev_remv; + /* This guarantees that num_possible_rss_qs <= num_online_cpus */ num_possible_rss_qs = min_t(u32, num_online_cpus(), rsscap.num_recv_que);@@ -1558,7 +1570,7 @@ struct netvsc_device *rndis_filter_device_add(struct hv_device *dev, net_device->num_chn = min(net_device->max_chn, device_info->num_chn); if (!netif_is_rxfh_configured(net)) { - for (i = 0; i < ITAB_NUM; i++) + for (i = 0; i < ndc->rx_table_sz; i++) ndc->rx_table[i] = ethtool_rxfh_indir_default( i, net_device->num_chn); }@@ -1596,11 +1608,18 @@ void rndis_filter_device_remove(struct hv_device *dev, struct netvsc_device *net_dev) { struct rndis_device *rndis_dev = net_dev->extension; + struct net_device *net = hv_get_drvdata(dev); + struct net_device_context *ndc = netdev_priv(net);
nit: Please use reverse xmas tree order - longest line to shortest -
for local variable declaration sin networking code.
struct rndis_device *rndis_dev = net_dev->extension;
struct net_device *net = hv_get_drvdata(dev);
struct net_device_context *ndc;
ndc = netdev_priv(net);
/* Halt and release the rndis device */ rndis_filter_halt_device(net_dev, rndis_dev); netvsc_device_remove(dev); + + ndc->rx_table_sz = 0; + kfree(ndc->rx_table); + ndc->rx_table = NULL; + } int rndis_filter_open(struct netvsc_device *nvdev)
-- pw-bot: cr