mm/zsmalloc.c: use page_private() to access page->private
[linux-2.6-microblaze.git] / mm / slab_common.c
index e981c80..7c8298c 100644 (file)
@@ -197,7 +197,7 @@ struct kmem_cache *find_mergeable(unsigned int size, unsigned int align,
        size = ALIGN(size, sizeof(void *));
        align = calculate_alignment(flags, align, size);
        size = ALIGN(size, align);
-       flags = kmem_cache_flags(size, flags, name, NULL);
+       flags = kmem_cache_flags(size, flags, name);
 
        if (flags & SLAB_NEVER_MERGE)
                return NULL;
@@ -309,9 +309,6 @@ kmem_cache_create_usercopy(const char *name,
        const char *cache_name;
        int err;
 
-       get_online_cpus();
-       get_online_mems();
-
        mutex_lock(&slab_mutex);
 
        err = kmem_cache_sanity_check(name, size);
@@ -360,9 +357,6 @@ kmem_cache_create_usercopy(const char *name,
 out_unlock:
        mutex_unlock(&slab_mutex);
 
-       put_online_mems();
-       put_online_cpus();
-
        if (err) {
                if (flags & SLAB_PANIC)
                        panic("kmem_cache_create: Failed to create slab '%s'. Error %d\n",
@@ -486,9 +480,6 @@ void kmem_cache_destroy(struct kmem_cache *s)
        if (unlikely(!s))
                return;
 
-       get_online_cpus();
-       get_online_mems();
-
        mutex_lock(&slab_mutex);
 
        s->refcount--;
@@ -503,9 +494,6 @@ void kmem_cache_destroy(struct kmem_cache *s)
        }
 out_unlock:
        mutex_unlock(&slab_mutex);
-
-       put_online_mems();
-       put_online_cpus();
 }
 EXPORT_SYMBOL(kmem_cache_destroy);
 
@@ -522,12 +510,10 @@ int kmem_cache_shrink(struct kmem_cache *cachep)
 {
        int ret;
 
-       get_online_cpus();
-       get_online_mems();
+
        kasan_cache_shrink(cachep);
        ret = __kmem_cache_shrink(cachep);
-       put_online_mems();
-       put_online_cpus();
+
        return ret;
 }
 EXPORT_SYMBOL(kmem_cache_shrink);
@@ -537,6 +523,81 @@ bool slab_is_available(void)
        return slab_state >= UP;
 }
 
+/**
+ * kmem_valid_obj - does the pointer reference a valid slab object?
+ * @object: pointer to query.
+ *
+ * Return: %true if the pointer is to a not-yet-freed object from
+ * kmalloc() or kmem_cache_alloc(), either %true or %false if the pointer
+ * is to an already-freed object, and %false otherwise.
+ */
+bool kmem_valid_obj(void *object)
+{
+       struct page *page;
+
+       /* Some arches consider ZERO_SIZE_PTR to be a valid address. */
+       if (object < (void *)PAGE_SIZE || !virt_addr_valid(object))
+               return false;
+       page = virt_to_head_page(object);
+       return PageSlab(page);
+}
+
+/**
+ * kmem_dump_obj - Print available slab provenance information
+ * @object: slab object for which to find provenance information.
+ *
+ * This function uses pr_cont(), so that the caller is expected to have
+ * printed out whatever preamble is appropriate.  The provenance information
+ * depends on the type of object and on how much debugging is enabled.
+ * For a slab-cache object, the fact that it is a slab object is printed,
+ * and, if available, the slab name, return address, and stack trace from
+ * the allocation of that object.
+ *
+ * This function will splat if passed a pointer to a non-slab object.
+ * If you are not sure what type of object you have, you should instead
+ * use mem_dump_obj().
+ */
+void kmem_dump_obj(void *object)
+{
+       char *cp = IS_ENABLED(CONFIG_MMU) ? "" : "/vmalloc";
+       int i;
+       struct page *page;
+       unsigned long ptroffset;
+       struct kmem_obj_info kp = { };
+
+       if (WARN_ON_ONCE(!virt_addr_valid(object)))
+               return;
+       page = virt_to_head_page(object);
+       if (WARN_ON_ONCE(!PageSlab(page))) {
+               pr_cont(" non-slab memory.\n");
+               return;
+       }
+       kmem_obj_info(&kp, object, page);
+       if (kp.kp_slab_cache)
+               pr_cont(" slab%s %s", cp, kp.kp_slab_cache->name);
+       else
+               pr_cont(" slab%s", cp);
+       if (kp.kp_objp)
+               pr_cont(" start %px", kp.kp_objp);
+       if (kp.kp_data_offset)
+               pr_cont(" data offset %lu", kp.kp_data_offset);
+       if (kp.kp_objp) {
+               ptroffset = ((char *)object - (char *)kp.kp_objp) - kp.kp_data_offset;
+               pr_cont(" pointer offset %lu", ptroffset);
+       }
+       if (kp.kp_slab_cache && kp.kp_slab_cache->usersize)
+               pr_cont(" size %u", kp.kp_slab_cache->usersize);
+       if (kp.kp_ret)
+               pr_cont(" allocated at %pS\n", kp.kp_ret);
+       else
+               pr_cont("\n");
+       for (i = 0; i < ARRAY_SIZE(kp.kp_stack); i++) {
+               if (!kp.kp_stack[i])
+                       break;
+               pr_info("    %pS\n", kp.kp_stack[i]);
+       }
+}
+
 #ifndef CONFIG_SLOB
 /* Create a cache during boot when no slab services are available yet */
 void __init create_boot_cache(struct kmem_cache *s, const char *name,
@@ -837,8 +898,8 @@ void *kmalloc_order(size_t size, gfp_t flags, unsigned int order)
        page = alloc_pages(flags, order);
        if (likely(page)) {
                ret = page_address(page);
-               mod_node_page_state(page_pgdat(page), NR_SLAB_UNRECLAIMABLE_B,
-                                   PAGE_SIZE << order);
+               mod_lruvec_page_state(page, NR_SLAB_UNRECLAIMABLE_B,
+                                     PAGE_SIZE << order);
        }
        ret = kasan_kmalloc_large(ret, size, flags);
        /* As ret might get tagged, call kmemleak hook after KASAN. */
@@ -1157,19 +1218,21 @@ size_t ksize(const void *objp)
        size_t size;
 
        /*
-        * We need to check that the pointed to object is valid, and only then
-        * unpoison the shadow memory below. We use __kasan_check_read(), to
-        * generate a more useful report at the time ksize() is called (rather
-        * than later where behaviour is undefined due to potential
-        * use-after-free or double-free).
+        * We need to first check that the pointer to the object is valid, and
+        * only then unpoison the memory. The report printed from ksize() is
+        * more useful, then when it's printed later when the behaviour could
+        * be undefined due to a potential use-after-free or double-free.
+        *
+        * We use kasan_check_byte(), which is supported for the hardware
+        * tag-based KASAN mode, unlike kasan_check_read/write().
         *
-        * If the pointed to memory is invalid we return 0, to avoid users of
+        * If the pointed to memory is invalid, we return 0 to avoid users of
         * ksize() writing to and potentially corrupting the memory region.
         *
         * We want to perform the check before __ksize(), to avoid potentially
         * crashing in __ksize() due to accessing invalid metadata.
         */
-       if (unlikely(ZERO_OR_NULL_PTR(objp)) || !__kasan_check_read(objp, 1))
+       if (unlikely(ZERO_OR_NULL_PTR(objp)) || !kasan_check_byte(objp))
                return 0;
 
        size = __ksize(objp);