Skip to content

Commit 15f73f5

Browse files
Christoph Hellwigaxboe
authored andcommitted
blk-mq: move failure injection out of blk_mq_complete_request
Move the call to blk_should_fake_timeout out of blk_mq_complete_request and into the drivers, skipping call sites that are obvious error handlers, and remove the now superflous blk_mq_force_complete_rq helper. This ensures we don't keep injecting errors into completions that just terminate the Linux request after the hardware has been reset or the command has been aborted. Reviewed-by: Daniel Wagner <dwagner@suse.de> Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Jens Axboe <axboe@kernel.dk>
1 parent d391a7a commit 15f73f5

File tree

19 files changed

+61
-72
lines changed

19 files changed

+61
-72
lines changed

block/blk-mq.c

Lines changed: 7 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -655,16 +655,13 @@ static void __blk_mq_complete_request_remote(void *data)
655655
}
656656

657657
/**
658-
* blk_mq_force_complete_rq() - Force complete the request, bypassing any error
659-
* injection that could drop the completion.
660-
* @rq: Request to be force completed
658+
* blk_mq_complete_request - end I/O on a request
659+
* @rq: the request being processed
661660
*
662-
* Drivers should use blk_mq_complete_request() to complete requests in their
663-
* normal IO path. For timeout error recovery, drivers may call this forced
664-
* completion routine after they've reclaimed timed out requests to bypass
665-
* potentially subsequent fake timeouts.
666-
*/
667-
void blk_mq_force_complete_rq(struct request *rq)
661+
* Description:
662+
* Complete a request by scheduling the ->complete_rq operation.
663+
**/
664+
void blk_mq_complete_request(struct request *rq)
668665
{
669666
struct blk_mq_ctx *ctx = rq->mq_ctx;
670667
struct request_queue *q = rq->q;
@@ -702,7 +699,7 @@ void blk_mq_force_complete_rq(struct request *rq)
702699
}
703700
put_cpu();
704701
}
705-
EXPORT_SYMBOL_GPL(blk_mq_force_complete_rq);
702+
EXPORT_SYMBOL(blk_mq_complete_request);
706703

707704
static void hctx_unlock(struct blk_mq_hw_ctx *hctx, int srcu_idx)
708705
__releases(hctx->srcu)
@@ -724,23 +721,6 @@ static void hctx_lock(struct blk_mq_hw_ctx *hctx, int *srcu_idx)
724721
*srcu_idx = srcu_read_lock(hctx->srcu);
725722
}
726723

727-
/**
728-
* blk_mq_complete_request - end I/O on a request
729-
* @rq: the request being processed
730-
*
731-
* Description:
732-
* Ends all I/O on a request. It does not handle partial completions.
733-
* The actual completion happens out-of-order, through a IPI handler.
734-
**/
735-
bool blk_mq_complete_request(struct request *rq)
736-
{
737-
if (unlikely(blk_should_fake_timeout(rq->q)))
738-
return false;
739-
blk_mq_force_complete_rq(rq);
740-
return true;
741-
}
742-
EXPORT_SYMBOL(blk_mq_complete_request);
743-
744724
/**
745725
* blk_mq_start_request - Start processing a request
746726
* @rq: Pointer to request to be started

block/blk-timeout.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,11 @@ static int __init setup_fail_io_timeout(char *str)
2020
}
2121
__setup("fail_io_timeout=", setup_fail_io_timeout);
2222

23-
int blk_should_fake_timeout(struct request_queue *q)
23+
bool __blk_should_fake_timeout(struct request_queue *q)
2424
{
25-
if (!test_bit(QUEUE_FLAG_FAIL_IO, &q->queue_flags))
26-
return 0;
27-
2825
return should_fail(&fail_io_timeout, 1);
2926
}
27+
EXPORT_SYMBOL_GPL(__blk_should_fake_timeout);
3028

3129
static int __init fail_io_timeout_debugfs(void)
3230
{

block/blk.h

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -223,18 +223,9 @@ ssize_t part_fail_show(struct device *dev, struct device_attribute *attr,
223223
char *buf);
224224
ssize_t part_fail_store(struct device *dev, struct device_attribute *attr,
225225
const char *buf, size_t count);
226-
227-
#ifdef CONFIG_FAIL_IO_TIMEOUT
228-
int blk_should_fake_timeout(struct request_queue *);
229226
ssize_t part_timeout_show(struct device *, struct device_attribute *, char *);
230227
ssize_t part_timeout_store(struct device *, struct device_attribute *,
231228
const char *, size_t);
232-
#else
233-
static inline int blk_should_fake_timeout(struct request_queue *q)
234-
{
235-
return 0;
236-
}
237-
#endif
238229

239230
void __blk_queue_split(struct request_queue *q, struct bio **bio,
240231
unsigned int *nr_segs);

block/bsg-lib.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,9 +181,12 @@ EXPORT_SYMBOL_GPL(bsg_job_get);
181181
void bsg_job_done(struct bsg_job *job, int result,
182182
unsigned int reply_payload_rcv_len)
183183
{
184+
struct request *rq = blk_mq_rq_from_pdu(job);
185+
184186
job->result = result;
185187
job->reply_payload_rcv_len = reply_payload_rcv_len;
186-
blk_mq_complete_request(blk_mq_rq_from_pdu(job));
188+
if (likely(!blk_should_fake_timeout(rq->q)))
189+
blk_mq_complete_request(rq);
187190
}
188191
EXPORT_SYMBOL_GPL(bsg_job_done);
189192

drivers/block/loop.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -509,7 +509,8 @@ static void lo_rw_aio_do_completion(struct loop_cmd *cmd)
509509
return;
510510
kfree(cmd->bvec);
511511
cmd->bvec = NULL;
512-
blk_mq_complete_request(rq);
512+
if (likely(!blk_should_fake_timeout(rq->q)))
513+
blk_mq_complete_request(rq);
513514
}
514515

515516
static void lo_rw_aio_complete(struct kiocb *iocb, long ret, long ret2)
@@ -2048,7 +2049,8 @@ static void loop_handle_cmd(struct loop_cmd *cmd)
20482049
cmd->ret = ret;
20492050
else
20502051
cmd->ret = ret ? -EIO : 0;
2051-
blk_mq_complete_request(rq);
2052+
if (likely(!blk_should_fake_timeout(rq->q)))
2053+
blk_mq_complete_request(rq);
20522054
}
20532055
}
20542056

drivers/block/mtip32xx/mtip32xx.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -492,7 +492,8 @@ static void mtip_complete_command(struct mtip_cmd *cmd, blk_status_t status)
492492
struct request *req = blk_mq_rq_from_pdu(cmd);
493493

494494
cmd->status = status;
495-
blk_mq_complete_request(req);
495+
if (likely(!blk_should_fake_timeout(req->q)))
496+
blk_mq_complete_request(req);
496497
}
497498

498499
/*

drivers/block/nbd.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -784,6 +784,7 @@ static void recv_work(struct work_struct *work)
784784
struct nbd_device *nbd = args->nbd;
785785
struct nbd_config *config = nbd->config;
786786
struct nbd_cmd *cmd;
787+
struct request *rq;
787788

788789
while (1) {
789790
cmd = nbd_read_stat(nbd, args->index);
@@ -796,7 +797,9 @@ static void recv_work(struct work_struct *work)
796797
break;
797798
}
798799

799-
blk_mq_complete_request(blk_mq_rq_from_pdu(cmd));
800+
rq = blk_mq_rq_from_pdu(cmd);
801+
if (likely(!blk_should_fake_timeout(rq->q)))
802+
blk_mq_complete_request(rq);
800803
}
801804
atomic_dec(&config->recv_threads);
802805
wake_up(&config->recv_wq);

drivers/block/null_blk_main.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1283,7 +1283,8 @@ static inline void nullb_complete_cmd(struct nullb_cmd *cmd)
12831283
case NULL_IRQ_SOFTIRQ:
12841284
switch (cmd->nq->dev->queue_mode) {
12851285
case NULL_Q_MQ:
1286-
blk_mq_complete_request(cmd->rq);
1286+
if (likely(!blk_should_fake_timeout(cmd->rq->q)))
1287+
blk_mq_complete_request(cmd->rq);
12871288
break;
12881289
case NULL_Q_BIO:
12891290
/*
@@ -1423,7 +1424,7 @@ static bool should_requeue_request(struct request *rq)
14231424
static enum blk_eh_timer_return null_timeout_rq(struct request *rq, bool res)
14241425
{
14251426
pr_info("rq %p timed out\n", rq);
1426-
blk_mq_force_complete_rq(rq);
1427+
blk_mq_complete_request(rq);
14271428
return BLK_EH_DONE;
14281429
}
14291430

drivers/block/skd_main.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1417,7 +1417,8 @@ static void skd_resolve_req_exception(struct skd_device *skdev,
14171417
case SKD_CHECK_STATUS_REPORT_GOOD:
14181418
case SKD_CHECK_STATUS_REPORT_SMART_ALERT:
14191419
skreq->status = BLK_STS_OK;
1420-
blk_mq_complete_request(req);
1420+
if (likely(!blk_should_fake_timeout(req->q)))
1421+
blk_mq_complete_request(req);
14211422
break;
14221423

14231424
case SKD_CHECK_STATUS_BUSY_IMMINENT:
@@ -1440,7 +1441,8 @@ static void skd_resolve_req_exception(struct skd_device *skdev,
14401441
case SKD_CHECK_STATUS_REPORT_ERROR:
14411442
default:
14421443
skreq->status = BLK_STS_IOERR;
1443-
blk_mq_complete_request(req);
1444+
if (likely(!blk_should_fake_timeout(req->q)))
1445+
blk_mq_complete_request(req);
14441446
break;
14451447
}
14461448
}
@@ -1560,7 +1562,8 @@ static int skd_isr_completion_posted(struct skd_device *skdev,
15601562
*/
15611563
if (likely(cmp_status == SAM_STAT_GOOD)) {
15621564
skreq->status = BLK_STS_OK;
1563-
blk_mq_complete_request(rq);
1565+
if (likely(!blk_should_fake_timeout(rq->q)))
1566+
blk_mq_complete_request(rq);
15641567
} else {
15651568
skd_resolve_req_exception(skdev, skreq, rq);
15661569
}

drivers/block/virtio_blk.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,8 @@ static void virtblk_done(struct virtqueue *vq)
171171
while ((vbr = virtqueue_get_buf(vblk->vqs[qid].vq, &len)) != NULL) {
172172
struct request *req = blk_mq_rq_from_pdu(vbr);
173173

174-
blk_mq_complete_request(req);
174+
if (likely(!blk_should_fake_timeout(req->q)))
175+
blk_mq_complete_request(req);
175176
req_done = true;
176177
}
177178
if (unlikely(virtqueue_is_broken(vq)))

0 commit comments

Comments
 (0)