diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-03-24 13:16:26 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-03-24 13:16:26 -0400 |
| commit | 6c5103890057b1bb781b26b7aae38d33e4c517d8 (patch) | |
| tree | e6e57961dcddcb5841acb34956e70b9dc696a880 /kernel | |
| parent | 3dab04e6978e358ad2307bca563fabd6c5d2c58b (diff) | |
| parent | 9d2e157d970a73b3f270b631828e03eb452d525e (diff) | |
Merge branch 'for-2.6.39/core' of git://git.kernel.dk/linux-2.6-block
* 'for-2.6.39/core' of git://git.kernel.dk/linux-2.6-block: (65 commits)
Documentation/iostats.txt: bit-size reference etc.
cfq-iosched: removing unnecessary think time checking
cfq-iosched: Don't clear queue stats when preempt.
blk-throttle: Reset group slice when limits are changed
blk-cgroup: Only give unaccounted_time under debug
cfq-iosched: Don't set active queue in preempt
block: fix non-atomic access to genhd inflight structures
block: attempt to merge with existing requests on plug flush
block: NULL dereference on error path in __blkdev_get()
cfq-iosched: Don't update group weights when on service tree
fs: assign sb->s_bdi to default_backing_dev_info if the bdi is going away
block: Require subsystems to explicitly allocate bio_set integrity mempool
jbd2: finish conversion from WRITE_SYNC_PLUG to WRITE_SYNC and explicit plugging
jbd: finish conversion from WRITE_SYNC_PLUG to WRITE_SYNC and explicit plugging
fs: make fsync_buffers_list() plug
mm: make generic_writepages() use plugging
blk-cgroup: Add unaccounted time to timeslice_used.
block: fixup plugging stubs for !CONFIG_BLOCK
block: remove obsolete comments for blkdev_issue_zeroout.
blktrace: Use rq->cmd_flags directly in blk_add_trace_rq.
...
Fix up conflicts in fs/{aio.c,super.c}
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/exit.c | 1 | ||||
| -rw-r--r-- | kernel/fork.c | 3 | ||||
| -rw-r--r-- | kernel/power/block_io.c | 2 | ||||
| -rw-r--r-- | kernel/sched.c | 12 | ||||
| -rw-r--r-- | kernel/trace/blktrace.c | 15 |
5 files changed, 21 insertions, 12 deletions
diff --git a/kernel/exit.c b/kernel/exit.c index f9a45ebcc7b1..6a488ad2dce5 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
| @@ -908,6 +908,7 @@ NORET_TYPE void do_exit(long code) | |||
| 908 | profile_task_exit(tsk); | 908 | profile_task_exit(tsk); |
| 909 | 909 | ||
| 910 | WARN_ON(atomic_read(&tsk->fs_excl)); | 910 | WARN_ON(atomic_read(&tsk->fs_excl)); |
| 911 | WARN_ON(blk_needs_flush_plug(tsk)); | ||
| 911 | 912 | ||
| 912 | if (unlikely(in_interrupt())) | 913 | if (unlikely(in_interrupt())) |
| 913 | panic("Aiee, killing interrupt handler!"); | 914 | panic("Aiee, killing interrupt handler!"); |
diff --git a/kernel/fork.c b/kernel/fork.c index 457fff2e17e0..e7548dee636b 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
| @@ -1205,6 +1205,9 @@ static struct task_struct *copy_process(unsigned long clone_flags, | |||
| 1205 | * Clear TID on mm_release()? | 1205 | * Clear TID on mm_release()? |
| 1206 | */ | 1206 | */ |
| 1207 | p->clear_child_tid = (clone_flags & CLONE_CHILD_CLEARTID) ? child_tidptr: NULL; | 1207 | p->clear_child_tid = (clone_flags & CLONE_CHILD_CLEARTID) ? child_tidptr: NULL; |
| 1208 | #ifdef CONFIG_BLOCK | ||
| 1209 | p->plug = NULL; | ||
| 1210 | #endif | ||
| 1208 | #ifdef CONFIG_FUTEX | 1211 | #ifdef CONFIG_FUTEX |
| 1209 | p->robust_list = NULL; | 1212 | p->robust_list = NULL; |
| 1210 | #ifdef CONFIG_COMPAT | 1213 | #ifdef CONFIG_COMPAT |
diff --git a/kernel/power/block_io.c b/kernel/power/block_io.c index 83bbc7c02df9..d09dd10c5a5e 100644 --- a/kernel/power/block_io.c +++ b/kernel/power/block_io.c | |||
| @@ -28,7 +28,7 @@ | |||
| 28 | static int submit(int rw, struct block_device *bdev, sector_t sector, | 28 | static int submit(int rw, struct block_device *bdev, sector_t sector, |
| 29 | struct page *page, struct bio **bio_chain) | 29 | struct page *page, struct bio **bio_chain) |
| 30 | { | 30 | { |
| 31 | const int bio_rw = rw | REQ_SYNC | REQ_UNPLUG; | 31 | const int bio_rw = rw | REQ_SYNC; |
| 32 | struct bio *bio; | 32 | struct bio *bio; |
| 33 | 33 | ||
| 34 | bio = bio_alloc(__GFP_WAIT | __GFP_HIGH, 1); | 34 | bio = bio_alloc(__GFP_WAIT | __GFP_HIGH, 1); |
diff --git a/kernel/sched.c b/kernel/sched.c index 480adeb63f8f..ae659b99ce73 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -4115,6 +4115,16 @@ need_resched: | |||
| 4115 | switch_count = &prev->nvcsw; | 4115 | switch_count = &prev->nvcsw; |
| 4116 | } | 4116 | } |
| 4117 | 4117 | ||
| 4118 | /* | ||
| 4119 | * If we are going to sleep and we have plugged IO queued, make | ||
| 4120 | * sure to submit it to avoid deadlocks. | ||
| 4121 | */ | ||
| 4122 | if (prev->state != TASK_RUNNING && blk_needs_flush_plug(prev)) { | ||
| 4123 | raw_spin_unlock(&rq->lock); | ||
| 4124 | blk_flush_plug(prev); | ||
| 4125 | raw_spin_lock(&rq->lock); | ||
| 4126 | } | ||
| 4127 | |||
| 4118 | pre_schedule(rq, prev); | 4128 | pre_schedule(rq, prev); |
| 4119 | 4129 | ||
| 4120 | if (unlikely(!rq->nr_running)) | 4130 | if (unlikely(!rq->nr_running)) |
| @@ -5528,6 +5538,7 @@ void __sched io_schedule(void) | |||
| 5528 | 5538 | ||
| 5529 | delayacct_blkio_start(); | 5539 | delayacct_blkio_start(); |
| 5530 | atomic_inc(&rq->nr_iowait); | 5540 | atomic_inc(&rq->nr_iowait); |
| 5541 | blk_flush_plug(current); | ||
| 5531 | current->in_iowait = 1; | 5542 | current->in_iowait = 1; |
| 5532 | schedule(); | 5543 | schedule(); |
| 5533 | current->in_iowait = 0; | 5544 | current->in_iowait = 0; |
| @@ -5543,6 +5554,7 @@ long __sched io_schedule_timeout(long timeout) | |||
| 5543 | 5554 | ||
| 5544 | delayacct_blkio_start(); | 5555 | delayacct_blkio_start(); |
| 5545 | atomic_inc(&rq->nr_iowait); | 5556 | atomic_inc(&rq->nr_iowait); |
| 5557 | blk_flush_plug(current); | ||
| 5546 | current->in_iowait = 1; | 5558 | current->in_iowait = 1; |
| 5547 | ret = schedule_timeout(timeout); | 5559 | ret = schedule_timeout(timeout); |
| 5548 | current->in_iowait = 0; | 5560 | current->in_iowait = 0; |
diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c index cbafed7d4f38..7aa40f8e182d 100644 --- a/kernel/trace/blktrace.c +++ b/kernel/trace/blktrace.c | |||
| @@ -703,28 +703,21 @@ void blk_trace_shutdown(struct request_queue *q) | |||
| 703 | * | 703 | * |
| 704 | **/ | 704 | **/ |
| 705 | static void blk_add_trace_rq(struct request_queue *q, struct request *rq, | 705 | static void blk_add_trace_rq(struct request_queue *q, struct request *rq, |
| 706 | u32 what) | 706 | u32 what) |
| 707 | { | 707 | { |
| 708 | struct blk_trace *bt = q->blk_trace; | 708 | struct blk_trace *bt = q->blk_trace; |
| 709 | int rw = rq->cmd_flags & 0x03; | ||
| 710 | 709 | ||
| 711 | if (likely(!bt)) | 710 | if (likely(!bt)) |
| 712 | return; | 711 | return; |
| 713 | 712 | ||
| 714 | if (rq->cmd_flags & REQ_DISCARD) | ||
| 715 | rw |= REQ_DISCARD; | ||
| 716 | |||
| 717 | if (rq->cmd_flags & REQ_SECURE) | ||
| 718 | rw |= REQ_SECURE; | ||
| 719 | |||
| 720 | if (rq->cmd_type == REQ_TYPE_BLOCK_PC) { | 713 | if (rq->cmd_type == REQ_TYPE_BLOCK_PC) { |
| 721 | what |= BLK_TC_ACT(BLK_TC_PC); | 714 | what |= BLK_TC_ACT(BLK_TC_PC); |
| 722 | __blk_add_trace(bt, 0, blk_rq_bytes(rq), rw, | 715 | __blk_add_trace(bt, 0, blk_rq_bytes(rq), rq->cmd_flags, |
| 723 | what, rq->errors, rq->cmd_len, rq->cmd); | 716 | what, rq->errors, rq->cmd_len, rq->cmd); |
| 724 | } else { | 717 | } else { |
| 725 | what |= BLK_TC_ACT(BLK_TC_FS); | 718 | what |= BLK_TC_ACT(BLK_TC_FS); |
| 726 | __blk_add_trace(bt, blk_rq_pos(rq), blk_rq_bytes(rq), rw, | 719 | __blk_add_trace(bt, blk_rq_pos(rq), blk_rq_bytes(rq), |
| 727 | what, rq->errors, 0, NULL); | 720 | rq->cmd_flags, what, rq->errors, 0, NULL); |
| 728 | } | 721 | } |
| 729 | } | 722 | } |
| 730 | 723 | ||
