#include "internal.h"
 
 LIST_HEAD(shrinker_list);
-DECLARE_RWSEM(shrinker_rwsem);
+DEFINE_MUTEX(shrinker_mutex);
 
 #ifdef CONFIG_MEMCG
 static int shrinker_nr_max;
        int nid, ret = 0;
        int array_size = 0;
 
-       down_write(&shrinker_rwsem);
+       mutex_lock(&shrinker_mutex);
        array_size = shrinker_unit_size(shrinker_nr_max);
        for_each_node(nid) {
                info = kvzalloc_node(sizeof(*info) + array_size, GFP_KERNEL, nid);
                        goto err;
                rcu_assign_pointer(memcg->nodeinfo[nid]->shrinker_info, info);
        }
-       up_write(&shrinker_rwsem);
+       mutex_unlock(&shrinker_mutex);
 
        return ret;
 
 err:
-       up_write(&shrinker_rwsem);
+       mutex_unlock(&shrinker_mutex);
        free_shrinker_info(memcg);
        return -ENOMEM;
 }
                                                     int nid)
 {
        return rcu_dereference_protected(memcg->nodeinfo[nid]->shrinker_info,
-                                        lockdep_is_held(&shrinker_rwsem));
+                                        lockdep_is_held(&shrinker_mutex));
 }
 
 static int expand_one_shrinker_info(struct mem_cgroup *memcg, int new_size,
        if (!root_mem_cgroup)
                goto out;
 
-       lockdep_assert_held(&shrinker_rwsem);
+       lockdep_assert_held(&shrinker_mutex);
 
        new_size = shrinker_unit_size(new_nr_max);
        old_size = shrinker_unit_size(shrinker_nr_max);
        if (mem_cgroup_disabled())
                return -ENOSYS;
 
-       down_write(&shrinker_rwsem);
+       mutex_lock(&shrinker_mutex);
        id = idr_alloc(&shrinker_idr, shrinker, 0, 0, GFP_KERNEL);
        if (id < 0)
                goto unlock;
        shrinker->id = id;
        ret = 0;
 unlock:
-       up_write(&shrinker_rwsem);
+       mutex_unlock(&shrinker_mutex);
        return ret;
 }
 
 
        BUG_ON(id < 0);
 
-       lockdep_assert_held(&shrinker_rwsem);
+       lockdep_assert_held(&shrinker_mutex);
 
        idr_remove(&shrinker_idr, id);
 }
                parent = root_mem_cgroup;
 
        /* Prevent from concurrent shrinker_info expand */
-       down_write(&shrinker_rwsem);
+       mutex_lock(&shrinker_mutex);
        for_each_node(nid) {
                child_info = shrinker_info_protected(memcg, nid);
                parent_info = shrinker_info_protected(parent, nid);
                        }
                }
        }
-       up_write(&shrinker_rwsem);
+       mutex_unlock(&shrinker_mutex);
 }
 #else
 static int shrinker_memcg_alloc(struct shrinker *shrinker)
                return;
        }
 
-       down_write(&shrinker_rwsem);
+       mutex_lock(&shrinker_mutex);
        list_add_tail_rcu(&shrinker->list, &shrinker_list);
        shrinker->flags |= SHRINKER_REGISTERED;
        shrinker_debugfs_add(shrinker);
-       up_write(&shrinker_rwsem);
+       mutex_unlock(&shrinker_mutex);
 
        init_completion(&shrinker->done);
        /*
                wait_for_completion(&shrinker->done);
        }
 
-       down_write(&shrinker_rwsem);
+       mutex_lock(&shrinker_mutex);
        if (shrinker->flags & SHRINKER_REGISTERED) {
                /*
                 * Now we can safely remove it from the shrinker_list and then
 
        if (shrinker->flags & SHRINKER_MEMCG_AWARE)
                shrinker_memcg_remove(shrinker);
-       up_write(&shrinker_rwsem);
+       mutex_unlock(&shrinker_mutex);
 
        if (debugfs_entry)
                shrinker_debugfs_remove(debugfs_entry, debugfs_id);
 
 #include "internal.h"
 
 /* defined in vmscan.c */
-extern struct rw_semaphore shrinker_rwsem;
+extern struct mutex shrinker_mutex;
 extern struct list_head shrinker_list;
 
 static DEFINE_IDA(shrinker_debugfs_ida);
        char buf[128];
        int id;
 
-       lockdep_assert_held(&shrinker_rwsem);
+       lockdep_assert_held(&shrinker_mutex);
 
        /* debugfs isn't initialized yet, add debugfs entries later. */
        if (!shrinker_debugfs_root)
        if (!new)
                return -ENOMEM;
 
-       down_write(&shrinker_rwsem);
+       mutex_lock(&shrinker_mutex);
 
        old = shrinker->name;
        shrinker->name = new;
                        shrinker->debugfs_entry = entry;
        }
 
-       up_write(&shrinker_rwsem);
+       mutex_unlock(&shrinker_mutex);
 
        kfree_const(old);
 
 {
        struct dentry *entry = shrinker->debugfs_entry;
 
-       lockdep_assert_held(&shrinker_rwsem);
+       lockdep_assert_held(&shrinker_mutex);
 
        *debugfs_id = entry ? shrinker->debugfs_id : -1;
        shrinker->debugfs_entry = NULL;
        shrinker_debugfs_root = dentry;
 
        /* Create debugfs entries for shrinkers registered at boot */
-       down_write(&shrinker_rwsem);
+       mutex_lock(&shrinker_mutex);
        list_for_each_entry(shrinker, &shrinker_list, list)
                if (!shrinker->debugfs_entry) {
                        ret = shrinker_debugfs_add(shrinker);
                        if (ret)
                                break;
                }
-       up_write(&shrinker_rwsem);
+       mutex_unlock(&shrinker_mutex);
 
        return ret;
 }