From patchwork Tue Jul 24 20:11:29 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kent Overstreet X-Patchwork-Id: 1233191 Return-Path: X-Original-To: patchwork-dm-devel@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from mx3-phx2.redhat.com (mx3-phx2.redhat.com [209.132.183.24]) by patchwork1.kernel.org (Postfix) with ESMTP id 1681C3FD4F for ; Tue, 24 Jul 2012 20:16:11 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by mx3-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q6OKDRlZ027759; Tue, 24 Jul 2012 16:13:27 -0400 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q6OKCOuq028336 for ; Tue, 24 Jul 2012 16:12:24 -0400 Received: from mx1.redhat.com (ext-mx13.extmail.prod.ext.phx2.redhat.com [10.5.110.18]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q6OKCJVp000309 for ; Tue, 24 Jul 2012 16:12:19 -0400 Received: from mail-pb0-f46.google.com (mail-pb0-f46.google.com [209.85.160.46]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q6OKC9Ei014253 for ; Tue, 24 Jul 2012 16:12:09 -0400 Received: by pbbrp8 with SMTP id rp8so125486pbb.33 for ; Tue, 24 Jul 2012 13:12:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; bh=o3YjE3X8vDD+v9D9IChHAv0B4fepk6NPkodS67q+SkQ=; b=WfcmxrpoHUH9rmdWvXPuSAgYl5YUFmUKZNlmcZKuRUPX7AXfG4/kazlbGGe8h0o17T 0UyZB9dXTL8oT9idjJM0iE83fuhsZFlsru7imd7//VdxpPdanyS3FRC9T5xzK1KRG1DB eecjwVp0Uw3tENqSUvtV485S1fZrFgQAvIAUbGF2SJonwhC1A8XDLfK1udSMykWp8yJO ctG386SBJ5rHlTNhVjmFYvYEgF3CHmfqH+JOdOp18wTuNTGkpKWnyAPLRCpJllpD7Ihx yL9JnvZsR+DKj8Y6rUEITApjm0Blm/AUE9AefxZG7V1ceROaG56atVYUaRz2SG+NUOb7 JSkQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references :x-gm-message-state; bh=o3YjE3X8vDD+v9D9IChHAv0B4fepk6NPkodS67q+SkQ=; b=EmPpODZ15kpy4QBfoLUmpltkxok5XqgeNPp+X168Hsy/JsZyl1QTkXc/HxX4qbMIMv 2VuTqzBmf5v891PEy9xVPSWLpFpBV3ren/lrC7dMgfg7qeWXEi6vo9INGsbuAWDwn/7G im/S1fJBA/73C9SRDXkb2gjNDP7ioqM5U8yP4rbTOWZQyLqApHHhdLLkfvmLheD/uSFe s1d9bYbujMyUArdxq8egdk5vZAzen5b+dC9MxdrwMN9zReJvpba9a/RrIUUitqFPF5wi lUXOKyWDSSsLbOyQnE3l1Cd9Y24JymQpWcIw18kjQZFriDf84jeGh8S4g5IuBLu7oGpG bUHA== Received: by 10.68.232.197 with SMTP id tq5mr47209257pbc.53.1343160728905; Tue, 24 Jul 2012 13:12:08 -0700 (PDT) Received: by 10.68.232.197 with SMTP id tq5mr47209224pbc.53.1343160728761; Tue, 24 Jul 2012 13:12:08 -0700 (PDT) Received: from formenos.mtv.corp.google.com (formenos.mtv.corp.google.com [172.18.110.66]) by mx.google.com with ESMTPS id jv6sm12774301pbc.40.2012.07.24.13.12.07 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 24 Jul 2012 13:12:08 -0700 (PDT) From: Kent Overstreet To: linux-bcache@vger.kernel.org, linux-kernel@vger.kernel.org, dm-devel@redhat.com Date: Tue, 24 Jul 2012 13:11:29 -0700 Message-Id: <1343160689-12378-13-git-send-email-koverstreet@google.com> In-Reply-To: <1343160689-12378-1-git-send-email-koverstreet@google.com> References: <1343160689-12378-1-git-send-email-koverstreet@google.com> X-Gm-Message-State: ALoCoQl7dizFggyds4qXvJHnM93bzHUZL0e2S2E1N0N5C6Ace3LmCnuA1zChDK3rtTfOlRXdULw0joAlFQ/N0W+sp/Y60EmWi/bv5qj9esHqo2Le1gnxyttdMwwM61qPbzf9ZfCOGxdGJuFrK8hO+Qw/20Ww90kHnTdfw8XWE2zgkDEbJg5CVH1ejaC/UUqKZlrVlQ4O/wBk X-RedHat-Spam-Score: -2.711 (BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, RCVD_IN_DNSWL_LOW, SPF_PASS, T_RP_MATCHES_RCVD) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Scanned-By: MIMEDefang 2.68 on 10.5.110.18 X-loop: dm-devel@redhat.com Cc: axboe@kernel.dk, yehuda@hq.newdream.net, Kent Overstreet , mpatocka@redhat.com, vgoyal@redhat.com, bharrosh@panasas.com, tj@kernel.org, sage@newdream.net, agk@redhat.com, drbd-dev@lists.linbit.com Subject: [dm-devel] [PATCH v4 12/12] block: Only clone bio vecs that are in use X-BeenThere: dm-devel@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk Reply-To: device-mapper development List-Id: device-mapper development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: dm-devel-bounces@redhat.com Errors-To: dm-devel-bounces@redhat.com bcache creates large bios internally, and then splits them according to the device requirements before it sends them down. If a lower level device tries to clone the bio, and the original bio had more than BIO_MAX_PAGES, the clone will fail unecessarily. We can fix this by only cloning the bio vecs that are actually in use. Signed-off-by: Kent Overstreet --- drivers/block/rbd.c | 2 +- drivers/md/dm.c | 5 ++--- fs/bio.c | 13 +++++++------ 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 692cf05..21edfe5 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -714,7 +714,7 @@ static struct bio *bio_chain_clone(struct bio **old, struct bio **next, } while (old_chain && (total < len)) { - tmp = bio_kmalloc(gfpmask, old_chain->bi_max_vecs); + tmp = bio_kmalloc(gfpmask, bio_segments(old_chain)); if (!tmp) goto err_out; diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 3f3c26e..193fb19 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -1057,11 +1057,10 @@ static struct bio *clone_bio(struct bio *bio, sector_t sector, { struct bio *clone; - clone = bio_alloc_bioset(GFP_NOIO, bio->bi_max_vecs, bs); + clone = bio_alloc_bioset(GFP_NOIO, bv_count, bs); __bio_clone(clone, bio); clone->bi_sector = sector; - clone->bi_idx = idx; - clone->bi_vcnt = idx + bv_count; + clone->bi_vcnt = bv_count; clone->bi_size = to_bytes(len); clone->bi_flags &= ~(1 << BIO_SEG_VALID); diff --git a/fs/bio.c b/fs/bio.c index 7a0801d..ec6a357 100644 --- a/fs/bio.c +++ b/fs/bio.c @@ -451,8 +451,9 @@ EXPORT_SYMBOL(bio_phys_segments); */ void __bio_clone(struct bio *bio, struct bio *bio_src) { - memcpy(bio->bi_io_vec, bio_src->bi_io_vec, - bio_src->bi_max_vecs * sizeof(struct bio_vec)); + memcpy(bio->bi_io_vec, + bio_iovec(bio_src), + bio_segments(bio_src) * sizeof(struct bio_vec)); /* * most users will be overriding ->bi_bdev with a new target, @@ -461,10 +462,10 @@ void __bio_clone(struct bio *bio, struct bio *bio_src) bio->bi_sector = bio_src->bi_sector; bio->bi_bdev = bio_src->bi_bdev; bio->bi_flags |= 1 << BIO_CLONED; + bio->bi_flags &= ~(1 << BIO_SEG_VALID); bio->bi_rw = bio_src->bi_rw; - bio->bi_vcnt = bio_src->bi_vcnt; + bio->bi_vcnt = bio_segments(bio_src); bio->bi_size = bio_src->bi_size; - bio->bi_idx = bio_src->bi_idx; } EXPORT_SYMBOL(__bio_clone); @@ -479,7 +480,7 @@ EXPORT_SYMBOL(__bio_clone); struct bio *bio_clone_bioset(struct bio *bio, gfp_t gfp_mask, struct bio_set *bs) { - struct bio *b = bio_alloc_bioset(gfp_mask, bio->bi_max_vecs, bs); + struct bio *b = bio_alloc_bioset(gfp_mask, bio_segments(bio), bs); if (!b) return NULL; @@ -509,7 +510,7 @@ EXPORT_SYMBOL(bio_clone); struct bio *bio_clone_kmalloc(struct bio *bio, gfp_t gfp_mask) { - struct bio *b = bio_kmalloc(gfp_mask, bio->bi_max_vecs); + struct bio *b = bio_kmalloc(gfp_mask, bio_segments(bio)); if (!b) return NULL;