From: Davidlohr Bueso <dave@stgolabs.net>
To: Dan Williams <dan.j.williams@intel.com>
Cc: linux-cxl@vger.kernel.org, Jonathan.Cameron@huawei.com,
dave.jiang@intel.com, nvdimm@lists.linux.dev
Subject: Re: [PATCH 4/5] nvdimm/region: Move cache management to the region driver
Date: Thu, 1 Dec 2022 19:21:31 -0800 [thread overview]
Message-ID: <20221202032131.hmy7ydpddjrlpd4u@offworld> (raw)
In-Reply-To: <166993221550.1995348.16843505129579060258.stgit@dwillia2-xfh.jf.intel.com>
On Thu, 01 Dec 2022, Dan Williams wrote:
>Now that cpu_cache_invalidate_memregion() is generically available, use
>it to centralize CPU cache management in the nvdimm region driver.
>
>This trades off removing redundant per-dimm CPU cache flushing with an
>opportunistic flush on every region disable event to cover the case of
>sensitive dirty data in the cache being written back to media after a
>secure erase / overwrite event.
Very nifty.
>Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Reviewed-by: Davidlohr Bueso <dave@stgolabs.net>
with a few notes below.
>+static int nd_region_invalidate_memregion(struct nd_region *nd_region)
>+{
>+ int i, incoherent = 0;
>+
>+ for (i = 0; i < nd_region->ndr_mappings; i++) {
>+ struct nd_mapping *nd_mapping = &nd_region->mapping[i];
>+ struct nvdimm *nvdimm = nd_mapping->nvdimm;
>+
>+ if (test_bit(NDD_INCOHERENT, &nvdimm->flags))
>+ incoherent++;
No need to compute the rest, just break out here?
>+ }
>+
>+ if (!incoherent)
>+ return 0;
>+
>+ if (!cpu_cache_has_invalidate_memregion()) {
>+ if (IS_ENABLED(CONFIG_NVDIMM_SECURITY_TEST)) {
>+ dev_warn(
>+ &nd_region->dev,
>+ "Bypassing cpu_cache_invalidate_memergion() for testing!\n");
>+ goto out;
>+ } else {
>+ dev_err(&nd_region->dev,
>+ "Failed to synchronize CPU cache state\n");
>+ return -ENXIO;
>+ }
>+ }
>+
>+ cpu_cache_invalidate_memregion(IORES_DESC_PERSISTENT_MEMORY);
>+out:
>+ for (i = 0; i < nd_region->ndr_mappings; i++) {
>+ struct nd_mapping *nd_mapping = &nd_region->mapping[i];
>+ struct nvdimm *nvdimm = nd_mapping->nvdimm;
>+
>+ clear_bit(NDD_INCOHERENT, &nvdimm->flags);
>+ }
>+
>+ return 0;
>+}
>+
> int nd_region_activate(struct nd_region *nd_region)
> {
>- int i, j, num_flush = 0;
>+ int i, j, rc, num_flush = 0;
> struct nd_region_data *ndrd;
> struct device *dev = &nd_region->dev;
> size_t flush_data_size = sizeof(void *);
>
>+ rc = nd_region_invalidate_memregion(nd_region);
>+ if (rc)
>+ return rc;
>+
> nvdimm_bus_lock(&nd_region->dev);
> for (i = 0; i < nd_region->ndr_mappings; i++) {
> struct nd_mapping *nd_mapping = &nd_region->mapping[i];
>@@ -85,6 +129,7 @@ int nd_region_activate(struct nd_region *nd_region)
> }
> nvdimm_bus_unlock(&nd_region->dev);
>
>+
> ndrd = devm_kzalloc(dev, sizeof(*ndrd) + flush_data_size, GFP_KERNEL);
> if (!ndrd)
> return -ENOMEM;
>@@ -1222,3 +1267,5 @@ int nd_region_conflict(struct nd_region *nd_region, resource_size_t start,
>
> return device_for_each_child(&nvdimm_bus->dev, &ctx, region_conflict);
> }
>+
>+MODULE_IMPORT_NS(DEVMEM);
>diff --git a/drivers/nvdimm/security.c b/drivers/nvdimm/security.c
>index 6814339b3dab..a03e3c45f297 100644
>--- a/drivers/nvdimm/security.c
>+++ b/drivers/nvdimm/security.c
>@@ -208,6 +208,8 @@ static int __nvdimm_security_unlock(struct nvdimm *nvdimm)
> rc = nvdimm->sec.ops->unlock(nvdimm, data);
> dev_dbg(dev, "key: %d unlock: %s\n", key_serial(key),
> rc == 0 ? "success" : "fail");
>+ if (rc == 0)
>+ set_bit(NDD_INCOHERENT, &nvdimm->flags);
>
> nvdimm_put_key(key);
> nvdimm->sec.flags = nvdimm_security_flags(nvdimm, NVDIMM_USER);
>@@ -374,6 +376,8 @@ static int security_erase(struct nvdimm *nvdimm, unsigned int keyid,
> return -ENOKEY;
>
> rc = nvdimm->sec.ops->erase(nvdimm, data, pass_type);
>+ if (rc == 0)
>+ set_bit(NDD_INCOHERENT, &nvdimm->flags);
> dev_dbg(dev, "key: %d erase%s: %s\n", key_serial(key),
> pass_type == NVDIMM_MASTER ? "(master)" : "(user)",
> rc == 0 ? "success" : "fail");
>@@ -408,6 +412,8 @@ static int security_overwrite(struct nvdimm *nvdimm, unsigned int keyid)
> return -ENOKEY;
>
> rc = nvdimm->sec.ops->overwrite(nvdimm, data);
>+ if (rc == 0)
>+ set_bit(NDD_INCOHERENT, &nvdimm->flags);
Are you relying on hw preventing an incoming region_activate() while the overwrite
operation is in progress to ensure that the flags are stable throughout the whole
op? Currently query-overwrite also provides the flushing guarantees for when the
command is actually complete (at least from a user pov).
Thanks,
Davidlohr
next prev parent reply other threads:[~2022-12-02 3:45 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-12-01 22:03 [PATCH 0/5] cxl, nvdimm: Move CPU cache management to region drivers Dan Williams
2022-12-01 22:03 ` [PATCH 1/5] cxl: add dimm_id support for __nvdimm_create() Dan Williams
2022-12-01 22:03 ` [PATCH 2/5] cxl/region: Fix missing probe failure Dan Williams
2022-12-01 22:30 ` Dave Jiang
2022-12-02 1:45 ` Davidlohr Bueso
2022-12-02 14:23 ` Jonathan Cameron
2022-12-03 8:03 ` Dan Williams
2022-12-01 22:03 ` [PATCH 3/5] cxl/pmem: Enforce keyctl ABI for PMEM security Dan Williams
2022-12-01 22:32 ` Dave Jiang
2022-12-01 22:44 ` Dan Williams
2022-12-02 1:49 ` Davidlohr Bueso
2022-12-02 14:24 ` Jonathan Cameron
2022-12-01 22:03 ` [PATCH 4/5] nvdimm/region: Move cache management to the region driver Dan Williams
2022-12-01 23:00 ` Dave Jiang
2022-12-02 3:21 ` Davidlohr Bueso [this message]
2022-12-03 8:01 ` Dan Williams
2022-12-01 22:03 ` [PATCH 5/5] cxl/region: Manage CPU caches relative to DPA invalidation events Dan Williams
2022-12-01 23:04 ` Dave Jiang
2022-12-05 19:20 ` Davidlohr Bueso
2022-12-05 20:10 ` Dan Williams
2022-12-06 9:47 ` Jonathan Cameron
2022-12-06 15:17 ` James Morse
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20221202032131.hmy7ydpddjrlpd4u@offworld \
--to=dave@stgolabs.net \
--cc=Jonathan.Cameron@huawei.com \
--cc=dan.j.williams@intel.com \
--cc=dave.jiang@intel.com \
--cc=linux-cxl@vger.kernel.org \
--cc=nvdimm@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox