net: ipa: allocate dummy net_device dynamically
authorBreno Leitao <leitao@debian.org>
Mon, 22 Apr 2024 12:38:59 +0000 (05:38 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 24 Apr 2024 11:00:16 +0000 (12:00 +0100)
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 the private struct by converting it
into a pointer. Then use the leverage the new alloc_netdev_dummy()
helper to allocate and initialize dummy devices.

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

Signed-off-by: Breno Leitao <leitao@debian.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ipa/gsi.c
drivers/net/ipa/gsi.h

index 6c8feb640a97e402a7b41b73f0626ec00dc0a159..4c3227e77898cf281d7e8733268776657aec7795 100644 (file)
@@ -1728,10 +1728,10 @@ static int gsi_channel_setup_one(struct gsi *gsi, u32 channel_id)
        gsi_channel_program(channel, true);
 
        if (channel->toward_ipa)
-               netif_napi_add_tx(&gsi->dummy_dev, &channel->napi,
+               netif_napi_add_tx(gsi->dummy_dev, &channel->napi,
                                  gsi_channel_poll);
        else
-               netif_napi_add(&gsi->dummy_dev, &channel->napi,
+               netif_napi_add(gsi->dummy_dev, &channel->napi,
                               gsi_channel_poll);
 
        return 0;
@@ -2367,12 +2367,14 @@ int gsi_init(struct gsi *gsi, struct platform_device *pdev,
        /* GSI uses NAPI on all channels.  Create a dummy network device
         * for the channel NAPI contexts to be associated with.
         */
-       init_dummy_netdev(&gsi->dummy_dev);
+       gsi->dummy_dev = alloc_netdev_dummy(0);
+       if (!gsi->dummy_dev)
+               return -ENOMEM;
        init_completion(&gsi->completion);
 
        ret = gsi_reg_init(gsi, pdev);
        if (ret)
-               return ret;
+               goto err_reg_exit;
 
        ret = gsi_irq_init(gsi, pdev);  /* No matching exit required */
        if (ret)
@@ -2387,6 +2389,7 @@ int gsi_init(struct gsi *gsi, struct platform_device *pdev,
        return 0;
 
 err_reg_exit:
+       free_netdev(gsi->dummy_dev);
        gsi_reg_exit(gsi);
 
        return ret;
@@ -2397,6 +2400,7 @@ void gsi_exit(struct gsi *gsi)
 {
        mutex_destroy(&gsi->mutex);
        gsi_channel_exit(gsi);
+       free_netdev(gsi->dummy_dev);
        gsi_reg_exit(gsi);
 }
 
index 833135b35380f544f1edd0cffb45aab2fe5d6b09..9d8e05d950e34f6f599c29256b645dcc649a98d6 100644 (file)
@@ -151,7 +151,7 @@ struct gsi {
        struct mutex mutex;             /* protects commands, programming */
        struct gsi_channel channel[GSI_CHANNEL_COUNT_MAX];
        struct gsi_evt_ring evt_ring[GSI_EVT_RING_COUNT_MAX];
-       struct net_device dummy_dev;    /* needed for NAPI */
+       struct net_device *dummy_dev;   /* needed for NAPI */
 };
 
 /**