mirror of
https://github.com/torvalds/linux.git
synced 2026-06-09 15:12:59 +02:00
UPSTREAM: kernel: cgroup: add poll file operation
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.com
Signed-off-by: Johannes Weiner <hannes@cmpxchg.org>
Signed-off-by: Suren 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: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
(cherry picked from commit: dc50537bdd)
Bug: 127712811
Test: lmkd in PSI mode
Change-Id: Idc648e7b7b7bd5fc00c7b32163e55a93b0f49a98
Signed-off-by: Suren Baghdasaryan <surenb@google.com>
This commit is contained in:
parent
adea88fa0d
commit
9f79143ebb
|
|
@ -32,6 +32,7 @@ struct kernfs_node;
|
|||
struct kernfs_ops;
|
||||
struct kernfs_open_file;
|
||||
struct seq_file;
|
||||
struct poll_table_struct;
|
||||
|
||||
#define MAX_CGROUP_TYPE_NAMELEN 32
|
||||
#define MAX_CGROUP_ROOT_NAMELEN 64
|
||||
|
|
@ -573,6 +574,9 @@ struct cftype {
|
|||
ssize_t (*write)(struct kernfs_open_file *of,
|
||||
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
|
||||
struct lock_class_key lockdep_key;
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -3499,6 +3499,16 @@ static ssize_t cgroup_file_write(struct kernfs_open_file *of, char *buf,
|
|||
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)
|
||||
{
|
||||
return seq_cft(seq)->seq_start(seq, ppos);
|
||||
|
|
@ -3537,6 +3547,7 @@ static struct kernfs_ops cgroup_kf_single_ops = {
|
|||
.open = cgroup_file_open,
|
||||
.release = cgroup_file_release,
|
||||
.write = cgroup_file_write,
|
||||
.poll = cgroup_file_poll,
|
||||
.seq_show = cgroup_seqfile_show,
|
||||
};
|
||||
|
||||
|
|
@ -3545,6 +3556,7 @@ static struct kernfs_ops cgroup_kf_ops = {
|
|||
.open = cgroup_file_open,
|
||||
.release = cgroup_file_release,
|
||||
.write = cgroup_file_write,
|
||||
.poll = cgroup_file_poll,
|
||||
.seq_start = cgroup_seqfile_start,
|
||||
.seq_next = cgroup_seqfile_next,
|
||||
.seq_stop = cgroup_seqfile_stop,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user