Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0ee3cb39 authored by Johannes Weiner's avatar Johannes Weiner Committed by Suren Baghdasaryan
Browse files

BACKPORT: 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: default avatarJohannes Weiner <hannes@cmpxchg.org>
Signed-off-by: default avatarSuren 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: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarStephen Rothwell <sfr@canb.auug.org.au>

(cherry picked from commit: dc50537bdd1a0804fa2cbc990565ee9a944e66fa)

Conflicts:
        include/linux/cgroup-defs.h
        kernel/cgroup.c

1. made changes in kernel/cgroup.c instead of kernel/cgroup/cgroup.c
2. replaced __poll_t with unsigned int

Bug: 111308141
Test: modified lmkd to use PSI and tested using lmkd_unit_test

Change-Id: Ie3d914197d1f150e1d83c6206865566a7cbff1b4
Signed-off-by: default avatarSuren Baghdasaryan <surenb@google.com>
parent 2c54994c
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
@@ -29,6 +29,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
@@ -436,6 +437,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);


	unsigned int (*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
+12 −0
Original line number Original line Diff line number Diff line
@@ -3556,6 +3556,16 @@ static ssize_t cgroup_file_write(struct kernfs_open_file *of, char *buf,
	return ret ?: nbytes;
	return ret ?: nbytes;
}
}


static unsigned int 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);
@@ -3594,6 +3604,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,
};
};


@@ -3602,6 +3613,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,