+++ /dev/null
-From 41c25707d21716826e3c1f60967f5550610ec1c9 Mon Sep 17 00:00:00 2001
-From: Tejun Heo <tj@kernel.org>
-Date: Wed, 24 May 2017 12:03:48 -0400
-Subject: cpuset: consider dying css as offline
-
-From: Tejun Heo <tj@kernel.org>
-
-commit 41c25707d21716826e3c1f60967f5550610ec1c9 upstream.
-
-In most cases, a cgroup controller don't care about the liftimes of
-cgroups. For the controller, a css becomes online when ->css_online()
-is called on it and offline when ->css_offline() is called.
-
-However, cpuset is special in that the user interface it exposes cares
-whether certain cgroups exist or not. Combined with the RCU delay
-between cgroup removal and css offlining, this can lead to user
-visible behavior oddities where operations which should succeed after
-cgroup removals fail for some time period. The effects of cgroup
-removals are delayed when seen from userland.
-
-This patch adds css_is_dying() which tests whether offline is pending
-and updates is_cpuset_online() so that the function returns false also
-while offline is pending. This gets rid of the userland visible
-delays.
-
-Signed-off-by: Tejun Heo <tj@kernel.org>
-Reported-by: Daniel Jordan <daniel.m.jordan@oracle.com>
-Link: http://lkml.kernel.org/r/327ca1f5-7957-fbb9-9e5f-9ba149d40ba2@oracle.com
-Signed-off-by: Tejun Heo <tj@kernel.org>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-
----
- include/linux/cgroup.h | 20 ++++++++++++++++++++
- kernel/cpuset.c | 4 ++--
- 2 files changed, 22 insertions(+), 2 deletions(-)
-
---- a/include/linux/cgroup.h
-+++ b/include/linux/cgroup.h
-@@ -148,6 +148,26 @@ static inline bool css_tryget_online(str
- }
-
- /**
-+ * css_is_dying - test whether the specified css is dying
-+ * @css: target css
-+ *
-+ * Test whether @css is in the process of offlining or already offline. In
-+ * most cases, ->css_online() and ->css_offline() callbacks should be
-+ * enough; however, the actual offline operations are RCU delayed and this
-+ * test returns %true also when @css is scheduled to be offlined.
-+ *
-+ * This is useful, for example, when the use case requires synchronous
-+ * behavior with respect to cgroup removal. cgroup removal schedules css
-+ * offlining but the css can seem alive while the operation is being
-+ * delayed. If the delay affects user visible semantics, this test can be
-+ * used to resolve the situation.
-+ */
-+static inline bool css_is_dying(struct cgroup_subsys_state *css)
-+{
-+ return !(css->flags & CSS_NO_REF) && percpu_ref_is_dying(&css->refcnt);
-+}
-+
-+/**
- * css_put - put a css reference
- * @css: target css
- *
---- a/kernel/cpuset.c
-+++ b/kernel/cpuset.c
-@@ -174,9 +174,9 @@ typedef enum {
- } cpuset_flagbits_t;
-
- /* convenient tests for these bits */
--static inline bool is_cpuset_online(const struct cpuset *cs)
-+static inline bool is_cpuset_online(struct cpuset *cs)
- {
-- return test_bit(CS_ONLINE, &cs->flags);
-+ return test_bit(CS_ONLINE, &cs->flags) && !css_is_dying(&cs->css);
- }
-
- static inline int is_cpu_exclusive(const struct cpuset *cs)