xref: /linux/block/blk-timeout.c (revision dd48c085c1cdf9446f92826f1fd451167fb6c2fd)
1242f9dcbSJens Axboe /*
2242f9dcbSJens Axboe  * Functions related to generic timeout handling of requests.
3242f9dcbSJens Axboe  */
4242f9dcbSJens Axboe #include <linux/kernel.h>
5242f9dcbSJens Axboe #include <linux/module.h>
6242f9dcbSJens Axboe #include <linux/blkdev.h>
7581d4e28SJens Axboe #include <linux/fault-inject.h>
8242f9dcbSJens Axboe 
9242f9dcbSJens Axboe #include "blk.h"
10242f9dcbSJens Axboe 
11581d4e28SJens Axboe #ifdef CONFIG_FAIL_IO_TIMEOUT
12581d4e28SJens Axboe 
13581d4e28SJens Axboe static DECLARE_FAULT_ATTR(fail_io_timeout);
14581d4e28SJens Axboe 
15581d4e28SJens Axboe static int __init setup_fail_io_timeout(char *str)
16581d4e28SJens Axboe {
17581d4e28SJens Axboe 	return setup_fault_attr(&fail_io_timeout, str);
18581d4e28SJens Axboe }
19581d4e28SJens Axboe __setup("fail_io_timeout=", setup_fail_io_timeout);
20581d4e28SJens Axboe 
21581d4e28SJens Axboe int blk_should_fake_timeout(struct request_queue *q)
22581d4e28SJens Axboe {
23581d4e28SJens Axboe 	if (!test_bit(QUEUE_FLAG_FAIL_IO, &q->queue_flags))
24581d4e28SJens Axboe 		return 0;
25581d4e28SJens Axboe 
26581d4e28SJens Axboe 	return should_fail(&fail_io_timeout, 1);
27581d4e28SJens Axboe }
28581d4e28SJens Axboe 
29581d4e28SJens Axboe static int __init fail_io_timeout_debugfs(void)
30581d4e28SJens Axboe {
31*dd48c085SAkinobu Mita 	struct dentry *dir = fault_create_debugfs_attr("fail_io_timeout",
32*dd48c085SAkinobu Mita 						NULL, &fail_io_timeout);
33*dd48c085SAkinobu Mita 
34*dd48c085SAkinobu Mita 	return IS_ERR(dir) ? PTR_ERR(dir) : 0;
35581d4e28SJens Axboe }
36581d4e28SJens Axboe 
37581d4e28SJens Axboe late_initcall(fail_io_timeout_debugfs);
38581d4e28SJens Axboe 
39581d4e28SJens Axboe ssize_t part_timeout_show(struct device *dev, struct device_attribute *attr,
40581d4e28SJens Axboe 			  char *buf)
41581d4e28SJens Axboe {
42581d4e28SJens Axboe 	struct gendisk *disk = dev_to_disk(dev);
43581d4e28SJens Axboe 	int set = test_bit(QUEUE_FLAG_FAIL_IO, &disk->queue->queue_flags);
44581d4e28SJens Axboe 
45581d4e28SJens Axboe 	return sprintf(buf, "%d\n", set != 0);
46581d4e28SJens Axboe }
47581d4e28SJens Axboe 
48581d4e28SJens Axboe ssize_t part_timeout_store(struct device *dev, struct device_attribute *attr,
49581d4e28SJens Axboe 			   const char *buf, size_t count)
50581d4e28SJens Axboe {
51581d4e28SJens Axboe 	struct gendisk *disk = dev_to_disk(dev);
52581d4e28SJens Axboe 	int val;
53581d4e28SJens Axboe 
54581d4e28SJens Axboe 	if (count) {
55581d4e28SJens Axboe 		struct request_queue *q = disk->queue;
56581d4e28SJens Axboe 		char *p = (char *) buf;
57581d4e28SJens Axboe 
58581d4e28SJens Axboe 		val = simple_strtoul(p, &p, 10);
59581d4e28SJens Axboe 		spin_lock_irq(q->queue_lock);
60581d4e28SJens Axboe 		if (val)
61581d4e28SJens Axboe 			queue_flag_set(QUEUE_FLAG_FAIL_IO, q);
62581d4e28SJens Axboe 		else
63581d4e28SJens Axboe 			queue_flag_clear(QUEUE_FLAG_FAIL_IO, q);
64581d4e28SJens Axboe 		spin_unlock_irq(q->queue_lock);
65581d4e28SJens Axboe 	}
66581d4e28SJens Axboe 
67581d4e28SJens Axboe 	return count;
68581d4e28SJens Axboe }
69581d4e28SJens Axboe 
70581d4e28SJens Axboe #endif /* CONFIG_FAIL_IO_TIMEOUT */
71581d4e28SJens Axboe 
72242f9dcbSJens Axboe /*
73242f9dcbSJens Axboe  * blk_delete_timer - Delete/cancel timer for a given function.
74242f9dcbSJens Axboe  * @req:	request that we are canceling timer for
75242f9dcbSJens Axboe  *
76242f9dcbSJens Axboe  */
77242f9dcbSJens Axboe void blk_delete_timer(struct request *req)
78242f9dcbSJens Axboe {
79242f9dcbSJens Axboe 	list_del_init(&req->timeout_list);
80242f9dcbSJens Axboe }
81242f9dcbSJens Axboe 
82242f9dcbSJens Axboe static void blk_rq_timed_out(struct request *req)
83242f9dcbSJens Axboe {
84242f9dcbSJens Axboe 	struct request_queue *q = req->q;
85242f9dcbSJens Axboe 	enum blk_eh_timer_return ret;
86242f9dcbSJens Axboe 
87242f9dcbSJens Axboe 	ret = q->rq_timed_out_fn(req);
88242f9dcbSJens Axboe 	switch (ret) {
89242f9dcbSJens Axboe 	case BLK_EH_HANDLED:
90242f9dcbSJens Axboe 		__blk_complete_request(req);
91242f9dcbSJens Axboe 		break;
92242f9dcbSJens Axboe 	case BLK_EH_RESET_TIMER:
93242f9dcbSJens Axboe 		blk_clear_rq_complete(req);
94242f9dcbSJens Axboe 		blk_add_timer(req);
95242f9dcbSJens Axboe 		break;
96242f9dcbSJens Axboe 	case BLK_EH_NOT_HANDLED:
97242f9dcbSJens Axboe 		/*
98242f9dcbSJens Axboe 		 * LLD handles this for now but in the future
99242f9dcbSJens Axboe 		 * we can send a request msg to abort the command
100242f9dcbSJens Axboe 		 * and we can move more of the generic scsi eh code to
101242f9dcbSJens Axboe 		 * the blk layer.
102242f9dcbSJens Axboe 		 */
103242f9dcbSJens Axboe 		break;
104242f9dcbSJens Axboe 	default:
105242f9dcbSJens Axboe 		printk(KERN_ERR "block: bad eh return: %d\n", ret);
106242f9dcbSJens Axboe 		break;
107242f9dcbSJens Axboe 	}
108242f9dcbSJens Axboe }
109242f9dcbSJens Axboe 
110242f9dcbSJens Axboe void blk_rq_timed_out_timer(unsigned long data)
111242f9dcbSJens Axboe {
112242f9dcbSJens Axboe 	struct request_queue *q = (struct request_queue *) data;
113565e411dSmalahal@us.ibm.com 	unsigned long flags, next = 0;
114242f9dcbSJens Axboe 	struct request *rq, *tmp;
115a534dbe9SRichard Kennedy 	int next_set = 0;
116242f9dcbSJens Axboe 
117242f9dcbSJens Axboe 	spin_lock_irqsave(q->queue_lock, flags);
118242f9dcbSJens Axboe 
119242f9dcbSJens Axboe 	list_for_each_entry_safe(rq, tmp, &q->timeout_list, timeout_list) {
120242f9dcbSJens Axboe 		if (time_after_eq(jiffies, rq->deadline)) {
121242f9dcbSJens Axboe 			list_del_init(&rq->timeout_list);
122242f9dcbSJens Axboe 
123242f9dcbSJens Axboe 			/*
124242f9dcbSJens Axboe 			 * Check if we raced with end io completion
125242f9dcbSJens Axboe 			 */
126242f9dcbSJens Axboe 			if (blk_mark_rq_complete(rq))
127242f9dcbSJens Axboe 				continue;
128242f9dcbSJens Axboe 			blk_rq_timed_out(rq);
129a534dbe9SRichard Kennedy 		} else if (!next_set || time_after(next, rq->deadline)) {
130565e411dSmalahal@us.ibm.com 			next = rq->deadline;
131a534dbe9SRichard Kennedy 			next_set = 1;
132a534dbe9SRichard Kennedy 		}
133242f9dcbSJens Axboe 	}
134242f9dcbSJens Axboe 
135a534dbe9SRichard Kennedy 	if (next_set)
1367838c15bSAlan Stern 		mod_timer(&q->timeout, round_jiffies_up(next));
137242f9dcbSJens Axboe 
138242f9dcbSJens Axboe 	spin_unlock_irqrestore(q->queue_lock, flags);
139242f9dcbSJens Axboe }
140242f9dcbSJens Axboe 
141242f9dcbSJens Axboe /**
142242f9dcbSJens Axboe  * blk_abort_request -- Request request recovery for the specified command
143242f9dcbSJens Axboe  * @req:	pointer to the request of interest
144242f9dcbSJens Axboe  *
145242f9dcbSJens Axboe  * This function requests that the block layer start recovery for the
146242f9dcbSJens Axboe  * request by deleting the timer and calling the q's timeout function.
147242f9dcbSJens Axboe  * LLDDs who implement their own error recovery MAY ignore the timeout
148242f9dcbSJens Axboe  * event if they generated blk_abort_req. Must hold queue lock.
149242f9dcbSJens Axboe  */
150242f9dcbSJens Axboe void blk_abort_request(struct request *req)
151242f9dcbSJens Axboe {
1527ba1fbaaSJens Axboe 	if (blk_mark_rq_complete(req))
1537ba1fbaaSJens Axboe 		return;
154242f9dcbSJens Axboe 	blk_delete_timer(req);
155242f9dcbSJens Axboe 	blk_rq_timed_out(req);
156242f9dcbSJens Axboe }
157242f9dcbSJens Axboe EXPORT_SYMBOL_GPL(blk_abort_request);
158242f9dcbSJens Axboe 
159242f9dcbSJens Axboe /**
160242f9dcbSJens Axboe  * blk_add_timer - Start timeout timer for a single request
161242f9dcbSJens Axboe  * @req:	request that is about to start running.
162242f9dcbSJens Axboe  *
163242f9dcbSJens Axboe  * Notes:
164242f9dcbSJens Axboe  *    Each request has its own timer, and as it is added to the queue, we
165242f9dcbSJens Axboe  *    set up the timer. When the request completes, we cancel the timer.
166242f9dcbSJens Axboe  */
167242f9dcbSJens Axboe void blk_add_timer(struct request *req)
168242f9dcbSJens Axboe {
169242f9dcbSJens Axboe 	struct request_queue *q = req->q;
170242f9dcbSJens Axboe 	unsigned long expiry;
171242f9dcbSJens Axboe 
172242f9dcbSJens Axboe 	if (!q->rq_timed_out_fn)
173242f9dcbSJens Axboe 		return;
174242f9dcbSJens Axboe 
175242f9dcbSJens Axboe 	BUG_ON(!list_empty(&req->timeout_list));
176242f9dcbSJens Axboe 	BUG_ON(test_bit(REQ_ATOM_COMPLETE, &req->atomic_flags));
177242f9dcbSJens Axboe 
178242f9dcbSJens Axboe 	/*
1792eef33e4STejun Heo 	 * Some LLDs, like scsi, peek at the timeout to prevent a
1802eef33e4STejun Heo 	 * command from being retried forever.
181242f9dcbSJens Axboe 	 */
1822eef33e4STejun Heo 	if (!req->timeout)
183242f9dcbSJens Axboe 		req->timeout = q->rq_timeout;
1842eef33e4STejun Heo 
1852eef33e4STejun Heo 	req->deadline = jiffies + req->timeout;
186242f9dcbSJens Axboe 	list_add_tail(&req->timeout_list, &q->timeout_list);
187242f9dcbSJens Axboe 
188242f9dcbSJens Axboe 	/*
189242f9dcbSJens Axboe 	 * If the timer isn't already pending or this timeout is earlier
1907838c15bSAlan Stern 	 * than an existing one, modify the timer. Round up to next nearest
191242f9dcbSJens Axboe 	 * second.
192242f9dcbSJens Axboe 	 */
1937838c15bSAlan Stern 	expiry = round_jiffies_up(req->deadline);
194242f9dcbSJens Axboe 
195242f9dcbSJens Axboe 	if (!timer_pending(&q->timeout) ||
196242f9dcbSJens Axboe 	    time_before(expiry, q->timeout.expires))
197242f9dcbSJens Axboe 		mod_timer(&q->timeout, expiry);
198242f9dcbSJens Axboe }
19911914a53SMike Anderson 
20011914a53SMike Anderson /**
20111914a53SMike Anderson  * blk_abort_queue -- Abort all request on given queue
20211914a53SMike Anderson  * @queue:	pointer to queue
20311914a53SMike Anderson  *
20411914a53SMike Anderson  */
20511914a53SMike Anderson void blk_abort_queue(struct request_queue *q)
20611914a53SMike Anderson {
20711914a53SMike Anderson 	unsigned long flags;
20811914a53SMike Anderson 	struct request *rq, *tmp;
209be987fdbSHannes Reinecke 	LIST_HEAD(list);
21011914a53SMike Anderson 
211b7591134SJens Axboe 	/*
212b7591134SJens Axboe 	 * Not a request based block device, nothing to abort
213b7591134SJens Axboe 	 */
214b7591134SJens Axboe 	if (!q->request_fn)
215b7591134SJens Axboe 		return;
216b7591134SJens Axboe 
21711914a53SMike Anderson 	spin_lock_irqsave(q->queue_lock, flags);
21811914a53SMike Anderson 
21911914a53SMike Anderson 	elv_abort_queue(q);
22011914a53SMike Anderson 
221be987fdbSHannes Reinecke 	/*
222be987fdbSHannes Reinecke 	 * Splice entries to local list, to avoid deadlocking if entries
223be987fdbSHannes Reinecke 	 * get readded to the timeout list by error handling
224be987fdbSHannes Reinecke 	 */
225be987fdbSHannes Reinecke 	list_splice_init(&q->timeout_list, &list);
226be987fdbSHannes Reinecke 
227be987fdbSHannes Reinecke 	list_for_each_entry_safe(rq, tmp, &list, timeout_list)
22811914a53SMike Anderson 		blk_abort_request(rq);
22911914a53SMike Anderson 
23017d5c8caSHannes Reinecke 	/*
23117d5c8caSHannes Reinecke 	 * Occasionally, blk_abort_request() will return without
23217d5c8caSHannes Reinecke 	 * deleting the element from the list. Make sure we add those back
23317d5c8caSHannes Reinecke 	 * instead of leaving them on the local stack list.
23417d5c8caSHannes Reinecke 	 */
23517d5c8caSHannes Reinecke 	list_splice(&list, &q->timeout_list);
23617d5c8caSHannes Reinecke 
23711914a53SMike Anderson 	spin_unlock_irqrestore(q->queue_lock, flags);
23811914a53SMike Anderson 
23911914a53SMike Anderson }
24011914a53SMike Anderson EXPORT_SYMBOL_GPL(blk_abort_queue);
241