]> www.infradead.org Git - users/willy/linux.git/commitdiff
mm/slub: Convert cmpxchg_double_slab to struct slab
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Sat, 2 Oct 2021 03:03:05 +0000 (23:03 -0400)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Mon, 4 Oct 2021 13:18:01 +0000 (09:18 -0400)
Improve type safety for both cmpxchg_double_slab() and
__cmpxchg_double_slab().

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
mm/slub.c

index 72a50fab64b5c02b386a0b73a580ebda7b8995b8..0d9299679ea2788b17f2de60f8e269920354773a 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -448,7 +448,7 @@ static __always_inline void slab_unlock(struct page *page, unsigned long *flags)
  * by an _irqsave() lock variant. Except on PREEMPT_RT where locks are different
  * so we disable interrupts as part of slab_[un]lock().
  */
-static inline bool __cmpxchg_double_slab(struct kmem_cache *s, struct page *page,
+static inline bool __cmpxchg_double_slab(struct kmem_cache *s, struct slab *slab,
                void *freelist_old, unsigned long counters_old,
                void *freelist_new, unsigned long counters_new,
                const char *n)
@@ -458,7 +458,7 @@ static inline bool __cmpxchg_double_slab(struct kmem_cache *s, struct page *page
 #if defined(CONFIG_HAVE_CMPXCHG_DOUBLE) && \
     defined(CONFIG_HAVE_ALIGNED_STRUCT_PAGE)
        if (s->flags & __CMPXCHG_DOUBLE) {
-               if (cmpxchg_double(&page->freelist, &page->counters,
+               if (cmpxchg_double(&slab->freelist, &slab->counters,
                                   freelist_old, counters_old,
                                   freelist_new, counters_new))
                        return true;
@@ -468,15 +468,15 @@ static inline bool __cmpxchg_double_slab(struct kmem_cache *s, struct page *page
                /* init to 0 to prevent spurious warnings */
                unsigned long flags = 0;
 
-               slab_lock(page, &flags);
-               if (page->freelist == freelist_old &&
-                                       page->counters == counters_old) {
-                       page->freelist = freelist_new;
-                       page->counters = counters_new;
-                       slab_unlock(page, &flags);
+               slab_lock(slab_page(slab), &flags);
+               if (slab->freelist == freelist_old &&
+                                       slab->counters == counters_old) {
+                       slab->freelist = freelist_new;
+                       slab->counters = counters_new;
+                       slab_unlock(slab_page(slab), &flags);
                        return true;
                }
-               slab_unlock(page, &flags);
+               slab_unlock(slab_page(slab), &flags);
        }
 
        cpu_relax();
@@ -489,7 +489,7 @@ static inline bool __cmpxchg_double_slab(struct kmem_cache *s, struct page *page
        return false;
 }
 
-static inline bool cmpxchg_double_slab(struct kmem_cache *s, struct page *page,
+static inline bool cmpxchg_double_slab(struct kmem_cache *s, struct slab *slab,
                void *freelist_old, unsigned long counters_old,
                void *freelist_new, unsigned long counters_new,
                const char *n)
@@ -497,7 +497,7 @@ static inline bool cmpxchg_double_slab(struct kmem_cache *s, struct page *page,
 #if defined(CONFIG_HAVE_CMPXCHG_DOUBLE) && \
     defined(CONFIG_HAVE_ALIGNED_STRUCT_PAGE)
        if (s->flags & __CMPXCHG_DOUBLE) {
-               if (cmpxchg_double(&page->freelist, &page->counters,
+               if (cmpxchg_double(&slab->freelist, &slab->counters,
                                   freelist_old, counters_old,
                                   freelist_new, counters_new))
                        return true;
@@ -507,16 +507,16 @@ static inline bool cmpxchg_double_slab(struct kmem_cache *s, struct page *page,
                unsigned long flags;
 
                local_irq_save(flags);
-               __slab_lock(page);
-               if (page->freelist == freelist_old &&
-                                       page->counters == counters_old) {
-                       page->freelist = freelist_new;
-                       page->counters = counters_new;
-                       __slab_unlock(page);
+               __slab_lock(slab_page(slab));
+               if (slab->freelist == freelist_old &&
+                                       slab->counters == counters_old) {
+                       slab->freelist = freelist_new;
+                       slab->counters = counters_new;
+                       __slab_unlock(slab_page(slab));
                        local_irq_restore(flags);
                        return true;
                }
-               __slab_unlock(page);
+               __slab_unlock(slab_page(slab));
                local_irq_restore(flags);
        }
 
@@ -2068,7 +2068,7 @@ static inline void *acquire_slab(struct kmem_cache *s,
        VM_BUG_ON(new.frozen);
        new.frozen = 1;
 
-       if (!__cmpxchg_double_slab(s, slab_page(slab),
+       if (!__cmpxchg_double_slab(s, slab,
                        freelist, counters,
                        new.freelist, new.counters,
                        "acquire_slab"))
@@ -2412,7 +2412,7 @@ redo:
        }
 
        l = m;
-       if (!cmpxchg_double_slab(s, slab_page(slab),
+       if (!cmpxchg_double_slab(s, slab,
                                old.freelist, old.counters,
                                new.freelist, new.counters,
                                "unfreezing slab"))
@@ -2466,7 +2466,7 @@ static void __unfreeze_partials(struct kmem_cache *s, struct slab *partial_slab)
 
                        new.frozen = 0;
 
-               } while (!__cmpxchg_double_slab(s, slab_page(slab),
+               } while (!__cmpxchg_double_slab(s, slab,
                                old.freelist, old.counters,
                                new.freelist, new.counters,
                                "unfreezing slab"));
@@ -2837,7 +2837,7 @@ static inline void *get_freelist(struct kmem_cache *s, struct slab *slab)
                new.inuse = slab->objects;
                new.frozen = freelist != NULL;
 
-       } while (!__cmpxchg_double_slab(s, slab_page(slab),
+       } while (!__cmpxchg_double_slab(s, slab,
                freelist, counters,
                NULL, new.counters,
                "get_freelist"));
@@ -3329,7 +3329,7 @@ static void __slab_free(struct kmem_cache *s, struct slab *slab,
                        }
                }
 
-       } while (!cmpxchg_double_slab(s, slab_page(slab),
+       } while (!cmpxchg_double_slab(s, slab,
                prior, counters,
                head, new.counters,
                "__slab_free"));