mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00

Rx/tx queues embed their own kobject for registering their per-queue sysfs files. The issue is they're using the kobject default groups for this and entirely rely on the kobject refcounting for releasing their sysfs paths. In order to remove rtnl_trylock calls we need sysfs files not to rely on their associated kobject refcounting for their release. Thus we here move queues sysfs files from the kobject default groups to their own groups which can be removed separately. Signed-off-by: Antoine Tenart <atenart@kernel.org> Link: https://patch.msgid.link/20250204170314.146022-3-atenart@kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
62 lines
1.5 KiB
C
62 lines
1.5 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _LINUX_NETDEV_RX_QUEUE_H
|
|
#define _LINUX_NETDEV_RX_QUEUE_H
|
|
|
|
#include <linux/kobject.h>
|
|
#include <linux/netdevice.h>
|
|
#include <linux/sysfs.h>
|
|
#include <net/xdp.h>
|
|
#include <net/page_pool/types.h>
|
|
|
|
/* This structure contains an instance of an RX queue. */
|
|
struct netdev_rx_queue {
|
|
struct xdp_rxq_info xdp_rxq;
|
|
#ifdef CONFIG_RPS
|
|
struct rps_map __rcu *rps_map;
|
|
struct rps_dev_flow_table __rcu *rps_flow_table;
|
|
#endif
|
|
struct kobject kobj;
|
|
const struct attribute_group **groups;
|
|
struct net_device *dev;
|
|
netdevice_tracker dev_tracker;
|
|
|
|
#ifdef CONFIG_XDP_SOCKETS
|
|
struct xsk_buff_pool *pool;
|
|
#endif
|
|
/* NAPI instance for the queue
|
|
* Readers and writers must hold RTNL
|
|
*/
|
|
struct napi_struct *napi;
|
|
struct pp_memory_provider_params mp_params;
|
|
} ____cacheline_aligned_in_smp;
|
|
|
|
/*
|
|
* RX queue sysfs structures and functions.
|
|
*/
|
|
struct rx_queue_attribute {
|
|
struct attribute attr;
|
|
ssize_t (*show)(struct netdev_rx_queue *queue, char *buf);
|
|
ssize_t (*store)(struct netdev_rx_queue *queue,
|
|
const char *buf, size_t len);
|
|
};
|
|
|
|
static inline struct netdev_rx_queue *
|
|
__netif_get_rx_queue(struct net_device *dev, unsigned int rxq)
|
|
{
|
|
return dev->_rx + rxq;
|
|
}
|
|
|
|
static inline unsigned int
|
|
get_netdev_rx_queue_index(struct netdev_rx_queue *queue)
|
|
{
|
|
struct net_device *dev = queue->dev;
|
|
int index = queue - dev->_rx;
|
|
|
|
BUG_ON(index >= dev->num_rx_queues);
|
|
return index;
|
|
}
|
|
|
|
int netdev_rx_queue_restart(struct net_device *dev, unsigned int rxq);
|
|
|
|
#endif
|