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: Adam Manzanares <adam.manzanares@wdc.com> Reviewed-by: Jeff Moyer <jmoyer@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
fc28724d67
commit
d9a08a9e61
4 changed files with 23 additions and 0 deletions
|
@ -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,
|
||||||
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);
|
||||||
|
|
||||||
|
|
16
fs/aio.c
16
fs/aio.c
|
@ -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 @@
|
||||||
#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 {
|
||||||
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)
|
||||||
.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 {
|
||||||
* 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 {
|
||||||
|
|
Loading…
Reference in a new issue