Received: by 10.192.165.156 with SMTP id m28csp465922imm; Mon, 16 Apr 2018 03:28:02 -0700 (PDT) X-Google-Smtp-Source: AIpwx4+7NswHF9RlTcesarBD+EX7WKuasmq3XNEw/Vi8OwhO0aRbtK+cS+1oM2m6ynQPUaF9p0aE X-Received: by 2002:a17:902:7709:: with SMTP id n9-v6mr15043362pll.385.1523874482385; Mon, 16 Apr 2018 03:28:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523874482; cv=none; d=google.com; s=arc-20160816; b=eNQRlVFMlqANgU7xMR9FH9yTatIQGFOMrEkmeHM+Je2nKzEn5v0rs3U4VKsUjfXbNo BorkE20ysEVbR7aqGtWblAydxkICjEM9T8H7lmDB1IC4Lqhr1Uzd3sUVi2vk3NqPfrzV iT1rEYjXQuwS3U2bpZd6Eokgoxh6aWyHxe5yODXXhd8sGqzICnv0zOdPUls9rKb2kexW OFj2MFdr50cG3nLC0QxCbbyyUvoT25sIgZD9UFGAgpJ6GDLldJFz8+lVJhp7wmMYR/88 2MEWoubZiPHtSUrom13Rvysmu0+Uu5TjlzInTvRoMkNLQRvaw/gSFARRUne19ariyho9 qEeA== 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=vyCFGQWiAcPewjniu+vmBQxMWHI8Hi09FZX7yt15bJk=; b=pAFLDART21BRkrEhmBCnYlhnktogwkGO+42bNkgd0juBgm6yTywYGciNDi7ojy4wNc A5631Ajh5oyjhWvqYHII4fOIMSjEErmmFqB+oTXLpc1e5jfP3+7rGR+eatCa+OwriOt6 IjzB6sdfJOSmyRZcI1jAQH4x4zWq3txOGadSI/tSFoPRdTgsw5mJcmFs5P30cU1kAZwr VNO9jD46ANIWUtz1tnTkQbFP6+nJpVc1F6x1xi0V5v6Vrs2J2o7sUrbnPJ7baUn3Qo7o esRV5e0qsJ9T+ntkuWdiShJSDyaU3YfSciL/0MnqhGp1ufl+qTslPHz1MMXAB8JIL6Py DdUA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@javigon-com.20150623.gappssmtp.com header.s=20150623 header.b=vxUIUCfz; 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 q127si2571556pfb.1.2018.04.16.03.27.48; Mon, 16 Apr 2018 03:28:02 -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=@javigon-com.20150623.gappssmtp.com header.s=20150623 header.b=vxUIUCfz; 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 S1754729AbeDPK00 (ORCPT + 99 others); Mon, 16 Apr 2018 06:26:26 -0400 Received: from mail-wr0-f194.google.com ([209.85.128.194]:39382 "EHLO mail-wr0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754160AbeDPKZu (ORCPT ); Mon, 16 Apr 2018 06:25:50 -0400 Received: by mail-wr0-f194.google.com with SMTP id q6so12351943wrd.6 for ; Mon, 16 Apr 2018 03:25:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=javigon-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=vyCFGQWiAcPewjniu+vmBQxMWHI8Hi09FZX7yt15bJk=; b=vxUIUCfz+uevqNfOJb4kTJPwnZNt/EWQ01fMnMEiV1TRAGEZ9bY38SjrJqql4re/xj 3XRI00bw/jG1z5mV/pCaIuqDAOKnRD8wCHxAagCfni7751mXo7ldFEKjASkmTuu5u0zi xaFUqoyw85PhVxYKgs0UigYATlcPESmkR+dM1U3wm4bV0nrbgd3XD0ZG/G1azmrmrYgd uqMhLlRCF+WrnLcYilKB6QOUMkkJstylrvQqNdLnqTrpQZ/OU+l1kZwXWnhRYdlIuoe9 nXjqq9FnSls4qRtDCaA8hRAa8WQL1CqbZFxmpBlUgIupz0Crup/FEtY0MoRdkTHLIiQF 15sA== 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=vyCFGQWiAcPewjniu+vmBQxMWHI8Hi09FZX7yt15bJk=; b=bowwRqw7K4gaie73vugbhUrUXX1EwCmrB7SO+YmiWYQv7n8VKysThA4Ggy/Apk2CM8 G89lDrSWE0UPSha2P9XY8aFJTtLd5XBapKyM+KOWAw8RP/+7KH0d7CL6S6HUuGtJiD5q Ok0f6xSz4T6FReDAK/cWlyjzJ09Y2u3F7duw0tnybq+PtsOUMcCMEKo6woQIYUjXvzVq vbCHpFLiSpBggnQquz27vpr6i1tzdotmrqc8kuOKUZwms5gGe0kZZiqcthCuVU39+NZ7 9uE6/LI2wPgqConIZpW3/c5qw37QGSVuOL34jfMJ/gAGSv7D8oQxrweRnbC9yux7Js+w vTWA== X-Gm-Message-State: ALQs6tC80q5MSOJHNIGhlnOyL73eB3Sk4vJqyav7ZasZGdtzGwkkirXy qQYGwZPdjbbWDrNkGKHXKwoj2A== X-Received: by 10.80.143.101 with SMTP id 92mr14456351edy.287.1523874349398; Mon, 16 Apr 2018 03:25:49 -0700 (PDT) Received: from uhalley.cnexlabs.com (6164211-cl69.boa.fiberby.dk. [193.106.164.211]) by smtp.gmail.com with ESMTPSA id q11sm4250074edj.2.2018.04.16.03.25.48 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 16 Apr 2018 03:25:48 -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 Cc: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, =?UTF-8?q?Javier=20Gonz=C3=A1lez?= Subject: [PATCH 10/11] lightnvn: pass flag on graceful teardown to targets Date: Mon, 16 Apr 2018 12:25:31 +0200 Message-Id: <1523874332-6272-11-git-send-email-javier@cnexlabs.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1523874332-6272-1-git-send-email-javier@cnexlabs.com> References: <1523874332-6272-1-git-send-email-javier@cnexlabs.com> 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 If the namespace is unregistered before the LightNVM target is removed (e.g., on hot unplug) it is too late for the target to store any metadata on the device - any attempt to write to the device will fail. In this case, pass on a "gracefull teardown" flag to the target to let it know when this happens. In the case of pblk, we pad the open line (close all open chunks) to improve data retention. In the event of an ungraceful shutdown, avoid this part and just clean up. Signed-off-by: Javier González --- drivers/lightnvm/core.c | 10 +++++----- drivers/lightnvm/pblk-core.c | 13 ++++++++++++- drivers/lightnvm/pblk-gc.c | 10 ++++++---- drivers/lightnvm/pblk-init.c | 14 ++++++++------ drivers/lightnvm/pblk.h | 4 +++- include/linux/lightnvm.h | 2 +- 6 files changed, 35 insertions(+), 18 deletions(-) diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c index 63171cdce270..60aa7bc5a630 100644 --- a/drivers/lightnvm/core.c +++ b/drivers/lightnvm/core.c @@ -431,7 +431,7 @@ static int nvm_create_tgt(struct nvm_dev *dev, struct nvm_ioctl_create *create) return 0; err_sysfs: if (tt->exit) - tt->exit(targetdata); + tt->exit(targetdata, true); err_init: blk_cleanup_queue(tqueue); tdisk->queue = NULL; @@ -446,7 +446,7 @@ static int nvm_create_tgt(struct nvm_dev *dev, struct nvm_ioctl_create *create) return ret; } -static void __nvm_remove_target(struct nvm_target *t) +static void __nvm_remove_target(struct nvm_target *t, bool graceful) { struct nvm_tgt_type *tt = t->type; struct gendisk *tdisk = t->disk; @@ -459,7 +459,7 @@ static void __nvm_remove_target(struct nvm_target *t) tt->sysfs_exit(tdisk); if (tt->exit) - tt->exit(tdisk->private_data); + tt->exit(tdisk->private_data, graceful); nvm_remove_tgt_dev(t->dev, 1); put_disk(tdisk); @@ -489,7 +489,7 @@ static int nvm_remove_tgt(struct nvm_dev *dev, struct nvm_ioctl_remove *remove) mutex_unlock(&dev->mlock); return 1; } - __nvm_remove_target(t); + __nvm_remove_target(t, true); mutex_unlock(&dev->mlock); return 0; @@ -963,7 +963,7 @@ void nvm_unregister(struct nvm_dev *dev) list_for_each_entry_safe(t, tmp, &dev->targets, list) { if (t->dev->parent != dev) continue; - __nvm_remove_target(t); + __nvm_remove_target(t, false); } mutex_unlock(&dev->mlock); diff --git a/drivers/lightnvm/pblk-core.c b/drivers/lightnvm/pblk-core.c index 1b871441d816..cc34d5d9652d 100644 --- a/drivers/lightnvm/pblk-core.c +++ b/drivers/lightnvm/pblk-core.c @@ -1461,7 +1461,7 @@ static void pblk_line_close_meta_sync(struct pblk *pblk) flush_workqueue(pblk->close_wq); } -void pblk_pipeline_stop(struct pblk *pblk) +void __pblk_pipeline_flush(struct pblk *pblk) { struct pblk_line_mgmt *l_mg = &pblk->l_mg; int ret; @@ -1486,6 +1486,11 @@ void pblk_pipeline_stop(struct pblk *pblk) flush_workqueue(pblk->bb_wq); pblk_line_close_meta_sync(pblk); +} + +void __pblk_pipeline_stop(struct pblk *pblk) +{ + struct pblk_line_mgmt *l_mg = &pblk->l_mg; spin_lock(&l_mg->free_lock); pblk->state = PBLK_STATE_STOPPED; @@ -1494,6 +1499,12 @@ void pblk_pipeline_stop(struct pblk *pblk) spin_unlock(&l_mg->free_lock); } +void pblk_pipeline_stop(struct pblk *pblk) +{ + __pblk_pipeline_flush(pblk); + __pblk_pipeline_stop(pblk); +} + struct pblk_line *pblk_line_replace_data(struct pblk *pblk) { struct pblk_line_mgmt *l_mg = &pblk->l_mg; diff --git a/drivers/lightnvm/pblk-gc.c b/drivers/lightnvm/pblk-gc.c index 6851a5c67189..b0cc277bf972 100644 --- a/drivers/lightnvm/pblk-gc.c +++ b/drivers/lightnvm/pblk-gc.c @@ -649,7 +649,7 @@ int pblk_gc_init(struct pblk *pblk) return ret; } -void pblk_gc_exit(struct pblk *pblk) +void pblk_gc_exit(struct pblk *pblk, bool graceful) { struct pblk_gc *gc = &pblk->gc; @@ -663,10 +663,12 @@ void pblk_gc_exit(struct pblk *pblk) if (gc->gc_reader_ts) kthread_stop(gc->gc_reader_ts); - flush_workqueue(gc->gc_reader_wq); + if (graceful) { + flush_workqueue(gc->gc_reader_wq); + flush_workqueue(gc->gc_line_reader_wq); + } + destroy_workqueue(gc->gc_reader_wq); - - flush_workqueue(gc->gc_line_reader_wq); destroy_workqueue(gc->gc_line_reader_wq); if (gc->gc_writer_ts) diff --git a/drivers/lightnvm/pblk-init.c b/drivers/lightnvm/pblk-init.c index 9e3a43346d4c..bfc488d0dda9 100644 --- a/drivers/lightnvm/pblk-init.c +++ b/drivers/lightnvm/pblk-init.c @@ -1118,23 +1118,25 @@ static void pblk_free(struct pblk *pblk) kfree(pblk); } -static void pblk_tear_down(struct pblk *pblk) +static void pblk_tear_down(struct pblk *pblk, bool graceful) { - pblk_pipeline_stop(pblk); + if (graceful) + __pblk_pipeline_flush(pblk); + __pblk_pipeline_stop(pblk); pblk_writer_stop(pblk); pblk_rb_sync_l2p(&pblk->rwb); pblk_rl_free(&pblk->rl); - pr_debug("pblk: consistent tear down\n"); + pr_debug("pblk: consistent tear down (graceful:%d)\n", graceful); } -static void pblk_exit(void *private) +static void pblk_exit(void *private, bool graceful) { struct pblk *pblk = private; down_write(&pblk_lock); - pblk_gc_exit(pblk); - pblk_tear_down(pblk); + pblk_gc_exit(pblk, graceful); + pblk_tear_down(pblk, graceful); #ifdef CONFIG_NVM_DEBUG pr_info("pblk exit: L2P CRC: %x\n", pblk_l2p_crc(pblk)); diff --git a/drivers/lightnvm/pblk.h b/drivers/lightnvm/pblk.h index ff0e5e6421dd..4b725bedc36a 100644 --- a/drivers/lightnvm/pblk.h +++ b/drivers/lightnvm/pblk.h @@ -771,6 +771,8 @@ void pblk_line_close_meta(struct pblk *pblk, struct pblk_line *line); void pblk_line_close(struct pblk *pblk, struct pblk_line *line); void pblk_line_close_ws(struct work_struct *work); void pblk_pipeline_stop(struct pblk *pblk); +void __pblk_pipeline_stop(struct pblk *pblk); +void __pblk_pipeline_flush(struct pblk *pblk); void pblk_gen_run_ws(struct pblk *pblk, struct pblk_line *line, void *priv, void (*work)(struct work_struct *), gfp_t gfp_mask, struct workqueue_struct *wq); @@ -865,7 +867,7 @@ int pblk_recov_setup_rq(struct pblk *pblk, struct pblk_c_ctx *c_ctx, #define PBLK_GC_RSV_LINE 1 /* Reserved lines for GC */ int pblk_gc_init(struct pblk *pblk); -void pblk_gc_exit(struct pblk *pblk); +void pblk_gc_exit(struct pblk *pblk, bool graceful); void pblk_gc_should_start(struct pblk *pblk); void pblk_gc_should_stop(struct pblk *pblk); void pblk_gc_should_kick(struct pblk *pblk); diff --git a/include/linux/lightnvm.h b/include/linux/lightnvm.h index 6e0859b9d4d2..e9e0d1c7eaf5 100644 --- a/include/linux/lightnvm.h +++ b/include/linux/lightnvm.h @@ -489,7 +489,7 @@ typedef blk_qc_t (nvm_tgt_make_rq_fn)(struct request_queue *, struct bio *); typedef sector_t (nvm_tgt_capacity_fn)(void *); typedef void *(nvm_tgt_init_fn)(struct nvm_tgt_dev *, struct gendisk *, int flags); -typedef void (nvm_tgt_exit_fn)(void *); +typedef void (nvm_tgt_exit_fn)(void *, bool); typedef int (nvm_tgt_sysfs_init_fn)(struct gendisk *); typedef void (nvm_tgt_sysfs_exit_fn)(struct gendisk *); -- 2.7.4