From 44cb8bfcc7fe34cc65005770ac00c59f713f6ed1 Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Wed, 19 Oct 2011 14:33:08 +0200 Subject: [PATCH] --- yaml --- r: 273801 b: refs/heads/master c: bd87b5898a72b1aef6acf3705c61c9f6372adf0c h: refs/heads/master i: 273799: 853aac9ac4d8d49650ae5da687c9a91b7a45e5d0 v: v3 --- [refs] | 2 +- trunk/block/blk-core.c | 28 +++++++++++++++++++++------- trunk/include/linux/elevator.h | 6 ++++++ 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/[refs] b/[refs] index 45e89b8d5d8e..646dd1d2360e 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: da8303c63b8de73619884382d6e573d44aae0810 +refs/heads/master: bd87b5898a72b1aef6acf3705c61c9f6372adf0c diff --git a/trunk/block/blk-core.c b/trunk/block/blk-core.c index 3508751c779a..034cbb2024f0 100644 --- a/trunk/block/blk-core.c +++ b/trunk/block/blk-core.c @@ -1203,18 +1203,32 @@ static bool bio_attempt_front_merge(struct request_queue *q, return true; } -/* - * Attempts to merge with the plugged list in the current process. Returns - * true if merge was successful, otherwise false. +/** + * attempt_plug_merge - try to merge with %current's plugged list + * @q: request_queue new bio is being queued at + * @bio: new bio being queued + * @request_count: out parameter for number of traversed plugged requests + * + * Determine whether @bio being queued on @q can be merged with a request + * on %current's plugged list. Returns %true if merge was successful, + * otherwise %false. + * + * This function is called without @q->queue_lock; however, elevator is + * accessed iff there already are requests on the plugged list which in + * turn guarantees validity of the elevator. + * + * Note that, on successful merge, elevator operation + * elevator_bio_merged_fn() will be called without queue lock. Elevator + * must be ready for this. */ -static bool attempt_plug_merge(struct task_struct *tsk, struct request_queue *q, - struct bio *bio, unsigned int *request_count) +static bool attempt_plug_merge(struct request_queue *q, struct bio *bio, + unsigned int *request_count) { struct blk_plug *plug; struct request *rq; bool ret = false; - plug = tsk->plug; + plug = current->plug; if (!plug) goto out; *request_count = 0; @@ -1282,7 +1296,7 @@ void blk_queue_bio(struct request_queue *q, struct bio *bio) * Check if we can merge with the plugged list before grabbing * any locks. */ - if (attempt_plug_merge(current, q, bio, &request_count)) + if (attempt_plug_merge(q, bio, &request_count)) return; spin_lock_irq(q->queue_lock); diff --git a/trunk/include/linux/elevator.h b/trunk/include/linux/elevator.h index d800d5142184..1d0f7a2ff73b 100644 --- a/trunk/include/linux/elevator.h +++ b/trunk/include/linux/elevator.h @@ -38,6 +38,12 @@ struct elevator_ops elevator_merged_fn *elevator_merged_fn; elevator_merge_req_fn *elevator_merge_req_fn; elevator_allow_merge_fn *elevator_allow_merge_fn; + + /* + * Used for both plugged list and elevator merging and in the + * former case called without queue_lock. Read comment on top of + * attempt_plug_merge() for details. + */ elevator_bio_merged_fn *elevator_bio_merged_fn; elevator_dispatch_fn *elevator_dispatch_fn;