struct kmem_cache_node *node[MAX_NUMNODES];
 };
 
-static inline void *nearest_obj(struct kmem_cache *cache, struct page *page,
+static inline void *nearest_obj(struct kmem_cache *cache, const struct slab *slab,
                                void *x)
 {
-       void *object = x - (x - page->s_mem) % cache->size;
-       void *last_object = page->s_mem + (cache->num - 1) * cache->size;
+       void *object = x - (x - slab->s_mem) % cache->size;
+       void *last_object = slab->s_mem + (cache->num - 1) * cache->size;
 
        if (unlikely(object > last_object))
                return last_object;
  *   reciprocal_divide(offset, cache->reciprocal_buffer_size)
  */
 static inline unsigned int obj_to_index(const struct kmem_cache *cache,
-                                       const struct page *page, void *obj)
+                                       const struct slab *slab, void *obj)
 {
-       u32 offset = (obj - page->s_mem);
+       u32 offset = (obj - slab->s_mem);
        return reciprocal_divide(offset, cache->reciprocal_buffer_size);
 }
 
-static inline int objs_per_slab_page(const struct kmem_cache *cache,
-                                    const struct page *page)
+static inline int objs_per_slab(const struct kmem_cache *cache,
+                                    const struct slab *slab)
 {
-       if (is_kfence_address(page_address(page)))
+       if (is_kfence_address(slab_address(slab)))
                return 1;
        return cache->num;
 }
 
 
 void *fixup_red_left(struct kmem_cache *s, void *p);
 
-static inline void *nearest_obj(struct kmem_cache *cache, struct page *page,
+static inline void *nearest_obj(struct kmem_cache *cache, const struct slab *slab,
                                void *x) {
-       void *object = x - (x - page_address(page)) % cache->size;
-       void *last_object = page_address(page) +
-               (page->objects - 1) * cache->size;
+       void *object = x - (x - slab_address(slab)) % cache->size;
+       void *last_object = slab_address(slab) +
+               (slab->objects - 1) * cache->size;
        void *result = (unlikely(object > last_object)) ? last_object : object;
 
        result = fixup_red_left(cache, result);
 }
 
 static inline unsigned int obj_to_index(const struct kmem_cache *cache,
-                                       const struct page *page, void *obj)
+                                       const struct slab *slab, void *obj)
 {
        if (is_kfence_address(obj))
                return 0;
-       return __obj_to_index(cache, page_address(page), obj);
+       return __obj_to_index(cache, slab_address(slab), obj);
 }
 
-static inline int objs_per_slab_page(const struct kmem_cache *cache,
-                                    const struct page *page)
+static inline int objs_per_slab(const struct kmem_cache *cache,
+                                    const struct slab *slab)
 {
-       return page->objects;
+       return slab->objects;
 }
 #endif /* _LINUX_SLUB_DEF_H */
 
        /* For caches that either have a constructor or SLAB_TYPESAFE_BY_RCU: */
 #ifdef CONFIG_SLAB
        /* For SLAB assign tags based on the object index in the freelist. */
-       return (u8)obj_to_index(cache, virt_to_head_page(object), (void *)object);
+       return (u8)obj_to_index(cache, virt_to_slab(object), (void *)object);
 #else
        /*
         * For SLUB assign a random tag during slab creation, otherwise reuse
        if (is_kfence_address(object))
                return false;
 
-       if (unlikely(nearest_obj(cache, virt_to_head_page(object), object) !=
+       if (unlikely(nearest_obj(cache, virt_to_slab(object), object) !=
            object)) {
                kasan_report_invalid_free(tagged_object, ip);
                return true;
 
                return;
 
        cache = page->slab_cache;
-       object = nearest_obj(cache, page, addr);
+       object = nearest_obj(cache, page_slab(page), addr);
        alloc_meta = kasan_get_alloc_meta(cache, object);
        if (!alloc_meta)
                return;
 
 
        if (page && PageSlab(page)) {
                struct kmem_cache *cache = page->slab_cache;
-               void *object = nearest_obj(cache, page, addr);
+               void *object = nearest_obj(cache, page_slab(page),      addr);
 
                describe_object(cache, object, addr, tag);
        }
 
        page = kasan_addr_to_page(addr);
        if (page && PageSlab(page)) {
                cache = page->slab_cache;
-               object = nearest_obj(cache, page, (void *)addr);
+               object = nearest_obj(cache, page_slab(page), (void *)addr);
                alloc_meta = kasan_get_alloc_meta(cache, object);
 
                if (alloc_meta) {
 
                         * even for KFENCE objects; these are required so that
                         * memcg accounting works correctly.
                         */
-                       KUNIT_EXPECT_EQ(test, obj_to_index(s, page, alloc), 0U);
-                       KUNIT_EXPECT_EQ(test, objs_per_slab_page(s, page), 1);
+                       KUNIT_EXPECT_EQ(test, obj_to_index(s, page_slab(page), alloc), 0U);
+                       KUNIT_EXPECT_EQ(test, objs_per_slab(s, page_slab(page)), 1);
 
                        if (policy == ALLOCATE_ANY)
                                return alloc;
 
 int memcg_alloc_page_obj_cgroups(struct page *page, struct kmem_cache *s,
                                 gfp_t gfp, bool new_page)
 {
-       unsigned int objects = objs_per_slab_page(s, page);
+       unsigned int objects = objs_per_slab(s, page_slab(page));
        unsigned long memcg_data;
        void *vec;
 
                struct obj_cgroup *objcg;
                unsigned int off;
 
-               off = obj_to_index(page->slab_cache, page, p);
+               off = obj_to_index(page->slab_cache, page_slab(page), p);
                objcg = page_objcgs(page)[off];
                if (objcg)
                        return obj_cgroup_memcg(objcg);
 
                struct slab *slab = virt_to_slab(objp);
                unsigned int objnr;
 
-               objnr = obj_to_index(cachep, slab_page(slab), objp);
+               objnr = obj_to_index(cachep, slab, objp);
                if (objnr) {
                        objp = index_to_obj(cachep, slab, objnr - 1);
                        realobj = (char *)objp + obj_offset(cachep);
 static void slab_put_obj(struct kmem_cache *cachep,
                        struct slab *slab, void *objp)
 {
-       unsigned int objnr = obj_to_index(cachep, slab_page(slab), objp);
+       unsigned int objnr = obj_to_index(cachep, slab, objp);
 #if DEBUG
        unsigned int i;
 
        if (cachep->flags & SLAB_STORE_USER)
                *dbg_userword(cachep, objp) = (void *)caller;
 
-       objnr = obj_to_index(cachep, slab_page(slab), objp);
+       objnr = obj_to_index(cachep, slab, objp);
 
        BUG_ON(objnr >= cachep->num);
        BUG_ON(objp != index_to_obj(cachep, slab, objnr));
        objp = object - obj_offset(cachep);
        kpp->kp_data_offset = obj_offset(cachep);
        slab = virt_to_slab(objp);
-       objnr = obj_to_index(cachep, slab_page(slab), objp);
+       objnr = obj_to_index(cachep, slab, objp);
        objp = index_to_obj(cachep, slab, objnr);
        kpp->kp_objp = objp;
        if (DEBUG && cachep->flags & SLAB_STORE_USER)
 
        /* Find and validate object. */
        cachep = slab->slab_cache;
-       objnr = obj_to_index(cachep, slab_page(slab), (void *)ptr);
+       objnr = obj_to_index(cachep, slab, (void *)ptr);
        BUG_ON(objnr >= cachep->num);
 
        /* Find offset within object. */
 
                                continue;
                        }
 
-                       off = obj_to_index(s, page, p[i]);
+                       off = obj_to_index(s, page_slab(page), p[i]);
                        obj_cgroup_get(objcg);
                        page_objcgs(page)[off] = objcg;
                        mod_objcg_state(objcg, page_pgdat(page),
                else
                        s = s_orig;
 
-               off = obj_to_index(s, page, p[i]);
+               off = obj_to_index(s, page_slab(page), p[i]);
                objcg = objcgs[off];
                if (!objcg)
                        continue;
 
 #else
        objp = objp0;
 #endif
-       objnr = obj_to_index(s, slab_page(slab), objp);
+       objnr = obj_to_index(s, slab, objp);
        kpp->kp_data_offset = (unsigned long)((char *)objp0 - (char *)objp);
        objp = base + s->size * objnr;
        kpp->kp_objp = objp;