diff options
author | James Bottomley <jejb@mulgrave.il.steeleye.com> | 2006-06-10 14:47:26 -0400 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.il.steeleye.com> | 2006-06-10 14:47:26 -0400 |
commit | f0cd91a68acdc9b49d7f6738b514a426da627649 (patch) | |
tree | 8ad73564015794197583b094217ae0a71e71e753 /block/ll_rw_blk.c | |
parent | 60eef25701d25e99c991dd0f4a9f3832a0c3ad3e (diff) | |
parent | 128e6ced247cda88f96fa9f2e4ba8b2c4a681560 (diff) |
Merge ../linux-2.6
Diffstat (limited to 'block/ll_rw_blk.c')
-rw-r--r-- | block/ll_rw_blk.c | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/block/ll_rw_blk.c b/block/ll_rw_blk.c index e112d1a5dab6..7eb36c53f4b7 100644 --- a/block/ll_rw_blk.c +++ b/block/ll_rw_blk.c | |||
@@ -1554,7 +1554,7 @@ void blk_plug_device(request_queue_t *q) | |||
1554 | * don't plug a stopped queue, it must be paired with blk_start_queue() | 1554 | * don't plug a stopped queue, it must be paired with blk_start_queue() |
1555 | * which will restart the queueing | 1555 | * which will restart the queueing |
1556 | */ | 1556 | */ |
1557 | if (test_bit(QUEUE_FLAG_STOPPED, &q->queue_flags)) | 1557 | if (blk_queue_stopped(q)) |
1558 | return; | 1558 | return; |
1559 | 1559 | ||
1560 | if (!test_and_set_bit(QUEUE_FLAG_PLUGGED, &q->queue_flags)) { | 1560 | if (!test_and_set_bit(QUEUE_FLAG_PLUGGED, &q->queue_flags)) { |
@@ -1587,7 +1587,7 @@ EXPORT_SYMBOL(blk_remove_plug); | |||
1587 | */ | 1587 | */ |
1588 | void __generic_unplug_device(request_queue_t *q) | 1588 | void __generic_unplug_device(request_queue_t *q) |
1589 | { | 1589 | { |
1590 | if (unlikely(test_bit(QUEUE_FLAG_STOPPED, &q->queue_flags))) | 1590 | if (unlikely(blk_queue_stopped(q))) |
1591 | return; | 1591 | return; |
1592 | 1592 | ||
1593 | if (!blk_remove_plug(q)) | 1593 | if (!blk_remove_plug(q)) |
@@ -1732,8 +1732,21 @@ void blk_run_queue(struct request_queue *q) | |||
1732 | 1732 | ||
1733 | spin_lock_irqsave(q->queue_lock, flags); | 1733 | spin_lock_irqsave(q->queue_lock, flags); |
1734 | blk_remove_plug(q); | 1734 | blk_remove_plug(q); |
1735 | if (!elv_queue_empty(q)) | 1735 | |
1736 | q->request_fn(q); | 1736 | /* |
1737 | * Only recurse once to avoid overrunning the stack, let the unplug | ||
1738 | * handling reinvoke the handler shortly if we already got there. | ||
1739 | */ | ||
1740 | if (!elv_queue_empty(q)) { | ||
1741 | if (!test_and_set_bit(QUEUE_FLAG_REENTER, &q->queue_flags)) { | ||
1742 | q->request_fn(q); | ||
1743 | clear_bit(QUEUE_FLAG_REENTER, &q->queue_flags); | ||
1744 | } else { | ||
1745 | blk_plug_device(q); | ||
1746 | kblockd_schedule_work(&q->unplug_work); | ||
1747 | } | ||
1748 | } | ||
1749 | |||
1737 | spin_unlock_irqrestore(q->queue_lock, flags); | 1750 | spin_unlock_irqrestore(q->queue_lock, flags); |
1738 | } | 1751 | } |
1739 | EXPORT_SYMBOL(blk_run_queue); | 1752 | EXPORT_SYMBOL(blk_run_queue); |
@@ -3385,7 +3398,7 @@ static int blk_cpu_notify(struct notifier_block *self, unsigned long action, | |||
3385 | } | 3398 | } |
3386 | 3399 | ||
3387 | 3400 | ||
3388 | static struct notifier_block __devinitdata blk_cpu_notifier = { | 3401 | static struct notifier_block blk_cpu_notifier = { |
3389 | .notifier_call = blk_cpu_notify, | 3402 | .notifier_call = blk_cpu_notify, |
3390 | }; | 3403 | }; |
3391 | 3404 | ||
@@ -3439,7 +3452,12 @@ void end_that_request_last(struct request *req, int uptodate) | |||
3439 | if (unlikely(laptop_mode) && blk_fs_request(req)) | 3452 | if (unlikely(laptop_mode) && blk_fs_request(req)) |
3440 | laptop_io_completion(); | 3453 | laptop_io_completion(); |
3441 | 3454 | ||
3442 | if (disk && blk_fs_request(req)) { | 3455 | /* |
3456 | * Account IO completion. bar_rq isn't accounted as a normal | ||
3457 | * IO on queueing nor completion. Accounting the containing | ||
3458 | * request is enough. | ||
3459 | */ | ||
3460 | if (disk && blk_fs_request(req) && req != &req->q->bar_rq) { | ||
3443 | unsigned long duration = jiffies - req->start_time; | 3461 | unsigned long duration = jiffies - req->start_time; |
3444 | const int rw = rq_data_dir(req); | 3462 | const int rw = rq_data_dir(req); |
3445 | 3463 | ||