diff options
author | Jens Axboe <axboe@suse.de> | 2005-11-09 10:22:08 -0800 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2005-11-10 21:18:54 -0800 |
commit | d47698c7ff2a71160e1095161e841af1ddd9fe8b (patch) | |
tree | 411852f682557c2bbdecd7749f98827a458f5f2e | |
parent | ee5b36ffa0f2e6ff56ab118fd7d62a740d4d8b93 (diff) | |
download | linux-stable-d47698c7ff2a71160e1095161e841af1ddd9fe8b.tar.gz linux-stable-d47698c7ff2a71160e1095161e841af1ddd9fe8b.tar.bz2 linux-stable-d47698c7ff2a71160e1095161e841af1ddd9fe8b.zip |
[PATCH] Oops on suspend after on-the-fly switch to anticipatory i/o scheduler - PowerBook5, 4
Paul Collins wrote:
>I boot with elevator=cfq (wanted to try the ionice stuff, never got
>around to it). Having decided to go back to the anticipatory
>scheduler, I did the following:
>
># echo anticipatory > /sys/block/hda/queue/scheduler
># echo anticipatory > /sys/block/hdc/queue/scheduler
>
>A while later I did 'sudo snooze', which produced the Oops below.
>
>Booting with elevator=as and then changing to cfq, sleep works fine.
>But if I resume and change back to anticipatory I get a similar Oops
>on the next 'sudo snooze'.
>
>
> Oops: kernel access of bad area, sig: 11 [#1]
> NIP: C01E1948 LR: C01D6A60 SP: EFBC5C20 REGS: efbc5b70 TRAP: 0300
>Not tainted
> MSR: 00001032 EE: 0 PR: 0 FP: 0 ME: 1 IR/DR: 11
> DAR: 00000020, DSISR: 40000000
> TASK = efb012c0[1213] 'pmud' THREAD: efbc4000
> Last syscall: 54 GPR00: 00080000 EFBC5C20 EFB012C0 EFE9E044
>EFBC5CE8 00000002 00000000 C03B0000 GPR08: C046E5D8 00000000
>C03B47C8 E6A58360 22042422 1001E4DC 10010000 10000000 GPR16:
>10000000 10000000 10000000 7FE4EB40 10000000 10000000 10010000
>C0400000 GPR24: C0380000 00000002 00000002 C046E0C0 00000000
>00000002 00000000 EFBC5CE8 NIP [c01e1948] as_insert_request+0xa8/0x6b0
> LR [c01d6a60] __elv_add_request+0xa0/0x100
> Call trace:
> [c01d6a60] __elv_add_request+0xa0/0x100
> [c01ffb84] ide_do_drive_cmd+0xb4/0x190
> [c01fc1c0] generic_ide_suspend+0x80/0xa0
> [c01d4574] suspend_device+0x104/0x160
> [c01d47c0] device_suspend+0x120/0x330
> [c03f3b50] pmac_suspend_devices+0x50/0x1b0
> [c03f4294] pmu_ioctl+0x344/0x9b0
> [c0082aa4] do_ioctl+0x84/0x90
> [c0082b3c] vfs_ioctl+0x8c/0x460
> [c0082f50] sys_ioctl+0x40/0x80
> [c0004850] ret_from_syscall+0x0/0x4c
Don't clear ->elevator_data on exit, if we are switching queues we are
overwriting the data of the new io scheduler.
Signed-off-by: Jens Axboe <axboe@suse.de>
Signed-off-by: Chris Wright <chrisw@osdl.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | drivers/block/cfq-iosched.c | 4 |
1 files changed, 1 insertions, 3 deletions
diff --git a/drivers/block/cfq-iosched.c b/drivers/block/cfq-iosched.c index cd056e7e64ec..23df2d29949f 100644 --- a/drivers/block/cfq-iosched.c +++ b/drivers/block/cfq-iosched.c @@ -2260,10 +2260,8 @@ static void cfq_put_cfqd(struct cfq_data *cfqd) if (!atomic_dec_and_test(&cfqd->ref)) return; - blk_put_queue(q); - cfq_shutdown_timer_wq(cfqd); - q->elevator->elevator_data = NULL; + blk_put_queue(q); mempool_destroy(cfqd->crq_pool); kfree(cfqd->crq_hash); |