On 8/14/24 7:42 PM, Ming Lei wrote: > On Wed, Aug 14, 2024 at 6:46?PM Pavel Begunkov <asml.silence@xxxxxxxxx> wrote: >> >> Add ->uring_cmd callback for block device files and use it to implement >> asynchronous discard. Normally, it first tries to execute the command >> from non-blocking context, which we limit to a single bio because >> otherwise one of sub-bios may need to wait for other bios, and we don't >> want to deal with partial IO. If non-blocking attempt fails, we'll retry >> it in a blocking context. >> >> Suggested-by: Conrad Meyer <conradmeyer@xxxxxxxx> >> Signed-off-by: Pavel Begunkov <asml.silence@xxxxxxxxx> >> --- >> block/blk.h | 1 + >> block/fops.c | 2 + >> block/ioctl.c | 94 +++++++++++++++++++++++++++++++++++++++++ >> include/uapi/linux/fs.h | 2 + >> 4 files changed, 99 insertions(+) >> >> diff --git a/block/blk.h b/block/blk.h >> index e180863f918b..5178c5ba6852 100644 >> --- a/block/blk.h >> +++ b/block/blk.h >> @@ -571,6 +571,7 @@ blk_mode_t file_to_blk_mode(struct file *file); >> int truncate_bdev_range(struct block_device *bdev, blk_mode_t mode, >> loff_t lstart, loff_t lend); >> long blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg); >> +int blkdev_uring_cmd(struct io_uring_cmd *cmd, unsigned int issue_flags); >> long compat_blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg); >> >> extern const struct address_space_operations def_blk_aops; >> diff --git a/block/fops.c b/block/fops.c >> index 9825c1713a49..8154b10b5abf 100644 >> --- a/block/fops.c >> +++ b/block/fops.c >> @@ -17,6 +17,7 @@ >> #include <linux/fs.h> >> #include <linux/iomap.h> >> #include <linux/module.h> >> +#include <linux/io_uring/cmd.h> >> #include "blk.h" >> >> static inline struct inode *bdev_file_inode(struct file *file) >> @@ -873,6 +874,7 @@ const struct file_operations def_blk_fops = { >> .splice_read = filemap_splice_read, >> .splice_write = iter_file_splice_write, >> .fallocate = blkdev_fallocate, >> + .uring_cmd = blkdev_uring_cmd, > > Just be curious, we have IORING_OP_FALLOCATE already for sending > discard to block device, why is .uring_cmd added for this purpose? I think wiring up a bdev uring_cmd makes sense, because: 1) The existing FALLOCATE op is using vfs_fallocate, which is inherently sync and hence always punted to io-wq. 2) There will most certainly be other async ops that would be interesting to add, at which point we'd need it anyway. 3) It arguably makes more sense to have a direct discard op than use fallocate for this, if working on a raw bdev. And probably others... -- Jens Axboe