commit 32a5169a5562db6a09a2d85164e0079913ecc227 Merge: 5fb023fb414a fa15bafb71fd Author: Jens Axboe Date: Sun Aug 2 10:43:35 2020 -0600 Merge branch 'for-5.9/io_uring' into test * for-5.9/io_uring: (127 commits) io_uring: flip if handling after io_setup_async_rw fs: optimise kiocb_set_rw_flags() io_uring: don't touch 'ctx' after installing file descriptor io_uring: get rid of atomic FAA for cq_timeouts io_uring: consolidate *_check_overflow accounting io_uring: fix stalled deferred requests io_uring: fix racy overflow count reporting io_uring: deduplicate __io_complete_rw() io_uring: de-unionise io_kiocb io-wq: update hash bits io_uring: fix missing io_queue_linked_timeout() io_uring: mark ->work uninitialised after cleanup io_uring: deduplicate io_grab_files() calls io_uring: don't do opcode prep twice io_uring: clear IORING_SQ_NEED_WAKEUP after executing task works io_uring: batch put_task_struct() tasks: add put_task_struct_many() io_uring: return locked and pinned page accounting io_uring: don't miscount pinned memory io_uring: don't open-code recv kbuf managment ... Signed-off-by: Jens Axboe diff --cc block/blk-core.c index 93104c7470e8,62a4904db921..d9d632639bd1 --- a/block/blk-core.c +++ b/block/blk-core.c @@@ -956,13 -952,30 +956,18 @@@ static inline blk_status_t blk_check_zo return BLK_STS_OK; } -static noinline_for_stack bool -generic_make_request_checks(struct bio *bio) +static noinline_for_stack bool submit_bio_checks(struct bio *bio) { - struct request_queue *q; - int nr_sectors = bio_sectors(bio); + struct request_queue *q = bio->bi_disk->queue; blk_status_t status = BLK_STS_IOERR; + struct blk_plug *plug; - char b[BDEVNAME_SIZE]; might_sleep(); - q = bio->bi_disk->queue; - if (unlikely(!q)) { - printk(KERN_ERR - "generic_make_request: Trying to access " - "nonexistent block-device %s (%Lu)\n", - bio_devname(bio, b), (long long)bio->bi_iter.bi_sector); - goto end_io; - } - + plug = blk_mq_plug(q, bio); + if (plug && plug->nowait) + bio->bi_opf |= REQ_NOWAIT; + /* * For a REQ_NOWAIT based request, return -EOPNOTSUPP * if queue is not a request based queue. diff --cc include/linux/fs.h index 41cd993ec0f6,e535543d31d9..b7f1f1b7d691 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@@ -315,7 -318,8 +318,9 @@@ enum rw_hint #define IOCB_SYNC (1 << 5) #define IOCB_WRITE (1 << 6) #define IOCB_NOWAIT (1 << 7) + /* iocb->ki_waitq is valid */ + #define IOCB_WAITQ (1 << 8) +#define IOCB_NOIO (1 << 9) struct kiocb { struct file *ki_filp; diff --cc mm/filemap.c index 385759c4ce4b,a5b1fa8f7ce4..4e39c1f4c7d9 --- a/mm/filemap.c +++ b/mm/filemap.c @@@ -2028,8 -2044,6 +2044,8 @@@ find_page page = find_get_page(mapping, index); if (!page) { - if (iocb->ki_flags & (IOCB_NOWAIT | IOCB_NOIO)) ++ if (iocb->ki_flags & IOCB_NOIO) + goto would_block; page_cache_sync_readahead(mapping, ra, filp, index, last_index - index); @@@ -2164,7 -2185,7 +2191,7 @@@ page_not_up_to_date_locked } readpage: - if (iocb->ki_flags & IOCB_NOIO) { - if (iocb->ki_flags & IOCB_NOWAIT) { ++ if (iocb->ki_flags & (IOCB_NOWAIT | IOCB_NOIO)) { unlock_page(page); put_page(page); goto would_block;