From patchwork Wed Sep 6 10:51:05 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: 9940393 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 5451D602CC for ; Wed, 6 Sep 2017 10:55:53 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 49D8128B98 for ; Wed, 6 Sep 2017 10:55:53 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3EA8528BA1; Wed, 6 Sep 2017 10:55:53 +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=unavailable 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 C11BA28B98 for ; Wed, 6 Sep 2017 10:55:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753592AbdIFKyP (ORCPT ); Wed, 6 Sep 2017 06:54:15 -0400 Received: from mail-wm0-f44.google.com ([74.125.82.44]:35631 "EHLO mail-wm0-f44.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753348AbdIFKwt (ORCPT ); Wed, 6 Sep 2017 06:52:49 -0400 Received: by mail-wm0-f44.google.com with SMTP id f199so7945140wme.0 for ; Wed, 06 Sep 2017 03:52:49 -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=xAPh45TYqMcrIx6kTauRgRP06CuoMJaiPGeFNoS7SBk=; b=NGH5MSkUesM4L92n+chd5GmPkNGyVu2lnoAr7DN5CB/CC3FJiSnUeLm2uQMYl+NMca hdIwl38T3u2YfIFU7nS5RCDEcmSPBdNBGtxjq2hH+zRqL2sbACu1aVl7hD2mHkDhTu8D J1sBL1/Cz2XWHmwn6qqobehdXZ/brIGX+tNQkuq6SpeF9rHVBUk4JYaU4KlzA6mNhOr6 F6A6IlYAWNkBSTkOnmuyCQ1pqgdpnslFgisIshZmDH+m5NPMgzG4QiDayFTxm9VNDkGN J1zosD2DAk7+6aZenrW+4Iuogg2a8oQDfMOmAnyIbsYVYob0vh2CVGUre66biVNXSppp bTTg== 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=xAPh45TYqMcrIx6kTauRgRP06CuoMJaiPGeFNoS7SBk=; b=ar2PZENC4QSCHcqNWa13c/q54aJ6feaz8F1oHkMck0/clKOyz0aQUF21vt184btfvU iyqZITv6haXAKSkNDg3acL/iRp9blW1AmePX4yG4zH+s1+D3x3iF+Y60ZLul77ZxRFe/ 4oD6O1Bv9qEAWU1Pau63m2hFiJN1nHgYnYq3u9AVIiSWa0VC+Uox5rQlBuc6VAPK/IX4 yDqSBPnc4n+LnXJnvic5y5ytL70w/ikJsqOb90nEvVbN6okDH49ZdRfhK/fFXLEsbplj 6OzzMDgTuTFs6wgJ3KCY0n0S9NtrWCGdarQ7ez9ry1d7oW/0z9Y1wvYWeil9zyhDGEeD FUQw== X-Gm-Message-State: AHPjjUh/d+4o9W+lgnOFdA3iYJuaZhcmbugXrjoGSsZjNvhAB7Un/Dzx uqxbc1r2GoVNJywi X-Google-Smtp-Source: ADKCNb5cGdVSEBEXcBENLbhtTOcnelH6y3J4xhWIh3GUKndllIl6dFe15HYJ69pJxeUZX0NCTJ4Z0A== X-Received: by 10.80.221.137 with SMTP id w9mr5486446edk.166.1504695167610; Wed, 06 Sep 2017 03:52:47 -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.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 06 Sep 2017 03:52:47 -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 12/18] lightnvm: pblk: free padded entries in write buffer Date: Wed, 6 Sep 2017 12:51:05 +0200 Message-Id: <1504695071-25928-13-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 When a REQ_FLUSH reaches pblk, the bio cannot be directly completed. Instead, data on the write buffer is flushed and the bio is completed on the completion pah. This might require some sectors to be padded in order to guarantee a successful write. This patch fixes a memory leak on the padded pages. A consequence of this bad free was that internal bios not containing data (only a flush) were not being completed. Fixes: a4bd217b4326 ("lightnvm: physical block device (pblk) target") Signed-off-by: Javier González Signed-off-by: Matias Bjørling --- drivers/lightnvm/pblk-core.c | 1 - drivers/lightnvm/pblk-write.c | 14 +++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/drivers/lightnvm/pblk-core.c b/drivers/lightnvm/pblk-core.c index e69e8829b093..1f746e31e379 100644 --- a/drivers/lightnvm/pblk-core.c +++ b/drivers/lightnvm/pblk-core.c @@ -187,7 +187,6 @@ void pblk_bio_free_pages(struct pblk *pblk, struct bio *bio, int off, WARN_ON(off + nr_pages != bio->bi_vcnt); - bio_advance(bio, off * PBLK_EXPOSED_PAGE_SIZE); for (i = off; i < nr_pages + off; i++) { bv = bio->bi_io_vec[i]; mempool_free(bv.bv_page, pblk->page_pool); diff --git a/drivers/lightnvm/pblk-write.c b/drivers/lightnvm/pblk-write.c index e5d77af1aad1..33dd90251a60 100644 --- a/drivers/lightnvm/pblk-write.c +++ b/drivers/lightnvm/pblk-write.c @@ -25,13 +25,20 @@ static unsigned long pblk_end_w_bio(struct pblk *pblk, struct nvm_rq *rqd, unsigned long ret; int i; - for (i = 0; i < c_ctx->nr_valid; i++) { + i = 0; + do { struct pblk_w_ctx *w_ctx; w_ctx = pblk_rb_w_ctx(&pblk->rwb, c_ctx->sentry + i); while ((original_bio = bio_list_pop(&w_ctx->bios))) bio_endio(original_bio); - } + + i++; + } while (i < c_ctx->nr_valid); + + if (c_ctx->nr_padded) + pblk_bio_free_pages(pblk, rqd->bio, c_ctx->nr_valid, + c_ctx->nr_padded); #ifdef CONFIG_NVM_DEBUG atomic_long_add(c_ctx->nr_valid, &pblk->sync_writes); @@ -516,7 +523,8 @@ static void pblk_free_write_rqd(struct pblk *pblk, struct nvm_rq *rqd) struct bio *bio = rqd->bio; if (c_ctx->nr_padded) - pblk_bio_free_pages(pblk, bio, rqd->nr_ppas, c_ctx->nr_padded); + pblk_bio_free_pages(pblk, bio, c_ctx->nr_valid, + c_ctx->nr_padded); } static int pblk_submit_write(struct pblk *pblk)