return key;
 }
 
-static void __put_css_set(struct css_set *cset, int taskexit)
+static void put_css_set_locked(struct css_set *cset, bool taskexit)
 {
        struct cgrp_cset_link *link, *tmp_link;
 
-       /*
-        * Ensure that the refcount doesn't hit zero while any readers
-        * can see it. Similar to atomic_dec_and_lock(), but for an
-        * rwlock
-        */
-       if (atomic_add_unless(&cset->refcount, -1, 1))
-               return;
-       down_write(&css_set_rwsem);
-       if (!atomic_dec_and_test(&cset->refcount)) {
-               up_write(&css_set_rwsem);
+       lockdep_assert_held(&css_set_rwsem);
+
+       if (!atomic_dec_and_test(&cset->refcount))
                return;
-       }
 
        /* This css_set is dead. unlink it and release cgroup refcounts */
        hash_del(&cset->hlist);
                kfree(link);
        }
 
-       up_write(&css_set_rwsem);
        kfree_rcu(cset, rcu_head);
 }
 
+static void put_css_set(struct css_set *cset, bool taskexit)
+{
+       /*
+        * Ensure that the refcount doesn't hit zero while any readers
+        * can see it. Similar to atomic_dec_and_lock(), but for an
+        * rwlock
+        */
+       if (atomic_add_unless(&cset->refcount, -1, 1))
+               return;
+
+       down_write(&css_set_rwsem);
+       put_css_set_locked(cset, taskexit);
+       up_write(&css_set_rwsem);
+}
+
 /*
  * refcounted get/put for css_set objects
  */
        atomic_inc(&cset->refcount);
 }
 
-static inline void put_css_set(struct css_set *cset)
-{
-       __put_css_set(cset, 0);
-}
-
-static inline void put_css_set_taskexit(struct css_set *cset)
-{
-       __put_css_set(cset, 1);
-}
-
 /**
  * compare_css_sets - helper function for find_existing_css_set().
  * @cset: candidate css_set being tested
         * we're safe to drop it here; it will be freed under RCU.
         */
        set_bit(CGRP_RELEASABLE, &old_cgrp->flags);
-       put_css_set(old_cset);
+       put_css_set(old_cset, false);
 }
 
 /**
                        tc = flex_array_get(group, i);
                        if (!tc->cset)
                                break;
-                       put_css_set(tc->cset);
+                       put_css_set(tc->cset, false);
                }
        }
 out_cancel_attach:
 
        /*
         * css_set_rwsem synchronizes access to ->cset_links and prevents
-        * @cgrp from being removed while __put_css_set() is in progress.
+        * @cgrp from being removed while put_css_set() is in progress.
         */
        down_read(&css_set_rwsem);
        empty = list_empty(&cgrp->cset_links);
        }
        task_unlock(tsk);
 
-       put_css_set_taskexit(cset);
+       put_css_set(cset, true);
 }
 
 static void check_for_release(struct cgroup *cgrp)