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 /** 8 * netdev_queue_get_dma_dev() - get dma device for zero-copy operations 9 * @dev: net_device 10 * @idx: queue index 11 * 12 * Get dma device for zero-copy operations to be used for this queue. If the 13 * queue is leased to a physical queue, we retrieve the latter's dma device. 14 * When such device is not available or valid, the function will return NULL. 15 * 16 * Return: Device or NULL on error 17 */ 18 struct device *netdev_queue_get_dma_dev(struct net_device *dev, int idx) 19 { 20 const struct netdev_queue_mgmt_ops *queue_ops; 21 struct device *dma_dev; 22 23 if (idx < dev->real_num_rx_queues) { 24 struct netdev_rx_queue *rxq = __netif_get_rx_queue(dev, idx); 25 26 if (rxq->lease) { 27 rxq = rxq->lease; 28 dev = rxq->dev; 29 idx = get_netdev_rx_queue_index(rxq); 30 } 31 } 32 33 queue_ops = dev->queue_mgmt_ops; 34 35 if (queue_ops && queue_ops->ndo_queue_get_dma_dev) 36 dma_dev = queue_ops->ndo_queue_get_dma_dev(dev, idx); 37 else 38 dma_dev = dev->dev.parent; 39 40 return dma_dev && dma_dev->dma_mask ? dma_dev : NULL; 41 } 42 43 bool netdev_can_create_queue(const struct net_device *dev, 44 struct netlink_ext_ack *extack) 45 { 46 if (dev->dev.parent) { 47 NL_SET_ERR_MSG(extack, "Device is not a virtual device"); 48 return false; 49 } 50 if (!dev->queue_mgmt_ops || 51 !dev->queue_mgmt_ops->ndo_queue_create) { 52 NL_SET_ERR_MSG(extack, "Device does not support queue creation"); 53 return false; 54 } 55 if (dev->real_num_rx_queues < 1 || 56 dev->real_num_tx_queues < 1) { 57 NL_SET_ERR_MSG(extack, "Device must have at least one real queue"); 58 return false; 59 } 60 return true; 61 } 62 63 bool netdev_can_lease_queue(const struct net_device *dev, 64 struct netlink_ext_ack *extack) 65 { 66 if (!dev->dev.parent) { 67 NL_SET_ERR_MSG(extack, "Lease device is a virtual device"); 68 return false; 69 } 70 if (!netif_device_present(dev)) { 71 NL_SET_ERR_MSG(extack, "Lease device has been removed from the system"); 72 return false; 73 } 74 if (!dev->queue_mgmt_ops) { 75 NL_SET_ERR_MSG(extack, "Lease device does not support queue management operations"); 76 return false; 77 } 78 return true; 79 } 80 81 bool netdev_queue_busy(struct net_device *dev, int idx, 82 struct netlink_ext_ack *extack) 83 { 84 if (netif_rxq_is_leased(dev, idx)) { 85 NL_SET_ERR_MSG(extack, "Lease device queue is already leased"); 86 return true; 87 } 88 if (xsk_get_pool_from_qid(dev, idx)) { 89 NL_SET_ERR_MSG(extack, "Lease device queue in use by AF_XDP"); 90 return true; 91 } 92 if (netif_rxq_has_mp(dev, idx)) { 93 NL_SET_ERR_MSG(extack, "Lease device queue in use by memory provider"); 94 return true; 95 } 96 return false; 97 } 98