From patchwork Wed Sep 6 10:51:03 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?UTF-8?q?Javier=20Gonz=C3=A1lez?= X-Patchwork-Id: 9940353 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 38439602CC for ; Wed, 6 Sep 2017 10:53:03 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2F5A028B75 for ; Wed, 6 Sep 2017 10:53:03 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2093428B98; Wed, 6 Sep 2017 10:53:03 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.4 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8B2CD28B75 for ; Wed, 6 Sep 2017 10:53:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752712AbdIFKxA (ORCPT ); Wed, 6 Sep 2017 06:53:00 -0400 Received: from mail-wm0-f49.google.com ([74.125.82.49]:37032 "EHLO mail-wm0-f49.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753328AbdIFKwr (ORCPT ); Wed, 6 Sep 2017 06:52:47 -0400 Received: by mail-wm0-f49.google.com with SMTP id u26so29536229wma.0 for ; Wed, 06 Sep 2017 03:52:46 -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=M1NxhJHIkfv226qj7yoylvC9LF4sG680jbQ2pfmJweo=; b=vZAAJ+2mDUQXp/nnwXo4HdPCcc6wGmbCZORHAu3LL0WoN6GhNZjWzOFITuYNiD290q FsvoeDPp9c7pc283CgoxFI+cUNpMYze/2UB6Yk7R41Hx4rjpUMUZykhC6qDkXkL+nt+P KJMhpv3jkhcB1DnG3a3o0cgng+jjl1McitUq2GopCosv8MJ0lcpng5tl8FzOZL6PeWBE d0A+8UDBTS2pYfezH7fIb7dPuAEGBcjxfuPL1weYAMjHexiVUKj5dAWfExz2yzIJHUKT u5xFmEmhrbq2oGPJCInzIolbqkXbnZsfWYEc5RrZ6qK/uxk1zW222MfJvD0THg4BBL5M /NKw== 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=M1NxhJHIkfv226qj7yoylvC9LF4sG680jbQ2pfmJweo=; b=sKkg5bodDsPZFcUWZdnPG4MHZ9q4vEXOcuU097GaCX5e/oFsXRsLOTeT9wDsD56Fxs ed3jTpMAVSfuWKxNeD+W1AQ+WA5JCV4ojzIzooCmfusruV2IsfioaRtsNOdg7jtTH/8B C4NjRTmfHfTVd7ebM4qIwZRrXOpgG3b6c276yNSG1f0KfSfh6VKN+n5iPTMPcX4W4QOV ZPSSVj0wLOQaQ4jU4oMbaujjLV6EWFWgf151kEMNK/cq9moslbpGGlJLX0NPyDWwnWex Is0XlivpMaVP3q7m1kAYVGUn2yICsgnFqZFc6dMi9SiWXiREmrx3XfqZazx1MJelELtK LVXA== X-Gm-Message-State: AHPjjUhdNTqOyfc1tjNkxrAJeexHVS5KNAaQ7c9AHsgOP+64sqduCkI8 tl6fjirft11wVfuT X-Google-Smtp-Source: ADKCNb59NsbFO7HohiiFceKQ43Fx7h168+3aN4aiRv+2KFPI8/Ki+TiteHeB/01Vkv7uO9igFRYhrw== X-Received: by 10.80.204.145 with SMTP id q17mr5704455edi.104.1504695165756; Wed, 06 Sep 2017 03:52:45 -0700 (PDT) Received: from uHalley.cnexlabs.com (6164211-cl69.boa.fiberby.dk. [193.106.164.211]) by smtp.gmail.com with ESMTPSA id b8sm1044007edi.46.2017.09.06.03.52.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 06 Sep 2017 03:52:45 -0700 (PDT) From: "=?UTF-8?q?Javier=20Gonz=C3=A1lez?=" X-Google-Original-From: =?UTF-8?q?Javier=20Gonz=C3=A1lez?= To: mb@lightnvm.io, axboe@fb.com Cc: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, =?UTF-8?q?Javier=20Gonz=C3=A1lez?= , =?UTF-8?q?Matias=20Bj=C3=B8rling?= Subject: [PATCH 10/18] lightnvm: pblk: use bio_copy_kern when possible Date: Wed, 6 Sep 2017 12:51:03 +0200 Message-Id: <1504695071-25928-11-git-send-email-javier@cnexlabs.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1504695071-25928-1-git-send-email-javier@cnexlabs.com> References: <1504695071-25928-1-git-send-email-javier@cnexlabs.com> MIME-Version: 1.0 Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP In pblk, buffers forming bios can be allocated on physically contiguous or virtually contiguous memory. For physically contiguous memory, we already use the bio_map_kern helper funciton, however, for virtually contiguous memory, we from the bio manually. This makes the code more complex, specially on the completion path, where mapped pages need to be freed. Instead, use bio_copy_kern, which does the same and at the same time simplifies the completion path. Signed-off-by: Javier González Signed-off-by: Matias Bjørling --- drivers/lightnvm/pblk-core.c | 39 ++++----------------------------------- drivers/lightnvm/pblk-read.c | 3 +-- drivers/lightnvm/pblk-recovery.c | 3 +-- drivers/lightnvm/pblk-write.c | 7 +------ drivers/lightnvm/pblk.h | 2 +- 5 files changed, 8 insertions(+), 46 deletions(-) diff --git a/drivers/lightnvm/pblk-core.c b/drivers/lightnvm/pblk-core.c index f6b9afbe8589..e69e8829b093 100644 --- a/drivers/lightnvm/pblk-core.c +++ b/drivers/lightnvm/pblk-core.c @@ -423,42 +423,14 @@ int pblk_submit_io(struct pblk *pblk, struct nvm_rq *rqd) struct bio *pblk_bio_map_addr(struct pblk *pblk, void *data, unsigned int nr_secs, unsigned int len, - int alloc_type, gfp_t gfp_mask) + int alloc_type, gfp_t gfp_mask, int reading) { struct nvm_tgt_dev *dev = pblk->dev; - void *kaddr = data; - struct page *page; - struct bio *bio; - int i, ret; if (alloc_type == PBLK_KMALLOC_META) - return bio_map_kern(dev->q, kaddr, len, gfp_mask); + return bio_map_kern(dev->q, data, len, gfp_mask); - bio = bio_kmalloc(gfp_mask, nr_secs); - if (!bio) - return ERR_PTR(-ENOMEM); - - for (i = 0; i < nr_secs; i++) { - page = vmalloc_to_page(kaddr); - if (!page) { - pr_err("pblk: could not map vmalloc bio\n"); - bio_put(bio); - bio = ERR_PTR(-ENOMEM); - goto out; - } - - ret = bio_add_pc_page(dev->q, bio, page, PAGE_SIZE, 0); - if (ret != PAGE_SIZE) { - pr_err("pblk: could not add page to bio\n"); - bio_put(bio); - bio = ERR_PTR(-ENOMEM); - goto out; - } - - kaddr += PAGE_SIZE; - } -out: - return bio; + return bio_copy_kern(dev->q, data, len, GFP_KERNEL, reading); } int pblk_calc_secs(struct pblk *pblk, unsigned long secs_avail, @@ -588,7 +560,7 @@ static int pblk_line_submit_emeta_io(struct pblk *pblk, struct pblk_line *line, rq_len = rq_ppas * geo->sec_size; bio = pblk_bio_map_addr(pblk, emeta_buf, rq_ppas, rq_len, - l_mg->emeta_alloc_type, GFP_KERNEL); + l_mg->emeta_alloc_type, GFP_KERNEL, dir == READ); if (IS_ERR(bio)) { ret = PTR_ERR(bio); goto free_rqd_dma; @@ -673,9 +645,6 @@ static int pblk_line_submit_emeta_io(struct pblk *pblk, struct pblk_line *line, atomic_dec(&pblk->inflight_io); reinit_completion(&wait); - if (likely(pblk->l_mg.emeta_alloc_type == PBLK_VMALLOC_META)) - bio_put(bio); - if (rqd.error) { if (dir == WRITE) pblk_log_write_err(pblk, &rqd); diff --git a/drivers/lightnvm/pblk-read.c b/drivers/lightnvm/pblk-read.c index f32091503547..1be972521dcd 100644 --- a/drivers/lightnvm/pblk-read.c +++ b/drivers/lightnvm/pblk-read.c @@ -542,7 +542,7 @@ int pblk_submit_read_gc(struct pblk *pblk, struct pblk_gc_rq *gc_rq) data_len = (gc_rq->secs_to_gc) * geo->sec_size; bio = pblk_bio_map_addr(pblk, gc_rq->data, gc_rq->secs_to_gc, data_len, - PBLK_VMALLOC_META, GFP_KERNEL); + PBLK_VMALLOC_META, GFP_KERNEL, 1); if (IS_ERR(bio)) { pr_err("pblk: could not allocate GC bio (%lu)\n", PTR_ERR(bio)); goto err_free_dma; @@ -583,7 +583,6 @@ int pblk_submit_read_gc(struct pblk *pblk, struct pblk_gc_rq *gc_rq) atomic_long_sub(gc_rq->secs_to_gc, &pblk->inflight_reads); #endif - bio_put(bio); out: nvm_dev_dma_free(dev->parent, rqd.meta_list, rqd.dma_meta_list); return ret; diff --git a/drivers/lightnvm/pblk-recovery.c b/drivers/lightnvm/pblk-recovery.c index 279638309d9a..b033d4f2b446 100644 --- a/drivers/lightnvm/pblk-recovery.c +++ b/drivers/lightnvm/pblk-recovery.c @@ -342,7 +342,6 @@ static void pblk_end_io_recov(struct nvm_rq *rqd) pblk_up_page(pblk, rqd->ppa_list, rqd->nr_ppas); - bio_put(rqd->bio); nvm_dev_dma_free(dev->parent, rqd->meta_list, rqd->dma_meta_list); pblk_free_rqd(pblk, rqd, WRITE_INT); @@ -411,7 +410,7 @@ static int pblk_recov_pad_oob(struct pblk *pblk, struct pblk_line *line, } bio = pblk_bio_map_addr(pblk, data, rq_ppas, rq_len, - PBLK_VMALLOC_META, GFP_KERNEL); + PBLK_VMALLOC_META, GFP_KERNEL, 0); if (IS_ERR(bio)) { ret = PTR_ERR(bio); goto fail_free_rqd; diff --git a/drivers/lightnvm/pblk-write.c b/drivers/lightnvm/pblk-write.c index 920b93fb15d5..e5d77af1aad1 100644 --- a/drivers/lightnvm/pblk-write.c +++ b/drivers/lightnvm/pblk-write.c @@ -187,17 +187,12 @@ static void pblk_end_io_write_meta(struct nvm_rq *rqd) pblk_log_write_err(pblk, rqd); pr_err("pblk: metadata I/O failed. Line %d\n", line->id); } -#ifdef CONFIG_NVM_DEBUG - else - WARN_ONCE(rqd->bio->bi_status, "pblk: corrupted write error\n"); -#endif sync = atomic_add_return(rqd->nr_ppas, &emeta->sync); if (sync == emeta->nr_entries) pblk_line_run_ws(pblk, line, NULL, pblk_line_close_ws, pblk->close_wq); - bio_put(rqd->bio); nvm_dev_dma_free(dev->parent, rqd->meta_list, rqd->dma_meta_list); pblk_free_rqd(pblk, rqd, WRITE_INT); @@ -382,7 +377,7 @@ int pblk_submit_meta_io(struct pblk *pblk, struct pblk_line *meta_line) data = ((void *)emeta->buf) + emeta->mem; bio = pblk_bio_map_addr(pblk, data, rq_ppas, rq_len, - l_mg->emeta_alloc_type, GFP_KERNEL); + l_mg->emeta_alloc_type, GFP_KERNEL, 0); if (IS_ERR(bio)) { ret = PTR_ERR(bio); goto fail_free_rqd; diff --git a/drivers/lightnvm/pblk.h b/drivers/lightnvm/pblk.h index 3771f876ce80..2304a4891f20 100644 --- a/drivers/lightnvm/pblk.h +++ b/drivers/lightnvm/pblk.h @@ -712,7 +712,7 @@ int pblk_submit_io(struct pblk *pblk, struct nvm_rq *rqd); int pblk_submit_meta_io(struct pblk *pblk, struct pblk_line *meta_line); struct bio *pblk_bio_map_addr(struct pblk *pblk, void *data, unsigned int nr_secs, unsigned int len, - int alloc_type, gfp_t gfp_mask); + int alloc_type, gfp_t gfp_mask, int reading); struct pblk_line *pblk_line_get(struct pblk *pblk); struct pblk_line *pblk_line_get_first_data(struct pblk *pblk); void pblk_line_replace_data(struct pblk *pblk);