Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp614997imm; Fri, 1 Jun 2018 06:48:09 -0700 (PDT) X-Google-Smtp-Source: ADUXVKLc9vGwE8EvoEEvqt87ZoxE7i0/LFm+eUft0Gnlmx1CriZQim5YuO457+Fsc5G0MNnVVZrf X-Received: by 2002:a17:902:56e:: with SMTP id 101-v6mr11359345plf.25.1527860889131; Fri, 01 Jun 2018 06:48:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527860889; cv=none; d=google.com; s=arc-20160816; b=haQTVRCAsAS+XCuUBCyM5wTBkB4VIkg+LEdCdql7Bst270Idcd30x8DHze/u/sIs7P xMjqOl1RfAFB/xVp4JId3pMsgyQDVOmRMAJeSjLyIXw/6eWMr4H9oYqFqpf143N4t0xs qdv4wrGV6LIWq0fr61+Dy4W8vqgNAel7kmNwCoud9A5JC0eHMkTFnQpEkKkrFQ6gptCQ uKa/24tfdJlo6iJ23T2Obg+35SxM9mn67wqwZ0bfSDSq7jvDwzvnazwHfrWWL5b5PPhL 4+ZTBfIpFsQ7BkFBkvJkJvKJhL/NrOjPSbe2W5Lcu/n7I6o0Vyy0NygOJCwCcJrjvwXy Yttg== 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=z3ChiF6lkvjtRpOqk8FkUsj8I2aX3z4huUKdtc3N7qE=; b=xlXGMwJ8rEyqSR0HovMJkClnGJ7rlEBcxL3ZshX/nGKxtr7KgXoNXRnNqNFf+1FIDF fd6os8QdQkH/tBfk4niLqVnOJFsBKHrCL3d1bpFe2rS+S22JSN3+6mOc4l3TohqL9lsQ dVIVCrXu+MbiFWXmp3aUPA7o5JmZ5LYP5aXK7lRwbfNrwx9R44/LoKGchx1VWq3Om6rK 9iFnzUBaFN9aX+km7xuTxhd+G5IKt+JwGbe5kFx2Xz4eDW7Dbx5aKszG+SE6tpQzuhBB XhmYai5Ng9KiBfxEB9gaLigxMo+GlDmZFCizsJqagbRKczdObjJR8JZHYDZo9Yk9jIvb h2+A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel-dk.20150623.gappssmtp.com header.s=20150623 header.b=MW9GW3gL; 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 18-v6si14488715pfr.242.2018.06.01.06.47.54; Fri, 01 Jun 2018 06:48:09 -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=@kernel-dk.20150623.gappssmtp.com header.s=20150623 header.b=MW9GW3gL; 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 S1752069AbeFANrX (ORCPT + 99 others); Fri, 1 Jun 2018 09:47:23 -0400 Received: from mail-io0-f194.google.com ([209.85.223.194]:34575 "EHLO mail-io0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751454AbeFANrU (ORCPT ); Fri, 1 Jun 2018 09:47:20 -0400 Received: by mail-io0-f194.google.com with SMTP id e15-v6so21351849iog.1 for ; Fri, 01 Jun 2018 06:47:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel-dk.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=z3ChiF6lkvjtRpOqk8FkUsj8I2aX3z4huUKdtc3N7qE=; b=MW9GW3gLWJBO+ewX4ItfzychT2tD45tu7dVencR/f7t0T8KBhRKzdwRScGNG7henM7 RBZqQ3bKxzQFZlPK7Mcy533ms1adCqAGAWk5t3TpFNejmEX0utVV8IY5e18Mf/UpugqH 245mMvFYJ2JFMm62grmVUVrD6AalP3Fsw4rb4+FlKfjxTr5ZkzNj0DJ0lv/Z14xSu7qj 3U9OZ3I6UF11lbBkVGIr5VTpO0zS3LWd4rpyKxMDi89CBO2nS0gNfUeR5WlhJTzal1pf 98ZIEBZj1xdcppqEQb9wysFfIAd3oQyD0Y9YMpBx1D7Skx/qsdOJkertRvgMTyeevm+0 E8qQ== 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=z3ChiF6lkvjtRpOqk8FkUsj8I2aX3z4huUKdtc3N7qE=; b=SSt2V8134W3Nqfc7Bo8PJaV368I2ZKNjUAJnkzeOwagis4rsZmuKBe/7Bx4mIGpU+T R8dTmCJwMOBwBuZqVbzS6Si1bfHwwIj5GRDNo9+ku+WnYvYb5N2YdgGUVrOc13HBQYbv AaqXnJ5rdMC0J7wvlV3f/ap8tlZa6nxhcSEXtxUuBQlxxMlf8JqQ7C0lAiz840uC7PUr kIl8vo9x/EIIA6Hh1f8pNpfPPq19ZarY79MLxnZBH8EjFWB+evHSJrRFWS2Jrr0iAfos bcBBmzSRiSWUtQEf4TJnrfgCG47pPxr9QQ5g/Gcl23FJ36kDjw1S4ra8pEO62mTvI5yM Rnmw== X-Gm-Message-State: APt69E2LOmmk84qv8rtS31DF7zoVE+Ew8ovKQFdB+PvSBOKyBR1fI7Q9 W3qYZF+3Z/BIeDbj4bj0d/fO6Q== X-Received: by 2002:a6b:f112:: with SMTP id e18-v6mr10427250iog.253.1527860839305; Fri, 01 Jun 2018 06:47:19 -0700 (PDT) Received: from [192.168.1.212] (107.191.0.158.static.utbb.net. [107.191.0.158]) by smtp.gmail.com with ESMTPSA id e2-v6sm1190764ioh.23.2018.06.01.06.47.17 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 01 Jun 2018 06:47:18 -0700 (PDT) Subject: Re: [PATCH] lightnvm: pblk: remove unnecessary bio_get/put To: =?UTF-8?Q?Matias_Bj=c3=b8rling?= , =?UTF-8?Q?Javier_Gonz=c3=a1lez?= 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: Jens Axboe Message-ID: <162341d7-83b1-6bb3-9e00-f7bbc14f99f0@kernel.dk> Date: Fri, 1 Jun 2018 07:47:16 -0600 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 6/1/18 6:05 AM, Matias Bjørling wrote: > 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? Please just make it part of your updated series, it doesn't apply to what I currently have. -- Jens Axboe