1*49e47a5bSJakub Kicinski /* SPDX-License-Identifier: GPL-2.0 */ 2*49e47a5bSJakub Kicinski #ifndef _LINUX_NETDEV_RX_QUEUE_H 3*49e47a5bSJakub Kicinski #define _LINUX_NETDEV_RX_QUEUE_H 4*49e47a5bSJakub Kicinski 5*49e47a5bSJakub Kicinski #include <linux/kobject.h> 6*49e47a5bSJakub Kicinski #include <linux/netdevice.h> 7*49e47a5bSJakub Kicinski #include <linux/sysfs.h> 8*49e47a5bSJakub Kicinski #include <net/xdp.h> 9*49e47a5bSJakub Kicinski 10*49e47a5bSJakub Kicinski /* This structure contains an instance of an RX queue. */ 11*49e47a5bSJakub Kicinski struct netdev_rx_queue { 12*49e47a5bSJakub Kicinski struct xdp_rxq_info xdp_rxq; 13*49e47a5bSJakub Kicinski #ifdef CONFIG_RPS 14*49e47a5bSJakub Kicinski struct rps_map __rcu *rps_map; 15*49e47a5bSJakub Kicinski struct rps_dev_flow_table __rcu *rps_flow_table; 16*49e47a5bSJakub Kicinski #endif 17*49e47a5bSJakub Kicinski struct kobject kobj; 18*49e47a5bSJakub Kicinski struct net_device *dev; 19*49e47a5bSJakub Kicinski netdevice_tracker dev_tracker; 20*49e47a5bSJakub Kicinski 21*49e47a5bSJakub Kicinski #ifdef CONFIG_XDP_SOCKETS 22*49e47a5bSJakub Kicinski struct xsk_buff_pool *pool; 23*49e47a5bSJakub Kicinski #endif 24*49e47a5bSJakub Kicinski } ____cacheline_aligned_in_smp; 25*49e47a5bSJakub Kicinski 26*49e47a5bSJakub Kicinski /* 27*49e47a5bSJakub Kicinski * RX queue sysfs structures and functions. 28*49e47a5bSJakub Kicinski */ 29*49e47a5bSJakub Kicinski struct rx_queue_attribute { 30*49e47a5bSJakub Kicinski struct attribute attr; 31*49e47a5bSJakub Kicinski ssize_t (*show)(struct netdev_rx_queue *queue, char *buf); 32*49e47a5bSJakub Kicinski ssize_t (*store)(struct netdev_rx_queue *queue, 33*49e47a5bSJakub Kicinski const char *buf, size_t len); 34*49e47a5bSJakub Kicinski }; 35*49e47a5bSJakub Kicinski 36*49e47a5bSJakub Kicinski static inline struct netdev_rx_queue * __netif_get_rx_queue(struct net_device * dev,unsigned int rxq)37*49e47a5bSJakub Kicinski__netif_get_rx_queue(struct net_device *dev, unsigned int rxq) 38*49e47a5bSJakub Kicinski { 39*49e47a5bSJakub Kicinski return dev->_rx + rxq; 40*49e47a5bSJakub Kicinski } 41*49e47a5bSJakub Kicinski 42*49e47a5bSJakub Kicinski #ifdef CONFIG_SYSFS 43*49e47a5bSJakub Kicinski static inline unsigned int get_netdev_rx_queue_index(struct netdev_rx_queue * queue)44*49e47a5bSJakub Kicinskiget_netdev_rx_queue_index(struct netdev_rx_queue *queue) 45*49e47a5bSJakub Kicinski { 46*49e47a5bSJakub Kicinski struct net_device *dev = queue->dev; 47*49e47a5bSJakub Kicinski int index = queue - dev->_rx; 48*49e47a5bSJakub Kicinski 49*49e47a5bSJakub Kicinski BUG_ON(index >= dev->num_rx_queues); 50*49e47a5bSJakub Kicinski return index; 51*49e47a5bSJakub Kicinski } 52*49e47a5bSJakub Kicinski #endif 53*49e47a5bSJakub Kicinski #endif 54