IB/hfi1: allocate dummy net_device dynamically
authorBreno Leitao <leitao@debian.org>
Tue, 30 Apr 2024 16:22:11 +0000 (09:22 -0700)
committerJakub Kicinski <kuba@kernel.org>
Fri, 3 May 2024 01:20:17 +0000 (18:20 -0700)
Embedding net_device into structures prohibits the usage of flexible
arrays in the net_device structure. For more details, see the discussion
at [1].

Un-embed the net_device from struct hfi1_netdev_rx by converting it
into a pointer. Then use the leverage alloc_netdev() to allocate the
net_device object at hfi1_alloc_rx().

[1] https://lore.kernel.org/all/20240229225910.79e224cf@kernel.org/

Acked-by: Dennis Dalessandro <dennis.dalessandro@cornelisnetworks.com>
Signed-off-by: Breno Leitao <leitao@debian.org>
Acked-by: Leon Romanovsky <leon@kernel.org>
Link: https://lore.kernel.org/r/20240430162213.746492-1-leitao@debian.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/infiniband/hw/hfi1/netdev.h
drivers/infiniband/hw/hfi1/netdev_rx.c

index 8aa074670a9c8c44383e5d38d593afbb1f01a835..07c8f77c9181756fce8c529c5fb1a43e745ec801 100644 (file)
@@ -49,7 +49,7 @@ struct hfi1_netdev_rxq {
  *             When 0 receive queues will be freed.
  */
 struct hfi1_netdev_rx {
-       struct net_device rx_napi;
+       struct net_device *rx_napi;
        struct hfi1_devdata *dd;
        struct hfi1_netdev_rxq *rxq;
        int num_rx_q;
index 720d4c85c9c93fd09b87143e53e394270725fb8a..8608044203bb909dbd6a1952c3d8d76021c9e2ba 100644 (file)
@@ -188,7 +188,7 @@ static int hfi1_netdev_rxq_init(struct hfi1_netdev_rx *rx)
        int i;
        int rc;
        struct hfi1_devdata *dd = rx->dd;
-       struct net_device *dev = &rx->rx_napi;
+       struct net_device *dev = rx->rx_napi;
 
        rx->num_rx_q = dd->num_netdev_contexts;
        rx->rxq = kcalloc_node(rx->num_rx_q, sizeof(*rx->rxq),
@@ -360,7 +360,11 @@ int hfi1_alloc_rx(struct hfi1_devdata *dd)
        if (!rx)
                return -ENOMEM;
        rx->dd = dd;
-       init_dummy_netdev(&rx->rx_napi);
+       rx->rx_napi = alloc_netdev_dummy(0);
+       if (!rx->rx_napi) {
+               kfree(rx);
+               return -ENOMEM;
+       }
 
        xa_init(&rx->dev_tbl);
        atomic_set(&rx->enabled, 0);
@@ -374,6 +378,7 @@ void hfi1_free_rx(struct hfi1_devdata *dd)
 {
        if (dd->netdev_rx) {
                dd_dev_info(dd, "hfi1 rx freed\n");
+               free_netdev(dd->netdev_rx->rx_napi);
                kfree(dd->netdev_rx);
                dd->netdev_rx = NULL;
        }