xref: /linux-6.15/include/net/netdev_rx_queue.h (revision 170aafe3)
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>
9*170aafe3SMina 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;
1949e47a5bSJakub Kicinski 	struct net_device		*dev;
2049e47a5bSJakub Kicinski 	netdevice_tracker		dev_tracker;
2149e47a5bSJakub Kicinski 
2249e47a5bSJakub Kicinski #ifdef CONFIG_XDP_SOCKETS
2349e47a5bSJakub Kicinski 	struct xsk_buff_pool            *pool;
2449e47a5bSJakub Kicinski #endif
252a502ff0SAmritha Nambiar 	/* NAPI instance for the queue
262a502ff0SAmritha Nambiar 	 * Readers and writers must hold RTNL
272a502ff0SAmritha Nambiar 	 */
282a502ff0SAmritha Nambiar 	struct napi_struct		*napi;
29*170aafe3SMina Almasry 	struct pp_memory_provider_params mp_params;
3049e47a5bSJakub Kicinski } ____cacheline_aligned_in_smp;
3149e47a5bSJakub Kicinski 
3249e47a5bSJakub Kicinski /*
3349e47a5bSJakub Kicinski  * RX queue sysfs structures and functions.
3449e47a5bSJakub Kicinski  */
3549e47a5bSJakub Kicinski struct rx_queue_attribute {
3649e47a5bSJakub Kicinski 	struct attribute attr;
3749e47a5bSJakub Kicinski 	ssize_t (*show)(struct netdev_rx_queue *queue, char *buf);
3849e47a5bSJakub Kicinski 	ssize_t (*store)(struct netdev_rx_queue *queue,
3949e47a5bSJakub Kicinski 			 const char *buf, size_t len);
4049e47a5bSJakub Kicinski };
4149e47a5bSJakub Kicinski 
4249e47a5bSJakub Kicinski static inline struct netdev_rx_queue *
4349e47a5bSJakub Kicinski __netif_get_rx_queue(struct net_device *dev, unsigned int rxq)
4449e47a5bSJakub Kicinski {
4549e47a5bSJakub Kicinski 	return dev->_rx + rxq;
4649e47a5bSJakub Kicinski }
4749e47a5bSJakub Kicinski 
4849e47a5bSJakub Kicinski #ifdef CONFIG_SYSFS
4949e47a5bSJakub Kicinski static inline unsigned int
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 }
5849e47a5bSJakub Kicinski #endif
597c88f865SMina Almasry 
607c88f865SMina Almasry int netdev_rx_queue_restart(struct net_device *dev, unsigned int rxq);
617c88f865SMina Almasry 
6249e47a5bSJakub Kicinski #endif
63