Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1641686 > unrolled thread
| Started by | Waiman Long <longman@redhat.com> |
|---|---|
| First post | 2017-05-15 15:40 +0200 |
| Last post | 2017-05-18 18:00 +0200 |
| Articles | 3 — 2 participants |
Back to article view | Back to linux.kernel
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
[RFC PATCH v2 09/17] cgroup: Keep accurate count of tasks in each css_set Waiman Long <longman@redhat.com> - 2017-05-15 15:40 +0200
Re: [RFC PATCH v2 09/17] cgroup: Keep accurate count of tasks in each css_set Tejun Heo <tj@kernel.org> - 2017-05-17 23:50 +0200
Re: [RFC PATCH v2 09/17] cgroup: Keep accurate count of tasks in each css_set Waiman Long <longman@redhat.com> - 2017-05-18 18:00 +0200
| From | Waiman Long <longman@redhat.com> |
|---|---|
| Date | 2017-05-15 15:40 +0200 |
| Subject | [RFC PATCH v2 09/17] cgroup: Keep accurate count of tasks in each css_set |
| Message-ID | <tHooa-lZ-37@gated-at.bofh.it> |
The reference count in the css_set data structure was used as a
proxy of the number of tasks attached to that css_set. However, that
count is actually not an accurate measure especially with thread mode
support. So a new variable task_count is added to the css_set to keep
track of the actual task count. This new variable is protected by
the css_set_lock. Functions that require the actual task count are
updated to use the new variable.
Signed-off-by: Waiman Long <longman@redhat.com>
---
include/linux/cgroup-defs.h | 3 +++
kernel/cgroup/cgroup-v1.c | 6 +-----
kernel/cgroup/cgroup.c | 5 +++++
kernel/cgroup/debug.c | 6 +-----
4 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/include/linux/cgroup-defs.h b/include/linux/cgroup-defs.h
index b123afc..104be73 100644
--- a/include/linux/cgroup-defs.h
+++ b/include/linux/cgroup-defs.h
@@ -163,6 +163,9 @@ struct css_set {
/* reference count */
refcount_t refcount;
+ /* internal task count, protected by css_set_lock */
+ int task_count;
+
/*
* If not threaded, the following points to self. If threaded, to
* a cset which belongs to the top cgroup of the threaded subtree.
diff --git a/kernel/cgroup/cgroup-v1.c b/kernel/cgroup/cgroup-v1.c
index 7ad6b17..302b3b8 100644
--- a/kernel/cgroup/cgroup-v1.c
+++ b/kernel/cgroup/cgroup-v1.c
@@ -334,10 +334,6 @@ static struct cgroup_pidlist *cgroup_pidlist_find_create(struct cgroup *cgrp,
/**
* cgroup_task_count - count the number of tasks in a cgroup.
* @cgrp: the cgroup in question
- *
- * Return the number of tasks in the cgroup. The returned number can be
- * higher than the actual number of tasks due to css_set references from
- * namespace roots and temporary usages.
*/
static int cgroup_task_count(const struct cgroup *cgrp)
{
@@ -346,7 +342,7 @@ static int cgroup_task_count(const struct cgroup *cgrp)
spin_lock_irq(&css_set_lock);
list_for_each_entry(link, &cgrp->cset_links, cset_link)
- count += refcount_read(&link->cset->refcount);
+ count += link->cset->task_count;
spin_unlock_irq(&css_set_lock);
return count;
}
diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c
index 7b085d5..7e3ddfb 100644
--- a/kernel/cgroup/cgroup.c
+++ b/kernel/cgroup/cgroup.c
@@ -1676,6 +1676,7 @@ static void cgroup_enable_task_cg_lists(void)
css_set_update_populated(cset, true);
list_add_tail(&p->cg_list, &cset->tasks);
get_css_set(cset);
+ cset->task_count++;
}
spin_unlock(&p->sighand->siglock);
} while_each_thread(g, p);
@@ -2159,8 +2160,10 @@ static int cgroup_migrate_execute(struct cgroup_mgctx *mgctx)
struct css_set *to_cset = cset->mg_dst_cset;
get_css_set(to_cset);
+ to_cset->task_count++;
css_set_move_task(task, from_cset, to_cset, true);
put_css_set_locked(from_cset);
+ from_cset->task_count--;
}
}
spin_unlock_irq(&css_set_lock);
@@ -5160,6 +5163,7 @@ void cgroup_post_fork(struct task_struct *child)
cset = task_css_set(current);
if (list_empty(&child->cg_list)) {
get_css_set(cset);
+ cset->task_count++;
css_set_move_task(child, NULL, cset, false);
}
spin_unlock_irq(&css_set_lock);
@@ -5209,6 +5213,7 @@ void cgroup_exit(struct task_struct *tsk)
if (!list_empty(&tsk->cg_list)) {
spin_lock_irq(&css_set_lock);
css_set_move_task(tsk, cset, NULL, false);
+ cset->task_count--;
spin_unlock_irq(&css_set_lock);
} else {
get_css_set(cset);
diff --git a/kernel/cgroup/debug.c b/kernel/cgroup/debug.c
index 56e60a2..ada53e6 100644
--- a/kernel/cgroup/debug.c
+++ b/kernel/cgroup/debug.c
@@ -23,10 +23,6 @@ static void debug_css_free(struct cgroup_subsys_state *css)
/*
* debug_taskcount_read - return the number of tasks in a cgroup.
* @cgrp: the cgroup in question
- *
- * Return the number of tasks in the cgroup. The returned number can be
- * higher than the actual number of tasks due to css_set references from
- * namespace roots and temporary usages.
*/
static u64 debug_taskcount_read(struct cgroup_subsys_state *css,
struct cftype *cft)
@@ -37,7 +33,7 @@ static u64 debug_taskcount_read(struct cgroup_subsys_state *css,
spin_lock_irq(&css_set_lock);
list_for_each_entry(link, &cgrp->cset_links, cset_link)
- count += refcount_read(&link->cset->refcount);
+ count += link->cset->task_count;
spin_unlock_irq(&css_set_lock);
return count;
}
--
1.8.3.1
[toc] | [next] | [standalone]
| From | Tejun Heo <tj@kernel.org> |
|---|---|
| Date | 2017-05-17 23:50 +0200 |
| Subject | Re: [RFC PATCH v2 09/17] cgroup: Keep accurate count of tasks in each css_set |
| Message-ID | <tIeZs-8x-21@gated-at.bofh.it> |
| In reply to | #1641686 |
Hello, On Mon, May 15, 2017 at 09:34:08AM -0400, Waiman Long wrote: > The reference count in the css_set data structure was used as a > proxy of the number of tasks attached to that css_set. However, that > count is actually not an accurate measure especially with thread mode > support. So a new variable task_count is added to the css_set to keep > track of the actual task count. This new variable is protected by > the css_set_lock. Functions that require the actual task count are > updated to use the new variable. > > Signed-off-by: Waiman Long <longman@redhat.com> Looks good. We probably should replace css_set_populated() to use this too. Thanks. -- tejun
[toc] | [prev] | [next] | [standalone]
| From | Waiman Long <longman@redhat.com> |
|---|---|
| Date | 2017-05-18 18:00 +0200 |
| Subject | Re: [RFC PATCH v2 09/17] cgroup: Keep accurate count of tasks in each css_set |
| Message-ID | <tIw0h-4M2-5@gated-at.bofh.it> |
| In reply to | #1643655 |
On 05/17/2017 05:40 PM, Tejun Heo wrote: > Hello, > > On Mon, May 15, 2017 at 09:34:08AM -0400, Waiman Long wrote: >> The reference count in the css_set data structure was used as a >> proxy of the number of tasks attached to that css_set. However, that >> count is actually not an accurate measure especially with thread mode >> support. So a new variable task_count is added to the css_set to keep >> track of the actual task count. This new variable is protected by >> the css_set_lock. Functions that require the actual task count are >> updated to use the new variable. >> >> Signed-off-by: Waiman Long <longman@redhat.com> > Looks good. We probably should replace css_set_populated() to use > this too. > > Thanks. > Yes, you are right. css_set_populated() can be replaced with a check on the task_count. Regards, Longman
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web