Message ID | 20181204233729.26776-2-axboe@kernel.dk (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [01/26] fs: add an iopoll method to struct file_operations | expand |
Jens Axboe <axboe@kernel.dk> writes: > From: Christoph Hellwig <hch@lst.de> > > This new methods is used to explicitly poll for I/O completion for an > iocb. It must be called for any iocb submitted asynchronously (that > is with a non-null ki_complete) which has the IOCB_HIPRI flag set. > > The method is assisted by a new ki_cookie field in struct iocb to store > the polling cookie. > > TODO: we can probably union ki_cookie with the existing hint and I/O > priority fields to avoid struct kiocb growth. Please document return values. Thanks, Jeff > > Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de> > Signed-off-by: Christoph Hellwig <hch@lst.de> > Signed-off-by: Jens Axboe <axboe@kernel.dk> > --- > Documentation/filesystems/vfs.txt | 3 +++ > include/linux/fs.h | 2 ++ > 2 files changed, 5 insertions(+) > > diff --git a/Documentation/filesystems/vfs.txt b/Documentation/filesystems/vfs.txt > index 5f71a252e2e0..d9dc5e4d82b9 100644 > --- a/Documentation/filesystems/vfs.txt > +++ b/Documentation/filesystems/vfs.txt > @@ -857,6 +857,7 @@ struct file_operations { > ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); > ssize_t (*read_iter) (struct kiocb *, struct iov_iter *); > ssize_t (*write_iter) (struct kiocb *, struct iov_iter *); > + int (*iopoll)(struct kiocb *kiocb, bool spin); > int (*iterate) (struct file *, struct dir_context *); > int (*iterate_shared) (struct file *, struct dir_context *); > __poll_t (*poll) (struct file *, struct poll_table_struct *); > @@ -902,6 +903,8 @@ otherwise noted. > > write_iter: possibly asynchronous write with iov_iter as source > > + iopoll: called when aio wants to poll for completions on HIPRI iocbs > + > iterate: called when the VFS needs to read the directory contents > > iterate_shared: called when the VFS needs to read the directory contents > diff --git a/include/linux/fs.h b/include/linux/fs.h > index a1ab233e6469..6a5f71f8ae06 100644 > --- a/include/linux/fs.h > +++ b/include/linux/fs.h > @@ -310,6 +310,7 @@ struct kiocb { > int ki_flags; > u16 ki_hint; > u16 ki_ioprio; /* See linux/ioprio.h */ > + unsigned int ki_cookie; /* for ->iopoll */ > } __randomize_layout; > > static inline bool is_sync_kiocb(struct kiocb *kiocb) > @@ -1781,6 +1782,7 @@ struct file_operations { > ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); > ssize_t (*read_iter) (struct kiocb *, struct iov_iter *); > ssize_t (*write_iter) (struct kiocb *, struct iov_iter *); > + int (*iopoll)(struct kiocb *kiocb, bool spin); > int (*iterate) (struct file *, struct dir_context *); > int (*iterate_shared) (struct file *, struct dir_context *); > __poll_t (*poll) (struct file *, struct poll_table_struct *);
diff --git a/Documentation/filesystems/vfs.txt b/Documentation/filesystems/vfs.txt index 5f71a252e2e0..d9dc5e4d82b9 100644 --- a/Documentation/filesystems/vfs.txt +++ b/Documentation/filesystems/vfs.txt @@ -857,6 +857,7 @@ struct file_operations { ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); ssize_t (*read_iter) (struct kiocb *, struct iov_iter *); ssize_t (*write_iter) (struct kiocb *, struct iov_iter *); + int (*iopoll)(struct kiocb *kiocb, bool spin); int (*iterate) (struct file *, struct dir_context *); int (*iterate_shared) (struct file *, struct dir_context *); __poll_t (*poll) (struct file *, struct poll_table_struct *); @@ -902,6 +903,8 @@ otherwise noted. write_iter: possibly asynchronous write with iov_iter as source + iopoll: called when aio wants to poll for completions on HIPRI iocbs + iterate: called when the VFS needs to read the directory contents iterate_shared: called when the VFS needs to read the directory contents diff --git a/include/linux/fs.h b/include/linux/fs.h index a1ab233e6469..6a5f71f8ae06 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -310,6 +310,7 @@ struct kiocb { int ki_flags; u16 ki_hint; u16 ki_ioprio; /* See linux/ioprio.h */ + unsigned int ki_cookie; /* for ->iopoll */ } __randomize_layout; static inline bool is_sync_kiocb(struct kiocb *kiocb) @@ -1781,6 +1782,7 @@ struct file_operations { ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); ssize_t (*read_iter) (struct kiocb *, struct iov_iter *); ssize_t (*write_iter) (struct kiocb *, struct iov_iter *); + int (*iopoll)(struct kiocb *kiocb, bool spin); int (*iterate) (struct file *, struct dir_context *); int (*iterate_shared) (struct file *, struct dir_context *); __poll_t (*poll) (struct file *, struct poll_table_struct *);