On 2/22/21 23:10, Christoph Hellwig wrote:
> Well, that is a somewhat odd calling convention.  What about the patch below
> instead?  That being we really need to kill this bouncing code off..
If we can kill it off soon it will be great.
>
> diff --git a/block/bounce.c b/block/bounce.c
> index fc55314aa4269a..789fbcacb1e92a 100644
> --- a/block/bounce.c
> +++ b/block/bounce.c
> @@ -214,9 +214,9 @@ static void bounce_end_io_read_isa(struct bio *bio)
>       __bounce_end_io_read(bio, &isa_page_pool);
>  }
>  
> -static struct bio *bounce_clone_bio(struct bio *bio_src, gfp_t gfp_mask,
> -             struct bio_set *bs)
> +static struct bio *bounce_clone_bio(struct bio *bio_src, bool passthrough)
>  {
> +     unsigned int nr_vecs = bio_segments(bio_src);
>       struct bvec_iter iter;
>       struct bio_vec bv;
>       struct bio *bio;
> @@ -242,8 +242,10 @@ static struct bio *bounce_clone_bio(struct bio *bio_src, 
> gfp_t gfp_mask,
>        *    asking for trouble and would force extra work on
>        *    __bio_clone_fast() anyways.
>        */
> -
> -     bio = bio_alloc_bioset(gfp_mask, bio_segments(bio_src), bs);
> +     if (passthrough)
> +             bio = bio_kmalloc(GFP_NOIO, nr_vecs);
> +     else
> +             bio = bio_alloc_bioset(GFP_NOIO, nr_vecs, &bounce_bio_set);
>       if (!bio)
>               return NULL;
>       bio->bi_bdev            = bio_src->bi_bdev;
> @@ -269,11 +271,11 @@ static struct bio *bounce_clone_bio(struct bio 
> *bio_src, gfp_t gfp_mask,
>               break;
>       }
>  
> -     if (bio_crypt_clone(bio, bio_src, gfp_mask) < 0)
> +     if (bio_crypt_clone(bio, bio_src, GFP_NOIO) < 0)
>               goto err_put;
>  
>       if (bio_integrity(bio_src) &&
> -         bio_integrity_clone(bio, bio_src, gfp_mask) < 0)
> +         bio_integrity_clone(bio, bio_src, GFP_NOIO) < 0)
>               goto err_put;
>  
>       bio_clone_blkg_association(bio, bio_src);
> @@ -313,8 +315,7 @@ static void __blk_queue_bounce(struct request_queue *q, 
> struct bio **bio_orig,
>               submit_bio_noacct(*bio_orig);
>               *bio_orig = bio;
>       }
> -     bio = bounce_clone_bio(*bio_orig, GFP_NOIO, passthrough ? NULL :
> -                     &bounce_bio_set);
> +     bio = bounce_clone_bio(*bio_orig, passthrough);
>  
>       /*
>        * Bvec table can't be updated by bio_for_each_segment_all(),
>
Seems like this fixes the issue and does the cleanup in one patch, looks
good.

Reply via email to