diff options
| author | Greg Kroah-Hartman <[email protected]> | 2023-12-11 08:39:35 +0100 |
|---|---|---|
| committer | Greg Kroah-Hartman <[email protected]> | 2023-12-11 08:39:35 +0100 |
| commit | 0e42b5fee8a8c5bc173f702b0745da6d9329c714 (patch) | |
| tree | a71b0daded5764fcc33b88f9344872c13f4b488e /lib/objpool.c | |
| parent | 386a766c4169006d0e9df44823849930b8995e32 (diff) | |
| parent | a39b6ac3781d46ba18193c9dbb2110f31e9bffe9 (diff) | |
Merge 6.7-rc5 into char-misc-next
We need the char/misc fixes in here as well for testing and to build off
of.
Signed-off-by: Greg Kroah-Hartman <[email protected]>
Diffstat (limited to 'lib/objpool.c')
| -rw-r--r-- | lib/objpool.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/lib/objpool.c b/lib/objpool.c index ce0087f64400..cfdc02420884 100644 --- a/lib/objpool.c +++ b/lib/objpool.c @@ -201,6 +201,23 @@ static inline void *objpool_try_get_slot(struct objpool_head *pool, int cpu) while (head != READ_ONCE(slot->last)) { void *obj; + /* + * data visibility of 'last' and 'head' could be out of + * order since memory updating of 'last' and 'head' are + * performed in push() and pop() independently + * + * before any retrieving attempts, pop() must guarantee + * 'last' is behind 'head', that is to say, there must + * be available objects in slot, which could be ensured + * by condition 'last != head && last - head <= nr_objs' + * that is equivalent to 'last - head - 1 < nr_objs' as + * 'last' and 'head' are both unsigned int32 + */ + if (READ_ONCE(slot->last) - head - 1 >= pool->nr_objs) { + head = READ_ONCE(slot->head); + continue; + } + /* obj must be retrieved before moving forward head */ obj = READ_ONCE(slot->entries[head & slot->mask]); |