On Fri, May 21, 2021 at 04:54:45PM +0800, Ming Lei wrote: > On Fri, May 21, 2021 at 10:36:35AM +0200, Christoph Hellwig wrote: > > On Fri, May 21, 2021 at 04:35:03PM +0800, Ming Lei wrote: > > > Just wondering why the ioend isn't submitted out after it becomes full? > > > > block layer plugging? Although failing bio allocations will kick that, > > so that is not a deadlock risk. > > These ioends are just added to one list stored on local stack variable(submit_list), Yes. But only until the code finished iterating over a page. The worst case number of bios for a page is PAGE_SIZE / SECTOR_SIZE, and the bio_set is side to handle that comfortably. > how can block layer plugging observe & submit them out? It can't. I was talking about the high-level plug that is held over multiple pages. At that point the bios are submitted to the block layer already, but they might be held in a plug. And looking at the bio_alloc_bioset code we don't actually flush a plug at the moment in that case. Something like the patch below would do that: diff --git a/block/bio.c b/block/bio.c index 44205dfb6b60..5b9d2f4d7c08 100644 --- a/block/bio.c +++ b/block/bio.c @@ -432,6 +432,7 @@ struct bio *bio_alloc_bioset(gfp_t gfp_mask, unsigned short nr_iovecs, p = mempool_alloc(&bs->bio_pool, gfp_mask); if (!p && gfp_mask != saved_gfp) { + blk_schedule_flush_plug(current); punt_bios_to_rescuer(bs); gfp_mask = saved_gfp; p = mempool_alloc(&bs->bio_pool, gfp_mask);