bio_alloc() may allocate up to 256 iovecs (BIO_MAX_PAGES). Non-standard 2M cluster requires 512 iovecs. We never seen this problem before, since usually we use 1M cluster.
https://jira.sw.ru/browse/PSBM-98265 Signed-off-by: Kirill Tkhai <[email protected]> --- drivers/block/ploop/dev.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/drivers/block/ploop/dev.c b/drivers/block/ploop/dev.c index 61adcd0516fb..0a6c4111ca82 100644 --- a/drivers/block/ploop/dev.c +++ b/drivers/block/ploop/dev.c @@ -172,6 +172,13 @@ static void ploop_uncongest(struct ploop_device *plo) } } +static struct bio *aux_bio_alloc(gfp_t gfp_mask, unsigned int nr_iovecs) +{ + if (likely(nr_iovecs <= BIO_MAX_PAGES)) + return bio_alloc(gfp_mask, nr_iovecs); + return bio_kmalloc(gfp_mask, nr_iovecs); +} + static int fast_path_reqs_count(struct ploop_device *plo) { int ret; @@ -858,7 +865,7 @@ preallocate_bio(struct bio * orig_bio, struct ploop_device * plo) } if (nbio == NULL) - nbio = bio_alloc(GFP_NOIO, max(orig_bio->bi_max_vecs, block_vecs(plo))); + nbio = aux_bio_alloc(GFP_NOIO, max(orig_bio->bi_max_vecs, block_vecs(plo))); return nbio; } @@ -1848,7 +1855,7 @@ ploop_reloc_sched_read(struct ploop_request *preq, iblock_t iblk) spin_unlock_irq(&plo->lock); if (!preq->aux_bio) { - preq->aux_bio = bio_alloc(GFP_NOFS, block_vecs(plo)); + preq->aux_bio = aux_bio_alloc(GFP_NOFS, block_vecs(plo)); if (!preq->aux_bio || fill_bio(plo, preq->aux_bio, preq->req_cluster)) { @@ -2141,7 +2148,7 @@ ploop_entry_nullify_req(struct ploop_request *preq) struct bio_list sbl; if (!preq->aux_bio) { - preq->aux_bio = bio_alloc(GFP_NOFS, block_vecs(plo)); + preq->aux_bio = aux_bio_alloc(GFP_NOFS, block_vecs(plo)); if (!preq->aux_bio) return -ENOMEM; fill_zero_bio(plo, preq->aux_bio); @@ -2522,7 +2529,7 @@ ploop_entry_request(struct ploop_request * preq) plo->st.bio_cows++; if (!preq->aux_bio) - preq->aux_bio = bio_alloc(GFP_NOFS, block_vecs(plo)); + preq->aux_bio = aux_bio_alloc(GFP_NOFS, block_vecs(plo)); if (!preq->aux_bio || fill_bio(plo, preq->aux_bio, preq->req_cluster)) { @@ -2634,7 +2641,8 @@ ploop_entry_request(struct ploop_request * preq) plo->st.bio_cows++; if (!preq->aux_bio) - preq->aux_bio = bio_alloc(GFP_NOFS, block_vecs(plo)); + preq->aux_bio = aux_bio_alloc(GFP_NOFS, + block_vecs(plo)); if (!preq->aux_bio || fill_bio(plo, preq->aux_bio, preq->req_cluster)) { @@ -2883,7 +2891,7 @@ static void ploop_req_state_process(struct ploop_request * preq) int i; if (!preq->aux_bio) - preq->aux_bio = bio_alloc(GFP_NOFS, block_vecs(plo)); + preq->aux_bio = aux_bio_alloc(GFP_NOFS, block_vecs(plo)); if (!preq->aux_bio || fill_bio(plo, preq->aux_bio, preq->req_cluster)) { _______________________________________________ Devel mailing list [email protected] https://lists.openvz.org/mailman/listinfo/devel
