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