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