linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/3] Support DAX for device-mapper dm-linear devices
@ 2016-06-22 23:54 Toshi Kani
  2016-06-22 23:54 ` [PATCH v2 1/3] block: add QUEUE_FLAG_DAX for devices to advertise their DAX support Toshi Kani
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Toshi Kani @ 2016-06-22 23:54 UTC (permalink / raw)
  To: snitzer, axboe, dan.j.williams
  Cc: agk, ross.zwisler, viro, toshi.kani, linux-nvdimm, dm-devel,
	linux-raid, linux-kernel

This patch-set adds DAX support to device-mapper dm-linear devices
used by LVM.  It works with LVM commands as follows:
 - Creation of a logical volume with all DAX capable devices (such
   as pmem) sets the logical volume DAX capable as well.
 - Once a logical volume is set to DAX capable, the volume may not
   be extended with non-DAX capable devices.

The direct_access interface is added to dm and dm-linear to map
a request to a target device.

The patches replace v1 series at:
http://git.kernel.org/cgit/linux/kernel/git/snitzer/linux.git/log/?h=wip

v2:
 - Fix issue with partitioning.
 - Change to add DAX flag to a request queue.

---
Toshi Kani (3):
 1/3 block: add QUEUE_FLAG_DAX for devices to advertise their DAX support
 2/3 dm: add infrastructure for DAX support
 3/3 dm linear: add DAX support

---
 drivers/block/brd.c           |  4 +++-
 drivers/md/dm-linear.c        | 23 ++++++++++++++++++++++-
 drivers/md/dm-table.c         | 23 ++++++++++++++++++++---
 drivers/md/dm.c               | 36 +++++++++++++++++++++++++++++++++++-
 drivers/md/dm.h               |  1 +
 drivers/nvdimm/pmem.c         |  1 +
 drivers/s390/block/dcssblk.c  |  1 +
 fs/block_dev.c                |  5 +++--
 include/linux/blkdev.h        |  2 ++
 include/linux/device-mapper.h | 16 ++++++++++++++++
 10 files changed, 104 insertions(+), 8 deletions(-)

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

* [PATCH v2 1/3] block: add QUEUE_FLAG_DAX for devices to advertise their DAX support
  2016-06-22 23:54 [PATCH v2 0/3] Support DAX for device-mapper dm-linear devices Toshi Kani
@ 2016-06-22 23:54 ` Toshi Kani
  2016-06-23 16:31   ` Yigal Korman
  2016-06-22 23:54 ` [PATCH v2 2/3] dm: add infrastructure for " Toshi Kani
  2016-06-22 23:54 ` [PATCH v2 3/3] dm linear: add " Toshi Kani
  2 siblings, 1 reply; 9+ messages in thread
From: Toshi Kani @ 2016-06-22 23:54 UTC (permalink / raw)
  To: snitzer, axboe, dan.j.williams
  Cc: agk, ross.zwisler, viro, toshi.kani, linux-nvdimm, dm-devel,
	linux-raid, linux-kernel, Martin Schwidefsky, Heiko Carstens,
	linux-s390

Currently, presence of direct_access() in block_device_operations
indicates support of DAX on its block device.  Because
block_device_operations is instantiated with 'const', this DAX
capablity may not be enabled conditinally.

In preparation for supporting DAX to device-mapper devices, add
QUEUE_FLAG_DAX to request_queue flags to advertise their DAX
support.  This will allow to set the DAX capability based on how
mapped device is composed.

Signed-off-by: Toshi Kani <toshi.kani@hpe.com>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Ross Zwisler <ross.zwisler@linux.intel.com>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: <linux-s390@vger.kernel.org>
---
 drivers/block/brd.c          |    4 +++-
 drivers/nvdimm/pmem.c        |    1 +
 drivers/s390/block/dcssblk.c |    1 +
 fs/block_dev.c               |    5 +++--
 include/linux/blkdev.h       |    2 ++
 5 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/drivers/block/brd.c b/drivers/block/brd.c
index f5b0d6f..dd96a93 100644
--- a/drivers/block/brd.c
+++ b/drivers/block/brd.c
@@ -509,7 +509,9 @@ static struct brd_device *brd_alloc(int i)
 	blk_queue_max_discard_sectors(brd->brd_queue, UINT_MAX);
 	brd->brd_queue->limits.discard_zeroes_data = 1;
 	queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, brd->brd_queue);
-
+#ifdef CONFIG_BLK_DEV_RAM_DAX
+	queue_flag_set_unlocked(QUEUE_FLAG_DAX, brd->brd_queue);
+#endif
 	disk = brd->brd_disk = alloc_disk(max_part);
 	if (!disk)
 		goto out_free_queue;
diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c
index 608fc44..53b701b 100644
--- a/drivers/nvdimm/pmem.c
+++ b/drivers/nvdimm/pmem.c
@@ -283,6 +283,7 @@ static int pmem_attach_disk(struct device *dev,
 	blk_queue_max_hw_sectors(q, UINT_MAX);
 	blk_queue_bounce_limit(q, BLK_BOUNCE_ANY);
 	queue_flag_set_unlocked(QUEUE_FLAG_NONROT, q);
+	queue_flag_set_unlocked(QUEUE_FLAG_DAX, q);
 	q->queuedata = pmem;
 
 	disk = alloc_disk_node(0, nid);
diff --git a/drivers/s390/block/dcssblk.c b/drivers/s390/block/dcssblk.c
index bed53c4..093e9e1 100644
--- a/drivers/s390/block/dcssblk.c
+++ b/drivers/s390/block/dcssblk.c
@@ -618,6 +618,7 @@ dcssblk_add_store(struct device *dev, struct device_attribute *attr, const char
 	dev_info->gd->driverfs_dev = &dev_info->dev;
 	blk_queue_make_request(dev_info->dcssblk_queue, dcssblk_make_request);
 	blk_queue_logical_block_size(dev_info->dcssblk_queue, 4096);
+	queue_flag_set_unlocked(QUEUE_FLAG_DAX, dev_info->dcssblk_queue);
 
 	seg_byte_size = (dev_info->end - dev_info->start + 1);
 	set_capacity(dev_info->gd, seg_byte_size >> 9); // size in sectors
diff --git a/fs/block_dev.c b/fs/block_dev.c
index 71ccab1..d012be4 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -493,7 +493,7 @@ long bdev_direct_access(struct block_device *bdev, struct blk_dax_ctl *dax)
 
 	if (size < 0)
 		return size;
-	if (!ops->direct_access)
+	if (!blk_queue_dax(bdev_get_queue(bdev)) || !ops->direct_access)
 		return -EOPNOTSUPP;
 	if ((sector + DIV_ROUND_UP(size, 512)) >
 					part_nr_sects_read(bdev->bd_part))
@@ -1287,7 +1287,8 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
 		bdev->bd_disk = disk;
 		bdev->bd_queue = disk->queue;
 		bdev->bd_contains = bdev;
-		if (IS_ENABLED(CONFIG_BLK_DEV_DAX) && disk->fops->direct_access)
+		if (IS_ENABLED(CONFIG_BLK_DEV_DAX) &&
+		    blk_queue_dax(disk->queue))
 			bdev->bd_inode->i_flags = S_DAX;
 		else
 			bdev->bd_inode->i_flags = 0;
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index 9746d22..1493ab3 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -505,6 +505,7 @@ struct request_queue {
 #define QUEUE_FLAG_WC	       23	/* Write back caching */
 #define QUEUE_FLAG_FUA	       24	/* device supports FUA writes */
 #define QUEUE_FLAG_FLUSH_NQ    25	/* flush not queueuable */
+#define QUEUE_FLAG_DAX         26	/* device supports DAX */
 
 #define QUEUE_FLAG_DEFAULT	((1 << QUEUE_FLAG_IO_STAT) |		\
 				 (1 << QUEUE_FLAG_STACKABLE)	|	\
@@ -594,6 +595,7 @@ static inline void queue_flag_clear(unsigned int flag, struct request_queue *q)
 #define blk_queue_discard(q)	test_bit(QUEUE_FLAG_DISCARD, &(q)->queue_flags)
 #define blk_queue_secdiscard(q)	(blk_queue_discard(q) && \
 	test_bit(QUEUE_FLAG_SECDISCARD, &(q)->queue_flags))
+#define blk_queue_dax(q)	test_bit(QUEUE_FLAG_DAX, &(q)->queue_flags)
 
 #define blk_noretry_request(rq) \
 	((rq)->cmd_flags & (REQ_FAILFAST_DEV|REQ_FAILFAST_TRANSPORT| \

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

* [PATCH v2 2/3] dm: add infrastructure for DAX support
  2016-06-22 23:54 [PATCH v2 0/3] Support DAX for device-mapper dm-linear devices Toshi Kani
  2016-06-22 23:54 ` [PATCH v2 1/3] block: add QUEUE_FLAG_DAX for devices to advertise their DAX support Toshi Kani
@ 2016-06-22 23:54 ` Toshi Kani
  2016-06-22 23:54 ` [PATCH v2 3/3] dm linear: add " Toshi Kani
  2 siblings, 0 replies; 9+ messages in thread
From: Toshi Kani @ 2016-06-22 23:54 UTC (permalink / raw)
  To: snitzer, axboe, dan.j.williams
  Cc: agk, ross.zwisler, viro, toshi.kani, linux-nvdimm, dm-devel,
	linux-raid, linux-kernel

Change mapped device to implement direct_access function,
dm_blk_direct_access(), which calls a target direct_access function.
'struct target_type' is extended to have target direct_access interface.
This function limits direct accessible size to the dm_target's limit
with max_io_len().

Extend 'struct dm_target' to have dax_supported bit, which allows
dm-table to check if a dm-target supports DAX.

Add a new dm type, DM_TYPE_DAX_BIO_BASED, which indicates that mapped
device supports DAX and is bio based.  This new type is used to assure
that all target devices have DAX support and remain that way after
QUEUE_FLAG_DAX is set in mapped device.

At initial table load, QUEUE_FLAG_DAX is set to mapped device when setting
DM_TYPE_DAX_BIO_BASED to the type.  Any subsequent table load to the
mapped device must have the same type, or else it fails per the check in
table_load().

Signed-off-by: Toshi Kani <toshi.kani@hpe.com>
Cc: Alasdair Kergon <agk@redhat.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Ross Zwisler <ross.zwisler@linux.intel.com>
---
 drivers/md/dm-table.c         |   23 ++++++++++++++++++++---
 drivers/md/dm.c               |   36 +++++++++++++++++++++++++++++++++++-
 drivers/md/dm.h               |    1 +
 include/linux/device-mapper.h |   16 ++++++++++++++++
 4 files changed, 72 insertions(+), 4 deletions(-)

diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c
index 88f0174..aa14fc4 100644
--- a/drivers/md/dm-table.c
+++ b/drivers/md/dm-table.c
@@ -827,6 +827,12 @@ void dm_consume_args(struct dm_arg_set *as, unsigned num_args)
 }
 EXPORT_SYMBOL(dm_consume_args);
 
+static bool __table_type_bio_based(unsigned table_type)
+{
+	return (table_type == DM_TYPE_BIO_BASED ||
+		table_type == DM_TYPE_DAX_BIO_BASED);
+}
+
 static bool __table_type_request_based(unsigned table_type)
 {
 	return (table_type == DM_TYPE_REQUEST_BASED ||
@@ -842,7 +848,7 @@ EXPORT_SYMBOL_GPL(dm_table_set_type);
 static int dm_table_determine_type(struct dm_table *t)
 {
 	unsigned i;
-	unsigned bio_based = 0, request_based = 0, hybrid = 0;
+	unsigned bio_based = 0, request_based = 0, hybrid = 0, num_dax = 0;
 	bool verify_blk_mq = false;
 	struct dm_target *tgt;
 	struct dm_dev_internal *dd;
@@ -865,6 +871,9 @@ static int dm_table_determine_type(struct dm_table *t)
 		else
 			bio_based = 1;
 
+		if (tgt->dax_supported)
+			num_dax++;
+
 		if (bio_based && request_based) {
 			DMWARN("Inconsistent table: different target types"
 			       " can't be mixed up");
@@ -886,7 +895,10 @@ static int dm_table_determine_type(struct dm_table *t)
 
 	if (bio_based) {
 		/* We must use this table as bio-based */
-		t->type = DM_TYPE_BIO_BASED;
+		if (num_dax && num_dax == t->num_targets)
+			t->type = DM_TYPE_DAX_BIO_BASED;
+		else
+			t->type = DM_TYPE_BIO_BASED;
 		return 0;
 	}
 
@@ -979,6 +991,11 @@ struct dm_target *dm_table_get_wildcard_target(struct dm_table *t)
 	return NULL;
 }
 
+bool dm_table_bio_based(struct dm_table *t)
+{
+	return __table_type_bio_based(dm_table_get_type(t));
+}
+
 bool dm_table_request_based(struct dm_table *t)
 {
 	return __table_type_request_based(dm_table_get_type(t));
@@ -1001,7 +1018,7 @@ static int dm_table_alloc_md_mempools(struct dm_table *t, struct mapped_device *
 		return -EINVAL;
 	}
 
-	if (type == DM_TYPE_BIO_BASED)
+	if (__table_type_bio_based(type))
 		for (i = 0; i < t->num_targets; i++) {
 			tgt = t->targets + i;
 			per_io_data_size = max(per_io_data_size, tgt->per_io_data_size);
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index 2c907bc..17cd25a 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -905,6 +905,34 @@ int dm_set_target_max_io_len(struct dm_target *ti, sector_t len)
 }
 EXPORT_SYMBOL_GPL(dm_set_target_max_io_len);
 
+static long dm_blk_direct_access(struct block_device *bdev, sector_t sector,
+				 void __pmem **kaddr, pfn_t *pfn, long size)
+{
+	struct mapped_device *md = bdev->bd_disk->private_data;
+	struct dm_table *map;
+	struct dm_target *ti;
+	int srcu_idx;
+	long len, ret = -EIO;
+
+	map = dm_get_live_table(md, &srcu_idx);
+	if (!map)
+		return ret;
+
+	ti = dm_table_find_target(map, sector);
+	if (!dm_target_is_valid(ti))
+		goto out;
+
+	len = max_io_len(sector, ti) << SECTOR_SHIFT;
+	size = min(len, size);
+
+	if (ti->type->direct_access)
+		ret = ti->type->direct_access(ti, sector, kaddr, pfn, size);
+out:
+	dm_put_live_table(md, srcu_idx);
+
+	return min(ret, size);
+}
+
 /*
  * A target may call dm_accept_partial_bio only from the map routine.  It is
  * allowed for all bio types except REQ_PREFLUSH.
@@ -1548,7 +1576,7 @@ static void __bind_mempools(struct mapped_device *md, struct dm_table *t)
 
 	if (md->bs) {
 		/* The md already has necessary mempools. */
-		if (dm_table_get_type(t) == DM_TYPE_BIO_BASED) {
+		if (dm_table_bio_based(t)) {
 			/*
 			 * Reload bioset because front_pad may have changed
 			 * because a different table was loaded.
@@ -1715,6 +1743,9 @@ void dm_set_md_type(struct mapped_device *md, unsigned type)
 {
 	BUG_ON(!mutex_is_locked(&md->type_lock));
 	md->type = type;
+
+	if (type == DM_TYPE_DAX_BIO_BASED)
+		queue_flag_set_unlocked(QUEUE_FLAG_DAX, md->queue);
 }
 
 unsigned dm_get_md_type(struct mapped_device *md)
@@ -1761,6 +1792,7 @@ int dm_setup_md_queue(struct mapped_device *md, struct dm_table *t)
 		}
 		break;
 	case DM_TYPE_BIO_BASED:
+	case DM_TYPE_DAX_BIO_BASED:
 		dm_init_normal_md_queue(md);
 		blk_queue_make_request(md->queue, dm_make_request);
 		/*
@@ -2465,6 +2497,7 @@ struct dm_md_mempools *dm_alloc_md_mempools(struct mapped_device *md, unsigned t
 
 	switch (type) {
 	case DM_TYPE_BIO_BASED:
+	case DM_TYPE_DAX_BIO_BASED:
 		cachep = _io_cache;
 		pool_size = dm_get_reserved_bio_based_ios();
 		front_pad = roundup(per_io_data_size, __alignof__(struct dm_target_io)) + offsetof(struct dm_target_io, clone);
@@ -2641,6 +2674,7 @@ static const struct block_device_operations dm_blk_dops = {
 	.open = dm_blk_open,
 	.release = dm_blk_close,
 	.ioctl = dm_blk_ioctl,
+	.direct_access = dm_blk_direct_access,
 	.getgeo = dm_blk_getgeo,
 	.pr_ops = &dm_pr_ops,
 	.owner = THIS_MODULE
diff --git a/drivers/md/dm.h b/drivers/md/dm.h
index 2e0e4a5..f0aad08 100644
--- a/drivers/md/dm.h
+++ b/drivers/md/dm.h
@@ -68,6 +68,7 @@ unsigned dm_table_get_type(struct dm_table *t);
 struct target_type *dm_table_get_immutable_target_type(struct dm_table *t);
 struct dm_target *dm_table_get_immutable_target(struct dm_table *t);
 struct dm_target *dm_table_get_wildcard_target(struct dm_table *t);
+bool dm_table_bio_based(struct dm_table *t);
 bool dm_table_request_based(struct dm_table *t);
 bool dm_table_all_blk_mq_devices(struct dm_table *t);
 void dm_table_free_md_mempools(struct dm_table *t);
diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h
index 2ce3392..1f1a6de 100644
--- a/include/linux/device-mapper.h
+++ b/include/linux/device-mapper.h
@@ -26,6 +26,7 @@ struct bio_vec;
 #define DM_TYPE_BIO_BASED		1
 #define DM_TYPE_REQUEST_BASED		2
 #define DM_TYPE_MQ_REQUEST_BASED	3
+#define DM_TYPE_DAX_BIO_BASED		4
 
 typedef enum { STATUSTYPE_INFO, STATUSTYPE_TABLE } status_type_t;
 
@@ -124,6 +125,15 @@ typedef void (*dm_io_hints_fn) (struct dm_target *ti,
  */
 typedef int (*dm_busy_fn) (struct dm_target *ti);
 
+/*
+ * Returns:
+ *  < 0 : error
+ * >= 0 : the number of bytes accessible at the address
+ */
+typedef long (*dm_direct_access_fn) (struct dm_target *ti, sector_t sector,
+				     void __pmem **kaddr, pfn_t *pfn,
+				     long size);
+
 void dm_error(const char *message);
 
 struct dm_dev {
@@ -170,6 +180,7 @@ struct target_type {
 	dm_busy_fn busy;
 	dm_iterate_devices_fn iterate_devices;
 	dm_io_hints_fn io_hints;
+	dm_direct_access_fn direct_access;
 
 	/* For internal device-mapper use. */
 	struct list_head list;
@@ -288,6 +299,11 @@ struct dm_target {
 	 * Set if this target does not return zeroes on discarded blocks.
 	 */
 	bool discard_zeroes_data_unsupported:1;
+
+	/*
+	 * Set if the target supports DAX (direct access).
+	 */
+	bool dax_supported:1;
 };
 
 /* Each target can link one of these into the table */

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

* [PATCH v2 3/3] dm linear: add DAX support
  2016-06-22 23:54 [PATCH v2 0/3] Support DAX for device-mapper dm-linear devices Toshi Kani
  2016-06-22 23:54 ` [PATCH v2 1/3] block: add QUEUE_FLAG_DAX for devices to advertise their DAX support Toshi Kani
  2016-06-22 23:54 ` [PATCH v2 2/3] dm: add infrastructure for " Toshi Kani
@ 2016-06-22 23:54 ` Toshi Kani
  2 siblings, 0 replies; 9+ messages in thread
From: Toshi Kani @ 2016-06-22 23:54 UTC (permalink / raw)
  To: snitzer, axboe, dan.j.williams
  Cc: agk, ross.zwisler, viro, toshi.kani, linux-nvdimm, dm-devel,
	linux-raid, linux-kernel

Change dm-linear to implement direct_access function,
linear_direct_access(), which maps sector and calls direct_access
function of its physical target device.

Change dm-linear to sets 'dax_supported' when its target physical device
supports DAX.

Signed-off-by: Toshi Kani <toshi.kani@hpe.com>
Cc: Alasdair Kergon <agk@redhat.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Ross Zwisler <ross.zwisler@linux.intel.com>
---
 drivers/md/dm-linear.c |   23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/drivers/md/dm-linear.c b/drivers/md/dm-linear.c
index 05c35aa..c7fdd1d 100644
--- a/drivers/md/dm-linear.c
+++ b/drivers/md/dm-linear.c
@@ -59,6 +59,8 @@ static int linear_ctr(struct dm_target *ti, unsigned int argc, char **argv)
 	ti->num_flush_bios = 1;
 	ti->num_discard_bios = 1;
 	ti->num_write_same_bios = 1;
+	if (blk_queue_dax(lc->dev->bdev->bd_queue))
+		ti->dax_supported = true;
 	ti->private = lc;
 	return 0;
 
@@ -141,9 +143,27 @@ static int linear_iterate_devices(struct dm_target *ti,
 	return fn(ti, lc->dev, lc->start, ti->len, data);
 }
 
+static long linear_direct_access(struct dm_target *ti, sector_t sector,
+				 void __pmem **kaddr, pfn_t *pfn, long size)
+{
+	struct linear_c *lc = ti->private;
+	struct block_device *bdev = lc->dev->bdev;
+	struct blk_dax_ctl dax = {
+		.sector = linear_map_sector(ti, sector),
+		.size = size,
+	};
+	long ret;
+
+	ret = bdev_direct_access(bdev, &dax);
+	*kaddr = dax.addr;
+	*pfn = dax.pfn;
+
+	return ret;
+}
+
 static struct target_type linear_target = {
 	.name   = "linear",
-	.version = {1, 2, 1},
+	.version = {1, 3, 0},
 	.module = THIS_MODULE,
 	.ctr    = linear_ctr,
 	.dtr    = linear_dtr,
@@ -151,6 +171,7 @@ static struct target_type linear_target = {
 	.status = linear_status,
 	.prepare_ioctl = linear_prepare_ioctl,
 	.iterate_devices = linear_iterate_devices,
+	.direct_access = linear_direct_access,
 };
 
 int __init dm_linear_init(void)

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

* Re: [PATCH v2 1/3] block: add QUEUE_FLAG_DAX for devices to advertise their DAX support
  2016-06-22 23:54 ` [PATCH v2 1/3] block: add QUEUE_FLAG_DAX for devices to advertise their DAX support Toshi Kani
@ 2016-06-23 16:31   ` Yigal Korman
  2016-06-23 17:36     ` Kani, Toshimitsu
  0 siblings, 1 reply; 9+ messages in thread
From: Yigal Korman @ 2016-06-23 16:31 UTC (permalink / raw)
  To: Toshi Kani
  Cc: snitzer, Jens Axboe, Dan Williams, linux-s390, linux-nvdimm,
	Heiko Carstens, linux-kernel, linux-raid, dm-devel,
	Alexander Viro, Martin Schwidefsky, agk

On Thu, Jun 23, 2016 at 2:54 AM, Toshi Kani <toshi.kani@hpe.com> wrote:
>
> Currently, presence of direct_access() in block_device_operations
> indicates support of DAX on its block device.  Because
> block_device_operations is instantiated with 'const', this DAX
> capablity may not be enabled conditinally.
>
> In preparation for supporting DAX to device-mapper devices, add
> QUEUE_FLAG_DAX to request_queue flags to advertise their DAX
> support.  This will allow to set the DAX capability based on how
> mapped device is composed.


Hi Toshi,
This patch is very helpful!
I think QUEUE_FLAG_DAX can also help with identifying dax devices in userspace.
Perhaps you'd be willing to squash the patch below with this one or
add it to your submission?

Thanks,
Yigal


[PATCH] block: expose QUEUE_FLAG_DAX in sysfs

There's currently no way to identify DAX enabled devices in userspace.

Signed-off-by: Yigal Korman <yigal@plexistor.com>
---
 block/blk-sysfs.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c
index 9920596..d55126d 100644
--- a/block/blk-sysfs.c
+++ b/block/blk-sysfs.c
@@ -379,6 +379,15 @@ static ssize_t queue_wc_store(struct
request_queue *q, const char *page,
        return count;
 }

+static ssize_t queue_dax_show(struct request_queue *q, char *page)
+{
+       int bit;
+
+       bit = test_bit(QUEUE_FLAG_DAX, &q->queue_flags);
+
+       return queue_var_show(bit, page);
+}
+
 static struct queue_sysfs_entry queue_requests_entry = {
        .attr = {.name = "nr_requests", .mode = S_IRUGO | S_IWUSR },
        .show = queue_requests_show,
@@ -516,6 +525,11 @@ static struct queue_sysfs_entry queue_wc_entry = {
        .store = queue_wc_store,
 };

+static struct queue_sysfs_entry queue_dax_entry = {
+       .attr = {.name = "dax", .mode = S_IRUGO },
+       .show = queue_dax_show,
+};
+
 static struct attribute *default_attrs[] = {
        &queue_requests_entry.attr,
        &queue_ra_entry.attr,
@@ -542,6 +556,7 @@ static struct attribute *default_attrs[] = {
        &queue_random_entry.attr,
        &queue_poll_entry.attr,
        &queue_wc_entry.attr,
+       &queue_dax_entry.attr,
        NULL,
 };

--
1.9.3

>
>
> Signed-off-by: Toshi Kani <toshi.kani@hpe.com>
> Cc: Jens Axboe <axboe@kernel.dk>
> Cc: Dan Williams <dan.j.williams@intel.com>
> Cc: Ross Zwisler <ross.zwisler@linux.intel.com>
> Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
> Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
> Cc: <linux-s390@vger.kernel.org>
> ---
>  drivers/block/brd.c          |    4 +++-
>  drivers/nvdimm/pmem.c        |    1 +
>  drivers/s390/block/dcssblk.c |    1 +
>  fs/block_dev.c               |    5 +++--
>  include/linux/blkdev.h       |    2 ++
>  5 files changed, 10 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/block/brd.c b/drivers/block/brd.c
> index f5b0d6f..dd96a93 100644
> --- a/drivers/block/brd.c
> +++ b/drivers/block/brd.c
> @@ -509,7 +509,9 @@ static struct brd_device *brd_alloc(int i)
>         blk_queue_max_discard_sectors(brd->brd_queue, UINT_MAX);
>         brd->brd_queue->limits.discard_zeroes_data = 1;
>         queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, brd->brd_queue);
> -
> +#ifdef CONFIG_BLK_DEV_RAM_DAX
> +       queue_flag_set_unlocked(QUEUE_FLAG_DAX, brd->brd_queue);
> +#endif
>         disk = brd->brd_disk = alloc_disk(max_part);
>         if (!disk)
>                 goto out_free_queue;
> diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c
> index 608fc44..53b701b 100644
> --- a/drivers/nvdimm/pmem.c
> +++ b/drivers/nvdimm/pmem.c
> @@ -283,6 +283,7 @@ static int pmem_attach_disk(struct device *dev,
>         blk_queue_max_hw_sectors(q, UINT_MAX);
>         blk_queue_bounce_limit(q, BLK_BOUNCE_ANY);
>         queue_flag_set_unlocked(QUEUE_FLAG_NONROT, q);
> +       queue_flag_set_unlocked(QUEUE_FLAG_DAX, q);
>         q->queuedata = pmem;
>
>         disk = alloc_disk_node(0, nid);
> diff --git a/drivers/s390/block/dcssblk.c b/drivers/s390/block/dcssblk.c
> index bed53c4..093e9e1 100644
> --- a/drivers/s390/block/dcssblk.c
> +++ b/drivers/s390/block/dcssblk.c
> @@ -618,6 +618,7 @@ dcssblk_add_store(struct device *dev, struct device_attribute *attr, const char
>         dev_info->gd->driverfs_dev = &dev_info->dev;
>         blk_queue_make_request(dev_info->dcssblk_queue, dcssblk_make_request);
>         blk_queue_logical_block_size(dev_info->dcssblk_queue, 4096);
> +       queue_flag_set_unlocked(QUEUE_FLAG_DAX, dev_info->dcssblk_queue);
>
>         seg_byte_size = (dev_info->end - dev_info->start + 1);
>         set_capacity(dev_info->gd, seg_byte_size >> 9); // size in sectors
> diff --git a/fs/block_dev.c b/fs/block_dev.c
> index 71ccab1..d012be4 100644
> --- a/fs/block_dev.c
> +++ b/fs/block_dev.c
> @@ -493,7 +493,7 @@ long bdev_direct_access(struct block_device *bdev, struct blk_dax_ctl *dax)
>
>         if (size < 0)
>                 return size;
> -       if (!ops->direct_access)
> +       if (!blk_queue_dax(bdev_get_queue(bdev)) || !ops->direct_access)
>                 return -EOPNOTSUPP;
>         if ((sector + DIV_ROUND_UP(size, 512)) >
>                                         part_nr_sects_read(bdev->bd_part))
> @@ -1287,7 +1287,8 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
>                 bdev->bd_disk = disk;
>                 bdev->bd_queue = disk->queue;
>                 bdev->bd_contains = bdev;
> -               if (IS_ENABLED(CONFIG_BLK_DEV_DAX) && disk->fops->direct_access)
> +               if (IS_ENABLED(CONFIG_BLK_DEV_DAX) &&
> +                   blk_queue_dax(disk->queue))
>                         bdev->bd_inode->i_flags = S_DAX;
>                 else
>                         bdev->bd_inode->i_flags = 0;
> diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
> index 9746d22..1493ab3 100644
> --- a/include/linux/blkdev.h
> +++ b/include/linux/blkdev.h
> @@ -505,6 +505,7 @@ struct request_queue {
>  #define QUEUE_FLAG_WC         23       /* Write back caching */
>  #define QUEUE_FLAG_FUA        24       /* device supports FUA writes */
>  #define QUEUE_FLAG_FLUSH_NQ    25      /* flush not queueuable */
> +#define QUEUE_FLAG_DAX         26      /* device supports DAX */
>
>  #define QUEUE_FLAG_DEFAULT     ((1 << QUEUE_FLAG_IO_STAT) |            \
>                                  (1 << QUEUE_FLAG_STACKABLE)    |       \
> @@ -594,6 +595,7 @@ static inline void queue_flag_clear(unsigned int flag, struct request_queue *q)
>  #define blk_queue_discard(q)   test_bit(QUEUE_FLAG_DISCARD, &(q)->queue_flags)
>  #define blk_queue_secdiscard(q)        (blk_queue_discard(q) && \
>         test_bit(QUEUE_FLAG_SECDISCARD, &(q)->queue_flags))
> +#define blk_queue_dax(q)       test_bit(QUEUE_FLAG_DAX, &(q)->queue_flags)
>
>  #define blk_noretry_request(rq) \
>         ((rq)->cmd_flags & (REQ_FAILFAST_DEV|REQ_FAILFAST_TRANSPORT| \
> _______________________________________________
> Linux-nvdimm mailing list
> Linux-nvdimm@lists.01.org
> https://lists.01.org/mailman/listinfo/linux-nvdimm

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

* Re: [PATCH v2 1/3] block: add QUEUE_FLAG_DAX for devices to advertise their DAX support
  2016-06-23 16:31   ` Yigal Korman
@ 2016-06-23 17:36     ` Kani, Toshimitsu
  2016-06-23 18:05       ` Yigal Korman
  2016-06-23 21:11       ` Mike Snitzer
  0 siblings, 2 replies; 9+ messages in thread
From: Kani, Toshimitsu @ 2016-06-23 17:36 UTC (permalink / raw)
  To: yigal
  Cc: linux-s390, linux-kernel, agk, heiko.carstens, linux-raid,
	snitzer, axboe, dan.j.williams, viro, linux-nvdimm@lists.01.org,
	dm-devel, schwidefsky

On Thu, 2016-06-23 at 19:31 +0300, Yigal Korman wrote:
> On Thu, Jun 23, 2016 at 2:54 AM, Toshi Kani <toshi.kani@hpe.com> wrote:
> > 
> > 
> > Currently, presence of direct_access() in block_device_operations
> > indicates support of DAX on its block device.  Because
> > block_device_operations is instantiated with 'const', this DAX
> > capablity may not be enabled conditinally.
> > 
> > In preparation for supporting DAX to device-mapper devices, add
> > QUEUE_FLAG_DAX to request_queue flags to advertise their DAX
> > support.  This will allow to set the DAX capability based on how
> > mapped device is composed.
> 
> Hi Toshi,
> This patch is very helpful!
> I think QUEUE_FLAG_DAX can also help with identifying dax devices in
> userspace.
> Perhaps you'd be willing to squash the patch below with this one or
> add it to your submission?

Hi Yigal,

Good idea.  Mike can probably take it into his tree, but I will include it
into the series if I needed to submit v3.

Acked-by: Toshi Kani <toshi.kani@hpe.com>

I have one minor comment below.

> [PATCH] block: expose QUEUE_FLAG_DAX in sysfs
> 
> There's currently no way to identify DAX enabled devices in userspace.
> 
> Signed-off-by: Yigal Korman <yigal@plexistor.com>
> ---
>  block/blk-sysfs.c | 15 +++++++++++++++
>  1 file changed, 15 insertions(+)
> 
> diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c
> index 9920596..d55126d 100644
> --- a/block/blk-sysfs.c
> +++ b/block/blk-sysfs.c
> @@ -379,6 +379,15 @@ static ssize_t queue_wc_store(struct
> request_queue *q, const char *page,
>         return count;
>  }
> 
> +static ssize_t queue_dax_show(struct request_queue *q, char *page)
> +{
> +       int bit;
> +
> +       bit = test_bit(QUEUE_FLAG_DAX, &q->queue_flags);
> +
> +       return queue_var_show(bit, page);

This can be:
	return queue_var_show(blk_queue_dax(q), page);

Thanks,
-Toshi

> +}
> +
>  static struct queue_sysfs_entry queue_requests_entry = {
>         .attr = {.name = "nr_requests", .mode = S_IRUGO | S_IWUSR },
>         .show = queue_requests_show,
> @@ -516,6 +525,11 @@ static struct queue_sysfs_entry queue_wc_entry = {
>         .store = queue_wc_store,
>  };
> 
> +static struct queue_sysfs_entry queue_dax_entry = {
> +       .attr = {.name = "dax", .mode = S_IRUGO },
> +       .show = queue_dax_show,
> +};
> +
>  static struct attribute *default_attrs[] = {
>         &queue_requests_entry.attr,
>         &queue_ra_entry.attr,
> @@ -542,6 +556,7 @@ static struct attribute *default_attrs[] = {
>         &queue_random_entry.attr,
>         &queue_poll_entry.attr,
>         &queue_wc_entry.attr,
> +       &queue_dax_entry.attr,
>         NULL,
>  };
> 

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

* Re: [PATCH v2 1/3] block: add QUEUE_FLAG_DAX for devices to advertise their DAX support
  2016-06-23 17:36     ` Kani, Toshimitsu
@ 2016-06-23 18:05       ` Yigal Korman
  2016-06-23 18:10         ` Dan Williams
  2016-06-23 21:11       ` Mike Snitzer
  1 sibling, 1 reply; 9+ messages in thread
From: Yigal Korman @ 2016-06-23 18:05 UTC (permalink / raw)
  To: Kani, Toshimitsu
  Cc: linux-s390, linux-kernel, agk, heiko.carstens, linux-raid,
	snitzer, axboe, dan.j.williams, viro, linux-nvdimm@lists.01.org,
	dm-devel, schwidefsky

On Thu, Jun 23, 2016 at 8:36 PM, Kani, Toshimitsu <toshi.kani@hpe.com> wrote:
> On Thu, 2016-06-23 at 19:31 +0300, Yigal Korman wrote:
>> On Thu, Jun 23, 2016 at 2:54 AM, Toshi Kani <toshi.kani@hpe.com> wrote:
>> >
>> >
>> > Currently, presence of direct_access() in block_device_operations
>> > indicates support of DAX on its block device.  Because
>> > block_device_operations is instantiated with 'const', this DAX
>> > capablity may not be enabled conditinally.
>> >
>> > In preparation for supporting DAX to device-mapper devices, add
>> > QUEUE_FLAG_DAX to request_queue flags to advertise their DAX
>> > support.  This will allow to set the DAX capability based on how
>> > mapped device is composed.
>>
>> Hi Toshi,
>> This patch is very helpful!
>> I think QUEUE_FLAG_DAX can also help with identifying dax devices in
>> userspace.
>> Perhaps you'd be willing to squash the patch below with this one or
>> add it to your submission?
>
> Hi Yigal,
>
> Good idea.  Mike can probably take it into his tree, but I will include it
> into the series if I needed to submit v3.
>
> Acked-by: Toshi Kani <toshi.kani@hpe.com>

Great, Thanks!
I'll follow the thread to see if it goes through or needs to be resubmitted.

>
> I have one minor comment below.

My reply below as well.

>
>> [PATCH] block: expose QUEUE_FLAG_DAX in sysfs
>>
>> There's currently no way to identify DAX enabled devices in userspace.
>>
>> Signed-off-by: Yigal Korman <yigal@plexistor.com>
>> ---
>>  block/blk-sysfs.c | 15 +++++++++++++++
>>  1 file changed, 15 insertions(+)
>>
>> diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c
>> index 9920596..d55126d 100644
>> --- a/block/blk-sysfs.c
>> +++ b/block/blk-sysfs.c
>> @@ -379,6 +379,15 @@ static ssize_t queue_wc_store(struct
>> request_queue *q, const char *page,
>>         return count;
>>  }
>>
>> +static ssize_t queue_dax_show(struct request_queue *q, char *page)
>> +{
>> +       int bit;
>> +
>> +       bit = test_bit(QUEUE_FLAG_DAX, &q->queue_flags);
>> +
>> +       return queue_var_show(bit, page);
>
> This can be:
>         return queue_var_show(blk_queue_dax(q), page);

Oh, sure, of course you're right. thanks.

Subject: [PATCH] block: expose QUEUE_FLAG_DAX in sysfs

There's currently no way to identify DAX enabled devices in userspace.

Signed-off-by: Yigal Korman <yigal@plexistor.com>
Acked-by: Toshi Kani <toshi.kani@hpe.com>
---
 block/blk-sysfs.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c
index 9920596..f87a7e7 100644
--- a/block/blk-sysfs.c
+++ b/block/blk-sysfs.c
@@ -379,6 +379,11 @@ static ssize_t queue_wc_store(struct
request_queue *q, const char *page,
        return count;
 }

+static ssize_t queue_dax_show(struct request_queue *q, char *page)
+{
+       return queue_var_show(blk_queue_dax(q), page);
+}
+
 static struct queue_sysfs_entry queue_requests_entry = {
        .attr = {.name = "nr_requests", .mode = S_IRUGO | S_IWUSR },
        .show = queue_requests_show,
@@ -516,6 +521,11 @@ static struct queue_sysfs_entry queue_wc_entry = {
        .store = queue_wc_store,
 };

+static struct queue_sysfs_entry queue_dax_entry = {
+       .attr = {.name = "dax", .mode = S_IRUGO },
+       .show = queue_dax_show,
+};
+
 static struct attribute *default_attrs[] = {
        &queue_requests_entry.attr,
        &queue_ra_entry.attr,
@@ -542,6 +552,7 @@ static struct attribute *default_attrs[] = {
        &queue_random_entry.attr,
        &queue_poll_entry.attr,
        &queue_wc_entry.attr,
+       &queue_dax_entry.attr,
        NULL,
 };

--
1.9.3

Thanks,
Yigal

>
> Thanks,
> -Toshi
>
>> +}
>> +
>>  static struct queue_sysfs_entry queue_requests_entry = {
>>         .attr = {.name = "nr_requests", .mode = S_IRUGO | S_IWUSR },
>>         .show = queue_requests_show,
>> @@ -516,6 +525,11 @@ static struct queue_sysfs_entry queue_wc_entry = {
>>         .store = queue_wc_store,
>>  };
>>
>> +static struct queue_sysfs_entry queue_dax_entry = {
>> +       .attr = {.name = "dax", .mode = S_IRUGO },
>> +       .show = queue_dax_show,
>> +};
>> +
>>  static struct attribute *default_attrs[] = {
>>         &queue_requests_entry.attr,
>>         &queue_ra_entry.attr,
>> @@ -542,6 +556,7 @@ static struct attribute *default_attrs[] = {
>>         &queue_random_entry.attr,
>>         &queue_poll_entry.attr,
>>         &queue_wc_entry.attr,
>> +       &queue_dax_entry.attr,
>>         NULL,
>>  };
>>

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

* Re: [PATCH v2 1/3] block: add QUEUE_FLAG_DAX for devices to advertise their DAX support
  2016-06-23 18:05       ` Yigal Korman
@ 2016-06-23 18:10         ` Dan Williams
  0 siblings, 0 replies; 9+ messages in thread
From: Dan Williams @ 2016-06-23 18:10 UTC (permalink / raw)
  To: Yigal Korman
  Cc: Kani, Toshimitsu, linux-s390, linux-kernel, agk, heiko.carstens,
	linux-raid, snitzer, axboe, viro, linux-nvdimm@lists.01.org,
	dm-devel, schwidefsky

On Thu, Jun 23, 2016 at 11:05 AM, Yigal Korman <yigal@plexistor.com> wrote:
> On Thu, Jun 23, 2016 at 8:36 PM, Kani, Toshimitsu <toshi.kani@hpe.com> wrote:
>> On Thu, 2016-06-23 at 19:31 +0300, Yigal Korman wrote:
>>> On Thu, Jun 23, 2016 at 2:54 AM, Toshi Kani <toshi.kani@hpe.com> wrote:
>>> >
>>> >
>>> > Currently, presence of direct_access() in block_device_operations
>>> > indicates support of DAX on its block device.  Because
>>> > block_device_operations is instantiated with 'const', this DAX
>>> > capablity may not be enabled conditinally.
>>> >
>>> > In preparation for supporting DAX to device-mapper devices, add
>>> > QUEUE_FLAG_DAX to request_queue flags to advertise their DAX
>>> > support.  This will allow to set the DAX capability based on how
>>> > mapped device is composed.
>>>
>>> Hi Toshi,
>>> This patch is very helpful!
>>> I think QUEUE_FLAG_DAX can also help with identifying dax devices in
>>> userspace.
>>> Perhaps you'd be willing to squash the patch below with this one or
>>> add it to your submission?
>>
>> Hi Yigal,
>>
>> Good idea.  Mike can probably take it into his tree, but I will include it
>> into the series if I needed to submit v3.
>>
>> Acked-by: Toshi Kani <toshi.kani@hpe.com>
>
> Great, Thanks!
> I'll follow the thread to see if it goes through or needs to be resubmitted.
>
>>
>> I have one minor comment below.
>
> My reply below as well.
>
>>
>>> [PATCH] block: expose QUEUE_FLAG_DAX in sysfs
>>>
>>> There's currently no way to identify DAX enabled devices in userspace.
>>>
>>> Signed-off-by: Yigal Korman <yigal@plexistor.com>
>>> ---
>>>  block/blk-sysfs.c | 15 +++++++++++++++
>>>  1 file changed, 15 insertions(+)
>>>
>>> diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c
>>> index 9920596..d55126d 100644
>>> --- a/block/blk-sysfs.c
>>> +++ b/block/blk-sysfs.c
>>> @@ -379,6 +379,15 @@ static ssize_t queue_wc_store(struct
>>> request_queue *q, const char *page,
>>>         return count;
>>>  }
>>>
>>> +static ssize_t queue_dax_show(struct request_queue *q, char *page)
>>> +{
>>> +       int bit;
>>> +
>>> +       bit = test_bit(QUEUE_FLAG_DAX, &q->queue_flags);
>>> +
>>> +       return queue_var_show(bit, page);
>>
>> This can be:
>>         return queue_var_show(blk_queue_dax(q), page);
>
> Oh, sure, of course you're right. thanks.
>
> Subject: [PATCH] block: expose QUEUE_FLAG_DAX in sysfs
>
> There's currently no way to identify DAX enabled devices in userspace.
>
> Signed-off-by: Yigal Korman <yigal@plexistor.com>
> Acked-by: Toshi Kani <toshi.kani@hpe.com>

Great!

Acked-by: Dan Williams <dan.j.williams@intel.com>

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

* Re: [PATCH v2 1/3] block: add QUEUE_FLAG_DAX for devices to advertise their DAX support
  2016-06-23 17:36     ` Kani, Toshimitsu
  2016-06-23 18:05       ` Yigal Korman
@ 2016-06-23 21:11       ` Mike Snitzer
  1 sibling, 0 replies; 9+ messages in thread
From: Mike Snitzer @ 2016-06-23 21:11 UTC (permalink / raw)
  To: Kani, Toshimitsu
  Cc: yigal, axboe, linux-s390, linux-nvdimm@lists.01.org,
	heiko.carstens, linux-kernel, linux-raid, dm-devel, viro,
	schwidefsky, dan.j.williams, agk

On Thu, Jun 23 2016 at  1:36pm -0400,
Kani, Toshimitsu <toshi.kani@hpe.com> wrote:

> On Thu, 2016-06-23 at 19:31 +0300, Yigal Korman wrote:
> > On Thu, Jun 23, 2016 at 2:54 AM, Toshi Kani <toshi.kani@hpe.com> wrote:
> > > 
> > > 
> > > Currently, presence of direct_access() in block_device_operations
> > > indicates support of DAX on its block device.  Because
> > > block_device_operations is instantiated with 'const', this DAX
> > > capablity may not be enabled conditinally.
> > > 
> > > In preparation for supporting DAX to device-mapper devices, add
> > > QUEUE_FLAG_DAX to request_queue flags to advertise their DAX
> > > support.  This will allow to set the DAX capability based on how
> > > mapped device is composed.
> > 
> > Hi Toshi,
> > This patch is very helpful!
> > I think QUEUE_FLAG_DAX can also help with identifying dax devices in
> > userspace.
> > Perhaps you'd be willing to squash the patch below with this one or
> > add it to your submission?
> 
> Hi Yigal,
> 
> Good idea.  Mike can probably take it into his tree, but I will include it
> into the series if I needed to submit v3.
> 
> Acked-by: Toshi Kani <toshi.kani@hpe.com>

As you can see I sent out v3 of this set.  Jens will need to pick up the
"block:" patches but I'll pick up the DM patches once Jens does so.

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

end of thread, other threads:[~2016-06-23 21:11 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-06-22 23:54 [PATCH v2 0/3] Support DAX for device-mapper dm-linear devices Toshi Kani
2016-06-22 23:54 ` [PATCH v2 1/3] block: add QUEUE_FLAG_DAX for devices to advertise their DAX support Toshi Kani
2016-06-23 16:31   ` Yigal Korman
2016-06-23 17:36     ` Kani, Toshimitsu
2016-06-23 18:05       ` Yigal Korman
2016-06-23 18:10         ` Dan Williams
2016-06-23 21:11       ` Mike Snitzer
2016-06-22 23:54 ` [PATCH v2 2/3] dm: add infrastructure for " Toshi Kani
2016-06-22 23:54 ` [PATCH v2 3/3] dm linear: add " Toshi Kani

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).