All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mikulas Patocka <mpatocka@redhat.com>
To: "James E.J. Bottomley" <JBottomley@odin.com>,
	"Martin K. Petersen" <martin.petersen@oracle.com>,
	Jens Axboe <axboe@kernel.dk>, Mike Snitzer <msnitzer@redhat.com>,
	Jonathan Brassow <jbrassow@redhat.com>
Cc: dm-devel@redhat.com, linux-scsi@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-block@vger.kernel.org
Subject: [PATCH 9/15] dm: implement copy
Date: Thu, 10 Dec 2015 12:30:49 -0500 (EST)	[thread overview]
Message-ID: <alpine.LRH.2.02.1512101213420.25927@file01.intranet.prod.int.rdu2.redhat.com> (raw)
In-Reply-To: <alpine.LRH.2.02.1512101145430.25927@file01.intranet.prod.int.rdu2.redhat.com>

This patch implements basic copy support for device mapper core.
Individual targets can enable copy support by setting ti->copy_supported.

Device mapper device advertises copy support if at least one target
supports copy and for this target, at least one underlying device supports
copy.

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>

---
 drivers/md/dm-table.c         |   16 ++++++++++++++++
 drivers/md/dm.c               |   27 +++++++++++++++++++++++++++
 include/linux/device-mapper.h |    5 +++++
 3 files changed, 48 insertions(+)

Index: linux-4.4-rc4/drivers/md/dm.c
===================================================================
--- linux-4.4-rc4.orig/drivers/md/dm.c	2015-12-10 17:04:05.000000000 +0100
+++ linux-4.4-rc4/drivers/md/dm.c	2015-12-10 17:05:48.000000000 +0100
@@ -1679,6 +1679,31 @@ static int __send_write_same(struct clon
 	return __send_changing_extent_only(ci, get_num_write_same_bios, NULL);
 }
 
+static int __send_copy(struct clone_info *ci)
+{
+	struct dm_target *ti;
+	sector_t bound;
+
+	ti = dm_table_find_target(ci->map, ci->sector);
+	if (!dm_target_is_valid(ti))
+		return -EIO;
+
+	if (!ti->copy_supported)
+		return -EOPNOTSUPP;
+
+	bound = max_io_len(ci->sector, ti);
+
+	if (unlikely(ci->sector_count > bound))
+		return -EOPNOTSUPP;
+
+	__clone_and_map_simple_bio(ci, ti, 0, NULL);
+
+	ci->sector += ci->sector_count;
+	ci->sector_count = 0;
+
+	return 0;
+}
+
 /*
  * Select the correct strategy for processing a non-flush bio.
  */
@@ -1692,6 +1717,8 @@ static int __split_and_process_non_flush
 		return __send_discard(ci);
 	else if (unlikely(bio->bi_rw & REQ_WRITE_SAME))
 		return __send_write_same(ci);
+	else if (unlikely(bio->bi_rw & REQ_COPY))
+		return __send_copy(ci);
 
 	ti = dm_table_find_target(ci->map, ci->sector);
 	if (!dm_target_is_valid(ti))
Index: linux-4.4-rc4/include/linux/device-mapper.h
===================================================================
--- linux-4.4-rc4.orig/include/linux/device-mapper.h	2015-12-10 17:04:05.000000000 +0100
+++ linux-4.4-rc4/include/linux/device-mapper.h	2015-12-10 17:04:59.000000000 +0100
@@ -271,6 +271,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 XCOPY.
+	 */
+	bool copy_supported:1;
 };
 
 /* Each target can link one of these into the table */
Index: linux-4.4-rc4/drivers/md/dm-table.c
===================================================================
--- linux-4.4-rc4.orig/drivers/md/dm-table.c	2015-12-10 17:03:51.000000000 +0100
+++ linux-4.4-rc4/drivers/md/dm-table.c	2015-12-10 17:04:59.000000000 +0100
@@ -286,6 +286,11 @@ static int device_area_is_invalid(struct
 		limits->logical_block_size >> SECTOR_SHIFT;
 	char b[BDEVNAME_SIZE];
 
+	if (ti->copy_supported)
+		limits->max_copy_sectors =
+			min_not_zero(limits->max_copy_sectors,
+				bdev_get_queue(bdev)->limits.max_copy_sectors);
+
 	/*
 	 * Some devices exist without request functions,
 	 * such as loop devices not yet bound to backing files.
@@ -1256,6 +1261,13 @@ int dm_calculate_queue_limits(struct dm_
 
 		ti = dm_table_get_target(table, i++);
 
+		if (ti->begin)
+			ti_limits.copy_boundary = min(ti_limits.copy_boundary,
+					(unsigned char)__ffs64(ti->begin));
+		if (ti->max_io_len)
+			ti_limits.copy_boundary = min(ti_limits.copy_boundary,
+					(unsigned char)__ffs(ti->max_io_len));
+
 		if (!ti->type->iterate_devices)
 			goto combine_limits;
 
@@ -1289,6 +1301,10 @@ combine_limits:
 			       dm_device_name(table->md),
 			       (unsigned long long) ti->begin,
 			       (unsigned long long) ti->len);
+
+		limits->max_copy_sectors =
+					min_not_zero(limits->max_copy_sectors,
+					ti_limits.max_copy_sectors);
 	}
 
 	return validate_hardware_logical_block_alignment(table, limits);


WARNING: multiple messages have this Message-ID (diff)
From: Mikulas Patocka <mpatocka@redhat.com>
To: "James E.J. Bottomley" <JBottomley@odin.com>,
	"Martin K. Petersen" <martin.petersen@oracle.com>,
	Jens Axboe <axboe@kernel.dk>, Mike Snitzer <msnitzer@redhat.com>,
	Jonathan Brassow <jbrassow@redhat.com>
Cc: linux-block@vger.kernel.org, dm-devel@redhat.com,
	linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org
Subject: [PATCH 9/15] dm: implement copy
Date: Thu, 10 Dec 2015 12:30:49 -0500 (EST)	[thread overview]
Message-ID: <alpine.LRH.2.02.1512101213420.25927@file01.intranet.prod.int.rdu2.redhat.com> (raw)
In-Reply-To: <alpine.LRH.2.02.1512101145430.25927@file01.intranet.prod.int.rdu2.redhat.com>

This patch implements basic copy support for device mapper core.
Individual targets can enable copy support by setting ti->copy_supported.

Device mapper device advertises copy support if at least one target
supports copy and for this target, at least one underlying device supports
copy.

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>

---
 drivers/md/dm-table.c         |   16 ++++++++++++++++
 drivers/md/dm.c               |   27 +++++++++++++++++++++++++++
 include/linux/device-mapper.h |    5 +++++
 3 files changed, 48 insertions(+)

Index: linux-4.4-rc4/drivers/md/dm.c
===================================================================
--- linux-4.4-rc4.orig/drivers/md/dm.c	2015-12-10 17:04:05.000000000 +0100
+++ linux-4.4-rc4/drivers/md/dm.c	2015-12-10 17:05:48.000000000 +0100
@@ -1679,6 +1679,31 @@ static int __send_write_same(struct clon
 	return __send_changing_extent_only(ci, get_num_write_same_bios, NULL);
 }
 
+static int __send_copy(struct clone_info *ci)
+{
+	struct dm_target *ti;
+	sector_t bound;
+
+	ti = dm_table_find_target(ci->map, ci->sector);
+	if (!dm_target_is_valid(ti))
+		return -EIO;
+
+	if (!ti->copy_supported)
+		return -EOPNOTSUPP;
+
+	bound = max_io_len(ci->sector, ti);
+
+	if (unlikely(ci->sector_count > bound))
+		return -EOPNOTSUPP;
+
+	__clone_and_map_simple_bio(ci, ti, 0, NULL);
+
+	ci->sector += ci->sector_count;
+	ci->sector_count = 0;
+
+	return 0;
+}
+
 /*
  * Select the correct strategy for processing a non-flush bio.
  */
@@ -1692,6 +1717,8 @@ static int __split_and_process_non_flush
 		return __send_discard(ci);
 	else if (unlikely(bio->bi_rw & REQ_WRITE_SAME))
 		return __send_write_same(ci);
+	else if (unlikely(bio->bi_rw & REQ_COPY))
+		return __send_copy(ci);
 
 	ti = dm_table_find_target(ci->map, ci->sector);
 	if (!dm_target_is_valid(ti))
Index: linux-4.4-rc4/include/linux/device-mapper.h
===================================================================
--- linux-4.4-rc4.orig/include/linux/device-mapper.h	2015-12-10 17:04:05.000000000 +0100
+++ linux-4.4-rc4/include/linux/device-mapper.h	2015-12-10 17:04:59.000000000 +0100
@@ -271,6 +271,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 XCOPY.
+	 */
+	bool copy_supported:1;
 };
 
 /* Each target can link one of these into the table */
Index: linux-4.4-rc4/drivers/md/dm-table.c
===================================================================
--- linux-4.4-rc4.orig/drivers/md/dm-table.c	2015-12-10 17:03:51.000000000 +0100
+++ linux-4.4-rc4/drivers/md/dm-table.c	2015-12-10 17:04:59.000000000 +0100
@@ -286,6 +286,11 @@ static int device_area_is_invalid(struct
 		limits->logical_block_size >> SECTOR_SHIFT;
 	char b[BDEVNAME_SIZE];
 
+	if (ti->copy_supported)
+		limits->max_copy_sectors =
+			min_not_zero(limits->max_copy_sectors,
+				bdev_get_queue(bdev)->limits.max_copy_sectors);
+
 	/*
 	 * Some devices exist without request functions,
 	 * such as loop devices not yet bound to backing files.
@@ -1256,6 +1261,13 @@ int dm_calculate_queue_limits(struct dm_
 
 		ti = dm_table_get_target(table, i++);
 
+		if (ti->begin)
+			ti_limits.copy_boundary = min(ti_limits.copy_boundary,
+					(unsigned char)__ffs64(ti->begin));
+		if (ti->max_io_len)
+			ti_limits.copy_boundary = min(ti_limits.copy_boundary,
+					(unsigned char)__ffs(ti->max_io_len));
+
 		if (!ti->type->iterate_devices)
 			goto combine_limits;
 
@@ -1289,6 +1301,10 @@ combine_limits:
 			       dm_device_name(table->md),
 			       (unsigned long long) ti->begin,
 			       (unsigned long long) ti->len);
+
+		limits->max_copy_sectors =
+					min_not_zero(limits->max_copy_sectors,
+					ti_limits.max_copy_sectors);
 	}
 
 	return validate_hardware_logical_block_alignment(table, limits);

  parent reply	other threads:[~2015-12-10 17:33 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-10 17:29 [PATCH 0/15] copy offload patches Mikulas Patocka
2015-12-10 17:30 ` [PATCH 1/15] block copy: initial XCOPY offload support Mikulas Patocka
2015-12-10 17:30   ` Mikulas Patocka
2015-12-10 17:30 ` [PATCH 2/15] block copy: use two bios Mikulas Patocka
2015-12-10 17:30 ` [PATCH 3/15] block copy: report the amount of copied data Mikulas Patocka
2015-12-10 17:30 ` [PATCH 4/15] block copy: use a timer to fix a theoretical deadlock Mikulas Patocka
2015-12-10 17:30 ` [PATCH 5/15] block copy: use asynchronous notification Mikulas Patocka
2015-12-10 17:30 ` [PATCH 6/15] scsi xcopy: suppress error messages Mikulas Patocka
2015-12-10 17:30 ` [PATCH 7/15] scsi xcopy: keep cache of failures Mikulas Patocka
2015-12-10 17:30 ` [PATCH 8/15] block copy: introduce "copy_boundary" limits Mikulas Patocka
2015-12-10 17:30 ` Mikulas Patocka [this message]
2015-12-10 17:30   ` [PATCH 9/15] dm: implement copy Mikulas Patocka
2015-12-10 17:30 ` [PATCH 10/15] dm linear: support copy Mikulas Patocka
2015-12-10 17:31 ` [PATCH 11/15] dm stripe: " Mikulas Patocka
2015-12-10 17:31 ` [PATCH 12/15] dm kcopyd: introduce the function submit_job Mikulas Patocka
2015-12-10 17:31 ` [PATCH 13/15] dm kcopyd: support copy offload Mikulas Patocka
2015-12-10 17:31 ` [PATCH 14/15] dm kcopyd: change mutex to spinlock Mikulas Patocka
2015-12-10 17:31 ` [PATCH 15/15] dm kcopyd: call copy offload with asynchronous callback Mikulas Patocka
2015-12-10 22:33 ` [PATCH 0/15] copy offload patches Martin K. Petersen
2015-12-11  1:46   ` [dm-devel] " Mike Christie
2015-12-11  5:06   ` Mike Christie
2015-12-11 19:55     ` Christoph Hellwig
2015-12-15  1:22   ` Mikulas Patocka
2015-12-15  3:43     ` Douglas Gilbert
2015-12-16  3:05     ` Martin K. Petersen
  -- strict thread matches above, loose matches on Subject: below --
2014-07-15 19:34 [PATCH 0/15] SCSI XCOPY support for the kernel and device mapper Mikulas Patocka
2014-07-15 19:40 ` [PATCH 9/15] dm: implement copy Mikulas Patocka

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=alpine.LRH.2.02.1512101213420.25927@file01.intranet.prod.int.rdu2.redhat.com \
    --to=mpatocka@redhat.com \
    --cc=JBottomley@odin.com \
    --cc=axboe@kernel.dk \
    --cc=dm-devel@redhat.com \
    --cc=jbrassow@redhat.com \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-scsi@vger.kernel.org \
    --cc=martin.petersen@oracle.com \
    --cc=msnitzer@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is 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.