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);
next prev 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: linkBe 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.