3003 lines · 79.6 KB · C
RawDownload
/* * Copyright (C) 1991, 1992 Linus Torvalds * Copyright (C) 1994,      Karl Keyte: Added support for disk statistics * Elevator latency, (C) 2000  Andrea Arcangeli <andrea@suse.de> SuSE * Queue request tables / lock, selectable elevator, Jens Axboe <axboe@suse.de> * kernel-doc documentation started by NeilBrown <neilb@cse.unsw.edu.au> *	-  July2000 * bio rewrite, highmem i/o, etc, Jens Axboe <axboe@suse.de> - may 2001 */ /* * This handles all read/write requests to block devices */#include <linux/kernel.h>#include <linux/module.h>#include <linux/backing-dev.h>#include <linux/bio.h>#include <linux/blkdev.h>#include <linux/highmem.h>#include <linux/mm.h>#include <linux/kernel_stat.h>#include <linux/string.h>#include <linux/init.h>#include <linux/completion.h>#include <linux/slab.h>#include <linux/swap.h>#include <linux/writeback.h>#include <linux/task_io_accounting_ops.h>#include <linux/fault-inject.h>#include <linux/list_sort.h>#include <linux/delay.h>#include <linux/ratelimit.h> #define CREATE_TRACE_POINTS#include <trace/events/block.h> #include "blk.h"#include "blk-cgroup.h" EXPORT_TRACEPOINT_SYMBOL_GPL(block_bio_remap);EXPORT_TRACEPOINT_SYMBOL_GPL(block_rq_remap);EXPORT_TRACEPOINT_SYMBOL_GPL(block_bio_complete); DEFINE_IDA(blk_queue_ida); /* * For the allocated request tables */static struct kmem_cache *request_cachep; /* * For queue allocation */struct kmem_cache *blk_requestq_cachep; /* * Controlling structure to kblockd */static struct workqueue_struct *kblockd_workqueue; static void drive_stat_acct(struct request *rq, int new_io){	struct hd_struct *part;	int rw = rq_data_dir(rq);	int cpu; 	if (!blk_do_io_stat(rq))		return; 	cpu = part_stat_lock(); 	if (!new_io) {		part = rq->part;		part_stat_inc(cpu, part, merges[rw]);	} else {		part = disk_map_sector_rcu(rq->rq_disk, blk_rq_pos(rq));		if (!hd_struct_try_get(part)) {			/*			 * The partition is already being removed,			 * the request will be accounted on the disk only			 *			 * We take a reference on disk->part0 although that			 * partition will never be deleted, so we can treat			 * it as any other partition.			 */			part = &rq->rq_disk->part0;			hd_struct_get(part);		}		part_round_stats(cpu, part);		part_inc_in_flight(part, rw);		rq->part = part;	} 	part_stat_unlock();} void blk_queue_congestion_threshold(struct request_queue *q){	int nr; 	nr = q->nr_requests - (q->nr_requests / 8) + 1;	if (nr > q->nr_requests)		nr = q->nr_requests;	q->nr_congestion_on = nr; 	nr = q->nr_requests - (q->nr_requests / 8) - (q->nr_requests / 16) - 1;	if (nr < 1)		nr = 1;	q->nr_congestion_off = nr;} /** * blk_get_backing_dev_info - get the address of a queue's backing_dev_info * @bdev:	device * * Locates the passed device's request queue and returns the address of its * backing_dev_info * * Will return NULL if the request queue cannot be located. */struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev){	struct backing_dev_info *ret = NULL;	struct request_queue *q = bdev_get_queue(bdev); 	if (q)		ret = &q->backing_dev_info;	return ret;}EXPORT_SYMBOL(blk_get_backing_dev_info); void blk_rq_init(struct request_queue *q, struct request *rq){	memset(rq, 0, sizeof(*rq)); 	INIT_LIST_HEAD(&rq->queuelist);	INIT_LIST_HEAD(&rq->timeout_list);	rq->cpu = -1;	rq->q = q;	rq->__sector = (sector_t) -1;	INIT_HLIST_NODE(&rq->hash);	RB_CLEAR_NODE(&rq->rb_node);	rq->cmd = rq->__cmd;	rq->cmd_len = BLK_MAX_CDB;	rq->tag = -1;	rq->ref_count = 1;	rq->start_time = jiffies;	set_start_time_ns(rq);	rq->part = NULL;}EXPORT_SYMBOL(blk_rq_init); static void req_bio_endio(struct request *rq, struct bio *bio,			  unsigned int nbytes, int error){	if (error)		clear_bit(BIO_UPTODATE, &bio->bi_flags);	else if (!test_bit(BIO_UPTODATE, &bio->bi_flags))		error = -EIO; 	if (unlikely(nbytes > bio->bi_size)) {		printk(KERN_ERR "%s: want %u bytes done, %u left\n",		       __func__, nbytes, bio->bi_size);		nbytes = bio->bi_size;	} 	if (unlikely(rq->cmd_flags & REQ_QUIET))		set_bit(BIO_QUIET, &bio->bi_flags); 	bio->bi_size -= nbytes;	bio->bi_sector += (nbytes >> 9); 	if (bio_integrity(bio))		bio_integrity_advance(bio, nbytes); 	/* don't actually finish bio if it's part of flush sequence */	if (bio->bi_size == 0 && !(rq->cmd_flags & REQ_FLUSH_SEQ))		bio_endio(bio, error);} void blk_dump_rq_flags(struct request *rq, char *msg){	int bit; 	printk(KERN_INFO "%s: dev %s: type=%x, flags=%x\n", msg,		rq->rq_disk ? rq->rq_disk->disk_name : "?", rq->cmd_type,		rq->cmd_flags); 	printk(KERN_INFO "  sector %llu, nr/cnr %u/%u\n",	       (unsigned long long)blk_rq_pos(rq),	       blk_rq_sectors(rq), blk_rq_cur_sectors(rq));	printk(KERN_INFO "  bio %p, biotail %p, buffer %p, len %u\n",	       rq->bio, rq->biotail, rq->buffer, blk_rq_bytes(rq)); 	if (rq->cmd_type == REQ_TYPE_BLOCK_PC) {		printk(KERN_INFO "  cdb: ");		for (bit = 0; bit < BLK_MAX_CDB; bit++)			printk("%02x ", rq->cmd[bit]);		printk("\n");	}}EXPORT_SYMBOL(blk_dump_rq_flags); static void blk_delay_work(struct work_struct *work){	struct request_queue *q; 	q = container_of(work, struct request_queue, delay_work.work);	spin_lock_irq(q->queue_lock);	__blk_run_queue(q);	spin_unlock_irq(q->queue_lock);} /** * blk_delay_queue - restart queueing after defined interval * @q:		The &struct request_queue in question * @msecs:	Delay in msecs * * Description: *   Sometimes queueing needs to be postponed for a little while, to allow *   resources to come back. This function will make sure that queueing is *   restarted around the specified time. */void blk_delay_queue(struct request_queue *q, unsigned long msecs){	queue_delayed_work(kblockd_workqueue, &q->delay_work,				msecs_to_jiffies(msecs));}EXPORT_SYMBOL(blk_delay_queue); /** * blk_start_queue - restart a previously stopped queue * @q:    The &struct request_queue in question * * Description: *   blk_start_queue() will clear the stop flag on the queue, and call *   the request_fn for the queue if it was in a stopped state when *   entered. Also see blk_stop_queue(). Queue lock must be held. **/void blk_start_queue(struct request_queue *q){	WARN_ON(!irqs_disabled()); 	queue_flag_clear(QUEUE_FLAG_STOPPED, q);	__blk_run_queue(q);}EXPORT_SYMBOL(blk_start_queue); /** * blk_stop_queue - stop a queue * @q:    The &struct request_queue in question * * Description: *   The Linux block layer assumes that a block driver will consume all *   entries on the request queue when the request_fn strategy is called. *   Often this will not happen, because of hardware limitations (queue *   depth settings). If a device driver gets a 'queue full' response, *   or if it simply chooses not to queue more I/O at one point, it can *   call this function to prevent the request_fn from being called until *   the driver has signalled it's ready to go again. This happens by calling *   blk_start_queue() to restart queue operations. Queue lock must be held. **/void blk_stop_queue(struct request_queue *q){	__cancel_delayed_work(&q->delay_work);	queue_flag_set(QUEUE_FLAG_STOPPED, q);}EXPORT_SYMBOL(blk_stop_queue); /** * blk_sync_queue - cancel any pending callbacks on a queue * @q: the queue * * Description: *     The block layer may perform asynchronous callback activity *     on a queue, such as calling the unplug function after a timeout. *     A block device may call blk_sync_queue to ensure that any *     such activity is cancelled, thus allowing it to release resources *     that the callbacks might use. The caller must already have made sure *     that its ->make_request_fn will not re-add plugging prior to calling *     this function. * *     This function does not cancel any asynchronous activity arising *     out of elevator or throttling code. That would require elevaotor_exit() *     and blkcg_exit_queue() to be called with queue lock initialized. * */void blk_sync_queue(struct request_queue *q){	del_timer_sync(&q->timeout);	cancel_delayed_work_sync(&q->delay_work);}EXPORT_SYMBOL(blk_sync_queue); /** * __blk_run_queue - run a single device queue * @q:	The queue to run * * Description: *    See @blk_run_queue. This variant must be called with the queue lock *    held and interrupts disabled. */void __blk_run_queue(struct request_queue *q){	if (unlikely(blk_queue_stopped(q)))		return; 	q->request_fn(q);}EXPORT_SYMBOL(__blk_run_queue); /** * blk_run_queue_async - run a single device queue in workqueue context * @q:	The queue to run * * Description: *    Tells kblockd to perform the equivalent of @blk_run_queue on behalf *    of us. */void blk_run_queue_async(struct request_queue *q){	if (likely(!blk_queue_stopped(q))) {		__cancel_delayed_work(&q->delay_work);		queue_delayed_work(kblockd_workqueue, &q->delay_work, 0);	}}EXPORT_SYMBOL(blk_run_queue_async); /** * blk_run_queue - run a single device queue * @q: The queue to run * * Description: *    Invoke request handling on this queue, if it has pending work to do. *    May be used to restart queueing when a request has completed. */void blk_run_queue(struct request_queue *q){	unsigned long flags; 	spin_lock_irqsave(q->queue_lock, flags);	__blk_run_queue(q);	spin_unlock_irqrestore(q->queue_lock, flags);}EXPORT_SYMBOL(blk_run_queue); void blk_put_queue(struct request_queue *q){	kobject_put(&q->kobj);}EXPORT_SYMBOL(blk_put_queue); /** * blk_drain_queue - drain requests from request_queue * @q: queue to drain * @drain_all: whether to drain all requests or only the ones w/ ELVPRIV * * Drain requests from @q.  If @drain_all is set, all requests are drained. * If not, only ELVPRIV requests are drained.  The caller is responsible * for ensuring that no new requests which need to be drained are queued. */void blk_drain_queue(struct request_queue *q, bool drain_all){	while (true) {		bool drain = false;		int i; 		spin_lock_irq(q->queue_lock); 		/*		 * The caller might be trying to drain @q before its		 * elevator is initialized.		 */		if (q->elevator)			elv_drain_elevator(q); 		blkcg_drain_queue(q); 		/*		 * This function might be called on a queue which failed		 * driver init after queue creation or is not yet fully		 * active yet.  Some drivers (e.g. fd and loop) get unhappy		 * in such cases.  Kick queue iff dispatch queue has		 * something on it and @q has request_fn set.		 */		if (!list_empty(&q->queue_head) && q->request_fn)			__blk_run_queue(q); 		drain |= q->rq.elvpriv; 		/*		 * Unfortunately, requests are queued at and tracked from		 * multiple places and there's no single counter which can		 * be drained.  Check all the queues and counters.		 */		if (drain_all) {			drain |= !list_empty(&q->queue_head);			for (i = 0; i < 2; i++) {				drain |= q->rq.count[i];				drain |= q->in_flight[i];				drain |= !list_empty(&q->flush_queue[i]);			}		} 		spin_unlock_irq(q->queue_lock); 		if (!drain)			break;		msleep(10);	}} /** * blk_queue_bypass_start - enter queue bypass mode * @q: queue of interest * * In bypass mode, only the dispatch FIFO queue of @q is used.  This * function makes @q enter bypass mode and drains all requests which were * throttled or issued before.  On return, it's guaranteed that no request * is being throttled or has ELVPRIV set and blk_queue_bypass() %true * inside queue or RCU read lock. */void blk_queue_bypass_start(struct request_queue *q){	bool drain; 	spin_lock_irq(q->queue_lock);	drain = !q->bypass_depth++;	queue_flag_set(QUEUE_FLAG_BYPASS, q);	spin_unlock_irq(q->queue_lock); 	if (drain) {		blk_drain_queue(q, false);		/* ensure blk_queue_bypass() is %true inside RCU read lock */		synchronize_rcu();	}}EXPORT_SYMBOL_GPL(blk_queue_bypass_start); /** * blk_queue_bypass_end - leave queue bypass mode * @q: queue of interest * * Leave bypass mode and restore the normal queueing behavior. */void blk_queue_bypass_end(struct request_queue *q){	spin_lock_irq(q->queue_lock);	if (!--q->bypass_depth)		queue_flag_clear(QUEUE_FLAG_BYPASS, q);	WARN_ON_ONCE(q->bypass_depth < 0);	spin_unlock_irq(q->queue_lock);}EXPORT_SYMBOL_GPL(blk_queue_bypass_end); /** * blk_cleanup_queue - shutdown a request queue * @q: request queue to shutdown * * Mark @q DEAD, drain all pending requests, destroy and put it.  All * future requests will be failed immediately with -ENODEV. */void blk_cleanup_queue(struct request_queue *q){	spinlock_t *lock = q->queue_lock; 	/* mark @q DEAD, no new request or merges will be allowed afterwards */	mutex_lock(&q->sysfs_lock);	queue_flag_set_unlocked(QUEUE_FLAG_DEAD, q); 	spin_lock_irq(lock); 	/*	 * Dead queue is permanently in bypass mode till released.  Note	 * that, unlike blk_queue_bypass_start(), we aren't performing	 * synchronize_rcu() after entering bypass mode to avoid the delay	 * as some drivers create and destroy a lot of queues while	 * probing.  This is still safe because blk_release_queue() will be	 * called only after the queue refcnt drops to zero and nothing,	 * RCU or not, would be traversing the queue by then.	 */	q->bypass_depth++;	queue_flag_set(QUEUE_FLAG_BYPASS, q); 	queue_flag_set(QUEUE_FLAG_NOMERGES, q);	queue_flag_set(QUEUE_FLAG_NOXMERGES, q);	queue_flag_set(QUEUE_FLAG_DEAD, q); 	if (q->queue_lock != &q->__queue_lock)		q->queue_lock = &q->__queue_lock; 	spin_unlock_irq(lock);	mutex_unlock(&q->sysfs_lock); 	/* drain all requests queued before DEAD marking */	blk_drain_queue(q, true); 	/* @q won't process any more request, flush async actions */	del_timer_sync(&q->backing_dev_info.laptop_mode_wb_timer);	blk_sync_queue(q);

Lines 1–500 of 3003.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t