Commit d9a08a9e authored by Adam Manzanares's avatar Adam Manzanares Committed by Al Viro

fs: Add aio iopriority support

This is the per-I/O equivalent of the ioprio_set system call.

When IOCB_FLAG_IOPRIO is set on the iocb aio_flags field, then we set the
newly added kiocb ki_ioprio field to the value in the iocb aio_reqprio field.

This patch depends on block: add ioprio_check_cap function.
Signed-off-by: default avatarAdam Manzanares <adam.manzanares@wdc.com>
Reviewed-by: default avatarJeff Moyer <jmoyer@redhat.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent fc28724d
...@@ -76,6 +76,8 @@ ...@@ -76,6 +76,8 @@
#include <linux/miscdevice.h> #include <linux/miscdevice.h>
#include <linux/falloc.h> #include <linux/falloc.h>
#include <linux/uio.h> #include <linux/uio.h>
#include <linux/ioprio.h>
#include "loop.h" #include "loop.h"
#include <linux/uaccess.h> #include <linux/uaccess.h>
...@@ -559,6 +561,7 @@ static int lo_rw_aio(struct loop_device *lo, struct loop_cmd *cmd, ...@@ -559,6 +561,7 @@ static int lo_rw_aio(struct loop_device *lo, struct loop_cmd *cmd,
cmd->iocb.ki_filp = file; cmd->iocb.ki_filp = file;
cmd->iocb.ki_complete = lo_rw_aio_complete; cmd->iocb.ki_complete = lo_rw_aio_complete;
cmd->iocb.ki_flags = IOCB_DIRECT; cmd->iocb.ki_flags = IOCB_DIRECT;
cmd->iocb.ki_ioprio = IOPRIO_PRIO_VALUE(IOPRIO_CLASS_NONE, 0);
if (cmd->css) if (cmd->css)
kthread_associate_blkcg(cmd->css); kthread_associate_blkcg(cmd->css);
......
...@@ -1435,6 +1435,22 @@ static int aio_prep_rw(struct kiocb *req, struct iocb *iocb) ...@@ -1435,6 +1435,22 @@ static int aio_prep_rw(struct kiocb *req, struct iocb *iocb)
if (iocb->aio_flags & IOCB_FLAG_RESFD) if (iocb->aio_flags & IOCB_FLAG_RESFD)
req->ki_flags |= IOCB_EVENTFD; req->ki_flags |= IOCB_EVENTFD;
req->ki_hint = ki_hint_validate(file_write_hint(req->ki_filp)); req->ki_hint = ki_hint_validate(file_write_hint(req->ki_filp));
if (iocb->aio_flags & IOCB_FLAG_IOPRIO) {
/*
* If the IOCB_FLAG_IOPRIO flag of aio_flags is set, then
* aio_reqprio is interpreted as an I/O scheduling
* class and priority.
*/
ret = ioprio_check_cap(iocb->aio_reqprio);
if (ret) {
pr_debug("aio ioprio check cap error\n");
return -EINVAL;
}
req->ki_ioprio = iocb->aio_reqprio;
} else
req->ki_ioprio = IOPRIO_PRIO_VALUE(IOPRIO_CLASS_NONE, 0);
ret = kiocb_set_rw_flags(req, iocb->aio_rw_flags); ret = kiocb_set_rw_flags(req, iocb->aio_rw_flags);
if (unlikely(ret)) if (unlikely(ret))
fput(req->ki_filp); fput(req->ki_filp);
......
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
#include <linux/delayed_call.h> #include <linux/delayed_call.h>
#include <linux/uuid.h> #include <linux/uuid.h>
#include <linux/errseq.h> #include <linux/errseq.h>
#include <linux/ioprio.h>
#include <asm/byteorder.h> #include <asm/byteorder.h>
#include <uapi/linux/fs.h> #include <uapi/linux/fs.h>
...@@ -300,6 +301,7 @@ struct kiocb { ...@@ -300,6 +301,7 @@ struct kiocb {
void *private; void *private;
int ki_flags; int ki_flags;
u16 ki_hint; u16 ki_hint;
u16 ki_ioprio; /* See linux/ioprio.h */
} __randomize_layout; } __randomize_layout;
static inline bool is_sync_kiocb(struct kiocb *kiocb) static inline bool is_sync_kiocb(struct kiocb *kiocb)
...@@ -1944,6 +1946,7 @@ static inline void init_sync_kiocb(struct kiocb *kiocb, struct file *filp) ...@@ -1944,6 +1946,7 @@ static inline void init_sync_kiocb(struct kiocb *kiocb, struct file *filp)
.ki_filp = filp, .ki_filp = filp,
.ki_flags = iocb_flags(filp), .ki_flags = iocb_flags(filp),
.ki_hint = ki_hint_validate(file_write_hint(filp)), .ki_hint = ki_hint_validate(file_write_hint(filp)),
.ki_ioprio = IOPRIO_PRIO_VALUE(IOPRIO_CLASS_NONE, 0),
}; };
} }
......
...@@ -53,6 +53,7 @@ enum { ...@@ -53,6 +53,7 @@ enum {
* is valid. * is valid.
*/ */
#define IOCB_FLAG_RESFD (1 << 0) #define IOCB_FLAG_RESFD (1 << 0)
#define IOCB_FLAG_IOPRIO (1 << 1)
/* read() from /dev/aio returns these structures. */ /* read() from /dev/aio returns these structures. */
struct io_event { struct io_event {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment