mirror of
https://gitee.com/bianbu-linux/linux-6.6
synced 2025-07-06 00:13:38 -04:00
rhashtable: Introduce rhashtable_walk_*
Some existing rhashtable users get too intimate with it by walking the buckets directly. This prevents us from easily changing the internals of rhashtable. This patch adds the helpers rhashtable_walk_init/exit/start/next/stop which will replace these custom walkers. They are meant to be usable for both procfs seq_file walks as well as walking by a netlink dump. The iterator structure should fit inside a netlink dump cb structure, with at least one element to spare. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
28134a53d6
commit
f2dba9c6ff
2 changed files with 198 additions and 0 deletions
|
@ -18,6 +18,7 @@
|
|||
#ifndef _LINUX_RHASHTABLE_H
|
||||
#define _LINUX_RHASHTABLE_H
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/list_nulls.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/mutex.h>
|
||||
|
@ -111,6 +112,7 @@ struct rhashtable_params {
|
|||
* @p: Configuration parameters
|
||||
* @run_work: Deferred worker to expand/shrink asynchronously
|
||||
* @mutex: Mutex to protect current/future table swapping
|
||||
* @walkers: List of active walkers
|
||||
* @being_destroyed: True if table is set up for destruction
|
||||
*/
|
||||
struct rhashtable {
|
||||
|
@ -121,9 +123,36 @@ struct rhashtable {
|
|||
struct rhashtable_params p;
|
||||
struct work_struct run_work;
|
||||
struct mutex mutex;
|
||||
struct list_head walkers;
|
||||
bool being_destroyed;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct rhashtable_walker - Hash table walker
|
||||
* @list: List entry on list of walkers
|
||||
* @resize: Resize event occured
|
||||
*/
|
||||
struct rhashtable_walker {
|
||||
struct list_head list;
|
||||
bool resize;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct rhashtable_iter - Hash table iterator, fits into netlink cb
|
||||
* @ht: Table to iterate through
|
||||
* @p: Current pointer
|
||||
* @walker: Associated rhashtable walker
|
||||
* @slot: Current slot
|
||||
* @skip: Number of entries to skip in slot
|
||||
*/
|
||||
struct rhashtable_iter {
|
||||
struct rhashtable *ht;
|
||||
struct rhash_head *p;
|
||||
struct rhashtable_walker *walker;
|
||||
unsigned int slot;
|
||||
unsigned int skip;
|
||||
};
|
||||
|
||||
static inline unsigned long rht_marker(const struct rhashtable *ht, u32 hash)
|
||||
{
|
||||
return NULLS_MARKER(ht->p.nulls_base + hash);
|
||||
|
@ -179,6 +208,12 @@ bool rhashtable_lookup_compare_insert(struct rhashtable *ht,
|
|||
bool (*compare)(void *, void *),
|
||||
void *arg);
|
||||
|
||||
int rhashtable_walk_init(struct rhashtable *ht, struct rhashtable_iter *iter);
|
||||
void rhashtable_walk_exit(struct rhashtable_iter *iter);
|
||||
int rhashtable_walk_start(struct rhashtable_iter *iter) __acquires(RCU);
|
||||
void *rhashtable_walk_next(struct rhashtable_iter *iter);
|
||||
void rhashtable_walk_stop(struct rhashtable_iter *iter) __releases(RCU);
|
||||
|
||||
void rhashtable_destroy(struct rhashtable *ht);
|
||||
|
||||
#define rht_dereference(p, ht) \
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue