xref: /linux-6.15/include/net/netdev_rx_queue.h (revision 310ae9eb)
149e47a5bSJakub Kicinski /* SPDX-License-Identifier: GPL-2.0 */
249e47a5bSJakub Kicinski #ifndef _LINUX_NETDEV_RX_QUEUE_H
349e47a5bSJakub Kicinski #define _LINUX_NETDEV_RX_QUEUE_H
449e47a5bSJakub Kicinski 
549e47a5bSJakub Kicinski #include <linux/kobject.h>
649e47a5bSJakub Kicinski #include <linux/netdevice.h>
749e47a5bSJakub Kicinski #include <linux/sysfs.h>
849e47a5bSJakub Kicinski #include <net/xdp.h>
9170aafe3SMina Almasry #include <net/page_pool/types.h>
1049e47a5bSJakub Kicinski 
1149e47a5bSJakub Kicinski /* This structure contains an instance of an RX queue. */
1249e47a5bSJakub Kicinski struct netdev_rx_queue {
1349e47a5bSJakub Kicinski 	struct xdp_rxq_info		xdp_rxq;
1449e47a5bSJakub Kicinski #ifdef CONFIG_RPS
1549e47a5bSJakub Kicinski 	struct rps_map __rcu		*rps_map;
1649e47a5bSJakub Kicinski 	struct rps_dev_flow_table __rcu	*rps_flow_table;
1749e47a5bSJakub Kicinski #endif
1849e47a5bSJakub Kicinski 	struct kobject			kobj;
19b7ecc1deSAntoine Tenart 	const struct attribute_group	**groups;
2049e47a5bSJakub Kicinski 	struct net_device		*dev;
2149e47a5bSJakub Kicinski 	netdevice_tracker		dev_tracker;
2249e47a5bSJakub Kicinski 
2349e47a5bSJakub Kicinski #ifdef CONFIG_XDP_SOCKETS
2449e47a5bSJakub Kicinski 	struct xsk_buff_pool            *pool;
2549e47a5bSJakub Kicinski #endif
262a502ff0SAmritha Nambiar 	/* NAPI instance for the queue
27*310ae9ebSJakub Kicinski 	 * "ops protected", see comment about net_device::lock
282a502ff0SAmritha Nambiar 	 */
292a502ff0SAmritha Nambiar 	struct napi_struct		*napi;
30170aafe3SMina Almasry 	struct pp_memory_provider_params mp_params;
3149e47a5bSJakub Kicinski } ____cacheline_aligned_in_smp;
3249e47a5bSJakub Kicinski 
3349e47a5bSJakub Kicinski /*
3449e47a5bSJakub Kicinski  * RX queue sysfs structures and functions.
3549e47a5bSJakub Kicinski  */
3649e47a5bSJakub Kicinski struct rx_queue_attribute {
3749e47a5bSJakub Kicinski 	struct attribute attr;
3849e47a5bSJakub Kicinski 	ssize_t (*show)(struct netdev_rx_queue *queue, char *buf);
3949e47a5bSJakub Kicinski 	ssize_t (*store)(struct netdev_rx_queue *queue,
4049e47a5bSJakub Kicinski 			 const char *buf, size_t len);
4149e47a5bSJakub Kicinski };
4249e47a5bSJakub Kicinski 
4349e47a5bSJakub Kicinski static inline struct netdev_rx_queue *
__netif_get_rx_queue(struct net_device * dev,unsigned int rxq)4449e47a5bSJakub Kicinski __netif_get_rx_queue(struct net_device *dev, unsigned int rxq)
4549e47a5bSJakub Kicinski {
4649e47a5bSJakub Kicinski 	return dev->_rx + rxq;
4749e47a5bSJakub Kicinski }
4849e47a5bSJakub Kicinski 
4949e47a5bSJakub Kicinski static inline unsigned int
get_netdev_rx_queue_index(struct netdev_rx_queue * queue)5049e47a5bSJakub Kicinski get_netdev_rx_queue_index(struct netdev_rx_queue *queue)
5149e47a5bSJakub Kicinski {
5249e47a5bSJakub Kicinski 	struct net_device *dev = queue->dev;
5349e47a5bSJakub Kicinski 	int index = queue - dev->_rx;
5449e47a5bSJakub Kicinski 
5549e47a5bSJakub Kicinski 	BUG_ON(index >= dev->num_rx_queues);
5649e47a5bSJakub Kicinski 	return index;
5749e47a5bSJakub Kicinski }
587c88f865SMina Almasry 
597c88f865SMina Almasry int netdev_rx_queue_restart(struct net_device *dev, unsigned int rxq);
607c88f865SMina Almasry 
6149e47a5bSJakub Kicinski #endif
62