On Tue, Mar 22 2022 at 3:54P -0400, Christoph Hellwig <hch@xxxxxx> wrote: > On Tue, Mar 22, 2022 at 03:49:25PM -0400, Mike Snitzer wrote: > > - bio = bio_alloc_bioset(bdev, 0, bio_src->bi_opf, gfp, bs); > > + if (bs->cache && bio_src->bi_opf & REQ_POLLED) > > + bio = bio_alloc_percpu_cache(bdev, 0, bio_src->bi_opf, gfp, bs); > > + else > > I don't think we can just unconditionally do this based on REQ_POLLED. > We'd either need a flag for bio_alloc_bioset or (probably better) > a separate interface. > I did initially think it worthwhile to push the use of bio_alloc_percpu_cache() down to bio_alloc_bioset() rather than bio_alloc_clone() -- but I started slower with more targetted change for DM's needs. And yeah, since there isn't a REQ_ flag equivalent for IOCB_ALLOC_CACHE (other than just allowing all REQ_POLLED access) there isn't a meaningful way to limit access to the bioset's percpu cache. Curious: how do bio_alloc_kiocb() callers know when it appropriate to set IOCB_ALLOC_CACHE or not? Seems io_uring is only one and it unilaterally does: kiocb->ki_flags |= IOCB_HIPRI | IOCB_ALLOC_CACHE; So like IOCB_HIPRI maps to REQ_POLL, should IOCB_ALLOC_CACHE map to REQ_ALLOC_CACHE? Or better name? Open to further suggestions on which way to go with these details. Thanks, Mike