提交 b788c991 编写于 作者: J Johannes Weiner 提交者: Caspar Zhang

kernel: cgroup: add poll file operation

commit dc50537bdd1a0804fa2cbc990565ee9a944e66fa upstream.

Cgroup has a standardized poll/notification mechanism for waking all
pollers on all fds when a filesystem node changes.  To allow polling for
custom events, add a .poll callback that can override the default.

This is in preparation for pollable cgroup pressure files which have
per-fd trigger configurations.

Link: http://lkml.kernel.org/r/20190124211518.244221-3-surenb@google.comSigned-off-by: NJohannes Weiner <hannes@cmpxchg.org>
Signed-off-by: NSuren Baghdasaryan <surenb@google.com>
Cc: Dennis Zhou <dennis@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Li Zefan <lizefan@huawei.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Tejun Heo <tj@kernel.org>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: NJoseph Qi <joseph.qi@linux.alibaba.com>
Acked-by: NCaspar Zhang <caspar@linux.alibaba.com>
上级 e4a06af6
...@@ -32,6 +32,7 @@ struct kernfs_node; ...@@ -32,6 +32,7 @@ struct kernfs_node;
struct kernfs_ops; struct kernfs_ops;
struct kernfs_open_file; struct kernfs_open_file;
struct seq_file; struct seq_file;
struct poll_table_struct;
#define MAX_CGROUP_TYPE_NAMELEN 32 #define MAX_CGROUP_TYPE_NAMELEN 32
#define MAX_CGROUP_ROOT_NAMELEN 64 #define MAX_CGROUP_ROOT_NAMELEN 64
...@@ -579,6 +580,9 @@ struct cftype { ...@@ -579,6 +580,9 @@ struct cftype {
ssize_t (*write)(struct kernfs_open_file *of, ssize_t (*write)(struct kernfs_open_file *of,
char *buf, size_t nbytes, loff_t off); char *buf, size_t nbytes, loff_t off);
__poll_t (*poll)(struct kernfs_open_file *of,
struct poll_table_struct *pt);
#ifdef CONFIG_DEBUG_LOCK_ALLOC #ifdef CONFIG_DEBUG_LOCK_ALLOC
struct lock_class_key lockdep_key; struct lock_class_key lockdep_key;
#endif #endif
......
...@@ -3520,6 +3520,16 @@ static ssize_t cgroup_file_write(struct kernfs_open_file *of, char *buf, ...@@ -3520,6 +3520,16 @@ static ssize_t cgroup_file_write(struct kernfs_open_file *of, char *buf,
return ret ?: nbytes; return ret ?: nbytes;
} }
static __poll_t cgroup_file_poll(struct kernfs_open_file *of, poll_table *pt)
{
struct cftype *cft = of->kn->priv;
if (cft->poll)
return cft->poll(of, pt);
return kernfs_generic_poll(of, pt);
}
static void *cgroup_seqfile_start(struct seq_file *seq, loff_t *ppos) static void *cgroup_seqfile_start(struct seq_file *seq, loff_t *ppos)
{ {
return seq_cft(seq)->seq_start(seq, ppos); return seq_cft(seq)->seq_start(seq, ppos);
...@@ -3558,6 +3568,7 @@ static struct kernfs_ops cgroup_kf_single_ops = { ...@@ -3558,6 +3568,7 @@ static struct kernfs_ops cgroup_kf_single_ops = {
.open = cgroup_file_open, .open = cgroup_file_open,
.release = cgroup_file_release, .release = cgroup_file_release,
.write = cgroup_file_write, .write = cgroup_file_write,
.poll = cgroup_file_poll,
.seq_show = cgroup_seqfile_show, .seq_show = cgroup_seqfile_show,
}; };
...@@ -3566,6 +3577,7 @@ static struct kernfs_ops cgroup_kf_ops = { ...@@ -3566,6 +3577,7 @@ static struct kernfs_ops cgroup_kf_ops = {
.open = cgroup_file_open, .open = cgroup_file_open,
.release = cgroup_file_release, .release = cgroup_file_release,
.write = cgroup_file_write, .write = cgroup_file_write,
.poll = cgroup_file_poll,
.seq_start = cgroup_seqfile_start, .seq_start = cgroup_seqfile_start,
.seq_next = cgroup_seqfile_next, .seq_next = cgroup_seqfile_next,
.seq_stop = cgroup_seqfile_stop, .seq_stop = cgroup_seqfile_stop,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册