mirror of https://gitee.com/openkylin/linux.git
Merge branch 'for-4.12-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup
Pull cgroup fixes from Tejun Heo: "Two cgroup fixes. One to address RCU delay of cpuset removal affecting userland visible behaviors. The other fixes a race condition between controller disable and cgroup removal" * 'for-4.12-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup: cpuset: consider dying css as offline cgroup: Prevent kill_css() from being called more than once
This commit is contained in:
commit
ba7b2387ad
|
@ -48,6 +48,7 @@ enum {
|
||||||
CSS_ONLINE = (1 << 1), /* between ->css_online() and ->css_offline() */
|
CSS_ONLINE = (1 << 1), /* between ->css_online() and ->css_offline() */
|
||||||
CSS_RELEASED = (1 << 2), /* refcnt reached zero, released */
|
CSS_RELEASED = (1 << 2), /* refcnt reached zero, released */
|
||||||
CSS_VISIBLE = (1 << 3), /* css is visible to userland */
|
CSS_VISIBLE = (1 << 3), /* css is visible to userland */
|
||||||
|
CSS_DYING = (1 << 4), /* css is dying */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* bits in struct cgroup flags field */
|
/* bits in struct cgroup flags field */
|
||||||
|
|
|
@ -343,6 +343,26 @@ static inline bool css_tryget_online(struct cgroup_subsys_state *css)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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_put - put a css reference
|
||||||
* @css: target css
|
* @css: target css
|
||||||
|
|
|
@ -4265,6 +4265,11 @@ static void kill_css(struct cgroup_subsys_state *css)
|
||||||
{
|
{
|
||||||
lockdep_assert_held(&cgroup_mutex);
|
lockdep_assert_held(&cgroup_mutex);
|
||||||
|
|
||||||
|
if (css->flags & CSS_DYING)
|
||||||
|
return;
|
||||||
|
|
||||||
|
css->flags |= CSS_DYING;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This must happen before css is disassociated with its cgroup.
|
* This must happen before css is disassociated with its cgroup.
|
||||||
* See seq_css() for details.
|
* See seq_css() for details.
|
||||||
|
|
|
@ -176,9 +176,9 @@ typedef enum {
|
||||||
} cpuset_flagbits_t;
|
} cpuset_flagbits_t;
|
||||||
|
|
||||||
/* convenient tests for these bits */
|
/* 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)
|
static inline int is_cpu_exclusive(const struct cpuset *cs)
|
||||||
|
|
Loading…
Reference in New Issue