Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp572294imm; Fri, 1 Jun 2018 06:08:09 -0700 (PDT) X-Google-Smtp-Source: ADUXVKJSa/4ptU+1X8rE2aG9aZRcPMTPOBJQH7vskdamMJobfO0GuL4ZFCCG7IAv189oX5QONEtY X-Received: by 2002:a62:f619:: with SMTP id x25-v6mr10802101pfh.106.1527858489324; Fri, 01 Jun 2018 06:08:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527858489; cv=none; d=google.com; s=arc-20160816; b=n5MCLYC0U09FFIEp/WTumTPdJlthCrHsEGXhJJqnjZwIuR1jzYZdw03NTXECvlhm26 NGKHb7Cb9allT/WZ/fBrh/iUKLNILdnpEdhbov7rlAdMN8I/7vZPhY36caylt3r4AYeE fb12l3kYpSk89L/GYBxz3m25qpe/zALqdn8Ch+ga5JROFZ/KLFlp6QYANrlaS2yt4zbl 8LNF5MTV6Emgeh0n8mgVtj3EKAJP6d6AliWRD4p/ZP00RcPbnVwYHhp9lmzs+0pHrRw6 hgrnfR47/7dfnuJD+ihVRewuJCZc/pmNkPSI3FLwhhgm7mJw7+FBOvIrBXqhcN4UYkYh Ay2Q== 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=HqVbXRigcdVvZiqv0WYfaYen4yVKclkNI5UhLumBSzg=; b=og/LQSUNgsYg2x3XG7Y530cL5FidFBmmbD5QwD4dHHVJn0hAEDwe3X/igOq/SrxFf3 G2qje21RfLgpSGrog4Z9K16O8g7g+hn71ECoY3TOzuXz8JkYID1FG8t61jL1yKgF6Htr M/s7cgqrqq2hRtsmb2XAEIEZet2SZU2igPfr1iPEH5ja3DiRMi0hRvu6i6lHAgab6w// N0X4wXr5WnCNTmXC57w7e/mc+OSlWkY4HRcopZuqGU29Xqeu0UAcbL8l8IL7bzIohQNy kexeTjWKGKUGq8aEfDFQxJjNuKJ+Dj3BNiSnXalLU+I0dRf/F+mglJn2TMgvj4tmsiE8 0z1A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@lightnvm-io.20150623.gappssmtp.com header.s=20150623 header.b=N9nRSZiH; 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 f26-v6si16681327pgn.247.2018.06.01.06.07.54; Fri, 01 Jun 2018 06:08: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=@lightnvm-io.20150623.gappssmtp.com header.s=20150623 header.b=N9nRSZiH; 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 S1752314AbeFANGz (ORCPT + 99 others); Fri, 1 Jun 2018 09:06:55 -0400 Received: from mail-lf0-f68.google.com ([209.85.215.68]:36056 "EHLO mail-lf0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752511AbeFANFS (ORCPT ); Fri, 1 Jun 2018 09:05:18 -0400 Received: by mail-lf0-f68.google.com with SMTP id u4-v6so14739491lff.3 for ; Fri, 01 Jun 2018 06:05:17 -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=HqVbXRigcdVvZiqv0WYfaYen4yVKclkNI5UhLumBSzg=; b=N9nRSZiHLoi/P92KmZC3TT5Bap5sv7pmH+3DJyi4h++/FmRBD/FX7Ib3RgmV7wIj2Q P/p6QYIoKKPOs4AckIL40aoxz8BNZhW4+YaW05fyig87XJO6fEA6bpASKuMUBoqsjwt7 JUor9bIsokcnJQtDLi8Rl3HuBsmOtScPr0mw4zkeJYwLkTRpKKmBM3e7GYiusam2R5wq FyWxbuRuweKl5K0+Ch4p2XOwWB+U/iTxWcJDWefTSnkv55fwPj6L9yyVDovGcsyhUADJ xqHppRzsbkatzPIe4ldNn9VseuIhP3IOwmbvquM0vG9SRYrIAPWMFj4gK2NaLo9K3P98 t4jA== 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=HqVbXRigcdVvZiqv0WYfaYen4yVKclkNI5UhLumBSzg=; b=dw/OyRrctkowxzX+sRyCt62+zy3UU6m/M82C7vJGoWBjGh0ADINUuWibYIPLZtkNfK O08IopH1oX++SVsuisxHfi5Ojpsw1gKJO1isfKxx1611HHPsPiGcZH6WshCi3xAU+0/5 eaAD4US2389MmNVlQpWoVBrcPDPF6du2WRMw2V2eQBl8hvb2Q6PpgmTOY1MZUBMCJD5r SrWBb7IqZFiuYasOPvM9EtT/8VYMeZ+TvisAWW+iwf4UWgU0Z0IfN5//YEJ1whLGvPK1 EH8bhS60cbepLUUmyBbAWFJvTbxwCRR8zC2easl0k0HIzYCqQ7w9kPeOGmrcewbdHcH0 Z8NQ== X-Gm-Message-State: APt69E1jxd9JWz1l8IEnYGdrjXIYpESYL3/TBmTtNiD9PlRm5GACxysp MRwmEDBS2irujhcPYyKiCKfeoA== X-Received: by 2002:a2e:3613:: with SMTP id d19-v6mr1928726lja.31.1527858316496; Fri, 01 Jun 2018 06:05:16 -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 g5-v6sm303161lje.21.2018.06.01.06.05.15 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 01 Jun 2018 06:05:15 -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 18/18] lightnvm: pblk: remove unnecessary bio_get/put Date: Fri, 1 Jun 2018 15:04:32 +0200 Message-Id: <20180601130432.30866-19-mb@lightnvm.io> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180601130432.30866-1-mb@lightnvm.io> References: <20180601130432.30866-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 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); -- 2.11.0