Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp5484900imu; Tue, 13 Nov 2018 07:17:37 -0800 (PST) X-Google-Smtp-Source: AJdET5dsTO79Ovi2wyfXqZpRZ+cu4BpoDMVUfPBElOHv/hsE9UDl605yM9ifbv9rRdD+bdP2kyOs X-Received: by 2002:a63:a441:: with SMTP id c1-v6mr5135140pgp.49.1542122257815; Tue, 13 Nov 2018 07:17:37 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1542122257; cv=none; d=google.com; s=arc-20160816; b=ffhCCRMddVqpn+NeOYcwUqiH+12C3VByfYXt4Y0MVm8Sbp63of6ZH2PF9mNhKF6j3g bwT0E0p54lpr37tZqgTiFD7daxeuNDdPsjX7J/DYym0TKSjJ8VYsOQzqk7ZOktIum4GT DoXmcULoXdleMu/iFtcJU/sVfs1h2uDiacu8C4WhGNqXyPcClqCGKhUzRwOWO2IbvhaZ i321ZobVxwaeTO0iQ20y+yLlIs4/XR/Rzlc0WYnTyVFBTEPzRfCs8NVlrm8viDryRpbj sWR5UzK1InvxA9O1NcNP9yDxjv3h28GiB3tmr4uSrfgcm2jK+aVjmAcr6ZVBhZqCUEkf oRsg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=fBQ6zKe3K4kLKIHDmvC9FUZcL8PvbUcd6zU2gtWOHck=; b=ggA4LviEm/qztHymLezaKGVbFA23qhS9G4Kbf4ZXOkvT4c2Iuy2JL00sQoiPofbCQf Kzi2snudw4eYbJY4nNNb/33gE+wYwYktLlDJySnJ4/Lyf/20vAckwxjgLl5m0EfZONwu CSuk3F8iNxHkIzzo1bYByNYCkqWmrmt84CBicrbN8PjUhqrfCW8wQkNq1jtU+5XZDznz OqE2CJgwjtsLRyttEsIuDi/MXCNOoy1Smf/gG/hlQbVnoiJz+XnwCHAJOtBeekD9hwP7 vVMIHwvOTlNGqTyUNKIQTL1jslcMv+BTVIA9akI/pWZOfENLUOrpxFb3OFx6EAya+dbs YAEQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j24si14844706pgn.149.2018.11.13.07.17.18; Tue, 13 Nov 2018 07:17:37 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388080AbeKNBOw (ORCPT + 99 others); Tue, 13 Nov 2018 20:14:52 -0500 Received: from mx1.redhat.com ([209.132.183.28]:34688 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731105AbeKNBOw (ORCPT ); Tue, 13 Nov 2018 20:14:52 -0500 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 352D380466; Tue, 13 Nov 2018 15:16:18 +0000 (UTC) Received: from localhost (ovpn-8-23.pek2.redhat.com [10.72.8.23]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6435A5D9C8; Tue, 13 Nov 2018 15:16:15 +0000 (UTC) From: Ming Lei To: Jens Axboe Cc: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, Ming Lei , Christoph Hellwig Subject: [PATCH V9 10/19] block: loop: pass multi-page bvec to iov_iter Date: Tue, 13 Nov 2018 23:14:56 +0800 Message-Id: <20181113151505.15498-11-ming.lei@redhat.com> In-Reply-To: <20181113151505.15498-1-ming.lei@redhat.com> References: <20181113151505.15498-1-ming.lei@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Tue, 13 Nov 2018 15:16:18 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org iov_iter is implemented with bvec itererator, so it is safe to pass multipage bvec to it, and this way is much more efficient than passing one page in each bvec. Cc: Christoph Hellwig Signed-off-by: Ming Lei --- drivers/block/loop.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/drivers/block/loop.c b/drivers/block/loop.c index bf6bc35aaf88..a3fd418ec637 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -515,16 +515,16 @@ static int lo_rw_aio(struct loop_device *lo, struct loop_cmd *cmd, struct bio *bio = rq->bio; struct file *file = lo->lo_backing_file; unsigned int offset; - int segments = 0; + int nr_bvec = 0; int ret; if (rq->bio != rq->biotail) { - struct req_iterator iter; + struct bvec_iter iter; struct bio_vec tmp; __rq_for_each_bio(bio, rq) - segments += bio_segments(bio); - bvec = kmalloc_array(segments, sizeof(struct bio_vec), + nr_bvec += bio_bvecs(bio); + bvec = kmalloc_array(nr_bvec, sizeof(struct bio_vec), GFP_NOIO); if (!bvec) return -EIO; @@ -533,13 +533,14 @@ static int lo_rw_aio(struct loop_device *lo, struct loop_cmd *cmd, /* * The bios of the request may be started from the middle of * the 'bvec' because of bio splitting, so we can't directly - * copy bio->bi_iov_vec to new bvec. The rq_for_each_segment + * copy bio->bi_iov_vec to new bvec. The bio_for_each_bvec * API will take care of all details for us. */ - rq_for_each_segment(tmp, rq, iter) { - *bvec = tmp; - bvec++; - } + __rq_for_each_bio(bio, rq) + bio_for_each_bvec(tmp, bio, iter) { + *bvec = tmp; + bvec++; + } bvec = cmd->bvec; offset = 0; } else { @@ -550,11 +551,11 @@ static int lo_rw_aio(struct loop_device *lo, struct loop_cmd *cmd, */ offset = bio->bi_iter.bi_bvec_done; bvec = __bvec_iter_bvec(bio->bi_io_vec, bio->bi_iter); - segments = bio_segments(bio); + nr_bvec = bio_bvecs(bio); } atomic_set(&cmd->ref, 2); - iov_iter_bvec(&iter, rw, bvec, segments, blk_rq_bytes(rq)); + iov_iter_bvec(&iter, rw, bvec, nr_bvec, blk_rq_bytes(rq)); iter.iov_offset = offset; cmd->iocb.ki_pos = pos; -- 2.9.5