Skip to content

Commit 5076190

Browse files
committed
mm: slub: be more careful about the double cmpxchg of freelist
This is just a cleanup addition to Jann's fix to properly update the transaction ID for the slub slowpath in commit fd4d9c7 ("mm: slub: add missing TID bump.."). The transaction ID is what protects us against any concurrent accesses, but we should really also make sure to make the 'freelist' comparison itself always use the same freelist value that we then used as the new next free pointer. Jann points out that if we do all of this carefully, we could skip the transaction ID update for all the paths that only remove entries from the lists, and only update the TID when adding entries (to avoid the ABA issue with cmpxchg and list handling re-adding a previously seen value). But this patch just does the "make sure to cmpxchg the same value we used" rather than then try to be clever. Acked-by: Jann Horn <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent fd4d9c7 commit 5076190

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

mm/slub.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2997,11 +2997,13 @@ static __always_inline void do_slab_free(struct kmem_cache *s,
29972997
barrier();
29982998

29992999
if (likely(page == c->page)) {
3000-
set_freepointer(s, tail_obj, c->freelist);
3000+
void **freelist = READ_ONCE(c->freelist);
3001+
3002+
set_freepointer(s, tail_obj, freelist);
30013003

30023004
if (unlikely(!this_cpu_cmpxchg_double(
30033005
s->cpu_slab->freelist, s->cpu_slab->tid,
3004-
c->freelist, tid,
3006+
freelist, tid,
30053007
head, next_tid(tid)))) {
30063008

30073009
note_cmpxchg_failure("slab_free", s, tid);

0 commit comments

Comments
 (0)