fs/direct-io.c: Add REQ_NOIDLE for last bio .
RFC PATCH 1/1 fs/direct-io.c: Add REQ_NOIDLE for last bio .
For last bio of dio, there are no bio will come.So set REQ_NOIDLE.
Signed-off-by Jianpeng Ma <[email protected]>
--- fs/direct-io.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)
fs/direct-io.c +12 -3
@@ -127,6 +127,7 @@ struct dio {int page_errors;/* errno from get_user_pages() */ int is_async;/* is IO async ? */ int io_error;/* IO error in completion path */ +sector_t end_sector;/* the last sector for this dio */ unsigned long refcount;/* direct_io_worker() and bios */ struct bio *bio_list;/* singly linked via bi_private */ struct task_struct *waiter;/* waiting task (NULL if none) */
@@ -369,21 +370,28 @@ static inline void dio_bio_submit(struct dio *dio, struct dio_submit *sdio) {struct bio *bio = sdio->bio;unsigned long flags; - +int rw = dio->rw; bio->bi_private = dio;spin_lock_irqsave (&dio->bio_lock, flags); dio->refcount++;spin_unlock_irqrestore (&dio->bio_lock, flags); +/* +* If bio is the last for dio,so no bio can arrive for low-level +* unless this dio completed. +*/ +if (bio->bi_sector +bio_sectors (bio) >= dio->end_sector) + rw |=REQ_NOIDLE ; +if (dio->is_async && dio->rw ==READ )bio_set_pages_dirty (bio);if (sdio->submit_io) - sdio->submit_io (dio->rw, bio, dio->inode, + sdio->submit_io (rw, bio, dio->inode, sdio->logical_offset_in_bio);else -submit_bio (dio->rw, bio); +submit_bio (rw, bio); sdio->bio =NULL ; sdio->boundary =0 ;
@@ -1147,6 +1155,7 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, dio->inode = inode; dio->rw = rw; + dio->end_sector = end >>9 ; sdio.blkbits = blkbits; sdio.blkfactor = inode->i_blkbits - blkbits; sdio.block_in_file = offset >> blkbits;
Signature · 2 lines
1.7.9.5
�翳簕.n�+壏煯壄�+%娝�遍荻w�簕.n�+壏{炳G珴�妠ay�蕠跈�,jf"穐殢飦�戧鐉_璁(殠娸"濟�m���G珴�⒏?櫒璀�&x忈秈O曟瑉窔v豝�m����鹅�⒏?朓�