* [PATCH v4 0/6] BTT error clearing rework
@ 2017-07-26 23:35 Vishal Verma
2017-07-26 23:35 ` [PATCH v4 1/6] btt: fix a missed NVDIMM_IO_ATOMIC case in the write path Vishal Verma
` (6 more replies)
0 siblings, 7 replies; 13+ messages in thread
From: Vishal Verma @ 2017-07-26 23:35 UTC (permalink / raw)
To: linux-nvdimm
Cc: linux-acpi, Dan Williams, Jeff Moyer, Rafael J. Wysocki,
Toshi Kani, Vishal Verma
Changes in v4:
- move the deadlock fix to before enabling the BTT error clear paths (Dan)
- No need for an error lock per freelist entry, just have one per arena (Dan)
Changes in v3:
- Change the dynamically allocated (during IO) zerobuf to the kernel's
ZERO_PAGE for error clearing (patch 5) (Dan).
- Move the NOIO fixes a level down into nvdimm_clear_poison since both
btt and pmem poison clearing goes through that (Dan).
Changes in v2:
- Drop the ACPI allocation change patch. Instead use
memalloc_noio_{save,restore} to set the GFP_NOIO flag around anything
that can be expected to call into ACPI for clearing errors. (Rafael, Dan).
Clearing errors or badblocks during a BTT write requires sending an ACPI
DSM, which means potentially sleeping. Since a BTT IO happens in atomic
context (preemption disabled, spinlocks may be held), we cannot perform
error clearing in the course of an IO. Due to this error clearing for
BTT IOs has hitherto been disabled.
This series fixes these problems by moving the error clearing out of
the atomic sections in the BTT.
Also fix a potential deadlock that can occur while clearing errors
from either BTT or pmem due to memory allocations in the IO path.
Vishal Verma (6):
btt: fix a missed NVDIMM_IO_ATOMIC case in the write path
btt: refactor map entry operations with macros
btt: ensure that flags were also unchanged during a map_read
btt: cache sector_size in arena_info
libnvdimm: fix potential deadlock while clearing errors
libnvdimm, btt: rework error clearing
drivers/nvdimm/btt.c | 116 +++++++++++++++++++++++++++++++++++++++++--------
drivers/nvdimm/btt.h | 11 +++++
drivers/nvdimm/bus.c | 6 +++
drivers/nvdimm/claim.c | 9 +---
4 files changed, 117 insertions(+), 25 deletions(-)
--
2.9.3
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v4 1/6] btt: fix a missed NVDIMM_IO_ATOMIC case in the write path
2017-07-26 23:35 [PATCH v4 0/6] BTT error clearing rework Vishal Verma
@ 2017-07-26 23:35 ` Vishal Verma
2017-07-26 23:35 ` [PATCH v4 2/6] btt: refactor map entry operations with macros Vishal Verma
` (5 subsequent siblings)
6 siblings, 0 replies; 13+ messages in thread
From: Vishal Verma @ 2017-07-26 23:35 UTC (permalink / raw)
To: linux-nvdimm
Cc: linux-acpi, Dan Williams, Jeff Moyer, Rafael J. Wysocki,
Toshi Kani, Vishal Verma
The IO context conversion for rw_bytes missed a case in the BTT write
path (btt_map_write) which should've been marked as atomic.
In reality this should not cause a problem, because map writes are to
small for nsio_rw_bytes to attempt error clearing, but it should be
fixed for posterity.
Add a might_sleep() in the non-atomic section of nsio_rw_bytes so that
things like the nfit unit tests, which don't actually sleep, can catch
bugs like this.
Cc: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
---
drivers/nvdimm/btt.c | 3 ++-
drivers/nvdimm/claim.c | 1 +
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/nvdimm/btt.c b/drivers/nvdimm/btt.c
index 14323fa..f6ea82f 100644
--- a/drivers/nvdimm/btt.c
+++ b/drivers/nvdimm/btt.c
@@ -1156,7 +1156,8 @@ static int btt_write_pg(struct btt *btt, struct bio_integrity_payload *bip,
if (ret)
goto out_map;
- ret = btt_map_write(arena, premap, new_postmap, 0, 0, 0);
+ ret = btt_map_write(arena, premap, new_postmap, 0, 0,
+ NVDIMM_IO_ATOMIC);
if (ret)
goto out_map;
diff --git a/drivers/nvdimm/claim.c b/drivers/nvdimm/claim.c
index 4777046..3e6404f 100644
--- a/drivers/nvdimm/claim.c
+++ b/drivers/nvdimm/claim.c
@@ -292,6 +292,7 @@ static int nsio_rw_bytes(struct nd_namespace_common *ndns,
&& !(flags & NVDIMM_IO_ATOMIC)) {
long cleared;
+ might_sleep();
cleared = nvdimm_clear_poison(&ndns->dev,
nsio->res.start + offset, size);
if (cleared < size)
--
2.9.3
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 2/6] btt: refactor map entry operations with macros
2017-07-26 23:35 [PATCH v4 0/6] BTT error clearing rework Vishal Verma
2017-07-26 23:35 ` [PATCH v4 1/6] btt: fix a missed NVDIMM_IO_ATOMIC case in the write path Vishal Verma
@ 2017-07-26 23:35 ` Vishal Verma
2017-07-26 23:35 ` [PATCH v4 3/6] btt: ensure that flags were also unchanged during a map_read Vishal Verma
` (4 subsequent siblings)
6 siblings, 0 replies; 13+ messages in thread
From: Vishal Verma @ 2017-07-26 23:35 UTC (permalink / raw)
To: linux-nvdimm
Cc: linux-acpi, Dan Williams, Jeff Moyer, Rafael J. Wysocki,
Toshi Kani, Vishal Verma
Add helpers for converting a raw map entry to just the block number, or
either of the 'e' or 'z' flags in preparation for actually using the
error flag to mark blocks with media errors.
Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
---
drivers/nvdimm/btt.c | 8 ++++----
drivers/nvdimm/btt.h | 4 ++++
2 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/drivers/nvdimm/btt.c b/drivers/nvdimm/btt.c
index f6ea82f..8842baa 100644
--- a/drivers/nvdimm/btt.c
+++ b/drivers/nvdimm/btt.c
@@ -106,7 +106,7 @@ static int btt_map_write(struct arena_info *arena, u32 lba, u32 mapping,
* This 'mapping' is supposed to be just the LBA mapping, without
* any flags set, so strip the flag bits.
*/
- mapping &= MAP_LBA_MASK;
+ mapping = ent_lba(mapping);
ze = (z_flag << 1) + e_flag;
switch (ze) {
@@ -155,10 +155,10 @@ static int btt_map_read(struct arena_info *arena, u32 lba, u32 *mapping,
raw_mapping = le32_to_cpu(in);
- z_flag = (raw_mapping & MAP_TRIM_MASK) >> MAP_TRIM_SHIFT;
- e_flag = (raw_mapping & MAP_ERR_MASK) >> MAP_ERR_SHIFT;
+ z_flag = ent_z_flag(raw_mapping);
+ e_flag = ent_e_flag(raw_mapping);
ze = (z_flag << 1) + e_flag;
- postmap = raw_mapping & MAP_LBA_MASK;
+ postmap = ent_lba(raw_mapping);
/* Reuse the {z,e}_flag variables for *trim and *error */
z_flag = 0;
diff --git a/drivers/nvdimm/btt.h b/drivers/nvdimm/btt.h
index 888e862..09fabf5 100644
--- a/drivers/nvdimm/btt.h
+++ b/drivers/nvdimm/btt.h
@@ -38,6 +38,10 @@
#define IB_FLAG_ERROR 0x00000001
#define IB_FLAG_ERROR_MASK 0x00000001
+#define ent_lba(ent) (ent & MAP_LBA_MASK)
+#define ent_e_flag(ent) (!!(ent & MAP_ERR_MASK))
+#define ent_z_flag(ent) (!!(ent & MAP_TRIM_MASK))
+
enum btt_init_state {
INIT_UNCHECKED = 0,
INIT_NOTFOUND,
--
2.9.3
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 3/6] btt: ensure that flags were also unchanged during a map_read
2017-07-26 23:35 [PATCH v4 0/6] BTT error clearing rework Vishal Verma
2017-07-26 23:35 ` [PATCH v4 1/6] btt: fix a missed NVDIMM_IO_ATOMIC case in the write path Vishal Verma
2017-07-26 23:35 ` [PATCH v4 2/6] btt: refactor map entry operations with macros Vishal Verma
@ 2017-07-26 23:35 ` Vishal Verma
[not found] ` <20170726233546.29052-1-vishal.l.verma-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
` (3 subsequent siblings)
6 siblings, 0 replies; 13+ messages in thread
From: Vishal Verma @ 2017-07-26 23:35 UTC (permalink / raw)
To: linux-nvdimm
Cc: linux-acpi, Dan Williams, Jeff Moyer, Rafael J. Wysocki,
Toshi Kani, Vishal Verma
In btt_map_read, we read the map twice to make sure that the map entry
didn't change after we added it to the read tracking table. In
anticipation of expanding the use of the error bit, also make sure that
the error and zero flags are constant across the two map reads.
Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
---
drivers/nvdimm/btt.c | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/drivers/nvdimm/btt.c b/drivers/nvdimm/btt.c
index 8842baa..374ae62 100644
--- a/drivers/nvdimm/btt.c
+++ b/drivers/nvdimm/btt.c
@@ -1032,6 +1032,7 @@ static int btt_read_pg(struct btt *btt, struct bio_integrity_payload *bip,
*/
while (1) {
u32 new_map;
+ int new_t, new_e;
if (t_flag) {
zero_fill_data(page, off, cur_len);
@@ -1050,15 +1051,18 @@ static int btt_read_pg(struct btt *btt, struct bio_integrity_payload *bip,
*/
barrier();
- ret = btt_map_read(arena, premap, &new_map, &t_flag,
- &e_flag, NVDIMM_IO_ATOMIC);
+ ret = btt_map_read(arena, premap, &new_map, &new_t,
+ &new_e, NVDIMM_IO_ATOMIC);
if (ret)
goto out_rtt;
- if (postmap == new_map)
+ if ((postmap == new_map) && (t_flag == new_t) &&
+ (e_flag == new_e))
break;
postmap = new_map;
+ t_flag = new_t;
+ e_flag = new_e;
}
ret = btt_data_read(arena, page, off, postmap, cur_len);
--
2.9.3
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 4/6] btt: cache sector_size in arena_info
[not found] ` <20170726233546.29052-1-vishal.l.verma-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
@ 2017-07-26 23:35 ` Vishal Verma
0 siblings, 0 replies; 13+ messages in thread
From: Vishal Verma @ 2017-07-26 23:35 UTC (permalink / raw)
To: linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw
Cc: Rafael J. Wysocki, linux-acpi-u79uwXL29TY76Z2rM5mHXA
In preparation for the error clearing rework, add sector_size in the
arena_info struct.
Signed-off-by: Vishal Verma <vishal.l.verma-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
---
drivers/nvdimm/btt.c | 1 +
drivers/nvdimm/btt.h | 2 ++
2 files changed, 3 insertions(+)
diff --git a/drivers/nvdimm/btt.c b/drivers/nvdimm/btt.c
index 374ae62..e9dd651 100644
--- a/drivers/nvdimm/btt.c
+++ b/drivers/nvdimm/btt.c
@@ -566,6 +566,7 @@ static struct arena_info *alloc_arena(struct btt *btt, size_t size,
if (!arena)
return NULL;
arena->nd_btt = btt->nd_btt;
+ arena->sector_size = btt->sector_size;
if (!size)
return arena;
diff --git a/drivers/nvdimm/btt.h b/drivers/nvdimm/btt.h
index 09fabf5..2bc0d10b 100644
--- a/drivers/nvdimm/btt.h
+++ b/drivers/nvdimm/btt.h
@@ -108,6 +108,7 @@ struct aligned_lock {
* handle incoming writes.
* @version_major: Metadata layout version major.
* @version_minor: Metadata layout version minor.
+ * @sector_size: The Linux sector size - 512 or 4096
* @nextoff: Offset in bytes to the start of the next arena.
* @infooff: Offset in bytes to the info block of this arena.
* @dataoff: Offset in bytes to the data area of this arena.
@@ -135,6 +136,7 @@ struct arena_info {
u32 nfree;
u16 version_major;
u16 version_minor;
+ u32 sector_size;
/* Byte offsets to the different on-media structures */
u64 nextoff;
u64 infooff;
--
2.9.3
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 5/6] libnvdimm: fix potential deadlock while clearing errors
2017-07-26 23:35 [PATCH v4 0/6] BTT error clearing rework Vishal Verma
` (3 preceding siblings ...)
[not found] ` <20170726233546.29052-1-vishal.l.verma-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
@ 2017-07-26 23:35 ` Vishal Verma
2017-07-26 23:35 ` [PATCH v4 6/6] libnvdimm, btt: rework error clearing Vishal Verma
2017-07-31 23:15 ` [PATCH v4 0/6] BTT error clearing rework Kani, Toshimitsu
6 siblings, 0 replies; 13+ messages in thread
From: Vishal Verma @ 2017-07-26 23:35 UTC (permalink / raw)
To: linux-nvdimm
Cc: linux-acpi, Dan Williams, Jeff Moyer, Rafael J. Wysocki,
Toshi Kani, Vishal Verma, Robert Moore
With the ACPI NFIT 'DSM' methods, acpi can be called from IO paths.
Specifically, the DSM to clear media errors is called during writes, so
that we can provide a writes-fix-errors model.
However it is easy to imagine a scenario like:
-> write through the nvdimm driver
-> acpi allocation
-> writeback, causes more IO through the nvdimm driver
-> deadlock
Fix this by using memalloc_noio_{save,restore}, which sets the GFP_NOIO
flag for the current scope when issuing commands/IOs that are expected
to clear errors.
Cc: <linux-acpi@vger.kernel.org>
Cc: <linux-nvdimm@lists.01.org>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Robert Moore <robert.moore@intel.com>
Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
---
drivers/nvdimm/bus.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/drivers/nvdimm/bus.c b/drivers/nvdimm/bus.c
index 937fafa..a18c291 100644
--- a/drivers/nvdimm/bus.c
+++ b/drivers/nvdimm/bus.c
@@ -11,6 +11,7 @@
* General Public License for more details.
*/
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+#include <linux/sched/mm.h>
#include <linux/vmalloc.h>
#include <linux/uaccess.h>
#include <linux/module.h>
@@ -234,6 +235,7 @@ long nvdimm_clear_poison(struct device *dev, phys_addr_t phys,
struct nd_cmd_clear_error clear_err;
struct nd_cmd_ars_cap ars_cap;
u32 clear_err_unit, mask;
+ unsigned int noio_flag;
int cmd_rc, rc;
if (!nvdimm_bus)
@@ -250,8 +252,10 @@ long nvdimm_clear_poison(struct device *dev, phys_addr_t phys,
memset(&ars_cap, 0, sizeof(ars_cap));
ars_cap.address = phys;
ars_cap.length = len;
+ noio_flag = memalloc_noio_save();
rc = nd_desc->ndctl(nd_desc, NULL, ND_CMD_ARS_CAP, &ars_cap,
sizeof(ars_cap), &cmd_rc);
+ memalloc_noio_restore(noio_flag);
if (rc < 0)
return rc;
if (cmd_rc < 0)
@@ -266,8 +270,10 @@ long nvdimm_clear_poison(struct device *dev, phys_addr_t phys,
memset(&clear_err, 0, sizeof(clear_err));
clear_err.address = phys;
clear_err.length = len;
+ noio_flag = memalloc_noio_save();
rc = nd_desc->ndctl(nd_desc, NULL, ND_CMD_CLEAR_ERROR, &clear_err,
sizeof(clear_err), &cmd_rc);
+ memalloc_noio_restore(noio_flag);
if (rc < 0)
return rc;
if (cmd_rc < 0)
--
2.9.3
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 6/6] libnvdimm, btt: rework error clearing
2017-07-26 23:35 [PATCH v4 0/6] BTT error clearing rework Vishal Verma
` (4 preceding siblings ...)
2017-07-26 23:35 ` [PATCH v4 5/6] libnvdimm: fix potential deadlock while clearing errors Vishal Verma
@ 2017-07-26 23:35 ` Vishal Verma
2017-07-31 23:15 ` [PATCH v4 0/6] BTT error clearing rework Kani, Toshimitsu
6 siblings, 0 replies; 13+ messages in thread
From: Vishal Verma @ 2017-07-26 23:35 UTC (permalink / raw)
To: linux-nvdimm
Cc: linux-acpi, Dan Williams, Jeff Moyer, Rafael J. Wysocki,
Toshi Kani, Vishal Verma
Clearing errors or badblocks during a BTT write requires sending an ACPI
DSM, which means potentially sleeping. Since a BTT IO happens in atomic
context (preemption disabled, spinlocks may be held), we cannot perform
error clearing in the course of an IO. Due to this error clearing for
BTT IOs has hitherto been disabled.
In this patch we move error clearing out of the atomic section, and thus
re-enable error clearing with BTTs. When we are about to add a block to
the free list, we check if it was previously marked as an error, and if
it was, we add it to the freelist, but also set a flag that says error
clearing will be required. We then drop the lane (ending the atomic
context), and send a zero buffer so that the error can be cleared. The
error flag in the free list is protected by the nd 'lane', and is set
only be a thread while it holds that lane. When the error is cleared,
the flag is cleared, but while holding a mutex for that freelist index.
When writing, we check for two things -
1/ If the freelist mutex is held or if the error flag is set. If so,
this is an error block that is being (or about to be) cleared.
2/ If the block is a known badblock based on nsio->bb
The second check is required because the BTT map error flag for a map
entry only gets set when an error LBA is read. If we write to a new
location that may not have the map error flag set, but still might be in
the region's badblock list, we can trigger an EIO on the write, which is
undesirable and completely avoidable.
Cc: Jeff Moyer <jmoyer@redhat.com>
Cc: Toshi Kani <toshi.kani@hpe.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
---
drivers/nvdimm/btt.c | 94 +++++++++++++++++++++++++++++++++++++++++++++-----
drivers/nvdimm/btt.h | 5 +++
drivers/nvdimm/claim.c | 8 -----
3 files changed, 90 insertions(+), 17 deletions(-)
diff --git a/drivers/nvdimm/btt.c b/drivers/nvdimm/btt.c
index e9dd651..8a959f8 100644
--- a/drivers/nvdimm/btt.c
+++ b/drivers/nvdimm/btt.c
@@ -381,7 +381,9 @@ static int btt_flog_write(struct arena_info *arena, u32 lane, u32 sub,
arena->freelist[lane].sub = 1 - arena->freelist[lane].sub;
if (++(arena->freelist[lane].seq) == 4)
arena->freelist[lane].seq = 1;
- arena->freelist[lane].block = le32_to_cpu(ent->old_map);
+ if (ent_e_flag(ent->old_map))
+ arena->freelist[lane].has_err = 1;
+ arena->freelist[lane].block = le32_to_cpu(ent_lba(ent->old_map));
return ret;
}
@@ -480,6 +482,40 @@ static int btt_log_init(struct arena_info *arena)
return ret;
}
+static u64 to_namespace_offset(struct arena_info *arena, u64 lba)
+{
+ return arena->dataoff + ((u64)lba * arena->internal_lbasize);
+}
+
+static int arena_clear_freelist_error(struct arena_info *arena, u32 lane)
+{
+ int ret = 0;
+
+ if (arena->freelist[lane].has_err) {
+ void *zero_page = page_address(ZERO_PAGE(0));
+ u32 lba = arena->freelist[lane].block;
+ u64 nsoff = to_namespace_offset(arena, lba);
+ unsigned long len = arena->sector_size;
+
+ mutex_lock(&arena->err_lock);
+
+ while (len) {
+ unsigned long chunk = min(len, PAGE_SIZE);
+
+ ret = arena_write_bytes(arena, nsoff, zero_page,
+ chunk, 0);
+ if (ret)
+ break;
+ len -= chunk;
+ nsoff += chunk;
+ if (len == 0)
+ arena->freelist[lane].has_err = 0;
+ }
+ mutex_unlock(&arena->err_lock);
+ }
+ return ret;
+}
+
static int btt_freelist_init(struct arena_info *arena)
{
int old, new, ret;
@@ -505,6 +541,9 @@ static int btt_freelist_init(struct arena_info *arena)
arena->freelist[i].seq = nd_inc_seq(le32_to_cpu(log_new.seq));
arena->freelist[i].block = le32_to_cpu(log_new.old_map);
+ if (ent_e_flag(log_new.old_map))
+ arena_clear_freelist_error(arena, i);
+
/* This implies a newly created or untouched flog entry */
if (log_new.old_map == log_new.new_map)
continue;
@@ -525,7 +564,6 @@ static int btt_freelist_init(struct arena_info *arena)
if (ret)
return ret;
}
-
}
return 0;
@@ -695,6 +733,7 @@ static int discover_arenas(struct btt *btt)
arena->external_lba_start = cur_nlba;
parse_arena_meta(arena, super, cur_off);
+ mutex_init(&arena->err_lock);
ret = btt_freelist_init(arena);
if (ret)
goto out;
@@ -905,11 +944,6 @@ static void unlock_map(struct arena_info *arena, u32 premap)
spin_unlock(&arena->map_locks[idx].lock);
}
-static u64 to_namespace_offset(struct arena_info *arena, u64 lba)
-{
- return arena->dataoff + ((u64)lba * arena->internal_lbasize);
-}
-
static int btt_data_read(struct arena_info *arena, struct page *page,
unsigned int off, u32 lba, u32 len)
{
@@ -1067,8 +1101,14 @@ static int btt_read_pg(struct btt *btt, struct bio_integrity_payload *bip,
}
ret = btt_data_read(arena, page, off, postmap, cur_len);
- if (ret)
+ if (ret) {
+ int rc;
+
+ /* Media error - set the e_flag */
+ rc = btt_map_write(arena, premap, postmap, 0, 1,
+ NVDIMM_IO_ATOMIC);
goto out_rtt;
+ }
if (bip) {
ret = btt_rw_integrity(btt, bip, arena, postmap, READ);
@@ -1093,6 +1133,15 @@ static int btt_read_pg(struct btt *btt, struct bio_integrity_payload *bip,
return ret;
}
+static bool btt_is_badblock(struct btt *btt, struct arena_info *arena,
+ u32 postmap)
+{
+ u64 nsoff = to_namespace_offset(arena, postmap);
+ sector_t phys_sector = nsoff >> 9;
+
+ return is_bad_pmem(btt->phys_bb, phys_sector, arena->internal_lbasize);
+}
+
static int btt_write_pg(struct btt *btt, struct bio_integrity_payload *bip,
sector_t sector, struct page *page, unsigned int off,
unsigned int len)
@@ -1105,7 +1154,9 @@ static int btt_write_pg(struct btt *btt, struct bio_integrity_payload *bip,
while (len) {
u32 cur_len;
+ int e_flag;
+ retry:
lane = nd_region_acquire_lane(btt->nd_region);
ret = lba_to_arena(btt, sector, &premap, &arena);
@@ -1118,6 +1169,23 @@ static int btt_write_pg(struct btt *btt, struct bio_integrity_payload *bip,
goto out_lane;
}
+ /* The block had a media error, and is being cleared */
+ if (mutex_is_locked(&arena->err_lock)
+ || arena->freelist[lane].has_err) {
+ nd_region_release_lane(btt->nd_region, lane);
+ goto retry;
+ }
+
+ /* The block had a media error, and needs to be cleared */
+ if (btt_is_badblock(btt, arena, arena->freelist[lane].block)) {
+ arena->freelist[lane].has_err = 1;
+ nd_region_release_lane(btt->nd_region, lane);
+
+ arena_clear_freelist_error(arena, lane);
+ /* OK to acquire a different lane/free block */
+ goto retry;
+ }
+
new_postmap = arena->freelist[lane].block;
/* Wait if the new block is being read from */
@@ -1143,7 +1211,7 @@ static int btt_write_pg(struct btt *btt, struct bio_integrity_payload *bip,
}
lock_map(arena, premap);
- ret = btt_map_read(arena, premap, &old_postmap, NULL, NULL,
+ ret = btt_map_read(arena, premap, &old_postmap, NULL, &e_flag,
NVDIMM_IO_ATOMIC);
if (ret)
goto out_map;
@@ -1151,6 +1219,8 @@ static int btt_write_pg(struct btt *btt, struct bio_integrity_payload *bip,
ret = -EIO;
goto out_map;
}
+ if (e_flag)
+ set_e_flag(old_postmap);
log.lba = cpu_to_le32(premap);
log.old_map = cpu_to_le32(old_postmap);
@@ -1169,6 +1239,9 @@ static int btt_write_pg(struct btt *btt, struct bio_integrity_payload *bip,
unlock_map(arena, premap);
nd_region_release_lane(btt->nd_region, lane);
+ if (e_flag)
+ arena_clear_freelist_error(arena, lane);
+
len -= cur_len;
off += cur_len;
sector += btt->sector_size >> SECTOR_SHIFT;
@@ -1349,6 +1422,7 @@ static struct btt *btt_init(struct nd_btt *nd_btt, unsigned long long rawsize,
{
int ret;
struct btt *btt;
+ struct nd_namespace_io *nsio;
struct device *dev = &nd_btt->dev;
btt = devm_kzalloc(dev, sizeof(struct btt), GFP_KERNEL);
@@ -1362,6 +1436,8 @@ static struct btt *btt_init(struct nd_btt *nd_btt, unsigned long long rawsize,
INIT_LIST_HEAD(&btt->arena_list);
mutex_init(&btt->init_lock);
btt->nd_region = nd_region;
+ nsio = to_nd_namespace_io(&nd_btt->ndns->dev);
+ btt->phys_bb = &nsio->bb;
ret = discover_arenas(btt);
if (ret) {
diff --git a/drivers/nvdimm/btt.h b/drivers/nvdimm/btt.h
index 2bc0d10b..578c205 100644
--- a/drivers/nvdimm/btt.h
+++ b/drivers/nvdimm/btt.h
@@ -15,6 +15,7 @@
#ifndef _LINUX_BTT_H
#define _LINUX_BTT_H
+#include <linux/badblocks.h>
#include <linux/types.h>
#define BTT_SIG_LEN 16
@@ -41,6 +42,7 @@
#define ent_lba(ent) (ent & MAP_LBA_MASK)
#define ent_e_flag(ent) (!!(ent & MAP_ERR_MASK))
#define ent_z_flag(ent) (!!(ent & MAP_TRIM_MASK))
+#define set_e_flag(ent) (ent |= MAP_ERR_MASK)
enum btt_init_state {
INIT_UNCHECKED = 0,
@@ -82,6 +84,7 @@ struct free_entry {
u32 block;
u8 sub;
u8 seq;
+ u8 has_err;
};
struct aligned_lock {
@@ -153,6 +156,7 @@ struct arena_info {
struct dentry *debugfs_dir;
/* Arena flags */
u32 flags;
+ struct mutex err_lock;
};
/**
@@ -187,6 +191,7 @@ struct btt {
struct mutex init_lock;
int init_state;
int num_arenas;
+ struct badblocks *phys_bb;
};
bool nd_btt_arena_is_valid(struct nd_btt *nd_btt, struct btt_sb *super);
diff --git a/drivers/nvdimm/claim.c b/drivers/nvdimm/claim.c
index 3e6404f..b2fc29b 100644
--- a/drivers/nvdimm/claim.c
+++ b/drivers/nvdimm/claim.c
@@ -280,14 +280,6 @@ static int nsio_rw_bytes(struct nd_namespace_common *ndns,
}
if (unlikely(is_bad_pmem(&nsio->bb, sector, sz_align))) {
- /*
- * FIXME: nsio_rw_bytes() may be called from atomic
- * context in the btt case and the ACPI DSM path for
- * clearing the error takes sleeping locks and allocates
- * memory. An explicit error clearing path, and support
- * for tracking badblocks in BTT metadata is needed to
- * work around this collision.
- */
if (IS_ALIGNED(offset, 512) && IS_ALIGNED(size, 512)
&& !(flags & NVDIMM_IO_ATOMIC)) {
long cleared;
--
2.9.3
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v4 0/6] BTT error clearing rework
2017-07-26 23:35 [PATCH v4 0/6] BTT error clearing rework Vishal Verma
` (5 preceding siblings ...)
2017-07-26 23:35 ` [PATCH v4 6/6] libnvdimm, btt: rework error clearing Vishal Verma
@ 2017-07-31 23:15 ` Kani, Toshimitsu
2017-07-31 23:35 ` Verma, Vishal L
6 siblings, 1 reply; 13+ messages in thread
From: Kani, Toshimitsu @ 2017-07-31 23:15 UTC (permalink / raw)
To: linux-nvdimm@lists.01.org, vishal.l.verma@intel.com
Cc: dan.j.williams@intel.com, jmoyer@redhat.com,
linux-acpi@vger.kernel.org, rafael.j.wysocki@intel.com
On Wed, 2017-07-26 at 17:35 -0600, Vishal Verma wrote:
:
>
> Clearing errors or badblocks during a BTT write requires sending an
> ACPI DSM, which means potentially sleeping. Since a BTT IO happens in
> atomic context (preemption disabled, spinlocks may be held), we
> cannot perform error clearing in the course of an IO. Due to this
> error clearing for BTT IOs has hitherto been disabled.
>
> This series fixes these problems by moving the error clearing out of
> the atomic sections in the BTT.
>
> Also fix a potential deadlock that can occur while clearing errors
> from either BTT or pmem due to memory allocations in the IO path.
Hi Vishal,
I just tested the series (sorry for the delay). It works nicely when
doing I/Os to a block device directly. But I am seeing a lot of write
errors with filesystem.
Here is what I did for the testing.
1. 'mkfs.ext /dev/pmem0s' and 'mount /dev/pmem0s /mnt/pmem0s'.
2. Inject an error to somewhere in the pmem0s device, but not in the
metadata area at beginning.
3. Run the following script.
===
DEV=pmem0s
set -x
dd if=/dev/zero of=/mnt/$DEV/1Gfile bs=1M count=1024
while true; do
cp /mnt/$DEV/1Gfile /mnt/$DEV/file-1
cp /mnt/$DEV/1Gfile /mnt/$DEV/file-2
cp /mnt/$DEV/1Gfile /mnt/$DEV/file-3
cp /mnt/$DEV/1Gfile /mnt/$DEV/file-4
cp /mnt/$DEV/1Gfile /mnt/$DEV/file-5
cp /mnt/$DEV/1Gfile /mnt/$DEV/file-6
cp /mnt/$DEV/1Gfile /mnt/$DEV/file-7
cp /mnt/$DEV/1Gfile /mnt/$DEV/file-8
cp /mnt/$DEV/1Gfile /mnt/$DEV/file-9
cp /mnt/$DEV/1Gfile /mnt/$DEV/file-10
done
===
Step 3 clears an error and runs fine with raw and memory modes. With
sector mode, however, it ends up with continuous write errors like
below and does not clear the error. Do you have any thoughts?
EXT4-fs warning (device pmem0s): ext4_end_bio:322: I/O error 10
writing to inode 17 (offset 1023410176 size 8388608 starting block
1834752)
Buffer I/O error on device pmem0s, logical block 1834752
Buffer I/O error on device pmem0s, logical block 1834753
Buffer I/O error on device pmem0s, logical block 1834754
:
nd_pmem btt0.0: io error in WRITE sector 14680064, len 4096,
EXT4-fs warning (device pmem0s): ext4_end_bio:322: I/O error 10
writing to inode 17 (offset 1031798784 size 1052672 starting block
1835008)
nd_pmem btt0.0: io error in WRITE sector 14682112, len 4096,
EXT4-fs warning (device pmem0s): ext4_end_bio:322: I/O error 10
writing to inode 17 (offset 1031798784 size 2101248 starting block
1835264)
:
nd_pmem btt0.0: io error in WRITE sector 14698496, len 4096,
nd_pmem btt0.0: io error in WRITE sector 14700544, len 4096,
nd_pmem btt0.0: io error in WRITE sector 14702592, len 4096,
nd_pmem btt0.0: io error in WRITE sector 14704640, len 4096,
:
Thanks,
-Toshi
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 0/6] BTT error clearing rework
2017-07-31 23:15 ` [PATCH v4 0/6] BTT error clearing rework Kani, Toshimitsu
@ 2017-07-31 23:35 ` Verma, Vishal L
2017-08-01 15:28 ` Kani, Toshimitsu
0 siblings, 1 reply; 13+ messages in thread
From: Verma, Vishal L @ 2017-07-31 23:35 UTC (permalink / raw)
To: toshi.kani@hpe.com, linux-nvdimm@lists.01.org
Cc: Williams, Dan J, jmoyer@redhat.com, linux-acpi@vger.kernel.org,
Wysocki, Rafael J
On Mon, 2017-07-31 at 23:15 +0000, Kani, Toshimitsu wrote:
> On Wed, 2017-07-26 at 17:35 -0600, Vishal Verma wrote:
> :
> >
> > Clearing errors or badblocks during a BTT write requires sending an
> > ACPI DSM, which means potentially sleeping. Since a BTT IO happens
> > in
> > atomic context (preemption disabled, spinlocks may be held), we
> > cannot perform error clearing in the course of an IO. Due to this
> > error clearing for BTT IOs has hitherto been disabled.
> >
> > This series fixes these problems by moving the error clearing out of
> > the atomic sections in the BTT.
> >
> > Also fix a potential deadlock that can occur while clearing errors
> > from either BTT or pmem due to memory allocations in the IO path.
>
> Hi Vishal,
>
> I just tested the series (sorry for the delay). It works nicely when
> doing I/Os to a block device directly. But I am seeing a lot of write
> errors with filesystem.
>
> Here is what I did for the testing.
>
> 1. 'mkfs.ext /dev/pmem0s' and 'mount /dev/pmem0s /mnt/pmem0s'.
> 2. Inject an error to somewhere in the pmem0s device, but not in the
> metadata area at beginning.
> 3. Run the following script.
> ===
> DEV=pmem0s
> set -x
> dd if=/dev/zero of=/mnt/$DEV/1Gfile bs=1M count=1024
> while true; do
> cp /mnt/$DEV/1Gfile /mnt/$DEV/file-1
> cp /mnt/$DEV/1Gfile /mnt/$DEV/file-2
> cp /mnt/$DEV/1Gfile /mnt/$DEV/file-3
> cp /mnt/$DEV/1Gfile /mnt/$DEV/file-4
> cp /mnt/$DEV/1Gfile /mnt/$DEV/file-5
> cp /mnt/$DEV/1Gfile /mnt/$DEV/file-6
> cp /mnt/$DEV/1Gfile /mnt/$DEV/file-7
> cp /mnt/$DEV/1Gfile /mnt/$DEV/file-8
> cp /mnt/$DEV/1Gfile /mnt/$DEV/file-9
> cp /mnt/$DEV/1Gfile /mnt/$DEV/file-10
> done
> ===
>
> Step 3 clears an error and runs fine with raw and memory modes. With
> sector mode, however, it ends up with continuous write errors like
> below and does not clear the error. Do you have any thoughts?
>
> EXT4-fs warning (device pmem0s): ext4_end_bio:322: I/O error 10
> writing to inode 17 (offset 1023410176 size 8388608 starting block
> 1834752)
> Buffer I/O error on device pmem0s, logical block 1834752
> Buffer I/O error on device pmem0s, logical block 1834753
> Buffer I/O error on device pmem0s, logical block 1834754
> :
> nd_pmem btt0.0: io error in WRITE sector 14680064, len 4096,
> EXT4-fs warning (device pmem0s): ext4_end_bio:322: I/O error 10
> writing to inode 17 (offset 1031798784 size 1052672 starting block
> 1835008)
> nd_pmem btt0.0: io error in WRITE sector 14682112, len 4096,
> EXT4-fs warning (device pmem0s): ext4_end_bio:322: I/O error 10
> writing to inode 17 (offset 1031798784 size 2101248 starting block
> 1835264)
> :
> nd_pmem btt0.0: io error in WRITE sector 14698496, len 4096,
> nd_pmem btt0.0: io error in WRITE sector 14700544, len 4096,
> nd_pmem btt0.0: io error in WRITE sector 14702592, len 4096,
> nd_pmem btt0.0: io error in WRITE sector 14704640, len 4096,
> :
Thanks for the test Toshi, I will try and reproduce it.
My first guess is - are the injected errors potentially in the BTT
metadata area towards the end?
->rw_bytes can only clear errors on properly aligned writes, and the btt
metadata writes will be too small to clear metadata errors..
>
> Thanks,
> -Toshi
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 0/6] BTT error clearing rework
2017-07-31 23:35 ` Verma, Vishal L
@ 2017-08-01 15:28 ` Kani, Toshimitsu
2017-08-01 19:11 ` Kani, Toshimitsu
0 siblings, 1 reply; 13+ messages in thread
From: Kani, Toshimitsu @ 2017-08-01 15:28 UTC (permalink / raw)
To: linux-nvdimm@lists.01.org, vishal.l.verma@intel.com
Cc: dan.j.williams@intel.com, jmoyer@redhat.com,
linux-acpi@vger.kernel.org, rafael.j.wysocki@intel.com
On Mon, 2017-07-31 at 23:35 +0000, Verma, Vishal L wrote:
> On Mon, 2017-07-31 at 23:15 +0000, Kani, Toshimitsu wrote:
> > On Wed, 2017-07-26 at 17:35 -0600, Vishal Verma wrote:
:
> >
> > Step 3 clears an error and runs fine with raw and memory
> > modes. With sector mode, however, it ends up with continuous write
> > errors like below and does not clear the error. Do you have any
> > thoughts?
> >
> > EXT4-fs warning (device pmem0s): ext4_end_bio:322: I/O error 10
> > writing to inode 17 (offset 1023410176 size 8388608 starting block
> > 1834752)
> > Buffer I/O error on device pmem0s, logical block 1834752
> > Buffer I/O error on device pmem0s, logical block 1834753
> > Buffer I/O error on device pmem0s, logical block 1834754
> > :
> > nd_pmem btt0.0: io error in WRITE sector 14680064, len 4096,
> > EXT4-fs warning (device pmem0s): ext4_end_bio:322: I/O error 10
> > writing to inode 17 (offset 1031798784 size 1052672 starting block
> > 1835008)
> > nd_pmem btt0.0: io error in WRITE sector 14682112, len 4096,
> > EXT4-fs warning (device pmem0s): ext4_end_bio:322: I/O error 10
> > writing to inode 17 (offset 1031798784 size 2101248 starting block
> > 1835264)
> > :
> > nd_pmem btt0.0: io error in WRITE sector 14698496, len 4096,
> > nd_pmem btt0.0: io error in WRITE sector 14700544, len 4096,
> > nd_pmem btt0.0: io error in WRITE sector 14702592, len 4096,
> > nd_pmem btt0.0: io error in WRITE sector 14704640, len 4096,
> > :
>
> Thanks for the test Toshi, I will try and reproduce it.
> My first guess is - are the injected errors potentially in the BTT
> metadata area towards the end?
>
> ->rw_bytes can only clear errors on properly aligned writes, and the
> btt metadata writes will be too small to clear metadata errors..
I picked an injected offset without careful thoughts, so it is possible
that I might have stepped into such area. I just tested with a block
device interface with multiple different offsets, and they failed in
clearing as well... I will look into further as well as my test setup.
Thanks,
-Toshi
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 0/6] BTT error clearing rework
2017-08-01 15:28 ` Kani, Toshimitsu
@ 2017-08-01 19:11 ` Kani, Toshimitsu
[not found] ` <1501614143.2042.101.camel-ZPxbGqLxI0U@public.gmane.org>
0 siblings, 1 reply; 13+ messages in thread
From: Kani, Toshimitsu @ 2017-08-01 19:11 UTC (permalink / raw)
To: linux-nvdimm@lists.01.org, vishal.l.verma@intel.com
Cc: dan.j.williams@intel.com, jmoyer@redhat.com,
linux-acpi@vger.kernel.org, rafael.j.wysocki@intel.com
On Tue, 2017-08-01 at 09:19 -0600, Toshi Kani wrote:
> On Mon, 2017-07-31 at 23:35 +0000, Verma, Vishal L wrote:
> > On Mon, 2017-07-31 at 23:15 +0000, Kani, Toshimitsu wrote:
> > > On Wed, 2017-07-26 at 17:35 -0600, Vishal Verma wrote:
:
> > Thanks for the test Toshi, I will try and reproduce it.
> > My first guess is - are the injected errors potentially in the BTT
> > metadata area towards the end?
> >
> > ->rw_bytes can only clear errors on properly aligned writes, and
> > the btt metadata writes will be too small to clear metadata
> > errors..
>
> I picked an injected offset without careful thoughts, so it is
> possible that I might have stepped into such area. I just tested
> with a block device interface with multiple different offsets, and
> they failed in clearing as well... I will look into further as well
> as my test setup.
The change/hack below takes care of the issue in my setup. There is a
discrepancy in offset between the pre-check in btt_write_pg() and the
actual check in nsio_rw_bytes().
Thanks,
-Toshi
---
drivers/nvdimm/btt.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/nvdimm/btt.c b/drivers/nvdimm/btt.c
index 8a959f8..83ad4c6 100644
--- a/drivers/nvdimm/btt.c
+++ b/drivers/nvdimm/btt.c
@@ -1137,7 +1137,7 @@ static bool btt_is_badblock(struct btt *btt,
struct arena_info *arena,
u32 postmap)
{
u64 nsoff = to_namespace_offset(arena, postmap);
- sector_t phys_sector = nsoff >> 9;
+ sector_t phys_sector = (nsoff + arena->nd_btt->initial_offset)
>> 9;
return is_bad_pmem(btt->phys_bb, phys_sector, arena-
>internal_lbasize);
}
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v4 0/6] BTT error clearing rework
[not found] ` <1501614143.2042.101.camel-ZPxbGqLxI0U@public.gmane.org>
@ 2017-08-01 19:56 ` Vishal Verma
2017-08-01 20:06 ` Kani, Toshimitsu
0 siblings, 1 reply; 13+ messages in thread
From: Vishal Verma @ 2017-08-01 19:56 UTC (permalink / raw)
To: Kani, Toshimitsu
Cc: linux-acpi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
Wysocki, Rafael J,
linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw@public.gmane.org
On 08/01, Kani, Toshimitsu wrote:
> On Tue, 2017-08-01 at 09:19 -0600, Toshi Kani wrote:
> > On Mon, 2017-07-31 at 23:35 +0000, Verma, Vishal L wrote:
> > > On Mon, 2017-07-31 at 23:15 +0000, Kani, Toshimitsu wrote:
> > > > On Wed, 2017-07-26 at 17:35 -0600, Vishal Verma wrote:
> :
> > > Thanks for the test Toshi, I will try and reproduce it.
> > > My first guess is - are the injected errors potentially in the BTT
> > > metadata area towards the end?
> > >
> > > ->rw_bytes can only clear errors on properly aligned writes, and
> > > the btt metadata writes will be too small to clear metadata
> > > errors..
> >
> > I picked an injected offset without careful thoughts, so it is
> > possible that I might have stepped into such area. I just tested
> > with a block device interface with multiple different offsets, and
> > they failed in clearing as well... I will look into further as well
> > as my test setup.
>
> The change/hack below takes care of the issue in my setup. There is a
> discrepancy in offset between the pre-check in btt_write_pg() and the
> actual check in nsio_rw_bytes().
>
> Thanks,
> -Toshi
>
> ---
> drivers/nvdimm/btt.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/nvdimm/btt.c b/drivers/nvdimm/btt.c
> index 8a959f8..83ad4c6 100644
> --- a/drivers/nvdimm/btt.c
> +++ b/drivers/nvdimm/btt.c
> @@ -1137,7 +1137,7 @@ static bool btt_is_badblock(struct btt *btt,
> struct arena_info *arena,
> u32 postmap)
> {
> u64 nsoff = to_namespace_offset(arena, postmap);
> - sector_t phys_sector = nsoff >> 9;
> + sector_t phys_sector = (nsoff + arena->nd_btt->initial_offset) >> 9;
>
> return is_bad_pmem(btt->phys_bb, phys_sector, arena->internal_lbasize);
> }
Hey Toshi, that is a great catch (I'm going to look at enhancing the
unit tests too to catch this).
Your patch is correct. Normally whenever we calculate a 'nsoff', we use
that to do arena_{read,write}_bytes, and that takes care of adding the
initial_offset. This was the first instance where we calculated nsoff
and did something other than rw_bytes with it (i.e. is_bad_pmem), and
therefore this nsoff needs the initial_offset adjustment manually..
However just adding that here is inviting future bugs like this, so I'm
going to refactor the initial_offset adjustment into some helpers and
use those across the board. That should prevent this sort of a bug
again.
Thanks for the report and the root cause!
-Vishal
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 0/6] BTT error clearing rework
2017-08-01 19:56 ` Vishal Verma
@ 2017-08-01 20:06 ` Kani, Toshimitsu
0 siblings, 0 replies; 13+ messages in thread
From: Kani, Toshimitsu @ 2017-08-01 20:06 UTC (permalink / raw)
To: vishal.l.verma@intel.com
Cc: dan.j.williams@intel.com, linux-nvdimm@lists.01.org,
jmoyer@redhat.com, linux-acpi@vger.kernel.org,
rafael.j.wysocki@intel.com
On Tue, 2017-08-01 at 13:56 -0600, Vishal Verma wrote:
:
>
> Hey Toshi, that is a great catch (I'm going to look at enhancing the
> unit tests too to catch this).
>
> Your patch is correct. Normally whenever we calculate a 'nsoff', we
> use that to do arena_{read,write}_bytes, and that takes care of
> adding the initial_offset. This was the first instance where we
> calculated nsoff and did something other than rw_bytes with it (i.e.
> is_bad_pmem), and therefore this nsoff needs the initial_offset
> adjustment manually..
>
> However just adding that here is inviting future bugs like this, so
> I'm going to refactor the initial_offset adjustment into some helpers
> and use those across the board. That should prevent this sort of a
> bug again.
Sounds great. Thanks Vishal!
-Toshi
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2017-08-01 20:06 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-07-26 23:35 [PATCH v4 0/6] BTT error clearing rework Vishal Verma
2017-07-26 23:35 ` [PATCH v4 1/6] btt: fix a missed NVDIMM_IO_ATOMIC case in the write path Vishal Verma
2017-07-26 23:35 ` [PATCH v4 2/6] btt: refactor map entry operations with macros Vishal Verma
2017-07-26 23:35 ` [PATCH v4 3/6] btt: ensure that flags were also unchanged during a map_read Vishal Verma
[not found] ` <20170726233546.29052-1-vishal.l.verma-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2017-07-26 23:35 ` [PATCH v4 4/6] btt: cache sector_size in arena_info Vishal Verma
2017-07-26 23:35 ` [PATCH v4 5/6] libnvdimm: fix potential deadlock while clearing errors Vishal Verma
2017-07-26 23:35 ` [PATCH v4 6/6] libnvdimm, btt: rework error clearing Vishal Verma
2017-07-31 23:15 ` [PATCH v4 0/6] BTT error clearing rework Kani, Toshimitsu
2017-07-31 23:35 ` Verma, Vishal L
2017-08-01 15:28 ` Kani, Toshimitsu
2017-08-01 19:11 ` Kani, Toshimitsu
[not found] ` <1501614143.2042.101.camel-ZPxbGqLxI0U@public.gmane.org>
2017-08-01 19:56 ` Vishal Verma
2017-08-01 20:06 ` Kani, Toshimitsu
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox