OSDN Git Service

Merge tag 'fixes-non-critical-3.15' of git://git.kernel.org/pub/scm/linux/kernel...
[sagit-ice-cold/kernel_xiaomi_msm8998.git] / mm / slub.c
index 25f14ad..fe6d7be 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -1684,7 +1684,7 @@ static void *get_any_partial(struct kmem_cache *s, gfp_t flags,
                return NULL;
 
        do {
-               cpuset_mems_cookie = get_mems_allowed();
+               cpuset_mems_cookie = read_mems_allowed_begin();
                zonelist = node_zonelist(slab_node(), flags);
                for_each_zone_zonelist(zone, z, zonelist, high_zoneidx) {
                        struct kmem_cache_node *n;
@@ -1696,19 +1696,17 @@ static void *get_any_partial(struct kmem_cache *s, gfp_t flags,
                                object = get_partial_node(s, n, c, flags);
                                if (object) {
                                        /*
-                                        * Return the object even if
-                                        * put_mems_allowed indicated that
-                                        * the cpuset mems_allowed was
-                                        * updated in parallel. It's a
-                                        * harmless race between the alloc
-                                        * and the cpuset update.
+                                        * Don't check read_mems_allowed_retry()
+                                        * here - if mems_allowed was updated in
+                                        * parallel, that was a harmless race
+                                        * between allocation and the cpuset
+                                        * update
                                         */
-                                       put_mems_allowed(cpuset_mems_cookie);
                                        return object;
                                }
                        }
                }
-       } while (!put_mems_allowed(cpuset_mems_cookie));
+       } while (read_mems_allowed_retry(cpuset_mems_cookie));
 #endif
        return NULL;
 }
@@ -3239,8 +3237,9 @@ int __kmem_cache_shutdown(struct kmem_cache *s)
 
        if (!rc) {
                /*
-                * We do the same lock strategy around sysfs_slab_add, see
-                * __kmem_cache_create. Because this is pretty much the last
+                * Since slab_attr_store may take the slab_mutex, we should
+                * release the lock while removing the sysfs entry in order to
+                * avoid a deadlock. Because this is pretty much the last
                 * operation we do and the lock will be released shortly after
                 * that in slab_common.c, we could just move sysfs_slab_remove
                 * to a later point in common code. We should do that when we
@@ -3780,10 +3779,7 @@ int __kmem_cache_create(struct kmem_cache *s, unsigned long flags)
                return 0;
 
        memcg_propagate_slab_attrs(s);
-       mutex_unlock(&slab_mutex);
        err = sysfs_slab_add(s);
-       mutex_lock(&slab_mutex);
-
        if (err)
                kmem_cache_close(s);