cgroup: replace "cgroup.populated" with "cgroup.events"
memcg already uses "memory.events" for event reporting and other controllers may need event reporting too. Let's standardize on "$SUBSYS.events" interface file for reporting events which don't happen too frequently and thus can share event notification. "cgroup.populated" is replaced with "populated" field in "cgroup.events" and documentation is updated accordingly. Signed-off-by: Tejun Heo <tj@kernel.org> Cc: Li Zefan <lizefan@huawei.com> Cc: Johannes Weiner <hannes@cmpxchg.org>
This commit is contained in:
parent
9e10a130d9
commit
4a07c222d3
@ -341,11 +341,11 @@ is riddled with issues.
|
|||||||
unnecessarily complicated and probably done this way because event
|
unnecessarily complicated and probably done this way because event
|
||||||
delivery itself was expensive.
|
delivery itself was expensive.
|
||||||
|
|
||||||
Unified hierarchy implements an interface file "cgroup.populated"
|
Unified hierarchy implements "populated" field in "cgroup.events"
|
||||||
which can be used to monitor whether the cgroup's subhierarchy has
|
interface file which can be used to monitor whether the cgroup's
|
||||||
tasks in it or not. Its value is 0 if there is no task in the cgroup
|
subhierarchy has tasks in it or not. Its value is 0 if there is no
|
||||||
and its descendants; otherwise, 1. poll and [id]notify events are
|
task in the cgroup and its descendants; otherwise, 1. poll and
|
||||||
triggered when the value changes.
|
[id]notify events are triggered when the value changes.
|
||||||
|
|
||||||
This is significantly lighter and simpler and trivially allows
|
This is significantly lighter and simpler and trivially allows
|
||||||
delegating management of subhierarchy - subhierarchy monitoring can
|
delegating management of subhierarchy - subhierarchy monitoring can
|
||||||
@ -435,6 +435,11 @@ may be specified in any order and not all pairs have to be specified.
|
|||||||
the first entry in the file. Specific entries can use "default" as
|
the first entry in the file. Specific entries can use "default" as
|
||||||
its value to indicate inheritance of the default value.
|
its value to indicate inheritance of the default value.
|
||||||
|
|
||||||
|
- For events which are not very high frequency, an interface file
|
||||||
|
"events" should be created which lists event key value pairs.
|
||||||
|
Whenever a notifiable event happens, file modified event should be
|
||||||
|
generated on the file.
|
||||||
|
|
||||||
|
|
||||||
5-4. Per-Controller Changes
|
5-4. Per-Controller Changes
|
||||||
|
|
||||||
|
@ -226,7 +226,7 @@ struct cgroup {
|
|||||||
|
|
||||||
struct kernfs_node *kn; /* cgroup kernfs entry */
|
struct kernfs_node *kn; /* cgroup kernfs entry */
|
||||||
struct kernfs_node *procs_kn; /* kn for "cgroup.procs" */
|
struct kernfs_node *procs_kn; /* kn for "cgroup.procs" */
|
||||||
struct kernfs_node *populated_kn; /* kn for "cgroup.subtree_populated" */
|
struct kernfs_node *events_kn; /* kn for "cgroup.events" */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The bitmask of subsystems enabled on the child cgroups.
|
* The bitmask of subsystems enabled on the child cgroups.
|
||||||
|
@ -611,8 +611,8 @@ static void cgroup_update_populated(struct cgroup *cgrp, bool populated)
|
|||||||
if (!trigger)
|
if (!trigger)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (cgrp->populated_kn)
|
if (cgrp->events_kn)
|
||||||
kernfs_notify(cgrp->populated_kn);
|
kernfs_notify(cgrp->events_kn);
|
||||||
cgrp = cgroup_parent(cgrp);
|
cgrp = cgroup_parent(cgrp);
|
||||||
} while (cgrp);
|
} while (cgrp);
|
||||||
}
|
}
|
||||||
@ -3045,9 +3045,10 @@ static ssize_t cgroup_subtree_control_write(struct kernfs_open_file *of,
|
|||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cgroup_populated_show(struct seq_file *seq, void *v)
|
static int cgroup_events_show(struct seq_file *seq, void *v)
|
||||||
{
|
{
|
||||||
seq_printf(seq, "%d\n", (bool)seq_css(seq)->cgroup->populated_cnt);
|
seq_printf(seq, "populated %d\n",
|
||||||
|
(bool)seq_css(seq)->cgroup->populated_cnt);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3214,8 +3215,8 @@ static int cgroup_add_file(struct cgroup *cgrp, struct cftype *cft)
|
|||||||
|
|
||||||
if (cft->write == cgroup_procs_write)
|
if (cft->write == cgroup_procs_write)
|
||||||
cgrp->procs_kn = kn;
|
cgrp->procs_kn = kn;
|
||||||
else if (cft->seq_show == cgroup_populated_show)
|
else if (cft->seq_show == cgroup_events_show)
|
||||||
cgrp->populated_kn = kn;
|
cgrp->events_kn = kn;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4388,9 +4389,9 @@ static struct cftype cgroup_dfl_base_files[] = {
|
|||||||
.write = cgroup_subtree_control_write,
|
.write = cgroup_subtree_control_write,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "cgroup.populated",
|
.name = "cgroup.events",
|
||||||
.flags = CFTYPE_NOT_ON_ROOT,
|
.flags = CFTYPE_NOT_ON_ROOT,
|
||||||
.seq_show = cgroup_populated_show,
|
.seq_show = cgroup_events_show,
|
||||||
},
|
},
|
||||||
{ } /* terminate */
|
{ } /* terminate */
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user