Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp510298imm; Fri, 1 Jun 2018 05:06:06 -0700 (PDT) X-Google-Smtp-Source: ADUXVKLAPhWMLWf+96FDOPe/HkFtg33+dzhe67Lfg8+2JBk7kinidf5ujZPXYdFPNsWgch4JBe9Z X-Received: by 2002:a17:902:848e:: with SMTP id c14-v6mr10842901plo.129.1527854766616; Fri, 01 Jun 2018 05:06:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527854766; cv=none; d=google.com; s=arc-20160816; b=RDhJelT0oLXGxo8T7/Dz+QwoZnYcqGPzrvW4irUs2bGN08WuLlin6wljgTyQgXE6St b9HihKz6utlxWd1Tg/xJOG99QHJSDvn1WKtc5DMlhjxmyOk5i98npXxen5+VBXbCoNvx vCFplNHbJEulzmtQO2aZXkuE5NWP3eqA6vJi5qEGvWLmzPSGJPzEoOwv2Q34g2AQ4/ms VpfQGnAp4z6biEet5lzh20SdKFiIOpaS8033tvd+2Vrndk3wmfHr2Bmowud5siOx7szo 9e4ubIAbKKmBWt36VfWT7iYjARmQ92x6EMbtm3xKE2dQdzEY9E3S92HQsbYYrTKVGI9y CboA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:dkim-signature :arc-authentication-results; bh=5HQvJs5dinq7zrV4Y2fgvGTA0swDc23V4xMLYJJ9XwM=; b=U9dIyyHjnDcL1ITtsXsgKDD2ijN46Xe/fuimPEAfNiDNjubBnV5g1PZ6HYWE1yROzd 8ILfg+cW5PW/5WBKpfDJMgJqJVI5tT7CdkskD+OTj3Y5gIboPKOdyKX7UI5Yv+1BDoKK eWsPHT9DFqSqX1QJ7ZSHsu4/v9+zg67Nl7GiGdQgosK5K+SqPWw2zJZDDndPzxpOTgv4 zJIJHs9iHB4N+Ckvn4MCmPPbnqJ2EL5sIV5Igbdb0oYuDvOZ/rXRFkd2a0YxnPvmuk0i uwmi8sHr+bqMeUDFKeCOhY/XEn4gB9pLI8ooslIGJRk9cvV0fp+TqFLTkeohg2EC0AMP waIQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@lightnvm-io.20150623.gappssmtp.com header.s=20150623 header.b=OSaA8RFs; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id x3-v6si38437944plo.62.2018.06.01.05.05.51; Fri, 01 Jun 2018 05:06:06 -0700 (PDT) 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; dkim=pass header.i=@lightnvm-io.20150623.gappssmtp.com header.s=20150623 header.b=OSaA8RFs; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751598AbeFAMFV (ORCPT + 99 others); Fri, 1 Jun 2018 08:05:21 -0400 Received: from mail-lf0-f66.google.com ([209.85.215.66]:45034 "EHLO mail-lf0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750795AbeFAMFR (ORCPT ); Fri, 1 Jun 2018 08:05:17 -0400 Received: by mail-lf0-f66.google.com with SMTP id 36-v6so12527686lfr.11 for ; Fri, 01 Jun 2018 05:05:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lightnvm-io.20150623.gappssmtp.com; s=20150623; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=5HQvJs5dinq7zrV4Y2fgvGTA0swDc23V4xMLYJJ9XwM=; b=OSaA8RFsLm+CpzGoz+8saCiF1BubAcKELwvoYy+SvKfeDSIXhN+siBnLKzvfSO9FgI NSCAVWhzVuQD4SjFqEd5fqmiuYtJZGsb+IF4jOjnWWmF8JdGkfO7+sHpdPxGAWVbefOW R+4HDvxlIBqyOuOVbS2qFhE8RvYl4PKvtU/1PSxrAmXwf+MXu2ZGwipl9tPQEYkquaP9 jNzu0G12NGRj0bpKtC7x9h05dhr0Vsg9PJ54cnqJV0hI1e5w+jY4oERZHciw/gIjLGQB w7JbvPuJBb5mWWpOhl4xuvvSLzjfbLWIJbmjSVNqjBzn41/3srZPzkev5YtpUe+iYOHz N6GQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=5HQvJs5dinq7zrV4Y2fgvGTA0swDc23V4xMLYJJ9XwM=; b=RF4G3N6l8dbW1ops0o4KTxSkcKbqQhwtRxVVxvhiSjoFi/PujR4g+cvak8bhP1LKeR cLBoehO5ZNIyo7A3iMteZC+d50G/87bacaq2nUcbG1hFoWyY+quankhj1xx55EyHChLm 9nvXgd8ruGnIOtpdIl8OgacW9roygrnet+BdIAFE/N+QE5g9x75BvhQAtfxQLKiogL91 RePBnpJkbMaMtLlZlZlErhwiAcvg+Fn6UgzEjGSSJTrtiCSY3jjBd/2yyvycRk7jlvc9 imDyEsC6o2clOS2b8IRbfVLZUUz0aWnJme8l2N6KY7xC6hY9P8gH1p+z0B3/YMCuT3IB wMGQ== X-Gm-Message-State: ALKqPwf6YqlKvzKA+CmeNJye+RuTC48grd3hh/pH60mpzajl59FPSSR2 qL7VpisUTdbxZYSGYiyA4nnimg== X-Received: by 2002:a19:7402:: with SMTP id v2-v6mr6456799lfe.97.1527854715834; Fri, 01 Jun 2018 05:05:15 -0700 (PDT) Received: from [192.168.0.10] (95-166-82-66-cable.dk.customer.tdc.net. [95.166.82.66]) by smtp.googlemail.com with ESMTPSA id x15-v6sm192952lfe.39.2018.06.01.05.05.14 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 01 Jun 2018 05:05:14 -0700 (PDT) Subject: Re: [PATCH] lightnvm: pblk: remove unnecessary bio_get/put To: =?UTF-8?Q?Javier_Gonz=c3=a1lez?= , Jens Axboe Cc: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, =?UTF-8?Q?Javier_Gonz=c3=a1lez?= References: <1527854506-8708-1-git-send-email-javier@cnexlabs.com> <1527854506-8708-2-git-send-email-javier@cnexlabs.com> From: =?UTF-8?Q?Matias_Bj=c3=b8rling?= Message-ID: Date: Fri, 1 Jun 2018 14:05:14 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.0 MIME-Version: 1.0 In-Reply-To: <1527854506-8708-2-git-send-email-javier@cnexlabs.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-GB Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 06/01/2018 02:01 PM, Javier González wrote: > In the read path, pblk gets a reference to the incoming bio and puts it > after ending the bio. Though this behavior is correct, it is unnecessary > since pblk is the one putting the bio, therefore, it cannot disappear > underneath it. > > Removing this reference, allows to clean up rqd->bio and avoids pointer > bouncing for the different read paths. Now, the incoming bio always > resides in the read context and pblk's internal bios (if any) reside in > rqd->bio. > > Signed-off-by: Javier González > --- > drivers/lightnvm/pblk-read.c | 65 +++++++++++++++++++------------------------- > 1 file changed, 28 insertions(+), 37 deletions(-) > > diff --git a/drivers/lightnvm/pblk-read.c b/drivers/lightnvm/pblk-read.c > index fa7b60f852d9..38360de23d4e 100644 > --- a/drivers/lightnvm/pblk-read.c > +++ b/drivers/lightnvm/pblk-read.c > @@ -39,10 +39,10 @@ static int pblk_read_from_cache(struct pblk *pblk, struct bio *bio, > } > > static void pblk_read_ppalist_rq(struct pblk *pblk, struct nvm_rq *rqd, > - sector_t blba, unsigned long *read_bitmap) > + struct bio *bio, sector_t blba, > + unsigned long *read_bitmap) > { > struct pblk_sec_meta *meta_list = rqd->meta_list; > - struct bio *bio = rqd->bio; > struct ppa_addr ppas[PBLK_MAX_REQ_ADDRS]; > int nr_secs = rqd->nr_ppas; > bool advanced_bio = false; > @@ -189,7 +189,6 @@ static void pblk_end_user_read(struct bio *bio) > WARN_ONCE(bio->bi_status, "pblk: corrupted read bio\n"); > #endif > bio_endio(bio); > - bio_put(bio); > } > > static void __pblk_end_io_read(struct pblk *pblk, struct nvm_rq *rqd, > @@ -197,23 +196,18 @@ static void __pblk_end_io_read(struct pblk *pblk, struct nvm_rq *rqd, > { > struct nvm_tgt_dev *dev = pblk->dev; > struct pblk_g_ctx *r_ctx = nvm_rq_to_pdu(rqd); > - struct bio *bio = rqd->bio; > + struct bio *int_bio = rqd->bio; > unsigned long start_time = r_ctx->start_time; > > generic_end_io_acct(dev->q, READ, &pblk->disk->part0, start_time); > > if (rqd->error) > pblk_log_read_err(pblk, rqd); > -#ifdef CONFIG_NVM_DEBUG > - else > - WARN_ONCE(bio->bi_status, "pblk: corrupted read error\n"); > -#endif > > pblk_read_check_seq(pblk, rqd, r_ctx->lba); > > - bio_put(bio); > - if (r_ctx->private) > - pblk_end_user_read((struct bio *)r_ctx->private); > + if (int_bio) > + bio_put(int_bio); > > if (put_line) > pblk_read_put_rqd_kref(pblk, rqd); > @@ -230,16 +224,19 @@ static void __pblk_end_io_read(struct pblk *pblk, struct nvm_rq *rqd, > static void pblk_end_io_read(struct nvm_rq *rqd) > { > struct pblk *pblk = rqd->private; > + struct pblk_g_ctx *r_ctx = nvm_rq_to_pdu(rqd); > + struct bio *bio = (struct bio *)r_ctx->private; > > + pblk_end_user_read(bio); > __pblk_end_io_read(pblk, rqd, true); > } > > -static int pblk_partial_read_bio(struct pblk *pblk, struct nvm_rq *rqd, > - unsigned int bio_init_idx, > - unsigned long *read_bitmap) > +static int pblk_partial_read(struct pblk *pblk, struct nvm_rq *rqd, > + struct bio *orig_bio, unsigned int bio_init_idx, > + unsigned long *read_bitmap) > { > - struct bio *new_bio, *bio = rqd->bio; > struct pblk_sec_meta *meta_list = rqd->meta_list; > + struct bio *new_bio; > struct bio_vec src_bv, dst_bv; > void *ppa_ptr = NULL; > void *src_p, *dst_p; > @@ -256,11 +253,11 @@ static int pblk_partial_read_bio(struct pblk *pblk, struct nvm_rq *rqd, > new_bio = bio_alloc(GFP_KERNEL, nr_holes); > > if (pblk_bio_add_pages(pblk, new_bio, GFP_KERNEL, nr_holes)) > - goto err_add_pages; > + goto fail_add_pages; > > if (nr_holes != new_bio->bi_vcnt) { > pr_err("pblk: malformed bio\n"); > - goto err; > + goto fail; > } > > for (i = 0; i < nr_secs; i++) > @@ -283,7 +280,7 @@ static int pblk_partial_read_bio(struct pblk *pblk, struct nvm_rq *rqd, > if (ret) { > bio_put(rqd->bio); > pr_err("pblk: sync read IO submission failed\n"); > - goto err; > + goto fail; > } > > if (rqd->error) { > @@ -319,7 +316,7 @@ static int pblk_partial_read_bio(struct pblk *pblk, struct nvm_rq *rqd, > meta_list[hole].lba = lba_list_media[i]; > > src_bv = new_bio->bi_io_vec[i++]; > - dst_bv = bio->bi_io_vec[bio_init_idx + hole]; > + dst_bv = orig_bio->bi_io_vec[bio_init_idx + hole]; > > src_p = kmap_atomic(src_bv.bv_page); > dst_p = kmap_atomic(dst_bv.bv_page); > @@ -338,28 +335,26 @@ static int pblk_partial_read_bio(struct pblk *pblk, struct nvm_rq *rqd, > > bio_put(new_bio); > > - /* Complete the original bio and associated request */ > - bio_endio(bio); > - rqd->bio = bio; > + /* restore original request */ > + rqd->bio = NULL; > rqd->nr_ppas = nr_secs; > > __pblk_end_io_read(pblk, rqd, false); > - return NVM_IO_OK; > + return NVM_IO_DONE; > > -err: > +fail: > /* Free allocated pages in new bio */ > pblk_bio_free_pages(pblk, new_bio, 0, new_bio->bi_vcnt); > -err_add_pages: > +fail_add_pages: > pr_err("pblk: failed to perform partial read\n"); > __pblk_end_io_read(pblk, rqd, false); > return NVM_IO_ERR; > } > > -static void pblk_read_rq(struct pblk *pblk, struct nvm_rq *rqd, > +static void pblk_read_rq(struct pblk *pblk, struct nvm_rq *rqd, struct bio *bio, > sector_t lba, unsigned long *read_bitmap) > { > struct pblk_sec_meta *meta_list = rqd->meta_list; > - struct bio *bio = rqd->bio; > struct ppa_addr ppa; > > pblk_lookup_l2p_seq(pblk, &ppa, lba, 1); > @@ -423,14 +418,15 @@ int pblk_submit_read(struct pblk *pblk, struct bio *bio) > rqd = pblk_alloc_rqd(pblk, PBLK_READ); > > rqd->opcode = NVM_OP_PREAD; > - rqd->bio = bio; > rqd->nr_ppas = nr_secs; > + rqd->bio = NULL; /* cloned bio if needed */ > rqd->private = pblk; > rqd->end_io = pblk_end_io_read; > > r_ctx = nvm_rq_to_pdu(rqd); > r_ctx->start_time = jiffies; > r_ctx->lba = blba; > + r_ctx->private = bio; /* original bio */ > > /* Save the index for this bio's start. This is needed in case > * we need to fill a partial read. > @@ -448,17 +444,15 @@ int pblk_submit_read(struct pblk *pblk, struct bio *bio) > rqd->ppa_list = rqd->meta_list + pblk_dma_meta_size; > rqd->dma_ppa_list = rqd->dma_meta_list + pblk_dma_meta_size; > > - pblk_read_ppalist_rq(pblk, rqd, blba, &read_bitmap); > + pblk_read_ppalist_rq(pblk, rqd, bio, blba, &read_bitmap); > } else { > - pblk_read_rq(pblk, rqd, blba, &read_bitmap); > + pblk_read_rq(pblk, rqd, bio, blba, &read_bitmap); > } > > - bio_get(bio); > if (bitmap_full(&read_bitmap, nr_secs)) { > - bio_endio(bio); > atomic_inc(&pblk->inflight_io); > __pblk_end_io_read(pblk, rqd, false); > - return NVM_IO_OK; > + return NVM_IO_DONE; > } > > /* All sectors are to be read from the device */ > @@ -473,13 +467,10 @@ int pblk_submit_read(struct pblk *pblk, struct bio *bio) > } > > rqd->bio = int_bio; > - r_ctx->private = bio; > > if (pblk_submit_io(pblk, rqd)) { > pr_err("pblk: read IO submission failed\n"); > ret = NVM_IO_ERR; > - if (int_bio) > - bio_put(int_bio); > goto fail_end_io; > } > > @@ -489,7 +480,7 @@ int pblk_submit_read(struct pblk *pblk, struct bio *bio) > /* The read bio request could be partially filled by the write buffer, > * but there are some holes that need to be read from the drive. > */ > - return pblk_partial_read_bio(pblk, rqd, bio_init_idx, &read_bitmap); > + return pblk_partial_read(pblk, rqd, bio, bio_init_idx, &read_bitmap); > > fail_rqd_free: > pblk_free_rqd(pblk, rqd, PBLK_READ); > Hi Jens, Would you please pick this up as well? Signed-off-by: Matias Bjørling