Commit 606048cb authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

net: designate XSK pool pointers in queues as "ops protected"



Read accesses go via xsk_get_pool_from_qid(), the call coming
from the core and gve look safe (other "ops locked" drivers
don't support XSK).

Write accesses go via xsk_reg_pool_at_qid() and xsk_clear_pool_at_qid().
Former is already under the ops lock, latter is not (both coming from
the workqueue via xp_clear_dev() and NETDEV_UNREGISTER via xsk_notifier()).

Acked-by: default avatarStanislav Fomichev <sdf@fomichev.me>
Signed-off-by: default avatarStanislav Fomichev <sdf@fomichev.me>
Link: https://patch.msgid.link/20250408195956.412733-3-kuba@kernel.org


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent a82dc19d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -688,6 +688,7 @@ struct netdev_queue {
	/* Subordinate device that the queue has been assigned to */
	struct net_device	*sb_dev;
#ifdef CONFIG_XDP_SOCKETS
	/* "ops protected", see comment about net_device::lock */
	struct xsk_buff_pool    *pool;
#endif

+3 −3
Original line number Diff line number Diff line
@@ -20,12 +20,12 @@ struct netdev_rx_queue {
	struct net_device		*dev;
	netdevice_tracker		dev_tracker;

	/* All fields below are "ops protected",
	 * see comment about net_device::lock
	 */
#ifdef CONFIG_XDP_SOCKETS
	struct xsk_buff_pool            *pool;
#endif
	/* NAPI instance for the queue
	 * "ops protected", see comment about net_device::lock
	 */
	struct napi_struct		*napi;
	struct pp_memory_provider_params mp_params;
} ____cacheline_aligned_in_smp;
+5 −1
Original line number Diff line number Diff line
@@ -266,13 +266,17 @@ int xp_assign_dev_shared(struct xsk_buff_pool *pool, struct xdp_sock *umem_xs,

void xp_clear_dev(struct xsk_buff_pool *pool)
{
	struct net_device *netdev = pool->netdev;

	if (!pool->netdev)
		return;

	netdev_lock_ops(netdev);
	xp_disable_drv_zc(pool);
	xsk_clear_pool_at_qid(pool->netdev, pool->queue_id);
	dev_put(pool->netdev);
	pool->netdev = NULL;
	netdev_unlock_ops(netdev);
	dev_put(netdev);
}

static void xp_release_deferred(struct work_struct *work)