dm mpath: delay the retry of a request if the target responded as busy
Add DM_ENDIO_DELAY_REQUEUE to allow request-based multipath's multipath_end_io() to instruct dm-rq.c:dm_done() to delay a requeue. This is beneficial to do if BLK_STS_RESOURCE is returned from the target (because target is busy). Relative to blk-mq: kick the hw queues via blk_mq_requeue_work(), indirectly from dm-rq.c:__dm_mq_kick_requeue_list(), after a delay. For old .request_fn: use blk_delay_queue(). bio-based multipath doesn't have feature parity with request-based for retryable error requeues; that is something that'll need fixing in the future. Suggested-by: Bart Van Assche <bart.vanassche@wdc.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com> Acked-by: Bart Van Assche <bart.vanassche@wdc.com> [as interpreted from Bart's "... patch looks fine to me."]
This commit is contained in:
parent
459b54019c
commit
ac514ffc96
@ -1585,7 +1585,10 @@ static int multipath_end_io(struct dm_target *ti, struct request *clone,
|
||||
if (error && !noretry_error(error)) {
|
||||
struct multipath *m = ti->private;
|
||||
|
||||
r = DM_ENDIO_REQUEUE;
|
||||
if (error == BLK_STS_RESOURCE)
|
||||
r = DM_ENDIO_DELAY_REQUEUE;
|
||||
else
|
||||
r = DM_ENDIO_REQUEUE;
|
||||
|
||||
if (pgpath)
|
||||
fail_path(pgpath);
|
||||
|
@ -315,6 +315,10 @@ static void dm_done(struct request *clone, blk_status_t error, bool mapped)
|
||||
/* The target wants to requeue the I/O */
|
||||
dm_requeue_original_request(tio, false);
|
||||
break;
|
||||
case DM_ENDIO_DELAY_REQUEUE:
|
||||
/* The target wants to requeue the I/O after a delay */
|
||||
dm_requeue_original_request(tio, true);
|
||||
break;
|
||||
default:
|
||||
DMWARN("unimplemented target endio return value: %d", r);
|
||||
BUG();
|
||||
|
@ -550,6 +550,7 @@ do { \
|
||||
#define DM_ENDIO_DONE 0
|
||||
#define DM_ENDIO_INCOMPLETE 1
|
||||
#define DM_ENDIO_REQUEUE 2
|
||||
#define DM_ENDIO_DELAY_REQUEUE 3
|
||||
|
||||
/*
|
||||
* Definitions of return values from target map function.
|
||||
@ -557,7 +558,7 @@ do { \
|
||||
#define DM_MAPIO_SUBMITTED 0
|
||||
#define DM_MAPIO_REMAPPED 1
|
||||
#define DM_MAPIO_REQUEUE DM_ENDIO_REQUEUE
|
||||
#define DM_MAPIO_DELAY_REQUEUE 3
|
||||
#define DM_MAPIO_DELAY_REQUEUE DM_ENDIO_DELAY_REQUEUE
|
||||
#define DM_MAPIO_KILL 4
|
||||
|
||||
#define dm_sector_div64(x, y)( \
|
||||
|
Loading…
Reference in New Issue
Block a user