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