All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/3] dev-dax: add support to display badblocks in sysfs for dev-dax
@ 2016-12-13  0:14 Dave Jiang
  2016-12-13  0:14 ` [PATCH 2/3] nvdimm-testing: providing dax support for nvdimm testing Dave Jiang
                   ` (3 more replies)
  0 siblings, 4 replies; 7+ messages in thread
From: Dave Jiang @ 2016-12-13  0:14 UTC (permalink / raw)
  To: dan.j.williams; +Cc: linux-nvdimm

Adding support to show badblocks in the pmem region that's provided
by the poison_list. This should show up in
/sys/class/dax/daxN.N/badblocks as read only. Currently we only support
a single resource and we do not support badblocks for seeds. Additional
support code will be implemented to support.

Signed-off-by: Dave Jiang <dave.jiang@intel.com>
---
 drivers/dax/dax.c  |   27 ++++++++++++++++++++++-----
 drivers/dax/dax.h  |    8 +++++++-
 drivers/dax/pmem.c |   37 ++++++++++++++++++++++++++++++++++++-
 3 files changed, 65 insertions(+), 7 deletions(-)

diff --git a/drivers/dax/dax.c b/drivers/dax/dax.c
index 6450c07..2c34cae 100644
--- a/drivers/dax/dax.c
+++ b/drivers/dax/dax.c
@@ -83,6 +83,7 @@ struct dax_dev {
 	int id;
 	int num_resources;
 	struct resource **res;
+	void *private;
 };
 
 #define for_each_dax_region_resource(dax_region, res) \
@@ -408,6 +409,20 @@ static struct dax_dev *to_dax_dev(struct device *dev)
 	return container_of(dev, struct dax_dev, dev);
 }
 
+void *dax_dev_get_private(struct device *dev)
+{
+	struct dax_dev *dax_dev = to_dax_dev(dev);
+
+	return dax_dev->private;
+}
+EXPORT_SYMBOL_GPL(dax_dev_get_private);
+
+void dax_dev_set_private(struct dax_dev *dax_dev, void *priv)
+{
+	dax_dev->private = priv;
+}
+EXPORT_SYMBOL_GPL(dax_dev_set_private);
+
 static unsigned long long dax_dev_size(struct dax_dev *dax_dev)
 {
 	struct dax_region *dax_region = dax_dev->region;
@@ -805,7 +820,7 @@ static ssize_t dax_dev_resize(struct dax_region *dax_region,
 			&& &dax_dev->dev == dax_region->seed) {
 		struct dax_dev *seed;
 
-		seed = devm_create_dax_dev(dax_region, NULL, 0);
+		seed = devm_create_dax_dev(dax_region, NULL, 0, NULL);
 		if (IS_ERR(seed))
 			dev_warn(dax_region->dev,
 					"failed to create new region seed\n");
@@ -851,9 +866,10 @@ static struct attribute *dax_device_attributes[] = {
 	NULL,
 };
 
-static const struct attribute_group dax_device_attribute_group = {
+struct attribute_group dax_device_attribute_group = {
 	.attrs = dax_device_attributes,
 };
+EXPORT_SYMBOL_GPL(dax_device_attribute_group);
 
 static const struct attribute_group *dax_attribute_groups[] = {
 	&dax_device_attribute_group,
@@ -1143,7 +1159,8 @@ static void dax_dev_release(struct device *dev)
 }
 
 struct dax_dev *devm_create_dax_dev(struct dax_region *dax_region,
-		struct resource *res, int count)
+		struct resource *res, int count,
+		const struct attribute_group **groups)
 {
 	struct device *parent = dax_region->dev;
 	struct dax_dev *dax_dev;
@@ -1248,7 +1265,7 @@ struct dax_dev *devm_create_dax_dev(struct dax_region *dax_region,
 	dev->devt = dev_t;
 	dev->class = dax_class;
 	dev->parent = parent;
-	dev->groups = dax_attribute_groups;
+	dev->groups = groups ? groups : dax_attribute_groups;
 	dev->release = dax_dev_release;
 	dev_set_name(dev, "dax%d.%d", dax_region->id, dax_dev->id);
 	/* update resource names now that the owner device is named */
@@ -1268,7 +1285,7 @@ struct dax_dev *devm_create_dax_dev(struct dax_region *dax_region,
 	if (atomic_inc_return(&dax_region->child_count) == 1) {
 		struct dax_dev *seed;
 
-		seed = devm_create_dax_dev(dax_region, NULL, 0);
+		seed = devm_create_dax_dev(dax_region, NULL, 0, NULL);
 		if (IS_ERR(seed))
 			dev_warn(parent, "failed to create region seed\n");
 		else
diff --git a/drivers/dax/dax.h b/drivers/dax/dax.h
index ddd829a..c23c7ac 100644
--- a/drivers/dax/dax.h
+++ b/drivers/dax/dax.h
@@ -16,10 +16,16 @@ struct device;
 struct dax_dev;
 struct resource;
 struct dax_region;
+extern struct attribute_group dax_device_attribute_group;
+
 void dax_region_put(struct dax_region *dax_region);
 struct dax_region *alloc_dax_region(struct device *parent,
 		int region_id, struct resource *res, unsigned int align,
 		void *addr, unsigned long flags);
 struct dax_dev *devm_create_dax_dev(struct dax_region *dax_region,
-		struct resource *res, int count);
+		struct resource *res, int count,
+		const struct attribute_group **groups);
+void *dax_dev_get_private(struct device *dev);
+void dax_dev_set_private(struct dax_dev *dax_dev, void *priv);
+
 #endif /* __DAX_H__ */
diff --git a/drivers/dax/pmem.c b/drivers/dax/pmem.c
index 033f49b3..808d3bb 100644
--- a/drivers/dax/pmem.c
+++ b/drivers/dax/pmem.c
@@ -14,6 +14,7 @@
 #include <linux/memremap.h>
 #include <linux/module.h>
 #include <linux/pfn_t.h>
+#include <linux/badblocks.h>
 #include "../nvdimm/pfn.h"
 #include "../nvdimm/nd.h"
 #include "dax.h"
@@ -22,6 +23,32 @@ struct dax_pmem {
 	struct device *dev;
 	struct percpu_ref ref;
 	struct completion cmp;
+	struct badblocks bb;
+};
+
+static ssize_t dax_pmem_badblocks_show(struct device *dev,
+		struct device_attribute *attr, char *page)
+{
+	struct dax_pmem *dax_pmem =
+		(struct dax_pmem *)dax_dev_get_private(dev);
+
+	return badblocks_show(&dax_pmem->bb, page, 0);
+}
+static DEVICE_ATTR(badblocks, S_IRUGO, dax_pmem_badblocks_show, NULL);
+
+static struct attribute *dax_pmem_badblock_attributes[] = {
+	&dev_attr_badblocks.attr,
+	NULL,
+};
+
+static struct attribute_group dax_pmem_badblock_attribute_group = {
+	.attrs = dax_pmem_badblock_attributes,
+};
+
+static const struct attribute_group *dax_pmem_attribute_groups[] = {
+	&dax_device_attribute_group,
+	&dax_pmem_badblock_attribute_group,
+	NULL,
 };
 
 static struct dax_pmem *to_dax_pmem(struct percpu_ref *ref)
@@ -130,7 +157,15 @@ static int dax_pmem_probe(struct device *dev)
 		return -ENOMEM;
 
 	/* TODO: support for subdividing a dax region... */
-	dax_dev = devm_create_dax_dev(dax_region, &res, 1);
+	dax_dev = devm_create_dax_dev(dax_region, &res, 1,
+			dax_pmem_attribute_groups);
+	dax_dev_set_private(dax_dev, dax_pmem);
+
+	rc = devm_init_badblocks(dev, &dax_pmem->bb);
+	if (rc)
+		return rc;
+
+	nvdimm_badblocks_populate(nd_region, &dax_pmem->bb, &res);
 
 	/* child dax_dev instances now own the lifetime of the dax_region */
 	dax_region_put(dax_region);

_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 2/3] nvdimm-testing: providing dax support for nvdimm testing
  2016-12-13  0:14 [PATCH 1/3] dev-dax: add support to display badblocks in sysfs for dev-dax Dave Jiang
@ 2016-12-13  0:14 ` Dave Jiang
  2016-12-13  0:15 ` [PATCH 3/3] dev-dax: add fallocate support to clear poison Dave Jiang
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 7+ messages in thread
From: Dave Jiang @ 2016-12-13  0:14 UTC (permalink / raw)
  To: dan.j.williams; +Cc: linux-nvdimm

Adding dax support to the nvdimm testing in tools/testing/nvdimm. The
memory allocated by the tool is via vmalloc and non-contiguous.
Overriding pgoff_to_phys() call to support the vmalloc memory.

Signed-off-by: Dave Jiang <dave.jiang@intel.com>
---
 drivers/dax/dax-private.h      |   43 ++++++++++++++++++++++++++++++++++++++++
 drivers/dax/dax.c              |   34 ++++++--------------------------
 tools/testing/nvdimm/Kbuild    |    3 ++-
 tools/testing/nvdimm/dax-dev.c |   40 +++++++++++++++++++++++++++++++++++++
 4 files changed, 91 insertions(+), 29 deletions(-)
 create mode 100644 drivers/dax/dax-private.h
 create mode 100644 tools/testing/nvdimm/dax-dev.c

diff --git a/drivers/dax/dax-private.h b/drivers/dax/dax-private.h
new file mode 100644
index 0000000..56f80d2
--- /dev/null
+++ b/drivers/dax/dax-private.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright(c) 2016 Intel Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ */
+#ifndef __DAX_PRIVATE_H__
+#define __DAX_PRIVATE_H__
+
+#include <linux/device.h>
+#include <linux/cdev.h>
+
+/**
+ * struct dax_dev - subdivision of a dax region
+ * @region - parent region
+ * @resize_lock - for resource size reductions
+ * @dev - device backing the character device
+ * @cdev - core chardev data
+ * @alive - !alive + rcu grace period == no new mappings can be established
+ * @id - child id in the region
+ * @num_resources - number of physical address extents in this device
+ * @res - array of physical address ranges
+ */
+struct dax_dev {
+	struct dax_region *region;
+	rwlock_t resize_lock;
+	struct inode *inode;
+	struct device dev;
+	struct cdev cdev;
+	bool alive;
+	int id;
+	int num_resources;
+	struct resource **res;
+	void *private;
+};
+
+#endif
diff --git a/drivers/dax/dax.c b/drivers/dax/dax.c
index 2c34cae..32c9a7f 100644
--- a/drivers/dax/dax.c
+++ b/drivers/dax/dax.c
@@ -23,6 +23,7 @@
 #include <linux/fs.h>
 #include <linux/mm.h>
 #include "dax.h"
+#include "dax-private.h"
 
 static dev_t dax_devt;
 static struct class *dax_class;
@@ -62,30 +63,6 @@ struct dax_region {
 	unsigned long pfn_flags;
 };
 
-/**
- * struct dax_dev - subdivision of a dax region
- * @region - parent region
- * @resize_lock - for resource size reductions
- * @dev - device backing the character device
- * @cdev - core chardev data
- * @alive - !alive + rcu grace period == no new mappings can be established
- * @id - child id in the region
- * @num_resources - number of physical address extents in this device
- * @res - array of physical address ranges
- */
-struct dax_dev {
-	struct dax_region *region;
-	rwlock_t resize_lock;
-	struct inode *inode;
-	struct device dev;
-	struct cdev cdev;
-	bool alive;
-	int id;
-	int num_resources;
-	struct resource **res;
-	void *private;
-};
-
 #define for_each_dax_region_resource(dax_region, res) \
 	for (res = (dax_region)->res.child; res; res = res->sibling)
 
@@ -933,8 +910,9 @@ static phys_addr_t __pgoff_to_phys(struct dax_dev *dax_dev, pgoff_t pgoff,
 	return res->start + res_offset;
 }
 
-static phys_addr_t pgoff_to_phys(struct dax_dev *dax_dev, pgoff_t pgoff,
-                unsigned long size)
+/* see "strong" declaration in tools/testing/nvdimm/dax-dev.c */
+__weak phys_addr_t dax_pgoff_to_phys(struct dax_dev *dax_dev, pgoff_t pgoff,
+		unsigned long size)
 {
 	phys_addr_t phys;
 
@@ -964,7 +942,7 @@ static int __dax_dev_fault(struct dax_dev *dax_dev, struct vm_area_struct *vma,
 		return VM_FAULT_SIGBUS;
 	}
 
-	phys = pgoff_to_phys(dax_dev, vmf->pgoff, PAGE_SIZE);
+	phys = dax_pgoff_to_phys(dax_dev, vmf->pgoff, PAGE_SIZE);
 	if (phys == -1) {
 		dev_dbg(dev, "%s: phys_to_pgoff(%#lx) failed\n", __func__,
 				vmf->pgoff);
@@ -1026,7 +1004,7 @@ static int __dax_dev_pmd_fault(struct dax_dev *dax_dev,
 	}
 
 	pgoff = linear_page_index(vma, pmd_addr);
-	phys = pgoff_to_phys(dax_dev, pgoff, PMD_SIZE);
+	phys = dax_pgoff_to_phys(dax_dev, pgoff, PMD_SIZE);
 	if (phys == -1) {
 		dev_dbg(dev, "%s: phys_to_pgoff(%#lx) failed\n", __func__,
 				pgoff);
diff --git a/tools/testing/nvdimm/Kbuild b/tools/testing/nvdimm/Kbuild
index 405212b..6dcb3c4 100644
--- a/tools/testing/nvdimm/Kbuild
+++ b/tools/testing/nvdimm/Kbuild
@@ -28,7 +28,7 @@ obj-$(CONFIG_ND_BTT) += nd_btt.o
 obj-$(CONFIG_ND_BLK) += nd_blk.o
 obj-$(CONFIG_X86_PMEM_LEGACY) += nd_e820.o
 obj-$(CONFIG_ACPI_NFIT) += nfit.o
-obj-$(CONFIG_DEV_DAX) += dax.o
+obj-$(CONFIG_DEV_DAX) += dax.o dax-dev.o
 obj-$(CONFIG_DEV_DAX_PMEM) += dax_pmem.o
 
 nfit-y := $(ACPI_SRC)/core.o
@@ -49,6 +49,7 @@ nd_e820-y := $(NVDIMM_SRC)/e820.o
 nd_e820-y += config_check.o
 
 dax-y := $(DAX_SRC)/dax.o
+dax-y += dax-dev.o
 dax-y += config_check.o
 
 dax_pmem-y := $(DAX_SRC)/pmem.o
diff --git a/tools/testing/nvdimm/dax-dev.c b/tools/testing/nvdimm/dax-dev.c
new file mode 100644
index 0000000..cd9a5e0
--- /dev/null
+++ b/tools/testing/nvdimm/dax-dev.c
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2016, Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ */
+#include "test/nfit_test.h"
+#include <linux/mm.h>
+#include "../../../drivers/dax/dax-private.h"
+
+phys_addr_t dax_pgoff_to_phys(struct dax_dev *dax_dev, pgoff_t pgoff,
+		unsigned long size)
+{
+	struct address_space *mapping = dax_dev->inode->i_mapping;
+	phys_addr_t dev_offset = PFN_PHYS(pgoff), res_offset;
+	struct resource *res;
+
+	res = radix_tree_lookup(&mapping->page_tree, PFN_PHYS(pgoff));
+	if (!res)
+		return -1;
+
+	res_offset = dev_offset - to_dev_offset(res);
+	if (res_offset + size >= resource_size(res))
+		return -1;
+
+	if (get_nfit_res(res->start + res_offset)) {
+		struct page *page;
+
+		page = vmalloc_to_page((void *)(res->start + res_offset));
+		return PFN_PHYS(page_to_pfn(page));
+	}
+
+	return res->start + res_offset;
+}

_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 3/3] dev-dax: add fallocate support to clear poison
  2016-12-13  0:14 [PATCH 1/3] dev-dax: add support to display badblocks in sysfs for dev-dax Dave Jiang
  2016-12-13  0:14 ` [PATCH 2/3] nvdimm-testing: providing dax support for nvdimm testing Dave Jiang
@ 2016-12-13  0:15 ` Dave Jiang
       [not found] ` <148158809239.159590.16102609849408268953.stgit-Cxk7aZI4ujnJARH06PadV2t3HXsI98Cx0E9HWUfgJXw@public.gmane.org>
  2016-12-16  1:52 ` Elliott, Robert (Persistent Memory)
  3 siblings, 0 replies; 7+ messages in thread
From: Dave Jiang @ 2016-12-13  0:15 UTC (permalink / raw)
  To: dan.j.williams; +Cc: linux-nvdimm

Adding fallocate support to device-dax. This implements FALLOC_FL_PUNCH_HOLE
in order to allow clearing of badblocks/poison list.

Signed-off-by: Dave Jiang <dave.jiang@intel.com>
---
 drivers/dax/dax-private.h |    1 +
 drivers/dax/dax.c         |   28 +++++++++++++++++--
 drivers/dax/dax.h         |    4 ++-
 drivers/dax/pmem.c        |   68 ++++++++++++++++++++++++++++++++++++++++++++-
 fs/open.c                 |    2 +
 5 files changed, 97 insertions(+), 6 deletions(-)

diff --git a/drivers/dax/dax-private.h b/drivers/dax/dax-private.h
index 56f80d2..42ab18d 100644
--- a/drivers/dax/dax-private.h
+++ b/drivers/dax/dax-private.h
@@ -38,6 +38,7 @@ struct dax_dev {
 	int num_resources;
 	struct resource **res;
 	void *private;
+	const struct file_operations *fops;
 };
 
 #endif
diff --git a/drivers/dax/dax.c b/drivers/dax/dax.c
index 32c9a7f..cc02ea3 100644
--- a/drivers/dax/dax.c
+++ b/drivers/dax/dax.c
@@ -22,6 +22,7 @@
 #include <linux/dax.h>
 #include <linux/fs.h>
 #include <linux/mm.h>
+#include <linux/falloc.h>
 #include "dax.h"
 #include "dax-private.h"
 
@@ -394,6 +395,12 @@ void *dax_dev_get_private(struct device *dev)
 }
 EXPORT_SYMBOL_GPL(dax_dev_get_private);
 
+struct device *dax_dev_get_device(struct dax_dev *dax_dev)
+{
+	return &dax_dev->dev;
+}
+EXPORT_SYMBOL_GPL(dax_dev_get_device);
+
 void dax_dev_set_private(struct dax_dev *dax_dev, void *priv)
 {
 	dax_dev->private = priv;
@@ -797,7 +804,7 @@ static ssize_t dax_dev_resize(struct dax_region *dax_region,
 			&& &dax_dev->dev == dax_region->seed) {
 		struct dax_dev *seed;
 
-		seed = devm_create_dax_dev(dax_region, NULL, 0, NULL);
+		seed = devm_create_dax_dev(dax_region, NULL, 0, NULL, NULL);
 		if (IS_ERR(seed))
 			dev_warn(dax_region->dev,
 					"failed to create new region seed\n");
@@ -1114,6 +1121,17 @@ static int dax_release(struct inode *inode, struct file *filp)
 	return 0;
 }
 
+static long dax_fallocate(struct file *file, int mode,
+		loff_t offset, loff_t len)
+{
+	struct dax_dev *dax_dev = file->private_data;
+
+	if (dax_dev->fops)
+		return dax_dev->fops->fallocate(file, mode, offset, len);
+
+	return -EOPNOTSUPP;
+}
+
 static const struct file_operations dax_fops = {
 	.llseek = noop_llseek,
 	.owner = THIS_MODULE,
@@ -1121,6 +1139,7 @@ static const struct file_operations dax_fops = {
 	.release = dax_release,
 	.get_unmapped_area = dax_get_unmapped_area,
 	.mmap = dax_mmap,
+	.fallocate = dax_fallocate,
 };
 
 static void dax_dev_release(struct device *dev)
@@ -1138,7 +1157,8 @@ static void dax_dev_release(struct device *dev)
 
 struct dax_dev *devm_create_dax_dev(struct dax_region *dax_region,
 		struct resource *res, int count,
-		const struct attribute_group **groups)
+		const struct attribute_group **groups,
+		const struct file_operations *fops)
 {
 	struct device *parent = dax_region->dev;
 	struct dax_dev *dax_dev;
@@ -1260,10 +1280,12 @@ struct dax_dev *devm_create_dax_dev(struct dax_region *dax_region,
 	if (rc)
 		return ERR_PTR(rc);
 
+	dax_dev->fops = fops;
+
 	if (atomic_inc_return(&dax_region->child_count) == 1) {
 		struct dax_dev *seed;
 
-		seed = devm_create_dax_dev(dax_region, NULL, 0, NULL);
+		seed = devm_create_dax_dev(dax_region, NULL, 0, NULL, fops);
 		if (IS_ERR(seed))
 			dev_warn(parent, "failed to create region seed\n");
 		else
diff --git a/drivers/dax/dax.h b/drivers/dax/dax.h
index c23c7ac..6a31a74 100644
--- a/drivers/dax/dax.h
+++ b/drivers/dax/dax.h
@@ -24,8 +24,10 @@ struct dax_region *alloc_dax_region(struct device *parent,
 		void *addr, unsigned long flags);
 struct dax_dev *devm_create_dax_dev(struct dax_region *dax_region,
 		struct resource *res, int count,
-		const struct attribute_group **groups);
+		const struct attribute_group **groups,
+		const struct file_operations *fops);
 void *dax_dev_get_private(struct device *dev);
 void dax_dev_set_private(struct dax_dev *dax_dev, void *priv);
+struct device *dax_dev_get_device(struct dax_dev *dax_dev);
 
 #endif /* __DAX_H__ */
diff --git a/drivers/dax/pmem.c b/drivers/dax/pmem.c
index 808d3bb..ccf72b4 100644
--- a/drivers/dax/pmem.c
+++ b/drivers/dax/pmem.c
@@ -15,6 +15,7 @@
 #include <linux/module.h>
 #include <linux/pfn_t.h>
 #include <linux/badblocks.h>
+#include <linux/falloc.h>
 #include "../nvdimm/pfn.h"
 #include "../nvdimm/nd.h"
 #include "dax.h"
@@ -24,6 +25,69 @@ struct dax_pmem {
 	struct percpu_ref ref;
 	struct completion cmp;
 	struct badblocks bb;
+	resource_size_t start;
+	resource_size_t end;
+};
+
+static void dax_pmem_clear_poison(struct dax_pmem *dax_pmem,
+		loff_t offset, loff_t len)
+{
+	sector_t sector;
+	long cleared;
+
+	sector = offset >> 9;
+	cleared = nvdimm_clear_poison(dax_pmem->dev,
+			dax_pmem->start + offset, len);
+
+	if ((cleared > 0) && (cleared >> 9)) {
+		dev_dbg(dax_pmem->dev, "%s: %#llx clear %ld sector%s\n",
+				__func__, (unsigned long long)sector,
+				cleared >> 9, cleared >> 9 > 1 ? "s" : "");
+		badblocks_clear(&dax_pmem->bb, sector, cleared >> 9);
+	}
+}
+
+static long dax_pmem_fallocate(struct file *file, int mode,
+		loff_t start, loff_t len)
+{
+	struct dax_dev *dax_dev = file->private_data;
+	struct device *dev;
+	struct dax_pmem *dax_pmem;
+	loff_t end = start + len - 1;
+	loff_t res_size;
+
+	dev = dax_dev_get_device(dax_dev);
+	dax_pmem = dax_dev_get_private(dev);
+	res_size = dax_pmem->end - dax_pmem->start + 1;
+
+	dev_dbg(dev, "fallocate mode: %#x, start: %#llx, len: %llu\n",
+			mode, start, len);
+	dev_dbg(dev, "res start: %#llx end: %#llx size: %llu\n",
+			dax_pmem->start, dax_pmem->end, res_size);
+
+	/* check size boundares */
+	if (start >= dax_pmem->end)
+		return -EINVAL;
+	if (end >= res_size) {
+		if (mode & FALLOC_FL_KEEP_SIZE)
+			len = res_size - start;
+		else
+			return -EINVAL;
+	}
+
+	switch (mode) {
+	case FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE:
+		dax_pmem_clear_poison(dax_pmem, start, len);
+		break;
+	default:
+		return -EOPNOTSUPP;
+	}
+
+	return 0;
+}
+
+static const struct file_operations pmem_fops = {
+	.fallocate = dax_pmem_fallocate,
 };
 
 static ssize_t dax_pmem_badblocks_show(struct device *dev,
@@ -158,8 +222,10 @@ static int dax_pmem_probe(struct device *dev)
 
 	/* TODO: support for subdividing a dax region... */
 	dax_dev = devm_create_dax_dev(dax_region, &res, 1,
-			dax_pmem_attribute_groups);
+			dax_pmem_attribute_groups, &pmem_fops);
 	dax_dev_set_private(dax_dev, dax_pmem);
+	dax_pmem->start = res.start;
+	dax_pmem->end = res.end;
 
 	rc = devm_init_badblocks(dev, &dax_pmem->bb);
 	if (rc)
diff --git a/fs/open.c b/fs/open.c
index d3ed817..15325fd 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -306,7 +306,7 @@ int vfs_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
 	 * for directories or not.
 	 */
 	if (!S_ISREG(inode->i_mode) && !S_ISDIR(inode->i_mode) &&
-	    !S_ISBLK(inode->i_mode))
+	    !S_ISBLK(inode->i_mode) && !S_ISCHR(inode->i_mode))
 		return -ENODEV;
 
 	/* Check for wrap through zero too */

_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/3] dev-dax: add support to display badblocks in sysfs for dev-dax
       [not found] ` <148158809239.159590.16102609849408268953.stgit-Cxk7aZI4ujnJARH06PadV2t3HXsI98Cx0E9HWUfgJXw@public.gmane.org>
@ 2016-12-14 21:12   ` Jeff Moyer
       [not found]     ` <x491sxadxkn.fsf-RRHT56Q3PSP4kTEheFKJxxDDeQx5vsVwAInAS/Ez/D0@public.gmane.org>
  0 siblings, 1 reply; 7+ messages in thread
From: Jeff Moyer @ 2016-12-14 21:12 UTC (permalink / raw)
  To: Dave Jiang; +Cc: linux-nvdimm-y27Ovi1pjclAfugRpC6u6w

Dave Jiang <dave.jiang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org> writes:

> Adding support to show badblocks in the pmem region that's provided
> by the poison_list. This should show up in
> /sys/class/dax/daxN.N/badblocks as read only. Currently we only support
> a single resource and we do not support badblocks for seeds. Additional
> support code will be implemented to support.

You didn't wire up a notify event.  Was that intentional?

-Jeff

>
> Signed-off-by: Dave Jiang <dave.jiang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
> ---
>  drivers/dax/dax.c  |   27 ++++++++++++++++++++++-----
>  drivers/dax/dax.h  |    8 +++++++-
>  drivers/dax/pmem.c |   37 ++++++++++++++++++++++++++++++++++++-
>  3 files changed, 65 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/dax/dax.c b/drivers/dax/dax.c
> index 6450c07..2c34cae 100644
> --- a/drivers/dax/dax.c
> +++ b/drivers/dax/dax.c
> @@ -83,6 +83,7 @@ struct dax_dev {
>  	int id;
>  	int num_resources;
>  	struct resource **res;
> +	void *private;
>  };
>  
>  #define for_each_dax_region_resource(dax_region, res) \
> @@ -408,6 +409,20 @@ static struct dax_dev *to_dax_dev(struct device *dev)
>  	return container_of(dev, struct dax_dev, dev);
>  }
>  
> +void *dax_dev_get_private(struct device *dev)
> +{
> +	struct dax_dev *dax_dev = to_dax_dev(dev);
> +
> +	return dax_dev->private;
> +}
> +EXPORT_SYMBOL_GPL(dax_dev_get_private);
> +
> +void dax_dev_set_private(struct dax_dev *dax_dev, void *priv)
> +{
> +	dax_dev->private = priv;
> +}
> +EXPORT_SYMBOL_GPL(dax_dev_set_private);
> +
>  static unsigned long long dax_dev_size(struct dax_dev *dax_dev)
>  {
>  	struct dax_region *dax_region = dax_dev->region;
> @@ -805,7 +820,7 @@ static ssize_t dax_dev_resize(struct dax_region *dax_region,
>  			&& &dax_dev->dev == dax_region->seed) {
>  		struct dax_dev *seed;
>  
> -		seed = devm_create_dax_dev(dax_region, NULL, 0);
> +		seed = devm_create_dax_dev(dax_region, NULL, 0, NULL);
>  		if (IS_ERR(seed))
>  			dev_warn(dax_region->dev,
>  					"failed to create new region seed\n");
> @@ -851,9 +866,10 @@ static struct attribute *dax_device_attributes[] = {
>  	NULL,
>  };
>  
> -static const struct attribute_group dax_device_attribute_group = {
> +struct attribute_group dax_device_attribute_group = {
>  	.attrs = dax_device_attributes,
>  };
> +EXPORT_SYMBOL_GPL(dax_device_attribute_group);
>  
>  static const struct attribute_group *dax_attribute_groups[] = {
>  	&dax_device_attribute_group,
> @@ -1143,7 +1159,8 @@ static void dax_dev_release(struct device *dev)
>  }
>  
>  struct dax_dev *devm_create_dax_dev(struct dax_region *dax_region,
> -		struct resource *res, int count)
> +		struct resource *res, int count,
> +		const struct attribute_group **groups)
>  {
>  	struct device *parent = dax_region->dev;
>  	struct dax_dev *dax_dev;
> @@ -1248,7 +1265,7 @@ struct dax_dev *devm_create_dax_dev(struct dax_region *dax_region,
>  	dev->devt = dev_t;
>  	dev->class = dax_class;
>  	dev->parent = parent;
> -	dev->groups = dax_attribute_groups;
> +	dev->groups = groups ? groups : dax_attribute_groups;
>  	dev->release = dax_dev_release;
>  	dev_set_name(dev, "dax%d.%d", dax_region->id, dax_dev->id);
>  	/* update resource names now that the owner device is named */
> @@ -1268,7 +1285,7 @@ struct dax_dev *devm_create_dax_dev(struct dax_region *dax_region,
>  	if (atomic_inc_return(&dax_region->child_count) == 1) {
>  		struct dax_dev *seed;
>  
> -		seed = devm_create_dax_dev(dax_region, NULL, 0);
> +		seed = devm_create_dax_dev(dax_region, NULL, 0, NULL);
>  		if (IS_ERR(seed))
>  			dev_warn(parent, "failed to create region seed\n");
>  		else
> diff --git a/drivers/dax/dax.h b/drivers/dax/dax.h
> index ddd829a..c23c7ac 100644
> --- a/drivers/dax/dax.h
> +++ b/drivers/dax/dax.h
> @@ -16,10 +16,16 @@ struct device;
>  struct dax_dev;
>  struct resource;
>  struct dax_region;
> +extern struct attribute_group dax_device_attribute_group;
> +
>  void dax_region_put(struct dax_region *dax_region);
>  struct dax_region *alloc_dax_region(struct device *parent,
>  		int region_id, struct resource *res, unsigned int align,
>  		void *addr, unsigned long flags);
>  struct dax_dev *devm_create_dax_dev(struct dax_region *dax_region,
> -		struct resource *res, int count);
> +		struct resource *res, int count,
> +		const struct attribute_group **groups);
> +void *dax_dev_get_private(struct device *dev);
> +void dax_dev_set_private(struct dax_dev *dax_dev, void *priv);
> +
>  #endif /* __DAX_H__ */
> diff --git a/drivers/dax/pmem.c b/drivers/dax/pmem.c
> index 033f49b3..808d3bb 100644
> --- a/drivers/dax/pmem.c
> +++ b/drivers/dax/pmem.c
> @@ -14,6 +14,7 @@
>  #include <linux/memremap.h>
>  #include <linux/module.h>
>  #include <linux/pfn_t.h>
> +#include <linux/badblocks.h>
>  #include "../nvdimm/pfn.h"
>  #include "../nvdimm/nd.h"
>  #include "dax.h"
> @@ -22,6 +23,32 @@ struct dax_pmem {
>  	struct device *dev;
>  	struct percpu_ref ref;
>  	struct completion cmp;
> +	struct badblocks bb;
> +};
> +
> +static ssize_t dax_pmem_badblocks_show(struct device *dev,
> +		struct device_attribute *attr, char *page)
> +{
> +	struct dax_pmem *dax_pmem =
> +		(struct dax_pmem *)dax_dev_get_private(dev);
> +
> +	return badblocks_show(&dax_pmem->bb, page, 0);
> +}
> +static DEVICE_ATTR(badblocks, S_IRUGO, dax_pmem_badblocks_show, NULL);
> +
> +static struct attribute *dax_pmem_badblock_attributes[] = {
> +	&dev_attr_badblocks.attr,
> +	NULL,
> +};
> +
> +static struct attribute_group dax_pmem_badblock_attribute_group = {
> +	.attrs = dax_pmem_badblock_attributes,
> +};
> +
> +static const struct attribute_group *dax_pmem_attribute_groups[] = {
> +	&dax_device_attribute_group,
> +	&dax_pmem_badblock_attribute_group,
> +	NULL,
>  };
>  
>  static struct dax_pmem *to_dax_pmem(struct percpu_ref *ref)
> @@ -130,7 +157,15 @@ static int dax_pmem_probe(struct device *dev)
>  		return -ENOMEM;
>  
>  	/* TODO: support for subdividing a dax region... */
> -	dax_dev = devm_create_dax_dev(dax_region, &res, 1);
> +	dax_dev = devm_create_dax_dev(dax_region, &res, 1,
> +			dax_pmem_attribute_groups);
> +	dax_dev_set_private(dax_dev, dax_pmem);
> +
> +	rc = devm_init_badblocks(dev, &dax_pmem->bb);
> +	if (rc)
> +		return rc;
> +
> +	nvdimm_badblocks_populate(nd_region, &dax_pmem->bb, &res);
>  
>  	/* child dax_dev instances now own the lifetime of the dax_region */
>  	dax_region_put(dax_region);
>
> _______________________________________________
> Linux-nvdimm mailing list
> Linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw@public.gmane.org
> https://lists.01.org/mailman/listinfo/linux-nvdimm

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/3] dev-dax: add support to display badblocks in sysfs for dev-dax
       [not found]     ` <x491sxadxkn.fsf-RRHT56Q3PSP4kTEheFKJxxDDeQx5vsVwAInAS/Ez/D0@public.gmane.org>
@ 2016-12-14 22:51       ` Dave Jiang
  0 siblings, 0 replies; 7+ messages in thread
From: Dave Jiang @ 2016-12-14 22:51 UTC (permalink / raw)
  To: Jeff Moyer; +Cc: linux-nvdimm-y27Ovi1pjclAfugRpC6u6w



On 12/14/2016 02:12 PM, Jeff Moyer wrote:
> Dave Jiang <dave.jiang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org> writes:
> 
>> Adding support to show badblocks in the pmem region that's provided
>> by the poison_list. This should show up in
>> /sys/class/dax/daxN.N/badblocks as read only. Currently we only support
>> a single resource and we do not support badblocks for seeds. Additional
>> support code will be implemented to support.
> 
> You didn't wire up a notify event.  Was that intentional?

No. I totally missed it. Good catch!

> 
> -Jeff
> 
>>
>> Signed-off-by: Dave Jiang <dave.jiang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
>> ---
>>  drivers/dax/dax.c  |   27 ++++++++++++++++++++++-----
>>  drivers/dax/dax.h  |    8 +++++++-
>>  drivers/dax/pmem.c |   37 ++++++++++++++++++++++++++++++++++++-
>>  3 files changed, 65 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/dax/dax.c b/drivers/dax/dax.c
>> index 6450c07..2c34cae 100644
>> --- a/drivers/dax/dax.c
>> +++ b/drivers/dax/dax.c
>> @@ -83,6 +83,7 @@ struct dax_dev {
>>  	int id;
>>  	int num_resources;
>>  	struct resource **res;
>> +	void *private;
>>  };
>>  
>>  #define for_each_dax_region_resource(dax_region, res) \
>> @@ -408,6 +409,20 @@ static struct dax_dev *to_dax_dev(struct device *dev)
>>  	return container_of(dev, struct dax_dev, dev);
>>  }
>>  
>> +void *dax_dev_get_private(struct device *dev)
>> +{
>> +	struct dax_dev *dax_dev = to_dax_dev(dev);
>> +
>> +	return dax_dev->private;
>> +}
>> +EXPORT_SYMBOL_GPL(dax_dev_get_private);
>> +
>> +void dax_dev_set_private(struct dax_dev *dax_dev, void *priv)
>> +{
>> +	dax_dev->private = priv;
>> +}
>> +EXPORT_SYMBOL_GPL(dax_dev_set_private);
>> +
>>  static unsigned long long dax_dev_size(struct dax_dev *dax_dev)
>>  {
>>  	struct dax_region *dax_region = dax_dev->region;
>> @@ -805,7 +820,7 @@ static ssize_t dax_dev_resize(struct dax_region *dax_region,
>>  			&& &dax_dev->dev == dax_region->seed) {
>>  		struct dax_dev *seed;
>>  
>> -		seed = devm_create_dax_dev(dax_region, NULL, 0);
>> +		seed = devm_create_dax_dev(dax_region, NULL, 0, NULL);
>>  		if (IS_ERR(seed))
>>  			dev_warn(dax_region->dev,
>>  					"failed to create new region seed\n");
>> @@ -851,9 +866,10 @@ static struct attribute *dax_device_attributes[] = {
>>  	NULL,
>>  };
>>  
>> -static const struct attribute_group dax_device_attribute_group = {
>> +struct attribute_group dax_device_attribute_group = {
>>  	.attrs = dax_device_attributes,
>>  };
>> +EXPORT_SYMBOL_GPL(dax_device_attribute_group);
>>  
>>  static const struct attribute_group *dax_attribute_groups[] = {
>>  	&dax_device_attribute_group,
>> @@ -1143,7 +1159,8 @@ static void dax_dev_release(struct device *dev)
>>  }
>>  
>>  struct dax_dev *devm_create_dax_dev(struct dax_region *dax_region,
>> -		struct resource *res, int count)
>> +		struct resource *res, int count,
>> +		const struct attribute_group **groups)
>>  {
>>  	struct device *parent = dax_region->dev;
>>  	struct dax_dev *dax_dev;
>> @@ -1248,7 +1265,7 @@ struct dax_dev *devm_create_dax_dev(struct dax_region *dax_region,
>>  	dev->devt = dev_t;
>>  	dev->class = dax_class;
>>  	dev->parent = parent;
>> -	dev->groups = dax_attribute_groups;
>> +	dev->groups = groups ? groups : dax_attribute_groups;
>>  	dev->release = dax_dev_release;
>>  	dev_set_name(dev, "dax%d.%d", dax_region->id, dax_dev->id);
>>  	/* update resource names now that the owner device is named */
>> @@ -1268,7 +1285,7 @@ struct dax_dev *devm_create_dax_dev(struct dax_region *dax_region,
>>  	if (atomic_inc_return(&dax_region->child_count) == 1) {
>>  		struct dax_dev *seed;
>>  
>> -		seed = devm_create_dax_dev(dax_region, NULL, 0);
>> +		seed = devm_create_dax_dev(dax_region, NULL, 0, NULL);
>>  		if (IS_ERR(seed))
>>  			dev_warn(parent, "failed to create region seed\n");
>>  		else
>> diff --git a/drivers/dax/dax.h b/drivers/dax/dax.h
>> index ddd829a..c23c7ac 100644
>> --- a/drivers/dax/dax.h
>> +++ b/drivers/dax/dax.h
>> @@ -16,10 +16,16 @@ struct device;
>>  struct dax_dev;
>>  struct resource;
>>  struct dax_region;
>> +extern struct attribute_group dax_device_attribute_group;
>> +
>>  void dax_region_put(struct dax_region *dax_region);
>>  struct dax_region *alloc_dax_region(struct device *parent,
>>  		int region_id, struct resource *res, unsigned int align,
>>  		void *addr, unsigned long flags);
>>  struct dax_dev *devm_create_dax_dev(struct dax_region *dax_region,
>> -		struct resource *res, int count);
>> +		struct resource *res, int count,
>> +		const struct attribute_group **groups);
>> +void *dax_dev_get_private(struct device *dev);
>> +void dax_dev_set_private(struct dax_dev *dax_dev, void *priv);
>> +
>>  #endif /* __DAX_H__ */
>> diff --git a/drivers/dax/pmem.c b/drivers/dax/pmem.c
>> index 033f49b3..808d3bb 100644
>> --- a/drivers/dax/pmem.c
>> +++ b/drivers/dax/pmem.c
>> @@ -14,6 +14,7 @@
>>  #include <linux/memremap.h>
>>  #include <linux/module.h>
>>  #include <linux/pfn_t.h>
>> +#include <linux/badblocks.h>
>>  #include "../nvdimm/pfn.h"
>>  #include "../nvdimm/nd.h"
>>  #include "dax.h"
>> @@ -22,6 +23,32 @@ struct dax_pmem {
>>  	struct device *dev;
>>  	struct percpu_ref ref;
>>  	struct completion cmp;
>> +	struct badblocks bb;
>> +};
>> +
>> +static ssize_t dax_pmem_badblocks_show(struct device *dev,
>> +		struct device_attribute *attr, char *page)
>> +{
>> +	struct dax_pmem *dax_pmem =
>> +		(struct dax_pmem *)dax_dev_get_private(dev);
>> +
>> +	return badblocks_show(&dax_pmem->bb, page, 0);
>> +}
>> +static DEVICE_ATTR(badblocks, S_IRUGO, dax_pmem_badblocks_show, NULL);
>> +
>> +static struct attribute *dax_pmem_badblock_attributes[] = {
>> +	&dev_attr_badblocks.attr,
>> +	NULL,
>> +};
>> +
>> +static struct attribute_group dax_pmem_badblock_attribute_group = {
>> +	.attrs = dax_pmem_badblock_attributes,
>> +};
>> +
>> +static const struct attribute_group *dax_pmem_attribute_groups[] = {
>> +	&dax_device_attribute_group,
>> +	&dax_pmem_badblock_attribute_group,
>> +	NULL,
>>  };
>>  
>>  static struct dax_pmem *to_dax_pmem(struct percpu_ref *ref)
>> @@ -130,7 +157,15 @@ static int dax_pmem_probe(struct device *dev)
>>  		return -ENOMEM;
>>  
>>  	/* TODO: support for subdividing a dax region... */
>> -	dax_dev = devm_create_dax_dev(dax_region, &res, 1);
>> +	dax_dev = devm_create_dax_dev(dax_region, &res, 1,
>> +			dax_pmem_attribute_groups);
>> +	dax_dev_set_private(dax_dev, dax_pmem);
>> +
>> +	rc = devm_init_badblocks(dev, &dax_pmem->bb);
>> +	if (rc)
>> +		return rc;
>> +
>> +	nvdimm_badblocks_populate(nd_region, &dax_pmem->bb, &res);
>>  
>>  	/* child dax_dev instances now own the lifetime of the dax_region */
>>  	dax_region_put(dax_region);
>>
>> _______________________________________________
>> Linux-nvdimm mailing list
>> Linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw@public.gmane.org
>> https://lists.01.org/mailman/listinfo/linux-nvdimm

^ permalink raw reply	[flat|nested] 7+ messages in thread

* RE: [PATCH 1/3] dev-dax: add support to display badblocks in sysfs for dev-dax
  2016-12-13  0:14 [PATCH 1/3] dev-dax: add support to display badblocks in sysfs for dev-dax Dave Jiang
                   ` (2 preceding siblings ...)
       [not found] ` <148158809239.159590.16102609849408268953.stgit-Cxk7aZI4ujnJARH06PadV2t3HXsI98Cx0E9HWUfgJXw@public.gmane.org>
@ 2016-12-16  1:52 ` Elliott, Robert (Persistent Memory)
  2016-12-16  2:43   ` Dan Williams
  3 siblings, 1 reply; 7+ messages in thread
From: Elliott, Robert (Persistent Memory) @ 2016-12-16  1:52 UTC (permalink / raw)
  To: Dave Jiang, dan.j.williams; +Cc: linux-nvdimm

> -----Original Message-----
> From: Linux-nvdimm [mailto:linux-nvdimm-bounces@lists.01.org] On
> Behalf Of Dave Jiang
> Sent: Monday, December 12, 2016 6:15 PM
> Subject: [PATCH 1/3] dev-dax: add support to display badblocks in
> sysfs for dev-dax
> 
> Adding support to show badblocks in the pmem region that's provided
> by the poison_list. This should show up in
> /sys/class/dax/daxN.N/badblocks as read only. Currently we only
> support
> a single resource and we do not support badblocks for seeds.
> Additional
> support code will be implemented to support.
> 
...
> diff --git a/drivers/dax/pmem.c b/drivers/dax/pmem.c
...
> +static ssize_t dax_pmem_badblocks_show(struct device *dev,
> +		struct device_attribute *attr, char *page)
> +{
> +	struct dax_pmem *dax_pmem =
> +		(struct dax_pmem *)dax_dev_get_private(dev);
> +
> +	return badblocks_show(&dax_pmem->bb, page, 0);
> +}

Do /dev/dax devices have a "block size" to explain the units used in
the sysfs files?  If so, where is it reported?

This directory has the total size in bytes (here, 8 GiB - 2 MiB):
/sys/class/dax/dax0.0/dev:242:0
/sys/class/dax/dax0.0/size:8587837440
/sys/class/dax/dax0.0/uevent:MAJOR=242
/sys/class/dax/dax0.0/uevent:MINOR=0
/sys/class/dax/dax0.0/uevent:DEVNAME=dax0.0

In contrast, /dev/pmem devices have a full "queue" directory,
including logical_block_size.

/sys/class/block/pmem0/device/devtype:nd_namespace_io
/sys/class/block/pmem0/device/force_raw:0
/sys/class/block/pmem0/device/modalias:nd:t4
/sys/class/block/pmem0/device/mode:raw
/sys/class/block/pmem0/device/nstype:4
/sys/class/block/pmem0/device/numa_node:0
/sys/class/block/pmem0/device/resource:0x880000000
/sys/class/block/pmem0/device/size:8589934592
/sys/class/block/pmem0/device/uevent:DEVTYPE=nd_namespace_io
/sys/class/block/pmem0/device/uevent:DRIVER=nd_pmem
/sys/class/block/pmem0/device/uevent:MODALIAS=nd:t4
/sys/class/block/pmem0/queue/add_random:0
/sys/class/block/pmem0/queue/dax:1
/sys/class/block/pmem0/queue/discard_granularity:0
/sys/class/block/pmem0/queue/discard_max_bytes:0
/sys/class/block/pmem0/queue/discard_max_hw_bytes:0
/sys/class/block/pmem0/queue/discard_zeroes_data:0
/sys/class/block/pmem0/queue/hw_sector_size:512
/sys/class/block/pmem0/queue/io_poll:0
/sys/class/block/pmem0/queue/iostats:0
/sys/class/block/pmem0/queue/logical_block_size:512
/sys/class/block/pmem0/queue/max_hw_sectors_kb:2147483647
/sys/class/block/pmem0/queue/max_integrity_segments:0
/sys/class/block/pmem0/queue/max_sectors_kb:1280
/sys/class/block/pmem0/queue/max_segments:128
/sys/class/block/pmem0/queue/max_segment_size:65536
/sys/class/block/pmem0/queue/minimum_io_size:4096
/sys/class/block/pmem0/queue/nomerges:0
/sys/class/block/pmem0/queue/nr_requests:128
/sys/class/block/pmem0/queue/optimal_io_size:0
/sys/class/block/pmem0/queue/physical_block_size:4096
/sys/class/block/pmem0/queue/read_ahead_kb:128
/sys/class/block/pmem0/queue/rotational:0
/sys/class/block/pmem0/queue/rq_affinity:0
/sys/class/block/pmem0/queue/scheduler:none
/sys/class/block/pmem0/queue/write_cache:write back
/sys/class/block/pmem0/queue/write_same_max_bytes:0


---
Robert Elliott, HPE Persistent Memory


_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/3] dev-dax: add support to display badblocks in sysfs for dev-dax
  2016-12-16  1:52 ` Elliott, Robert (Persistent Memory)
@ 2016-12-16  2:43   ` Dan Williams
  0 siblings, 0 replies; 7+ messages in thread
From: Dan Williams @ 2016-12-16  2:43 UTC (permalink / raw)
  To: Elliott, Robert (Persistent Memory); +Cc: linux-nvdimm

On Thu, Dec 15, 2016 at 5:52 PM, Elliott, Robert (Persistent Memory)
<elliott@hpe.com> wrote:
>> -----Original Message-----
>> From: Linux-nvdimm [mailto:linux-nvdimm-bounces@lists.01.org] On
>> Behalf Of Dave Jiang
>> Sent: Monday, December 12, 2016 6:15 PM
>> Subject: [PATCH 1/3] dev-dax: add support to display badblocks in
>> sysfs for dev-dax
>>
>> Adding support to show badblocks in the pmem region that's provided
>> by the poison_list. This should show up in
>> /sys/class/dax/daxN.N/badblocks as read only. Currently we only
>> support
>> a single resource and we do not support badblocks for seeds.
>> Additional
>> support code will be implemented to support.
>>
> ...
>> diff --git a/drivers/dax/pmem.c b/drivers/dax/pmem.c
> ...
>> +static ssize_t dax_pmem_badblocks_show(struct device *dev,
>> +struct device_attribute *attr, char *page)
>> +{
>> +struct dax_pmem *dax_pmem =
>> +(struct dax_pmem *)dax_dev_get_private(dev);
>> +
>> +return badblocks_show(&dax_pmem->bb, page, 0);
>> +}
>
> Do /dev/dax devices have a "block size" to explain the units used in
> the sysfs files?  If so, where is it reported?

The "badblocks" sysfs interface is always in 512 byte logical units.
If badblocks ever grew support for other block sizes we would add it
as an attribute of the badblocks interface directly and not rely on
traversing other parts of the sysfs topology.
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2016-12-16  2:43 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-12-13  0:14 [PATCH 1/3] dev-dax: add support to display badblocks in sysfs for dev-dax Dave Jiang
2016-12-13  0:14 ` [PATCH 2/3] nvdimm-testing: providing dax support for nvdimm testing Dave Jiang
2016-12-13  0:15 ` [PATCH 3/3] dev-dax: add fallocate support to clear poison Dave Jiang
     [not found] ` <148158809239.159590.16102609849408268953.stgit-Cxk7aZI4ujnJARH06PadV2t3HXsI98Cx0E9HWUfgJXw@public.gmane.org>
2016-12-14 21:12   ` [PATCH 1/3] dev-dax: add support to display badblocks in sysfs for dev-dax Jeff Moyer
     [not found]     ` <x491sxadxkn.fsf-RRHT56Q3PSP4kTEheFKJxxDDeQx5vsVwAInAS/Ez/D0@public.gmane.org>
2016-12-14 22:51       ` Dave Jiang
2016-12-16  1:52 ` Elliott, Robert (Persistent Memory)
2016-12-16  2:43   ` Dan Williams

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.