Commit 0aa69d53 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'for-6.5/io_uring-2023-06-23' of git://git.kernel.dk/linux

Pull io_uring updates from Jens Axboe:
 "Nothing major in this release, just a bunch of cleanups and some
  optimizations around networking mostly.

   - clean up file request flags handling (Christoph)

   - clean up request freeing and CQ locking (Pavel)

   - support for using pre-registering the io_uring fd at setup time
     (Josh)

   - Add support for user allocated ring memory, rather than having the
     kernel allocate it. Mostly for packing rings into a huge page (me)

   - avoid an unnecessary double retry on receive (me)

   - maintain ordering for task_work, which also improves performance
     (me)

   - misc cleanups/fixes (Pavel, me)"

* tag 'for-6.5/io_uring-2023-06-23' of git://git.kernel.dk/linux: (39 commits)
  io_uring: merge conditional unlock flush helpers
  io_uring: make io_cq_unlock_post static
  io_uring: inline __io_cq_unlock
  io_uring: fix acquire/release annotations
  io_uring: kill io_cq_unlock()
  io_uring: remove IOU_F_TWQ_FORCE_NORMAL
  io_uring: don't batch task put on reqs free
  io_uring: move io_clean_op()
  io_uring: inline io_dismantle_req()
  io_uring: remove io_free_req_tw
  io_uring: open code io_put_req_find_next
  io_uring: add helpers to decode the fixed file file_ptr
  io_uring: use io_file_from_index in io_msg_grab_file
  io_uring: use io_file_from_index in __io_sync_cancel
  io_uring: return REQ_F_ flags from io_file_get_flags
  io_uring: remove io_req_ffs_set
  io_uring: remove a confusing comment above io_file_get_flags
  io_uring: remove the mode variable in io_file_get_flags
  io_uring: remove __io_file_supports_nowait
  io_uring: wait interruptibly for request completions on exit
  ...
parents 3eccc0c8 c98c81a4
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -481,7 +481,7 @@ static int blkdev_open(struct inode *inode, struct file *filp)
	 * during an unstable branch.
	 */
	filp->f_flags |= O_LARGEFILE;
	filp->f_mode |= FMODE_NOWAIT | FMODE_BUF_RASYNC;
	filp->f_mode |= FMODE_BUF_RASYNC;

	if (filp->f_flags & O_NDELAY)
		filp->f_mode |= FMODE_NDELAY;
@@ -494,6 +494,9 @@ static int blkdev_open(struct inode *inode, struct file *filp)
	if (IS_ERR(bdev))
		return PTR_ERR(bdev);

	if (bdev_nowait(bdev))
		filp->f_mode |= FMODE_NOWAIT;

	filp->private_data = bdev;
	filp->f_mapping = bdev->bd_inode->i_mapping;
	filp->f_wb_err = filemap_sample_wb_err(filp->f_mapping);
+2 −2
Original line number Diff line number Diff line
@@ -521,7 +521,7 @@ static enum rq_end_io_ret nvme_uring_cmd_end_io(struct request *req,
	if (cookie != NULL && blk_rq_is_poll(req))
		nvme_uring_task_cb(ioucmd, IO_URING_F_UNLOCKED);
	else
		io_uring_cmd_complete_in_task(ioucmd, nvme_uring_task_cb);
		io_uring_cmd_do_in_task_lazy(ioucmd, nvme_uring_task_cb);

	return RQ_END_IO_FREE;
}
@@ -543,7 +543,7 @@ static enum rq_end_io_ret nvme_uring_cmd_end_io_meta(struct request *req,
	if (cookie != NULL && blk_rq_is_poll(req))
		nvme_uring_task_meta_cb(ioucmd, IO_URING_F_UNLOCKED);
	else
		io_uring_cmd_complete_in_task(ioucmd, nvme_uring_task_meta_cb);
		io_uring_cmd_do_in_task_lazy(ioucmd, nvme_uring_task_meta_cb);

	return RQ_END_IO_NONE;
}
+16 −2
Original line number Diff line number Diff line
@@ -46,13 +46,23 @@ int io_uring_cmd_import_fixed(u64 ubuf, unsigned long len, int rw,
			      struct iov_iter *iter, void *ioucmd);
void io_uring_cmd_done(struct io_uring_cmd *cmd, ssize_t ret, ssize_t res2,
			unsigned issue_flags);
void io_uring_cmd_complete_in_task(struct io_uring_cmd *ioucmd,
			void (*task_work_cb)(struct io_uring_cmd *, unsigned));
struct sock *io_uring_get_socket(struct file *file);
void __io_uring_cancel(bool cancel_all);
void __io_uring_free(struct task_struct *tsk);
void io_uring_unreg_ringfd(void);
const char *io_uring_get_opcode(u8 opcode);
void __io_uring_cmd_do_in_task(struct io_uring_cmd *ioucmd,
			    void (*task_work_cb)(struct io_uring_cmd *, unsigned),
			    unsigned flags);
/* users should follow semantics of IOU_F_TWQ_LAZY_WAKE */
void io_uring_cmd_do_in_task_lazy(struct io_uring_cmd *ioucmd,
			void (*task_work_cb)(struct io_uring_cmd *, unsigned));

static inline void io_uring_cmd_complete_in_task(struct io_uring_cmd *ioucmd,
			void (*task_work_cb)(struct io_uring_cmd *, unsigned))
{
	__io_uring_cmd_do_in_task(ioucmd, task_work_cb, 0);
}

static inline void io_uring_files_cancel(void)
{
@@ -85,6 +95,10 @@ static inline void io_uring_cmd_complete_in_task(struct io_uring_cmd *ioucmd,
			void (*task_work_cb)(struct io_uring_cmd *, unsigned))
{
}
static inline void io_uring_cmd_do_in_task_lazy(struct io_uring_cmd *ioucmd,
			void (*task_work_cb)(struct io_uring_cmd *, unsigned))
{
}
static inline struct sock *io_uring_get_socket(struct file *file)
{
	return NULL;
+10 −0
Original line number Diff line number Diff line
@@ -211,6 +211,16 @@ struct io_ring_ctx {
		unsigned int		compat: 1;

		enum task_work_notify_mode	notify_method;

		/*
		 * If IORING_SETUP_NO_MMAP is used, then the below holds
		 * the gup'ed pages for the two rings, and the sqes.
		 */
		unsigned short		n_ring_pages;
		unsigned short		n_sqe_pages;
		struct page		**ring_pages;
		struct page		**sqe_pages;

		struct io_rings			*rings;
		struct task_struct		*submitter_task;
		struct percpu_ref		refs;
+14 −2
Original line number Diff line number Diff line
@@ -173,6 +173,18 @@ enum {
 */
#define IORING_SETUP_DEFER_TASKRUN	(1U << 13)

/*
 * Application provides the memory for the rings
 */
#define IORING_SETUP_NO_MMAP		(1U << 14)

/*
 * Register the ring fd in itself for use with
 * IORING_REGISTER_USE_REGISTERED_RING; return a registered fd index rather
 * than an fd.
 */
#define IORING_SETUP_REGISTERED_FD_ONLY	(1U << 15)

enum io_uring_op {
	IORING_OP_NOP,
	IORING_OP_READV,
@@ -406,7 +418,7 @@ struct io_sqring_offsets {
	__u32 dropped;
	__u32 array;
	__u32 resv1;
	__u64 resv2;
	__u64 user_addr;
};

/*
@@ -425,7 +437,7 @@ struct io_cqring_offsets {
	__u32 cqes;
	__u32 flags;
	__u32 resv1;
	__u64 resv2;
	__u64 user_addr;
};

/*
Loading