Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 273801
b: refs/heads/master
c: bd87b58
h: refs/heads/master
i:
  273799: 853aac9
v: v3
  • Loading branch information
Tejun Heo authored and Jens Axboe committed Oct 19, 2011
1 parent 7537d0d commit 44cb8bf
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 8 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: da8303c63b8de73619884382d6e573d44aae0810
refs/heads/master: bd87b5898a72b1aef6acf3705c61c9f6372adf0c
28 changes: 21 additions & 7 deletions trunk/block/blk-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
6 changes: 6 additions & 0 deletions trunk/include/linux/elevator.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 44cb8bf

Please sign in to comment.