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 Kicinskiget_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