Skip to content

Commit 246779d

Browse files
herbertxdavem330
authored andcommitted
rhashtable: Remove GFP flag from rhashtable_walk_init
The commit 8f6fd83 ("rhashtable: accept GFP flags in rhashtable_walk_init") added a GFP flag argument to rhashtable_walk_init because some users wish to use the walker in an unsleepable context. In fact we don't need to allocate memory in rhashtable_walk_init at all. The walker is always paired with an iterator so we could just stash ourselves there. This patch does that by introducing a new enter function to replace the existing init function. This way we don't have to churn all the existing users again. Signed-off-by: Herbert Xu <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 363dc39 commit 246779d

File tree

2 files changed

+29
-31
lines changed

2 files changed

+29
-31
lines changed

include/linux/rhashtable.h

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ struct rhashtable_walker {
173173
struct rhashtable_iter {
174174
struct rhashtable *ht;
175175
struct rhash_head *p;
176-
struct rhashtable_walker *walker;
176+
struct rhashtable_walker walker;
177177
unsigned int slot;
178178
unsigned int skip;
179179
};
@@ -346,8 +346,8 @@ struct bucket_table *rhashtable_insert_slow(struct rhashtable *ht,
346346
struct bucket_table *old_tbl);
347347
int rhashtable_insert_rehash(struct rhashtable *ht, struct bucket_table *tbl);
348348

349-
int rhashtable_walk_init(struct rhashtable *ht, struct rhashtable_iter *iter,
350-
gfp_t gfp);
349+
void rhashtable_walk_enter(struct rhashtable *ht,
350+
struct rhashtable_iter *iter);
351351
void rhashtable_walk_exit(struct rhashtable_iter *iter);
352352
int rhashtable_walk_start(struct rhashtable_iter *iter) __acquires(RCU);
353353
void *rhashtable_walk_next(struct rhashtable_iter *iter);
@@ -906,4 +906,12 @@ static inline int rhashtable_replace_fast(
906906
return err;
907907
}
908908

909+
/* Obsolete function, do not use in new code. */
910+
static inline int rhashtable_walk_init(struct rhashtable *ht,
911+
struct rhashtable_iter *iter, gfp_t gfp)
912+
{
913+
rhashtable_walk_enter(ht, iter);
914+
return 0;
915+
}
916+
909917
#endif /* _LINUX_RHASHTABLE_H */

lib/rhashtable.c

Lines changed: 18 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -489,10 +489,9 @@ struct bucket_table *rhashtable_insert_slow(struct rhashtable *ht,
489489
EXPORT_SYMBOL_GPL(rhashtable_insert_slow);
490490

491491
/**
492-
* rhashtable_walk_init - Initialise an iterator
492+
* rhashtable_walk_enter - Initialise an iterator
493493
* @ht: Table to walk over
494494
* @iter: Hash table Iterator
495-
* @gfp: GFP flags for allocations
496495
*
497496
* This function prepares a hash table walk.
498497
*
@@ -507,30 +506,22 @@ EXPORT_SYMBOL_GPL(rhashtable_insert_slow);
507506
* This function may sleep so you must not call it from interrupt
508507
* context or with spin locks held.
509508
*
510-
* You must call rhashtable_walk_exit if this function returns
511-
* successfully.
509+
* You must call rhashtable_walk_exit after this function returns.
512510
*/
513-
int rhashtable_walk_init(struct rhashtable *ht, struct rhashtable_iter *iter,
514-
gfp_t gfp)
511+
void rhashtable_walk_enter(struct rhashtable *ht, struct rhashtable_iter *iter)
515512
{
516513
iter->ht = ht;
517514
iter->p = NULL;
518515
iter->slot = 0;
519516
iter->skip = 0;
520517

521-
iter->walker = kmalloc(sizeof(*iter->walker), gfp);
522-
if (!iter->walker)
523-
return -ENOMEM;
524-
525518
spin_lock(&ht->lock);
526-
iter->walker->tbl =
519+
iter->walker.tbl =
527520
rcu_dereference_protected(ht->tbl, lockdep_is_held(&ht->lock));
528-
list_add(&iter->walker->list, &iter->walker->tbl->walkers);
521+
list_add(&iter->walker.list, &iter->walker.tbl->walkers);
529522
spin_unlock(&ht->lock);
530-
531-
return 0;
532523
}
533-
EXPORT_SYMBOL_GPL(rhashtable_walk_init);
524+
EXPORT_SYMBOL_GPL(rhashtable_walk_enter);
534525

535526
/**
536527
* rhashtable_walk_exit - Free an iterator
@@ -541,10 +532,9 @@ EXPORT_SYMBOL_GPL(rhashtable_walk_init);
541532
void rhashtable_walk_exit(struct rhashtable_iter *iter)
542533
{
543534
spin_lock(&iter->ht->lock);
544-
if (iter->walker->tbl)
545-
list_del(&iter->walker->list);
535+
if (iter->walker.tbl)
536+
list_del(&iter->walker.list);
546537
spin_unlock(&iter->ht->lock);
547-
kfree(iter->walker);
548538
}
549539
EXPORT_SYMBOL_GPL(rhashtable_walk_exit);
550540

@@ -570,12 +560,12 @@ int rhashtable_walk_start(struct rhashtable_iter *iter)
570560
rcu_read_lock();
571561

572562
spin_lock(&ht->lock);
573-
if (iter->walker->tbl)
574-
list_del(&iter->walker->list);
563+
if (iter->walker.tbl)
564+
list_del(&iter->walker.list);
575565
spin_unlock(&ht->lock);
576566

577-
if (!iter->walker->tbl) {
578-
iter->walker->tbl = rht_dereference_rcu(ht->tbl, ht);
567+
if (!iter->walker.tbl) {
568+
iter->walker.tbl = rht_dereference_rcu(ht->tbl, ht);
579569
return -EAGAIN;
580570
}
581571

@@ -597,7 +587,7 @@ EXPORT_SYMBOL_GPL(rhashtable_walk_start);
597587
*/
598588
void *rhashtable_walk_next(struct rhashtable_iter *iter)
599589
{
600-
struct bucket_table *tbl = iter->walker->tbl;
590+
struct bucket_table *tbl = iter->walker.tbl;
601591
struct rhashtable *ht = iter->ht;
602592
struct rhash_head *p = iter->p;
603593

@@ -630,8 +620,8 @@ void *rhashtable_walk_next(struct rhashtable_iter *iter)
630620
/* Ensure we see any new tables. */
631621
smp_rmb();
632622

633-
iter->walker->tbl = rht_dereference_rcu(tbl->future_tbl, ht);
634-
if (iter->walker->tbl) {
623+
iter->walker.tbl = rht_dereference_rcu(tbl->future_tbl, ht);
624+
if (iter->walker.tbl) {
635625
iter->slot = 0;
636626
iter->skip = 0;
637627
return ERR_PTR(-EAGAIN);
@@ -651,7 +641,7 @@ void rhashtable_walk_stop(struct rhashtable_iter *iter)
651641
__releases(RCU)
652642
{
653643
struct rhashtable *ht;
654-
struct bucket_table *tbl = iter->walker->tbl;
644+
struct bucket_table *tbl = iter->walker.tbl;
655645

656646
if (!tbl)
657647
goto out;
@@ -660,9 +650,9 @@ void rhashtable_walk_stop(struct rhashtable_iter *iter)
660650

661651
spin_lock(&ht->lock);
662652
if (tbl->rehash < tbl->size)
663-
list_add(&iter->walker->list, &tbl->walkers);
653+
list_add(&iter->walker.list, &tbl->walkers);
664654
else
665-
iter->walker->tbl = NULL;
655+
iter->walker.tbl = NULL;
666656
spin_unlock(&ht->lock);
667657

668658
iter->p = NULL;

0 commit comments

Comments
 (0)