xref: /linux-6.15/include/net/netdev_rx_queue.h (revision 2a502ff0)
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>
949e47a5bSJakub Kicinski 
1049e47a5bSJakub Kicinski /* This structure contains an instance of an RX queue. */
1149e47a5bSJakub Kicinski struct netdev_rx_queue {
1249e47a5bSJakub Kicinski 	struct xdp_rxq_info		xdp_rxq;
1349e47a5bSJakub Kicinski #ifdef CONFIG_RPS
1449e47a5bSJakub Kicinski 	struct rps_map __rcu		*rps_map;
1549e47a5bSJakub Kicinski 	struct rps_dev_flow_table __rcu	*rps_flow_table;
1649e47a5bSJakub Kicinski #endif
1749e47a5bSJakub Kicinski 	struct kobject			kobj;
1849e47a5bSJakub Kicinski 	struct net_device		*dev;
1949e47a5bSJakub Kicinski 	netdevice_tracker		dev_tracker;
2049e47a5bSJakub Kicinski 
2149e47a5bSJakub Kicinski #ifdef CONFIG_XDP_SOCKETS
2249e47a5bSJakub Kicinski 	struct xsk_buff_pool            *pool;
2349e47a5bSJakub Kicinski #endif
24*2a502ff0SAmritha Nambiar 	/* NAPI instance for the queue
25*2a502ff0SAmritha Nambiar 	 * Readers and writers must hold RTNL
26*2a502ff0SAmritha Nambiar 	 */
27*2a502ff0SAmritha Nambiar 	struct napi_struct		*napi;
2849e47a5bSJakub Kicinski } ____cacheline_aligned_in_smp;
2949e47a5bSJakub Kicinski 
3049e47a5bSJakub Kicinski /*
3149e47a5bSJakub Kicinski  * RX queue sysfs structures and functions.
3249e47a5bSJakub Kicinski  */
3349e47a5bSJakub Kicinski struct rx_queue_attribute {
3449e47a5bSJakub Kicinski 	struct attribute attr;
3549e47a5bSJakub Kicinski 	ssize_t (*show)(struct netdev_rx_queue *queue, char *buf);
3649e47a5bSJakub Kicinski 	ssize_t (*store)(struct netdev_rx_queue *queue,
3749e47a5bSJakub Kicinski 			 const char *buf, size_t len);
3849e47a5bSJakub Kicinski };
3949e47a5bSJakub Kicinski 
4049e47a5bSJakub Kicinski static inline struct netdev_rx_queue *
4149e47a5bSJakub Kicinski __netif_get_rx_queue(struct net_device *dev, unsigned int rxq)
4249e47a5bSJakub Kicinski {
4349e47a5bSJakub Kicinski 	return dev->_rx + rxq;
4449e47a5bSJakub Kicinski }
4549e47a5bSJakub Kicinski 
4649e47a5bSJakub Kicinski #ifdef CONFIG_SYSFS
4749e47a5bSJakub Kicinski static inline unsigned int
4849e47a5bSJakub Kicinski get_netdev_rx_queue_index(struct netdev_rx_queue *queue)
4949e47a5bSJakub Kicinski {
5049e47a5bSJakub Kicinski 	struct net_device *dev = queue->dev;
5149e47a5bSJakub Kicinski 	int index = queue - dev->_rx;
5249e47a5bSJakub Kicinski 
5349e47a5bSJakub Kicinski 	BUG_ON(index >= dev->num_rx_queues);
5449e47a5bSJakub Kicinski 	return index;
5549e47a5bSJakub Kicinski }
5649e47a5bSJakub Kicinski #endif
5749e47a5bSJakub Kicinski #endif
58