From: Jens Axboe Date: Tue, 9 Mar 2021 16:01:24 +0000 (-0700) Subject: io_uring: use kiocb->private to hold rw_len X-Git-Url: https://git.kernel.dk/?a=commitdiff_plain;h=refs%2Fheads%2Fio_uring-bio-cache;p=linux-2.6-block.git io_uring: use kiocb->private to hold rw_len We don't need a separate member in io_rw for this, we can just use the kiocb->private field as we're not using it for anything else anyway. This saves 8 bytes in io_rw, which we'll be needing once kiocb grows a new member. Signed-off-by: Jens Axboe --- diff --git a/fs/io_uring.c b/fs/io_uring.c index ae13cf6a5644..869cc8d155a9 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -570,7 +570,6 @@ struct io_rw { /* NOTE: kiocb has the file as the first member, so don't do it here */ struct kiocb kiocb; u64 addr; - u64 len; }; struct io_connect { @@ -2706,6 +2705,16 @@ static bool io_mark_alloc_cache(struct kiocb *kiocb) } #endif /* CONFIG_BLOCK */ +static inline void *u64_to_ptr(__u64 ptr) +{ + return (void *)(unsigned long) ptr; +} + +static inline __u64 ptr_to_u64(void *ptr) +{ + return (__u64)(unsigned long)ptr; +} + static int io_prep_rw(struct io_kiocb *req, const struct io_uring_sqe *sqe) { struct io_ring_ctx *ctx = req->ctx; @@ -2767,7 +2776,7 @@ static int io_prep_rw(struct io_kiocb *req, const struct io_uring_sqe *sqe) } req->rw.addr = READ_ONCE(sqe->addr); - req->rw.len = READ_ONCE(sqe->len); + req->rw.kiocb.private = u64_to_ptr(READ_ONCE(sqe->len)); req->buf_index = READ_ONCE(sqe->buf_index); return 0; } @@ -2836,7 +2845,7 @@ static void kiocb_done(struct kiocb *kiocb, ssize_t ret, static int __io_import_fixed(struct io_kiocb *req, int rw, struct iov_iter *iter, struct io_mapped_ubuf *imu) { - size_t len = req->rw.len; + size_t len = ptr_to_u64(req->rw.kiocb.private); u64 buf_end, buf_addr = req->rw.addr; size_t offset; @@ -3034,7 +3043,7 @@ static ssize_t io_iov_buffer_select(struct io_kiocb *req, struct iovec *iov, iov[0].iov_len = kbuf->len; return 0; } - if (req->rw.len != 1) + if (ptr_to_u64(req->rw.kiocb.private) != 1) return -EINVAL; #ifdef CONFIG_COMPAT @@ -3049,7 +3058,7 @@ static int io_import_iovec(int rw, struct io_kiocb *req, struct iovec **iovec, struct iov_iter *iter, bool needs_lock) { void __user *buf = u64_to_user_ptr(req->rw.addr); - size_t sqe_len = req->rw.len; + size_t sqe_len = ptr_to_u64(req->rw.kiocb.private); u8 opcode = req->opcode; ssize_t ret; @@ -3067,7 +3076,7 @@ static int io_import_iovec(int rw, struct io_kiocb *req, struct iovec **iovec, buf = io_rw_buffer_select(req, &sqe_len, needs_lock); if (IS_ERR(buf)) return PTR_ERR(buf); - req->rw.len = sqe_len; + req->rw.kiocb.private = u64_to_ptr(sqe_len); } ret = import_single_range(rw, buf, sqe_len, *iovec, iter); @@ -3100,6 +3109,7 @@ static ssize_t loop_rw_iter(int rw, struct io_kiocb *req, struct iov_iter *iter) { struct kiocb *kiocb = &req->rw.kiocb; struct file *file = req->file; + unsigned long rw_len; ssize_t ret = 0; /* @@ -3112,6 +3122,7 @@ static ssize_t loop_rw_iter(int rw, struct io_kiocb *req, struct iov_iter *iter) if (kiocb->ki_flags & IOCB_NOWAIT) return -EAGAIN; + rw_len = ptr_to_u64(req->rw.kiocb.private); while (iov_iter_count(iter)) { struct iovec iovec; ssize_t nr; @@ -3120,7 +3131,7 @@ static ssize_t loop_rw_iter(int rw, struct io_kiocb *req, struct iov_iter *iter) iovec = iov_iter_iovec(iter); } else { iovec.iov_base = u64_to_user_ptr(req->rw.addr); - iovec.iov_len = req->rw.len; + iovec.iov_len = rw_len; } if (rw == READ) { @@ -3139,7 +3150,7 @@ static ssize_t loop_rw_iter(int rw, struct io_kiocb *req, struct iov_iter *iter) ret += nr; if (nr != iovec.iov_len) break; - req->rw.len -= nr; + rw_len -= nr; req->rw.addr += nr; iov_iter_advance(iter, nr); }