Commit 1bdab0ee authored by Breno Leitao's avatar Breno Leitao Committed by David S. Miller
Browse files

net: ipa: allocate dummy net_device dynamically

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: default avatarBreno Leitao <leitao@debian.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b209bd6d
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -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);
}

+1 −1
Original line number Diff line number Diff line
@@ -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 */
};

/**