diff options
author | Olof Johansson <olof@lixom.net> | 2019-07-02 15:13:20 -0700 |
---|---|---|
committer | Olof Johansson <olof@lixom.net> | 2019-07-02 15:13:20 -0700 |
commit | 2659dc8d225c956b91d8a8e4ef05d91b2e985c02 (patch) | |
tree | 5cb6e035b6f154668f4f144b66ccc825a0c73df5 /lib/idr.c | |
parent | soc: ti: fix irq-ti-sci link error (diff) | |
parent | ARM: davinci: da830-evm: fix GPIO lookup for OHCI (diff) | |
download | linux-dev-2659dc8d225c956b91d8a8e4ef05d91b2e985c02.tar.xz linux-dev-2659dc8d225c956b91d8a8e4ef05d91b2e985c02.zip |
Merge tag 'davinci-fixes-for-v5.2-part2' of git://git.kernel.org/pub/scm/linux/kernel/git/nsekhar/linux-davinci into arm/fixes
This set of patches fixes regressions introduced in v5.2 kernel when DA8xx
OHCI driver was converted over to use GPIO regulators.
* tag 'davinci-fixes-for-v5.2-part2' of git://git.kernel.org/pub/scm/linux/kernel/git/nsekhar/linux-davinci:
ARM: davinci: da830-evm: fix GPIO lookup for OHCI
ARM: davinci: omapl138-hawk: add missing regulator constraints for OHCI
ARM: davinci: da830-evm: add missing regulator constraints for OHCI
+ Linux 5.2-rc7
Signed-off-by: Olof Johansson <olof@lixom.net>
Diffstat (limited to 'lib/idr.c')
-rw-r--r-- | lib/idr.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/lib/idr.c b/lib/idr.c index c34e256d2f01..66a374892482 100644 --- a/lib/idr.c +++ b/lib/idr.c @@ -228,11 +228,21 @@ void *idr_get_next(struct idr *idr, int *nextid) { struct radix_tree_iter iter; void __rcu **slot; + void *entry = NULL; unsigned long base = idr->idr_base; unsigned long id = *nextid; id = (id < base) ? 0 : id - base; - slot = radix_tree_iter_find(&idr->idr_rt, &iter, id); + radix_tree_for_each_slot(slot, &idr->idr_rt, &iter, id) { + entry = rcu_dereference_raw(*slot); + if (!entry) + continue; + if (!xa_is_internal(entry)) + break; + if (slot != &idr->idr_rt.xa_head && !xa_is_retry(entry)) + break; + slot = radix_tree_iter_retry(&iter); + } if (!slot) return NULL; id = iter.index + base; @@ -241,7 +251,7 @@ void *idr_get_next(struct idr *idr, int *nextid) return NULL; *nextid = id; - return rcu_dereference_raw(*slot); + return entry; } EXPORT_SYMBOL(idr_get_next); |