Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1288728
| From | Mikulas Patocka <mpatocka@redhat.com> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [PATCH 7/15] scsi xcopy: keep cache of failures |
| Date | 2015-12-10 18:40 +0100 |
| Message-ID | <qEdmc-OR-55@gated-at.bofh.it> (permalink) |
| References | <qEdma-OR-9@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
If xcopy between two devices fails, it is pointless to send more xcopy
command between there two devices because they take time and they will
likely also fail.
This patch keeps a cache of (source_device,destination_device) pairs where
copying failed and makes sure that no xcopy command is sooner than 30
seconds after the last failure.
Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
---
drivers/scsi/sd.c | 37 +++++++++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
Index: linux-4.4-rc4/drivers/scsi/sd.c
===================================================================
--- linux-4.4-rc4.orig/drivers/scsi/sd.c 2015-12-07 16:59:09.000000000 +0100
+++ linux-4.4-rc4/drivers/scsi/sd.c 2015-12-07 16:59:12.000000000 +0100
@@ -939,6 +939,26 @@ static void sd_config_copy(struct scsi_d
(logical_block_size >> 9));
}
+#define SD_COPY_DISABLED_CACHE_TIME (HZ * 30)
+#define SD_COPY_DISABLED_CACHE_HASH_BITS 6
+#define SD_COPY_DISABLED_CACHE_HASH (1 << SD_COPY_DISABLED_CACHE_HASH_BITS)
+
+struct sd_copy_disabled_cache_entry {
+ struct scsi_device *src;
+ struct scsi_device *dst;
+ unsigned long jiffies;
+};
+
+static struct sd_copy_disabled_cache_entry sd_copy_disabled_cache[SD_COPY_DISABLED_CACHE_HASH];
+
+static struct sd_copy_disabled_cache_entry *sd_copy_disabled_cache_hash(
+ struct scsi_device *src, struct scsi_device *dst)
+{
+ return &sd_copy_disabled_cache[
+ hash_long((unsigned long)src + ((unsigned long)dst >> 1), SD_COPY_DISABLED_CACHE_HASH_BITS)
+ ];
+}
+
static int sd_setup_copy_cmnd(struct scsi_cmnd *cmd)
{
struct request *rq = cmd->request;
@@ -951,6 +971,7 @@ static int sd_setup_copy_cmnd(struct scs
struct bio *bio = rq->bio;
struct page *page;
unsigned char *buf;
+ struct sd_copy_disabled_cache_entry *e;
dst_sdp = scsi_disk(rq->rq_disk)->device;
dst_queue = rq->rq_disk->queue;
@@ -970,6 +991,12 @@ static int sd_setup_copy_cmnd(struct scs
if (src_sdp->sector_size != dst_sdp->sector_size)
return BLKPREP_KILL;
+ /* The copy failed in the past, so do not retry it for some time */
+ e = sd_copy_disabled_cache_hash(src_sdp, dst_sdp);
+ if (unlikely(jiffies - ACCESS_ONCE(e->jiffies) < SD_COPY_DISABLED_CACHE_TIME) &&
+ likely(ACCESS_ONCE(e->src) == src_sdp) && likely(ACCESS_ONCE(e->dst) == dst_sdp))
+ return BLKPREP_KILL;
+
dst_lba = blk_rq_pos(rq) >> (ilog2(dst_sdp->sector_size) - 9);
src_lba = bio->bi_copy->pair[0]->bi_iter.bi_sector >> (ilog2(src_sdp->sector_size) - 9);
nr_blocks = blk_rq_sectors(rq) >> (ilog2(dst_sdp->sector_size) - 9);
@@ -2003,6 +2030,16 @@ static int sd_done(struct scsi_cmnd *SCp
*/
case EXTENDED_COPY:
if ((SCpnt->cmnd[1] & 0x1f) == 0) {
+ struct sd_copy_disabled_cache_entry *e;
+ struct scsi_device *src_sdp, *dst_sdp;
+
+ dst_sdp = sdkp->device;
+ src_sdp = scsi_disk(req->bio->bi_copy->pair[0]->bi_bdev->bd_disk)->device;
+ e = sd_copy_disabled_cache_hash(src_sdp, dst_sdp);
+ ACCESS_ONCE(e->src) = src_sdp;
+ ACCESS_ONCE(e->dst) = dst_sdp;
+ ACCESS_ONCE(e->jiffies) = jiffies;
+
good_bytes = 0;
req->__data_len = blk_rq_bytes(req);
req->cmd_flags |= REQ_QUIET;
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
[PATCH 0/15] copy offload patches Mikulas Patocka <mpatocka@redhat.com> - 2015-12-10 18:40 +0100
[PATCH 7/15] scsi xcopy: keep cache of failures Mikulas Patocka <mpatocka@redhat.com> - 2015-12-10 18:40 +0100
[PATCH 5/15] block copy: use asynchronous notification Mikulas Patocka <mpatocka@redhat.com> - 2015-12-10 18:40 +0100
[PATCH 6/15] scsi xcopy: suppress error messages Mikulas Patocka <mpatocka@redhat.com> - 2015-12-10 18:40 +0100
[PATCH 4/15] block copy: use a timer to fix a theoretical deadlock Mikulas Patocka <mpatocka@redhat.com> - 2015-12-10 18:40 +0100
[PATCH 14/15] dm kcopyd: change mutex to spinlock Mikulas Patocka <mpatocka@redhat.com> - 2015-12-10 18:40 +0100
[PATCH 9/15] dm: implement copy Mikulas Patocka <mpatocka@redhat.com> - 2015-12-10 18:40 +0100
[PATCH 1/15] block copy: initial XCOPY offload support Mikulas Patocka <mpatocka@redhat.com> - 2015-12-10 18:40 +0100
[PATCH 12/15] dm kcopyd: introduce the function submit_job Mikulas Patocka <mpatocka@redhat.com> - 2015-12-10 18:40 +0100
Re: [PATCH 0/15] copy offload patches "Martin K. Petersen" <martin.petersen@oracle.com> - 2015-12-10 23:40 +0100
Re: [dm-devel] [PATCH 0/15] copy offload patches Mike Christie <michaelc@cs.wisc.edu> - 2015-12-11 06:10 +0100
Re: [dm-devel] [PATCH 0/15] copy offload patches Christoph Hellwig <hch@infradead.org> - 2015-12-11 21:00 +0100
csiph-web