diff options
| author | David Wei <dw@davidwei.uk> | 2026-01-15 09:25:53 +0100 |
|---|---|---|
| committer | Paolo Abeni <pabeni@redhat.com> | 2026-01-20 11:58:49 +0100 |
| commit | 804bf334d08aeceda1c39f4e26d7eda802b63a33 (patch) | |
| tree | 5263b4cfccd15ec1185db21ae444f2a33a029d0f /net | |
| parent | 0caa9a8ddec3bf87bffb0eb99635068ddddce35d (diff) | |
net: Proxy netdev_queue_get_dma_dev for leased queues
Extend netdev_queue_get_dma_dev to return the physical device of the
real rxq for DMA in case the queue was leased. This allows memory
providers like io_uring zero-copy or devmem to bind to the physically
leased rxq via virtual devices such as netkit.
Signed-off-by: David Wei <dw@davidwei.uk>
Co-developed-by: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Stanislav Fomichev <sdf@fomichev.me>
Reviewed-by: Nikolay Aleksandrov <razor@blackwall.org>
Link: https://patch.msgid.link/20260115082603.219152-7-daniel@iogearbox.net
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Diffstat (limited to 'net')
| -rw-r--r-- | net/core/netdev_queues.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/net/core/netdev_queues.c b/net/core/netdev_queues.c index fae92ee090c4..97acf6440829 100644 --- a/net/core/netdev_queues.c +++ b/net/core/netdev_queues.c @@ -9,16 +9,29 @@ * @dev: net_device * @idx: queue index * - * Get dma device for zero-copy operations to be used for this queue. + * Get dma device for zero-copy operations to be used for this queue. If the + * queue is leased to a physical queue, we retrieve the latter's dma device. * When such device is not available or valid, the function will return NULL. * * Return: Device or NULL on error */ struct device *netdev_queue_get_dma_dev(struct net_device *dev, int idx) { - const struct netdev_queue_mgmt_ops *queue_ops = dev->queue_mgmt_ops; + const struct netdev_queue_mgmt_ops *queue_ops; struct device *dma_dev; + if (idx < dev->real_num_rx_queues) { + struct netdev_rx_queue *rxq = __netif_get_rx_queue(dev, idx); + + if (rxq->lease) { + rxq = rxq->lease; + dev = rxq->dev; + idx = get_netdev_rx_queue_index(rxq); + } + } + + queue_ops = dev->queue_mgmt_ops; + if (queue_ops && queue_ops->ndo_queue_get_dma_dev) dma_dev = queue_ops->ndo_queue_get_dma_dev(dev, idx); else |
