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 7/15] scsi xcopy: keep cache of failures
Date: Thu, 10 Dec 2015 12:30:37 -0500 (EST)	[thread overview]
Message-ID: <alpine.LRH.2.02.1512101212220.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>

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;

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

Thread overview: 25+ 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 ` Mikulas Patocka [this message]
2015-12-10 17:30 ` [PATCH 8/15] block copy: introduce "copy_boundary" limits Mikulas Patocka
2015-12-10 17:30 ` [PATCH 9/15] dm: implement copy Mikulas Patocka
2015-12-10 17:30   ` 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

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.1512101212220.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.