Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp678278imm; Fri, 1 Jun 2018 07:47:17 -0700 (PDT) X-Google-Smtp-Source: ADUXVKLbEzMbvnsYuRIWtRqx4G57bQrM/KtgvF06IBaqvloTFmzhI1n9Bg6TUtbZym/Vvd9G+Phh X-Received: by 2002:a63:9d8e:: with SMTP id i136-v6mr8938298pgd.288.1527864437168; Fri, 01 Jun 2018 07:47:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527864437; cv=none; d=google.com; s=arc-20160816; b=jNRhE4razzTF8wBaVYBNZZO9mOteZkCLW3b3RoW319+ELMaTmvHmwqaz9OCsuQo3ki IWEozRC9Xoikj+gbgs8j+seUdNNd+SOMaE85dzCwu3npoapk9MDquA82h2qnWIMMsJx7 LYGp23+fd5dIVfFYc62aaT8utU7HrmNqKlpnyt6slNeIBzH0dCO35/lA9Zi0G36cz7GF qoXjSUvDVzw0QuRc7EvY+TbJ1A4KCvW9KLkpapbywyaEjK0tb0ndBiJcnE9vAgyq+1K9 c82HjLCS4jot89g+FPaPonE5i/mLF9UBVIoXT3ywxkXmfJ4qJGhtNh3aIwKfJ0aCmSRK HFLw== 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:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=tmqjuUtoQYB4a6/4OIzV2JuPtVSnjCreRlLKQr5MVeM=; b=R5/xK0bDmaoBcAMVKWxCbGkS/0x0fu4ZPRrIwOFPkrf00SlXYxKJyJohM6xLPmaEf9 BcQ1WbWQmCKoOv7ajWnk1hjp/dyaKhP4wP8e2w4lf5YZ7WqAOElzFwgleGoYLZBFtRIW CECYQmK2ztATteKM/9q3uVI8yfyArYg56wti5NaVJgCM2iQYXZBDcFAaB3agf8vg/t/Z 5iMix0YIhXyhXipWI3QA/10HwabDEHBuNjuMv34Io//OZH+VAYdxus+tebkcMH0uNMaq xPAlVtU8L2n+e3YneNNVTMU8lEXSJbmYJcBSLbznHwsQctVigrUOoGfhqDUKSI1MAQxx LD8Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@lightnvm-io.20150623.gappssmtp.com header.s=20150623 header.b=HbyCivcW; 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 u2-v6si17987975plr.598.2018.06.01.07.47.03; Fri, 01 Jun 2018 07:47:17 -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=HbyCivcW; 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 S1752853AbeFAOpU (ORCPT + 99 others); Fri, 1 Jun 2018 10:45:20 -0400 Received: from mail-lf0-f65.google.com ([209.85.215.65]:37456 "EHLO mail-lf0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752208AbeFAOoD (ORCPT ); Fri, 1 Jun 2018 10:44:03 -0400 Received: by mail-lf0-f65.google.com with SMTP id r2-v6so15188789lff.4 for ; Fri, 01 Jun 2018 07:44:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lightnvm-io.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=tmqjuUtoQYB4a6/4OIzV2JuPtVSnjCreRlLKQr5MVeM=; b=HbyCivcWzjvrtfCZ5c3dwFRxoohEtKYfxxiuf4zEl/294mjzO2TKC1Zp3fdNXuXBvE TLAqQeqhgihyOdps1VbljOQJqs7KfFEEaww5UyXogSufCC+5EI6J4DDuHTF57oC7neiK 8OK2eEsTzZgX8wq+TXF/90e+q06AkmGwBhEELDMSluFH9UbD59Ec7piw4aGskRHrkucw TwAOhLQ36IpaPo5kukiPmFrq3ZI8MenOJZuf+rBHtfeOxhFqWD/qf+O9L4AlXB7dvLKn +2Gb+MY0ARP9ftOOXy6W/oCw3tLd7JonqzIvvA+lA4zvD8ctuhN1FjM6CvwewsktEdho OXjA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=tmqjuUtoQYB4a6/4OIzV2JuPtVSnjCreRlLKQr5MVeM=; b=V2ICymSp6DFJlgR324wdG1VD3bEmAwiOvbrSG7NE8+u1hv11XX9nrQpko147JZXuTq r/GunOfdxl9+yIi++vuIWOd32hdhYuvG2/nFBGTM+U9Af094ky57ug/dTBSD5hrlXzPw VA89MWu8TSgMjxYR7mDA00YXRV/GggrGCGytx/1LW5Wu2VezdLmsOYEHz4BrVxZwVyoy RZKaQC2u+61qOZXfEo+gjyKO27XYeF69JHAA9Z+ZlhSElMjlggocdsL4OzyFHK5/mdbV Qv7c1X4JKExk8Urstmkl1odgCv7dgl/uh0M/qYBCLIJ/LErSnQZdH64czIachO6fupiY UWgA== X-Gm-Message-State: ALKqPwenv/rEC281oCDTTtGccm/rvMWYc7nTGNzjtudVJm00aadmE2pV 9L2OXrzyE1K7Y5VCK5F9Eq2Ftg== X-Received: by 2002:a2e:4302:: with SMTP id q2-v6mr8767470lja.55.1527864242051; Fri, 01 Jun 2018 07:44:02 -0700 (PDT) Received: from Macroninja.cnexlabs.com (95-166-82-66-cable.dk.customer.tdc.net. [95.166.82.66]) by smtp.gmail.com with ESMTPSA id e65-v6sm356488lff.13.2018.06.01.07.44.00 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 01 Jun 2018 07:44:01 -0700 (PDT) From: =?UTF-8?q?Matias=20Bj=C3=B8rling?= To: axboe@fb.com Cc: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, javier@cnexlabs.com, igor.j.konopko@intel.com, marcin.dziegielewski@intel.com, =?UTF-8?q?Javier=20Gonz=C3=A1lez?= , =?UTF-8?q?Matias=20Bj=C3=B8rling?= Subject: [GIT PULL 07/10] lightnvm: pblk: remove unnecessary bio_get/put Date: Fri, 1 Jun 2018 16:41:11 +0200 Message-Id: <20180601144114.17490-8-mb@lightnvm.io> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180601144114.17490-1-mb@lightnvm.io> References: <20180601144114.17490-1-mb@lightnvm.io> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Javier González 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 Signed-off-by: Matias Bjørling --- 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 f770fd113ffe..18694694e5f0 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); -- 2.11.0