[PATCH V2 2/3 libnvdimm-pending] libnvdimm, namespace: avoid multiple sector calculations
by Fabian Frederick
Use sector_t for cleared
Suggested-by: Dan Williams <dan.j.williams(a)intel.com>
Signed-off-by: Fabian Frederick <fabf(a)skynet.be>
---
V2: -applied on top of libnvdimm-pending
drivers/nvdimm/pmem.c | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c
index 0f47062..9edad8b 100644
--- a/drivers/nvdimm/pmem.c
+++ b/drivers/nvdimm/pmem.c
@@ -51,17 +51,16 @@ static int pmem_clear_poison(struct pmem_device *pmem, phys_addr_t offset,
unsigned int len)
{
struct device *dev = to_dev(pmem);
- sector_t sector;
- long cleared;
+ sector_t sector, cleared;
sector = (offset - pmem->data_offset) / 512;
- cleared = nvdimm_clear_poison(dev, pmem->phys_addr + offset, len);
+ cleared = nvdimm_clear_poison(dev, pmem->phys_addr + offset, len) / 512;
- if (cleared > 0 && cleared / 512) {
+ if (cleared) {
dev_dbg(dev, "%s: %#llx clear %ld sector%s\n",
__func__, (unsigned long long) sector,
- cleared / 512, cleared / 512 > 1 ? "s" : "");
- badblocks_clear(&pmem->bb, sector, cleared / 512);
+ cleared, cleared > 1 ? "s" : "");
+ badblocks_clear(&pmem->bb, sector, cleared);
} else {
return -EIO;
}
--
2.7.4
4 years, 1 month
[PATCH 2/8 linux-next] libnvdimm, namespace: add verbosity to persistence warning
by Fabian Frederick
Signed-off-by: Fabian Frederick <fabf(a)skynet.be>
---
drivers/nvdimm/pmem.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c
index 2461843..822a712 100644
--- a/drivers/nvdimm/pmem.c
+++ b/drivers/nvdimm/pmem.c
@@ -267,7 +267,7 @@ static int pmem_attach_disk(struct device *dev,
pmem->phys_addr = res->start;
pmem->size = resource_size(res);
if (nvdimm_has_flush(nd_region) < 0)
- dev_warn(dev, "unable to guarantee persistence of writes\n");
+ dev_warn(dev, "unable to guarantee persistence of writes due to unknown flushing capability of the memory region\n");
if (!devm_request_mem_region(dev, res->start, resource_size(res),
dev_name(dev))) {
--
2.7.4
4 years, 1 month
[PATCH 3/8 linux-next] libnvdimm, namespace: move persistence warning
by Fabian Frederick
There's no need to warn on persistence yet as some validity tests
are on the way.
Signed-off-by: Fabian Frederick <fabf(a)skynet.be>
---
drivers/nvdimm/pmem.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c
index 822a712..204912c 100644
--- a/drivers/nvdimm/pmem.c
+++ b/drivers/nvdimm/pmem.c
@@ -266,9 +266,6 @@ static int pmem_attach_disk(struct device *dev,
dev_set_drvdata(dev, pmem);
pmem->phys_addr = res->start;
pmem->size = resource_size(res);
- if (nvdimm_has_flush(nd_region) < 0)
- dev_warn(dev, "unable to guarantee persistence of writes due to unknown flushing capability of the memory region\n");
-
if (!devm_request_mem_region(dev, res->start, resource_size(res),
dev_name(dev))) {
dev_warn(dev, "could not reserve region %pR\n", res);
@@ -279,6 +276,9 @@ static int pmem_attach_disk(struct device *dev,
if (!q)
return -ENOMEM;
+ if (nvdimm_has_flush(nd_region) < 0)
+ dev_warn(dev, "unable to guarantee persistence of writes due to unknown flushing capability of the memory region\n");
+
pmem->pfn_flags = PFN_DEV;
if (is_nd_pfn(dev)) {
addr = devm_memremap_pages(dev, &pfn_res, &q->q_usage_counter,
--
2.7.4
4 years, 1 month
[PATCH 4/8 linux-next] libnvdimm, namespace: avoid multiple sector calculations
by Fabian Frederick
add cleared_sectors variable to add more readability.
Signed-off-by: Fabian Frederick <fabf(a)skynet.be>
---
drivers/nvdimm/pmem.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c
index 204912c..4da4735 100644
--- a/drivers/nvdimm/pmem.c
+++ b/drivers/nvdimm/pmem.c
@@ -52,16 +52,16 @@ static int pmem_clear_poison(struct pmem_device *pmem, phys_addr_t offset,
{
struct device *dev = to_dev(pmem);
sector_t sector;
- long cleared;
+ long cleared, cleared_sectors;
sector = (offset - pmem->data_offset) / 512;
cleared = nvdimm_clear_poison(dev, pmem->phys_addr + offset, len);
-
- if (cleared > 0 && cleared / 512) {
+ cleared_sectors = cleared / 512;
+ if (cleared > 0 && cleared_sectors) {
dev_dbg(dev, "%s: %#llx clear %ld sector%s\n",
- __func__, (unsigned long long) sector,
- cleared / 512, cleared / 512 > 1 ? "s" : "");
- badblocks_clear(&pmem->bb, sector, cleared / 512);
+ __func__, (unsigned long long) sector,
+ cleared_sectors, cleared_sectors > 1 ? "s" : "");
+ badblocks_clear(&pmem->bb, sector, cleared_sectors);
} else {
return -EIO;
}
--
2.7.4
4 years, 1 month
[PATCH 5/8 linux-next] libnvdimm: remove else after return in nsio_rw_bytes()
by Fabian Frederick
else after return is not needed.
Signed-off-by: Fabian Frederick <fabf(a)skynet.be>
---
drivers/nvdimm/claim.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/drivers/nvdimm/claim.c b/drivers/nvdimm/claim.c
index d5dc80c..c0c113e 100644
--- a/drivers/nvdimm/claim.c
+++ b/drivers/nvdimm/claim.c
@@ -238,11 +238,10 @@ static int nsio_rw_bytes(struct nd_namespace_common *ndns,
if (unlikely(is_bad_pmem(&nsio->bb, offset / 512, sz_align)))
return -EIO;
return memcpy_from_pmem(buf, nsio->addr + offset, size);
- } else {
- memcpy_to_pmem(nsio->addr + offset, buf, size);
- nvdimm_flush(to_nd_region(ndns->dev.parent));
}
+ memcpy_to_pmem(nsio->addr + offset, buf, size);
+ nvdimm_flush(to_nd_region(ndns->dev.parent));
return 0;
}
--
2.7.4
4 years, 1 month
[PATCH 6/8 linux-next] libnvdimm, namespace: use octal for permissions
by Fabian Frederick
According to commit f90774e1fd27
("checkpatch: look for symbolic permissions and suggest octal instead")
Signed-off-by: Fabian Frederick <fabf(a)skynet.be>
---
drivers/nvdimm/namespace_devs.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/nvdimm/namespace_devs.c b/drivers/nvdimm/namespace_devs.c
index b00045b..0d2da9a 100644
--- a/drivers/nvdimm/namespace_devs.c
+++ b/drivers/nvdimm/namespace_devs.c
@@ -1132,7 +1132,7 @@ static ssize_t size_show(struct device *dev,
return sprintf(buf, "%llu\n", (unsigned long long)
nvdimm_namespace_capacity(to_ndns(dev)));
}
-static DEVICE_ATTR(size, S_IRUGO, size_show, size_store);
+static DEVICE_ATTR(size, 0444, size_show, size_store);
static u8 *namespace_to_uuid(struct device *dev)
{
@@ -1456,7 +1456,7 @@ static umode_t namespace_visible(struct kobject *kobj,
if (is_namespace_pmem(dev) || is_namespace_blk(dev)) {
if (a == &dev_attr_size.attr)
- return S_IWUSR | S_IRUGO;
+ return 0200 | 0444;
if (is_namespace_pmem(dev) && a == &dev_attr_sector_size.attr)
return 0;
--
2.7.4
4 years, 1 month
[PATCH 8/8 linux-next] mm: use SECTION_MASK where possible
by Fabian Frederick
Signed-off-by: Fabian Frederick <fabf(a)skynet.be>
---
kernel/memremap.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/kernel/memremap.c b/kernel/memremap.c
index 1bb5eec..8ebf9dd 100644
--- a/kernel/memremap.c
+++ b/kernel/memremap.c
@@ -198,7 +198,7 @@ static void pgmap_radix_release(struct resource *res)
{
resource_size_t key, align_start, align_size, align_end;
- align_start = res->start & ~(SECTION_SIZE - 1);
+ align_start = res->start & SECTION_MASK;
align_size = ALIGN(resource_size(res), SECTION_SIZE);
align_end = align_start + align_size - 1;
@@ -244,7 +244,7 @@ static void devm_memremap_pages_release(struct device *dev, void *data)
}
/* pages are dead and unused, undo the arch mapping */
- align_start = res->start & ~(SECTION_SIZE - 1);
+ align_start = res->start & SECTION_MASK;
align_size = ALIGN(resource_size(res), SECTION_SIZE);
arch_remove_memory(align_start, align_size);
untrack_pfn(NULL, PHYS_PFN(align_start), align_size);
@@ -289,7 +289,7 @@ void *devm_memremap_pages(struct device *dev, struct resource *res,
int error, nid, is_ram;
unsigned long pfn;
- align_start = res->start & ~(SECTION_SIZE - 1);
+ align_start = res->start & SECTION_MASK;
align_size = ALIGN(res->start + resource_size(res), SECTION_SIZE)
- align_start;
is_ram = region_intersects(align_start, align_size,
--
2.7.4
4 years, 1 month
[PATCH 7/8 linux-next] mm: warn about possible alignment problem
by Fabian Frederick
Commit 5f29a77cd957
("mm: fix mixed zone detection in devm_memremap_pages")
Aligned resource limits before region_intersects() which breaks
the following with false assertions on kernel command line: memmap=4M!700M
"devm_memremap_pages attempted on mixed region [ mem 0x2bc00000-0x2bfffff
flags 0x200]"
Memory regions
0x100000-0x2bbfffff: usable
0x2bc000000-0x2bbfffff: persistent
0x2c0000000-0x2bffffff: usable
resource start: 0x2bc00000
align start: 0x28000000
resource size: 0x3fffffff
align size: 0x80000000
SECTION_SIZE: 0x8000000
Now we need aligned memmap declarations based on 128M in this case
eg memmap=128!640M
Signed-off-by: Fabian Frederick <fabf(a)skynet.be>
---
kernel/memremap.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/kernel/memremap.c b/kernel/memremap.c
index b501e39..1bb5eec 100644
--- a/kernel/memremap.c
+++ b/kernel/memremap.c
@@ -296,8 +296,8 @@ void *devm_memremap_pages(struct device *dev, struct resource *res,
IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE);
if (is_ram == REGION_MIXED) {
- WARN_ONCE(1, "%s attempted on mixed region %pr\n",
- __func__, res);
+ WARN_ONCE(1, "%s attempted on mixed region %pr or arguments not aligned to section size: %#lx\n",
+ __func__, res, SECTION_SIZE);
return ERR_PTR(-ENXIO);
}
--
2.7.4
4 years, 1 month
[PATCH 1/8 linux-next] libnvdimm, namespace: update message level on smaller reservations
by Fabian Frederick
kernel command lines like memmap=1M!512M gave no pmem outputs
without debugging.
Signed-off-by: Fabian Frederick <fabf(a)skynet.be>
---
drivers/nvdimm/namespace_devs.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/nvdimm/namespace_devs.c b/drivers/nvdimm/namespace_devs.c
index abe5c6b..b00045b 100644
--- a/drivers/nvdimm/namespace_devs.c
+++ b/drivers/nvdimm/namespace_devs.c
@@ -1532,8 +1532,8 @@ struct nd_namespace_common *nvdimm_namespace_common_probe(struct device *dev)
size = nvdimm_namespace_capacity(ndns);
if (size < ND_MIN_NAMESPACE_SIZE) {
- dev_dbg(&ndns->dev, "%pa, too small must be at least %#x\n",
- &size, ND_MIN_NAMESPACE_SIZE);
+ dev_warn(&ndns->dev, "%pa, too small must be at least %#x\n",
+ &size, ND_MIN_NAMESPACE_SIZE);
return ERR_PTR(-ENODEV);
}
--
2.7.4
4 years, 1 month