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: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									147e1a97c4
								
							
						
					
					
						commit
						dc50537bdd
					
				| @ -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 | ||||
| @ -574,6 +575,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 | ||||
|  | ||||
| @ -3534,6 +3534,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); | ||||
| @ -3572,6 +3582,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, | ||||
| }; | ||||
| 
 | ||||
| @ -3580,6 +3591,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