On Wed, 21 Oct 2020 11:11:28 +0800 Xianting Tian <tian.xianting@xxxxxxx> wrote: > bio_alloc with __GFP_DIRECT_RECLAIM(which is included in GFP_NOIO, > GFP_KERNEL) never fails, as stated in the comments of bio_alloc_bioset. > > So we can remove multiple unneeded null checks of bio_alloc and simplify > the code. > > We have done it in fs/ext4/readpage.c, fs/ext4/page-io.c, fs/direct-io.c, > and so forth. > (cc Jens) > --- a/mm/page_io.c > +++ b/mm/page_io.c > @@ -30,18 +30,20 @@ static struct bio *get_swap_bio(gfp_t gfp_flags, > struct page *page, bio_end_io_t end_io) > { > struct bio *bio; > + struct block_device *bdev; > > + /* > + * bio_alloc will _always_ be able to allocate a bio if > + * __GFP_DIRECT_RECLAIM is set, see comments for bio_alloc_bioset(). > + */ > bio = bio_alloc(gfp_flags, 1); > - if (bio) { > - struct block_device *bdev; > + bio->bi_iter.bi_sector = map_swap_page(page, &bdev); > + bio_set_dev(bio, bdev); > + bio->bi_iter.bi_sector <<= PAGE_SHIFT - 9; > + bio->bi_end_io = end_io; > > - bio->bi_iter.bi_sector = map_swap_page(page, &bdev); > - bio_set_dev(bio, bdev); > - bio->bi_iter.bi_sector <<= PAGE_SHIFT - 9; > - bio->bi_end_io = end_io; > + bio_add_page(bio, page, thp_size(page), 0); > > - bio_add_page(bio, page, thp_size(page), 0); > - } > return bio; > } > > @@ -351,19 +353,13 @@ int __swap_writepage(struct page *page, struct writeback_control *wbc, > > ret = 0; > bio = get_swap_bio(GFP_NOIO, page, end_write_func); > - if (bio == NULL) { > - set_page_dirty(page); > - unlock_page(page); > - ret = -ENOMEM; > - goto out; > - } > bio->bi_opf = REQ_OP_WRITE | REQ_SWAP | wbc_to_write_flags(wbc); > bio_associate_blkg_from_page(bio, page); > count_swpout_vm_event(page); > set_page_writeback(page); > unlock_page(page); > submit_bio(bio); > -out: > + > return ret; > } > > @@ -416,11 +412,6 @@ int swap_readpage(struct page *page, bool synchronous) > > ret = 0; > bio = get_swap_bio(GFP_KERNEL, page, end_swap_bio_read); > - if (bio == NULL) { > - unlock_page(page); > - ret = -ENOMEM; > - goto out; > - } > disk = bio->bi_disk; > /* > * Keep this task valid during swap readpage because the oom killer may I'm reluctant to remove these checks - yours is a fairly subtle discovery and things might change in the future. Intentionally or otherwise!