1 // SPDX-License-Identifier: GPL-2.0-or-later 2 3 #include <net/netdev_queues.h> 4 #include <net/netdev_rx_queue.h> 5 #include <net/xdp_sock_drv.h> 6 7 #include "dev.h" 8 9 static struct device * 10 __netdev_queue_get_dma_dev(struct net_device *dev, unsigned int idx) 11 { 12 const struct netdev_queue_mgmt_ops *queue_ops = dev->queue_mgmt_ops; 13 struct device *dma_dev; 14 15 if (queue_ops && queue_ops->ndo_queue_get_dma_dev) 16 dma_dev = queue_ops->ndo_queue_get_dma_dev(dev, idx); 17 else 18 dma_dev = dev->dev.parent; 19 20 return dma_dev && dma_dev->dma_mask ? dma_dev : NULL; 21 } 22 23 /** 24 * netdev_queue_get_dma_dev() - get dma device for zero-copy operations 25 * @dev: net_device 26 * @idx: queue index 27 * @type: queue type (RX or TX) 28 * 29 * Get dma device for zero-copy operations to be used for this queue. If 30 * the queue is an RX queue leased from a physical queue, we retrieve the 31 * physical queue's dma device. When the dma device is not available or 32 * valid, the function will return NULL. 33 * 34 * Return: Device or NULL on error 35 */ 36 struct device *netdev_queue_get_dma_dev(struct net_device *dev, 37 unsigned int idx, 38 enum netdev_queue_type type) 39 { 40 struct net_device *orig_dev = dev; 41 struct device *dma_dev; 42 43 /* Only RX side supports queue leasing today. */ 44 if (type != NETDEV_QUEUE_TYPE_RX || !netif_rxq_is_leased(dev, idx)) 45 return __netdev_queue_get_dma_dev(dev, idx); 46 47 if (!netif_get_rx_queue_lease_locked(&dev, &idx)) 48 return NULL; 49 50 dma_dev = __netdev_queue_get_dma_dev(dev, idx); 51 netif_put_rx_queue_lease_locked(orig_dev, dev); 52 return dma_dev; 53 } 54 55 bool netdev_can_create_queue(const struct net_device *dev, 56 struct netlink_ext_ack *extack) 57 { 58 if (dev->dev.parent) { 59 NL_SET_ERR_MSG(extack, "Device is not a virtual device"); 60 return false; 61 } 62 if (!dev->queue_mgmt_ops || 63 !dev->queue_mgmt_ops->ndo_queue_create) { 64 NL_SET_ERR_MSG(extack, "Device does not support queue creation"); 65 return false; 66 } 67 if (dev->real_num_rx_queues < 1 || 68 dev->real_num_tx_queues < 1) { 69 NL_SET_ERR_MSG(extack, "Device must have at least one real queue"); 70 return false; 71 } 72 return true; 73 } 74 75 bool netdev_can_lease_queue(const struct net_device *dev, 76 struct netlink_ext_ack *extack) 77 { 78 if (!dev->dev.parent) { 79 NL_SET_ERR_MSG(extack, "Lease device is a virtual device"); 80 return false; 81 } 82 if (!netif_device_present(dev)) { 83 NL_SET_ERR_MSG(extack, "Lease device has been removed from the system"); 84 return false; 85 } 86 if (!dev->queue_mgmt_ops) { 87 NL_SET_ERR_MSG(extack, "Lease device does not support queue management operations"); 88 return false; 89 } 90 return true; 91 } 92 93 bool netdev_queue_busy(struct net_device *dev, unsigned int idx, 94 enum netdev_queue_type type, 95 struct netlink_ext_ack *extack) 96 { 97 if (xsk_get_pool_from_qid(dev, idx)) { 98 NL_SET_ERR_MSG(extack, "Device queue in use by AF_XDP"); 99 return true; 100 } 101 if (type == NETDEV_QUEUE_TYPE_TX) 102 return false; 103 if (netif_rxq_is_leased(dev, idx)) { 104 NL_SET_ERR_MSG(extack, "Device queue in use due to queue leasing"); 105 return true; 106 } 107 if (netif_rxq_has_mp(dev, idx)) { 108 NL_SET_ERR_MSG(extack, "Device queue in use by memory provider"); 109 return true; 110 } 111 return false; 112 } 113