IDE TCQ #2
PATCH 1/1 IDE TCQ #2
Hi,
2.5.13 now has the generic tag support that I wrote included, here's an IDE TCQ that uses that. Changes since the version posted for 2.5.12:
- Fix the ide_tcq_invalidate_queue() WIN_NOP usage needed to clear the internal queue on errors. It was disabled in the last version due to the ata_request changes, it should work now.
- Remove Promise tcq disable check, it works just fine on Promise as long as we handle the two-drives-with-tcq case like we currently do.
That's about it, code should be solid.
# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher. # This patch includes the following deltas:
# ChangeSet 1.514 -> 1.515
# drivers/ide/ide-probe.c 1.42 -> 1.43
# drivers/ide/ide-disk.c 1.42 -> 1.43
# drivers/ide/ide-dma.c 1.34 -> 1.35
# include/linux/ide.h 1.51 -> 1.52
# drivers/ide/ide.c 1.71 -> 1.72
# drivers/ide/ide-taskfile.c 1.28 -> 1.29
# drivers/ide/Makefile 1.14 -> 1.15
# drivers/ide/Config.help 1.15 -> 1.16
# drivers/ide/Config.in 1.18 -> 1.19
# (new) -> 1.1 drivers/ide/ide-tcq.c
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/05/03 [email protected] 1.515
# IDE TCQ support
# --------------------------------------------
#
drivers/ide/Config.help +31 -0
@@ -751,6 +751,37 @@ Generally say N here. +CONFIG_BLK_DEV_IDE_TCQ + Support for tagged command queueing on ATA disk drives. This enables + the IDE layer to have multiple in-flight requests on hardware that + supports it. For now this includes the IBM Deskstar series drives, + such as the 22GXP, 75GXP, 40GV, 60GXP, and 120GXP (ie any Deskstar made + in the last couple of years), and at least some of the Western + Digital drives in the Expert series (by nature of really being IBM + drives). + + If you have such a drive, say Y here. + +CONFIG_BLK_DEV_IDE_TCQ_DEPTH + Maximum size of commands to enable per-drive. Any value between 1 + and 32 is valid, with 32 being the maxium that the hardware supports. + + You probably just want the default of 32 here. If you enter an invalid + number, the default value will be used. + +CONFIG_BLK_DEV_IDE_TCQ_DEFAULT + Enabled tagged command queueing unconditionally on drives that report + support for it. Regardless of the chosen value here, tagging can be + controlled at run time: + + echo "using_tcq:32" > /proc/ide/hdX/settings + + where any value between 1-32 selects chosen queue depth and enables + TCQ, and 0 disables it. hdparm version 4.7 an above also support + TCQ manipulations. + + Generally say Y here. + CONFIG_BLK_DEV_IT8172 Say Y here to support the on-board IDE controller on the Integrated Technology Express, Inc. ITE8172 SBC. Vendor page at
drivers/ide/Config.in +5 -0
@@ -47,6 +47,11 @@ dep_bool ' Use PCI DMA by default when available' CONFIG_IDEDMA_PCI_AUTO $CONFIG_BLK_DEV_IDEDMA_PCI dep_bool ' Enable DMA only for disks ' CONFIG_IDEDMA_ONLYDISK $CONFIG_IDEDMA_PCI_AUTO define_bool CONFIG_BLK_DEV_IDEDMA $CONFIG_BLK_DEV_IDEDMA_PCI + dep_bool ' ATA tagged command queueing' CONFIG_BLK_DEV_IDE_TCQ $CONFIG_BLK_DEV_IDEDMA_PCI + dep_bool ' TCQ on by default' CONFIG_BLK_DEV_IDE_TCQ_DEFAULT $CONFIG_BLK_DEV_IDE_TCQ + if [ "$CONFIG_BLK_DEV_IDE_TCQ" != "n" ]; then + int ' Default queue depth' CONFIG_BLK_DEV_IDE_TCQ_DEPTH 32 + fi dep_bool ' Good-Bad DMA Model-Firmware (EXPERIMENTAL)' CONFIG_IDEDMA_NEW_DRIVE_LISTINGS $CONFIG_EXPERIMENTAL dep_bool ' AEC62XX chipset support' CONFIG_BLK_DEV_AEC62XX $CONFIG_BLK_DEV_IDEDMA_PCI dep_mbool ' AEC62XX Tuning support' CONFIG_AEC62XX_TUNING $CONFIG_BLK_DEV_AEC62XX
drivers/ide/Makefile +1 -0
@@ -44,6 +44,7 @@ ide-obj-$(CONFIG_BLK_DEV_HT6560B) += ht6560b.o ide-obj-$(CONFIG_BLK_DEV_IDE_ICSIDE) += icside.o ide-obj-$(CONFIG_BLK_DEV_IDEDMA_PCI) += ide-dma.o +ide-obj-$(CONFIG_BLK_DEV_IDE_TCQ) += ide-tcq.o ide-obj-$(CONFIG_BLK_DEV_IDEPCI) += ide-pci.o ide-obj-$(CONFIG_BLK_DEV_ISAPNP) += ide-pnp.o ide-obj-$(CONFIG_BLK_DEV_IDE_PMAC) += ide-pmac.o
drivers/ide/ide-disk.c +130 -4
205 lines not on this page · raw message
drivers/ide/ide-dma.c +46 -12
92 lines not on this page · raw message
drivers/ide/ide-probe.c +10 -0
@@ -198,6 +198,16 @@if (drive->channel->quirkproc) drive->quirk_list = drive->channel->quirkproc (drive); +/* Initialize queue depth settings */ + drive->queue_depth =1 ; +#ifdef CONFIG_BLK_DEV_IDE_TCQ_DEPTH + drive->queue_depth =CONFIG_BLK_DEV_IDE_TCQ_DEPTH ; +#else + drive->queue_depth = drive->id->queue_depth +1 ; +#endif +if (drive->queue_depth <1 || drive->queue_depth >IDE_MAX_TAG ) + drive->queue_depth =IDE_MAX_TAG ; +return ; err_misc:
drivers/ide/ide-taskfile.c +34 -6
@@ -456,11 +456,39 @@if (args->prehandler !=NULL )return args->prehandler (drive, rq); }else { -/* for dma commands we down set the handler */ -if (drive->using_dma && - !(drive->channel->udma (((args->taskfile.command ==WIN_WRITEDMA ) - || (args->taskfile.command ==WIN_WRITEDMA_EXT )) - ? ide_dma_write : ide_dma_read, drive, rq))); +ide_dma_action_t dma_act; +int tcq =0 ; + +if (!drive->using_dma) +return ide_started; + +/* for dma commands we don't set the handler */ +if (args->taskfile.command ==WIN_WRITEDMA || args->taskfile.command ==WIN_WRITEDMA_EXT ) + dma_act = ide_dma_write; +else if (args->taskfile.command ==WIN_READDMA || args->taskfile.command ==WIN_READDMA_EXT ) + dma_act = ide_dma_read; +else if (args->taskfile.command ==WIN_WRITEDMA_QUEUED || args->taskfile.command ==WIN_WRITEDMA_QUEUED_EXT ) { + tcq =1 ; + dma_act = ide_dma_write_queued; + }else if (args->taskfile.command ==WIN_READDMA_QUEUED || args->taskfile.command ==WIN_READDMA_QUEUED_EXT ) { + tcq =1 ; + dma_act = ide_dma_read_queued; + }else { +printk ("ata_taskfile: unknown command %x\n" , args->taskfile.command); +return ide_stopped; + } + +/* +* FIXME: this is a gross hack, need to unify tcq dma proc and +* regular dma proc -- basically split stuff that needs to act +* on a request from things like ide_dma_check etc. +*/ +if (tcq) +return drive->channel->udma (dma_act, drive, rq); +else { +if (drive->channel->udma (dma_act, drive, rq)) +return ide_stopped; + } }return ide_started;
@@ -523,7 +551,7 @@ide__sti ();/* local CPU only */ if (!OK_STAT (stat =GET_STAT (),READY_STAT ,BAD_STAT )) { -/* Keep quite for NOP becouse they are expected to fail. */ +/* Keep quiet for NOP because it is expected to fail. */ if (args && args->taskfile.command !=WIN_NOP )return ide_error (drive,"task_no_data_intr" , stat); }
drivers/ide/ide-tcq.c new file +638 -0
638 lines not on this page · raw message
drivers/ide/ide.c +10 -8
@@ -397,7 +397,10 @@if (!end_that_request_first (rq, uptodate, nr_secs)) {add_blkdev_randomness (major (rq->rq_dev)); -blkdev_dequeue_request (rq); +if (!blk_rq_tagged (rq)) +blkdev_dequeue_request (rq); +else +blk_queue_end_tag (&drive->queue, rq);HWGROUP (drive)->rq =NULL ;end_that_request_last (rq); ret =0 ;
@@ -1305,11 +1308,6 @@ } -/* Place holders for later expansion of functionality. -*/ -#define ata_pending_commands (drive) (0) -#define ata_can_queue (drive) (1) -/* * Feed commands to a drive until it barfs. Called with ide_lock/DRIVE_LOCK * held and busy channel.
@@ -1349,7 +1347,7 @@* still a severe BUG! */ if (blk_queue_plugged (&drive->queue)) { -BUG (); +BUG_ON (!drive->using_tcq);break ; }
@@ -1761,7 +1759,8 @@ }else {printk ("%s: %s: huh? expected NULL handler on exit\n" , drive->name, __FUNCTION__); } - } + }else if (startstop == ide_released) +queue_commands (drive, ch->irq); out_lock:spin_unlock_irqrestore (&ide_lock, flags);
@@ -3290,6 +3289,9 @@ drive->channel->udma (ide_dma_off_quietly, drive,NULL ); drive->channel->udma (ide_dma_check, drive,NULL ); +#ifdef CONFIG_BLK_DEV_IDE_TCQ_DEFAULT + drive->channel->udma (ide_dma_queued_on, drive,NULL ); +#endif }/* Only CD-ROMs and tape drives support DSC overlap. But only
include/linux/ide.h +39 -1
@@ -297,6 +297,7 @@u8 tune_req;/* requested drive tuning setting */ byte using_dma;/* disk is using dma for read/write */ +byte using_tcq;/* disk is using queueing */ byte retry_pio;/* retrying dma capable host in pio */ byte state;/* retry state */ byte dsc_overlap;/* flag: DSC overlap */
@@ -359,9 +360,17 @@byte dn;/* now wide spread use */ byte wcache;/* status of write cache */ byte acoustic;/* acoustic management */ +byte queue_depth;/* max queue depth */ unsigned int failures;/* current failure count */ unsigned int max_failures;/* maximum allowed failure count */ struct device device;/* global device tree handle */ +/* +* tcq statistics +*/ +unsigned long immed_rel; +unsigned long immed_comp; +int max_last_depth; +int max_depth; } ide_drive_t;/*
@@ -380,7 +389,10 @@ ide_dma_off, ide_dma_off_quietly, ide_dma_test_irq, ide_dma_bad_drive, ide_dma_good_drive, ide_dma_verbose, ide_dma_retune, - ide_dma_lostirq, ide_dma_timeout + ide_dma_lostirq, ide_dma_timeout, + ide_dma_read_queued, ide_dma_write_queued, + ide_dma_queued_start, ide_dma_queued_on, + ide_dma_queued_off, } ide_dma_action_t; enum {
@@ -461,6 +473,7 @@ unsigned highmem : 1; /* can do full 32-bit dma */ unsigned no_io_32bit : 1; /* disallow enabling 32bit I/O */ unsigned no_unmask : 1; /* disallow setting unmask bit */ + unsigned auto_poll : 1; /* supports nop auto-poll */byte io_32bit;/* 0=16-bit, 1=32-bit, 2/3=32bit+sync */ byte unmask;/* flag: okay to unmask other irqs */ byte slow;/* flag: slow data port */
@@ -500,6 +513,29 @@#define IDE_SLEEP 1#define IDE_DMA 2/* DMA in progress */ +#define IDE_MAX_TAG 32 + +#ifdef CONFIG_BLK_DEV_IDE_TCQ +static inline int ata_pending_commands (ide_drive_t *drive) +{ +if (drive->using_tcq) +return blk_queue_tag_depth (&drive->queue); + +return 0 ; +} + +static inline int ata_can_queue (ide_drive_t *drive) +{ +if (drive->using_tcq) +return blk_queue_tag_queue (&drive->queue); + +return 1 ; +} +#else +#define ata_pending_commands (drive) (0) +#define ata_can_queue (drive) (1) +#endif + typedef struct hwgroup_s { ide_startstop_t (*handler)(struct ata_device *, struct request *); /* irq handler, if active */ unsigned long flags; /* BUSY, SLEEPING */
@@ -858,9 +894,11 @@extern ide_startstop_t ide_dma_intr (struct ata_device *,struct request *);int check_drive_lists (ide_drive_t *drive,int good_bad);int ide_dmaproc (ide_dma_action_t func,struct ata_device *drive,struct request *); +ide_startstop_t ide_tcq_dmaproc (ide_dma_action_t func,struct ata_device *drive,struct request *);extern void ide_release_dma (struct ata_channel *hwif);extern void ide_setup_dma (struct ata_channel *hwif,unsigned long dmabase,unsigned int num_ports)__init ; +extern int ide_start_dma (ide_dma_action_t func,struct ata_device *drive);#endif extern spinlock_t ide_lock;
Signature · 1 line
Jens Axboe
Quoted 11 lines · On Fri, 3 May 2002 13:06:52 +0200 Jens Axboe <[email protected]> wrote:
Hi,
2.5.13 now has the generic tag support that I wrote included, here's an IDE TCQ that uses that. Changes since the version posted for 2.5.12:
- Fix the
ide_tcq_invalidate_queue()WIN_NOPusage needed to clear the internal queue on errors. It was disabled in the last version due to theata_requestchanges, it should work now.- Remove Promise tcq disable check, it works just fine on Promise as long as we handle the two-drives-with-tcq case like we currently do.
Hi,
I get following oops after a while... it's not really reproducable but happens a few minutes after bootup With TCQ disabled the kernel is rock-solid ;)
I only use TCQ on one harddisk (hda)... hdb doesn't support it.
The IDE controller is an Intel Corp. 82371AB PIIX4 IDE (rev 01)
hda is a IBM-DTTA-351010
Bye
ide_tcq_intr_timeout: timeout waiting for interrupt...ide_tcq_intr_timeout: hwgroup not busy
hda: invalidating pending queue (10)
kernel BUG at ll_rw_blk.c:407!
CPU: 0
EIP: 0010:[<c0106b9f>] Not tainted
Using defaults from ksymoops -t elf32-i386 -a i386
EFLAGS: 00010046
eax: cff40f28 ebx: ffffffff ecx: cff40960 edx: c13d90e0
esi: c13dacc0 edi: cff40f20 ebp: c038dea4 esp: c032debc
ds: 0018 es: 0018 ss: 0018
Stack: cff55760 c038dea4 c038de94 c038de90 cff40f20 c01f3b96 c038dea4 c023c000
c038de90 00000282 cff55760 00000296 c01f3d34 c038de90 c038de90 c01f3c8c
c032c000 c036bcc0 c011a5c7 c038de90 c032c000 00000000 00000000 c036bcc0
Call Trace: [<c01f3b96>] [<c01f3d34>] [<c01f3c8c>] [<c011d5c7>] [<c011d2f0>]
[<c011a13e>] [<c011a586>] [<c011a0b1>] [<c0108bef>] [<c010704e>] [<c01bb8e1>]
[<c01bb7f8>] [<c0105954>] [<c01059b3>] [<c0105000>] [<c010503d>]
Code: 0f 0b 97 01 ea 09 2d c0 3b 5f 14 7d 53 8b 57 04 0f b3 1a 19Quoted 10 lines
Quoted 10 lines
EIP;
c0106b9f<do_signal+97/290> <=====eax;
cff40f28<END_OF_CODE+fbabb8c/????>
ebx; ffffffff <END_OF_CODE+3fc6ac63/????>
ecx;cff40960<END_OF_CODE+fbab5c4/????>
edx;c13d90e0<END_OF_CODE+1043d44/????>
esi;c13dacc0<END_OF_CODE+1045924/????>
edi;cff40f20<END_OF_CODE+fbabb84/????>
ebp;c038dea4<ide_hwifs+104/39d0>
esp;c032debc<init_thread_union+1ebc/2000>
Trace; c01f3b96 <ide_tcq_invalidate_queue+86/17c>
Trace; c01f3d34 <ide_tcq_intr_timeout+a8/b0>
Trace; c01f3c8c <ide_tcq_intr_timeout+0/b0>
Trace; c011d5c7 <timer_bh+27b/2d0>
Trace; c011d2f0 <update_process_times+d4/dc>
Trace; c011a13e <bh_action+26/70>
Trace; c011a586 <tasklet_hi_action+4a/74>
Trace; c011a0b1 <do_softirq+61/c8>
Trace; c0108bef <do_IRQ+137/144>
Trace; c010704e <common_interrupt+22/28>
Trace; c01bb8e1 <acpi_processor_idle+e9/210>
Trace; c01bb7f8 <acpi_processor_idle+0/210>
Trace; c0105954 <default_idle+0/28>
Trace; c01059b3 <cpu_idle+37/48>
Trace; c0105000 <_stext+0/0>
Trace; c010503d <rest_init+3d/50>
Code; c0106b9f <do_signal+97/290>
00000000 <_EIP>:
Code; c0106b9f <do_signal+97/290> <=====
0: 0f 0b ud2a <=====
Code; c0106ba1 <do_signal+99/290>
2: 97 xchg %eax,%edi
Code; c0106ba2 <do_signal+9a/290>
3: 01 ea add %ebp,%edx
Code; c0106ba4 <do_signal+9c/290>
5: 09 2d c0 3b 5f 14 or %ebp,0x145f3bc0
Code; c0106baa <do_signal+a2/290>
b: 7d 53 jge 60 <_EIP+0x60> c0106bff <do_signal+f7/290>
Code; c0106bac <do_signal+a4/290>
d: 8b 57 04 mov 0x4(%edi),%edx
Code; c0106baf <do_signal+a7/290>
10: 0f b3 1a btr %ebx,(%edx)
Code; c0106bb2 <do_signal+aa/290>
13: 19 00 sbb %eax,(%eax)
<0> Kernel panic: Aiee, killing interrupt handler!
Quoted 11 lines · On Fri, 3 May 2002 13:06:52 +0200 Jens Axboe <[email protected]> wrote:
Hi,
2.5.13 now has the generic tag support that I wrote included, here's an IDE TCQ that uses that. Changes since the version posted for 2.5.12:
- Fix the
ide_tcq_invalidate_queue()WIN_NOPusage needed to clear the internal queue on errors. It was disabled in the last version due to theata_requestchanges, it should work now.- Remove Promise tcq disable check, it works just fine on Promise as long as we handle the two-drives-with-tcq case like we currently do.
Hi,
I get following oops after a while... it's not really reproducable but happens a few minutes after bootup With TCQ disabled the kernel is rock-solid ;)
I only use TCQ on one harddisk (hda)... hdb doesn't support it.
The IDE controller is an Intel Corp. 82371AB PIIX4 IDE (rev 01)
hda is a IBM-DTTA-351010
Bye
ide_tcq_intr_timeout: timeout waiting for interrupt...ide_tcq_intr_timeout: hwgroup not busy
hda: invalidating pending queue (10)
kernel BUG at ll_rw_blk.c:407!
CPU: 0
EIP: 0010:[<c0106b9f>] Not tainted
Using defaults from ksymoops -t elf32-i386 -a i386
EFLAGS: 00010046
eax: cff40f28 ebx: ffffffff ecx: cff40960 edx: c13d90e0
esi: c13dacc0 edi: cff40f20 ebp: c038dea4 esp: c032debc
ds: 0018 es: 0018 ss: 0018
Stack: cff55760 c038dea4 c038de94 c038de90 cff40f20 c01f3b96 c038dea4 c023c000
c038de90 00000282 cff55760 00000296 c01f3d34 c038de90 c038de90 c01f3c8c
c032c000 c036bcc0 c011a5c7 c038de90 c032c000 00000000 00000000 c036bcc0
Call Trace: [<c01f3b96>] [<c01f3d34>] [<c01f3c8c>] [<c011d5c7>] [<c011d2f0>]
[<c011a13e>] [<c011a586>] [<c011a0b1>] [<c0108bef>] [<c010704e>] [<c01bb8e1>]
[<c01bb7f8>] [<c0105954>] [<c01059b3>] [<c0105000>] [<c010503d>]
Code: 0f 0b 97 01 ea 09 2d c0 3b 5f 14 7d 53 8b 57 04 0f b3 1a 19Quoted 10 lines
Quoted 10 lines
EIP;
c0106b9f<do_signal+97/290> <=====eax;
cff40f28<END_OF_CODE+fbabb8c/????>
ebx; ffffffff <END_OF_CODE+3fc6ac63/????>
ecx;cff40960<END_OF_CODE+fbab5c4/????>
edx;c13d90e0<END_OF_CODE+1043d44/????>
esi;c13dacc0<END_OF_CODE+1045924/????>
edi;cff40f20<END_OF_CODE+fbabb84/????>
ebp;c038dea4<ide_hwifs+104/39d0>
esp;c032debc<init_thread_union+1ebc/2000>
Trace; c01f3b96 <ide_tcq_invalidate_queue+86/17c>
Trace; c01f3d34 <ide_tcq_intr_timeout+a8/b0>
Trace; c01f3c8c <ide_tcq_intr_timeout+0/b0>
Trace; c011d5c7 <timer_bh+27b/2d0>
Trace; c011d2f0 <update_process_times+d4/dc>
Trace; c011a13e <bh_action+26/70>
Trace; c011a586 <tasklet_hi_action+4a/74>
Trace; c011a0b1 <do_softirq+61/c8>
Trace; c0108bef <do_IRQ+137/144>
Trace; c010704e <common_interrupt+22/28>
Trace; c01bb8e1 <acpi_processor_idle+e9/210>
Trace; c01bb7f8 <acpi_processor_idle+0/210>
Trace; c0105954 <default_idle+0/28>
Trace; c01059b3 <cpu_idle+37/48>
Trace; c0105000 <_stext+0/0>
Trace; c010503d <rest_init+3d/50>
Code; c0106b9f <do_signal+97/290>
00000000 <_EIP>:
Code; c0106b9f <do_signal+97/290> <=====
0: 0f 0b ud2a <=====
Code; c0106ba1 <do_signal+99/290>
2: 97 xchg %eax,%edi
Code; c0106ba2 <do_signal+9a/290>
3: 01 ea add %ebp,%edx
Code; c0106ba4 <do_signal+9c/290>
5: 09 2d c0 3b 5f 14 or %ebp,0x145f3bc0
Code; c0106baa <do_signal+a2/290>
b: 7d 53 jge 60 <_EIP+0x60> c0106bff <do_signal+f7/290>
Code; c0106bac <do_signal+a4/290>
d: 8b 57 04 mov 0x4(%edi),%edx
Code; c0106baf <do_signal+a7/290>
10: 0f b3 1a btr %ebx,(%edx)
Code; c0106bb2 <do_signal+aa/290>
13: 19 00 sbb %eax,(%eax)
<0> Kernel panic: Aiee, killing interrupt handler!
Quoted 15 lines · Sebastian Droege
Quoted 11 lines · On Fri, 3 May 2002 13:06:52 +0200 Jens Axboe <[email protected]> wrote:
Hi,
2.5.13 now has the generic tag support that I wrote included, here's an IDE TCQ that uses that. Changes since the version posted for 2.5.12:
- Fix the
ide_tcq_invalidate_queue()WIN_NOPusage needed to clear the internal queue on errors. It was disabled in the last version due to theata_requestchanges, it should work now.- Remove Promise tcq disable check, it works just fine on Promise as long as we handle the two-drives-with-tcq case like we currently do.
Quoted 7 lines
Hi,
I get following oops after a while... it's not really reproducable but happens a few minutes after bootup
With TCQ disabled the kernel is rock-solid ;)
I only use TCQ on one harddisk (hda)... hdb doesn't support it. The IDE controller is an Intel Corp. 82371AB PIIX4 IDE (rev 01) hda is a IBM-DTTA-351010
Hmm strange, please send me your .config so I can see some more facts about your setup.
Quoted 2 lines
ide_tcq_intr_timeout: timeout waiting for interrupt...ide_tcq_intr_timeout: hwgroup not busy
We timed out waiting for an interrupt for service or dma completion. Damn, I forgot to print which one. Please change that printk in drivers/ide/ide-tcq.c:ide_tcq_intr_timeout() to:
printk("ide_tcq_intr_timeout: timeout waiting for %s interrupt...\n",
hwgroup->rq ? "completion" : "service");and reproduce!
Quoted 1 line
hda: invalidating pending queue (10)
Ok, so a service check produced nothing for the drive (ok, odds are good this is a completion interrupt timeout), so we proceeded to invalidate the block tag queue.
Quoted 1 line
kernel BUG at ll_rw_blk.c:407!
And apparently one of the request on the tag queue had no tag assigned, very odd. This means someone else ended it, but it didn't get cleared. Hmm. This is probably your problem, I'll have to think about this.
[snip oops]
At least part of the decode seems bogus (eip should be blk_queue_end_tag...) and the last traces should be ide_tcq_intr_timeout -> ide_tcq_invalidate_queue -> blk_queue_invalidate_tags
Thanks for testing!
Signature · 1 line
Jens Axboe
Quoted 24 lines · On Fri, 3 May 2002 18:45:55 +0200 Jens Axboe <[email protected]> wrote:
Quoted 15 lines · Sebastian Droege
Quoted 11 lines · On Fri, 3 May 2002 13:06:52 +0200 Jens Axboe <[email protected]> wrote:
Hi,
2.5.13 now has the generic tag support that I wrote included, here's an IDE TCQ that uses that. Changes since the version posted for 2.5.12:
- Fix the
ide_tcq_invalidate_queue()WIN_NOPusage needed to clear the internal queue on errors. It was disabled in the last version due to theata_requestchanges, it should work now.- Remove Promise tcq disable check, it works just fine on Promise as long as we handle the two-drives-with-tcq case like we currently do.
Quoted 7 lines
Hi,
I get following oops after a while... it's not really reproducable but happens a few minutes after bootup
With TCQ disabled the kernel is rock-solid ;)
I only use TCQ on one harddisk (hda)... hdb doesn't support it. The IDE controller is an Intel Corp. 82371AB PIIX4 IDE (rev 01) hda is a IBM-DTTA-351010
Quoted 2 lines
Hmm strange, please send me your .config so I can see some more facts about your setup.
Attached at the bottom...
Quoted 4 lines
Quoted 3 lines
ide_tcq_intr_timeout: timeout waiting for interrupt...ide_tcq_intr_timeout: hwgroup not busy
Quoted 8 lines
We timed out waiting for an interrupt for service or dma completion. Damn, I forgot to print which one. Please change that printk in drivers/ide/ide-tcq.c:ide_tcq_intr_timeout() to:
printk("ide_tcq_intr_timeout: timeout waiting for %s interrupt...\n", hwgroup->rq ? "completion" : "service");and reproduce!
Is this printk enough or should I handcopy the oops again? ;)
Quoted 13 lines
Quoted 2 lines
hda: invalidating pending queue (10)
Ok, so a service check produced nothing for the drive (ok, odds are good this is a completion interrupt timeout), so we proceeded to invalidate the block tag queue.
Quoted 1 line
kernel BUG at ll_rw_blk.c:407!
And apparently one of the request on the tag queue had no tag assigned, very odd. This means someone else ended it, but it didn't get cleared. Hmm. This is probably your problem, I'll have to think about this.
Quoted 5 lines
[snip oops]
At least part of the decode seems bogus (eip should be
blk_queue_end_tag...) and the last traces should beide_tcq_intr_timeout->ide_tcq_invalidate_queue->blk_queue_invalidate_tags
Yes this is possible... the oops is just hand copied...
Bye
CONFIG_X86=yCONFIG_ISA=yCONFIG_UID16=yCONFIG_EXPERIMENTAL=yCONFIG_NET=yCONFIG_SYSVIPC=yCONFIG_BSD_PROCESS_ACCT=yCONFIG_SYSCTL=yCONFIG_MODULES=yCONFIG_KMOD=yCONFIG_M686=yCONFIG_X86_WP_WORKS_OK=yCONFIG_X86_INVLPG=yCONFIG_X86_CMPXCHG=yCONFIG_X86_XADD=yCONFIG_X86_BSWAP=yCONFIG_X86_POPAD_OK=yCONFIG_RWSEM_XCHGADD_ALGORITHM=yCONFIG_X86_L1_CACHE_SHIFT=5CONFIG_X86_TSC=yCONFIG_X86_GOOD_APIC=yCONFIG_X86_USE_PPRO_CHECKSUM=yCONFIG_X86_PPRO_FENCE=yCONFIG_X86_MCE=yCONFIG_NOHIGHMEM=yCONFIG_MTRR=yCONFIG_PREEMPT=yCONFIG_HAVE_DEC_LOCK=yCONFIG_ACPI=yCONFIG_ACPI_BOOT=yCONFIG_ACPI_BUS=yCONFIG_ACPI_EC=yCONFIG_ACPI_INTERPRETER=yCONFIG_ACPI_PCI=yCONFIG_ACPI_POWER=yCONFIG_ACPI_SLEEP=yCONFIG_ACPI_SYSTEM=yCONFIG_ACPI_BUTTON=yCONFIG_ACPI_PROCESSOR=yCONFIG_PCI=yCONFIG_PCI_GODIRECT=yCONFIG_PCI_DIRECT=yCONFIG_PCI_NAMES=yCONFIG_KCORE_ELF=yCONFIG_BINFMT_AOUT=mCONFIG_BINFMT_ELF=yCONFIG_BINFMT_MISC=mCONFIG_PM=yCONFIG_PNP=yCONFIG_BLK_DEV_FD=mCONFIG_BLK_DEV_LOOP=mCONFIG_PACKET=yCONFIG_PACKET_MMAP=yCONFIG_UNIX=yCONFIG_INET=yCONFIG_IP_MULTICAST=yCONFIG_INET_ECN=yCONFIG_SYN_COOKIES=yCONFIG_IDE=yCONFIG_BLK_DEV_IDE=yCONFIG_BLK_DEV_IDEDISK=yCONFIG_IDEDISK_MULTI_MODE=yCONFIG_BLK_DEV_IDESCSI=yCONFIG_BLK_DEV_IDEPCI=yCONFIG_IDEPCI_SHARE_IRQ=yCONFIG_BLK_DEV_IDEDMA_PCI=yCONFIG_IDEDMA_PCI_AUTO=yCONFIG_BLK_DEV_IDEDMA=yCONFIG_BLK_DEV_IDE_TCQ=yCONFIG_BLK_DEV_IDE_TCQ_DEFAULT=yCONFIG_BLK_DEV_IDE_TCQ_DEPTH=32CONFIG_BLK_DEV_PIIX=yCONFIG_IDEDMA_IVB=yCONFIG_IDEDMA_AUTO=yCONFIG_SCSI=yCONFIG_BLK_DEV_SR=yCONFIG_BLK_DEV_SR_VENDOR=yCONFIG_SR_EXTRA_DEVS=2CONFIG_CHR_DEV_SG=yCONFIG_NETDEVICES=yCONFIG_DUMMY=mCONFIG_NET_ETHERNET=yCONFIG_NET_TULIP=yCONFIG_DM9102=yCONFIG_INPUT=yCONFIG_INPUT_KEYBDEV=yCONFIG_INPUT_MOUSEDEV=yCONFIG_INPUT_MOUSEDEV_SCREEN_X=1024CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768CONFIG_SOUND_GAMEPORT=yCONFIG_VT=yCONFIG_VT_CONSOLE=yCONFIG_UNIX98_PTYS=yCONFIG_UNIX98_PTY_COUNT=256CONFIG_MOUSE=yCONFIG_PSMOUSE=yCONFIG_RTC=yCONFIG_AGP=yCONFIG_AGP_INTEL=yCONFIG_DRM=yCONFIG_DRM_RADEON=yCONFIG_AUTOFS4_FS=yCONFIG_REISERFS_FS=yCONFIG_FAT_FS=mCONFIG_MSDOS_FS=mCONFIG_RAMFS=yCONFIG_ISO9660_FS=mCONFIG_JOLIET=yCONFIG_ZISOFS=yCONFIG_PROC_FS=yCONFIG_DEVFS_FS=yCONFIG_DEVFS_MOUNT=yCONFIG_UDF_FS=mCONFIG_NFS_FS=mCONFIG_NFS_V3=yCONFIG_NFSD=yCONFIG_NFSD_V3=yCONFIG_NFSD_TCP=yCONFIG_SUNRPC=yCONFIG_LOCKD=yCONFIG_LOCKD_V4=yCONFIG_EXPORTFS=yCONFIG_SMB_FS=mCONFIG_SMB_NLS_DEFAULT=yCONFIG_SMB_NLS_REMOTE="cp850"CONFIG_ZISOFS_FS=mCONFIG_MSDOS_PARTITION=yCONFIG_SMB_NLS=yCONFIG_NLS=yCONFIG_NLS_DEFAULT="iso8859-15"CONFIG_NLS_CODEPAGE_437=mCONFIG_NLS_CODEPAGE_850=mCONFIG_NLS_ISO8859_1=mCONFIG_NLS_ISO8859_15=yCONFIG_NLS_UTF8=mCONFIG_VGA_CONSOLE=yCONFIG_SOUND=yCONFIG_SND=yCONFIG_SND_SEQUENCER=yCONFIG_SND_OSSEMUL=yCONFIG_SND_MIXER_OSS=yCONFIG_SND_PCM_OSS=yCONFIG_SND_SEQUENCER_OSS=yCONFIG_SND_RTCTIMER=yCONFIG_SND_CS46XX=yCONFIG_SND_CS46XX_ACCEPT_VALID=yCONFIG_INPUT_GAMEPORT=yCONFIG_USB=yCONFIG_USB_DEVICEFS=yCONFIG_USB_UHCI_ALT=yCONFIG_USB_PRINTER=mCONFIG_USB_HID=yCONFIG_USB_HIDINPUT=yCONFIG_DEBUG_KERNEL=yCONFIG_MAGIC_SYSRQ=yCONFIG_ZLIB_INFLATE=m
Quoted 24 lines · On Fri, 3 May 2002 18:45:55 +0200 Jens Axboe <[email protected]> wrote:
Quoted 15 lines · Sebastian Droege
Quoted 11 lines · On Fri, 3 May 2002 13:06:52 +0200 Jens Axboe <[email protected]> wrote:
Hi,
2.5.13 now has the generic tag support that I wrote included, here's an IDE TCQ that uses that. Changes since the version posted for 2.5.12:
- Fix the
ide_tcq_invalidate_queue()WIN_NOPusage needed to clear the internal queue on errors. It was disabled in the last version due to theata_requestchanges, it should work now.- Remove Promise tcq disable check, it works just fine on Promise as long as we handle the two-drives-with-tcq case like we currently do.
Quoted 7 lines
Hi,
I get following oops after a while... it's not really reproducable but happens a few minutes after bootup
With TCQ disabled the kernel is rock-solid ;)
I only use TCQ on one harddisk (hda)... hdb doesn't support it. The IDE controller is an Intel Corp. 82371AB PIIX4 IDE (rev 01) hda is a IBM-DTTA-351010
Quoted 2 lines
Hmm strange, please send me your .config so I can see some more facts about your setup.
Attached at the bottom...
Quoted 4 lines
Quoted 3 lines
ide_tcq_intr_timeout: timeout waiting for interrupt...ide_tcq_intr_timeout: hwgroup not busy
Quoted 8 lines
We timed out waiting for an interrupt for service or dma completion. Damn, I forgot to print which one. Please change that printk in drivers/ide/ide-tcq.c:ide_tcq_intr_timeout() to:
printk("ide_tcq_intr_timeout: timeout waiting for %s interrupt...\n", hwgroup->rq ? "completion" : "service");and reproduce!
Is this printk enough or should I handcopy the oops again? ;)
Quoted 13 lines
Quoted 2 lines
hda: invalidating pending queue (10)
Ok, so a service check produced nothing for the drive (ok, odds are good this is a completion interrupt timeout), so we proceeded to invalidate the block tag queue.
Quoted 1 line
kernel BUG at ll_rw_blk.c:407!
And apparently one of the request on the tag queue had no tag assigned, very odd. This means someone else ended it, but it didn't get cleared. Hmm. This is probably your problem, I'll have to think about this.
Quoted 5 lines
[snip oops]
At least part of the decode seems bogus (eip should be
blk_queue_end_tag...) and the last traces should beide_tcq_intr_timeout->ide_tcq_invalidate_queue->blk_queue_invalidate_tags
Yes this is possible... the oops is just hand copied...
Bye
CONFIG_X86=yCONFIG_ISA=yCONFIG_UID16=yCONFIG_EXPERIMENTAL=yCONFIG_NET=yCONFIG_SYSVIPC=yCONFIG_BSD_PROCESS_ACCT=yCONFIG_SYSCTL=yCONFIG_MODULES=yCONFIG_KMOD=yCONFIG_M686=yCONFIG_X86_WP_WORKS_OK=yCONFIG_X86_INVLPG=yCONFIG_X86_CMPXCHG=yCONFIG_X86_XADD=yCONFIG_X86_BSWAP=yCONFIG_X86_POPAD_OK=yCONFIG_RWSEM_XCHGADD_ALGORITHM=yCONFIG_X86_L1_CACHE_SHIFT=5CONFIG_X86_TSC=yCONFIG_X86_GOOD_APIC=yCONFIG_X86_USE_PPRO_CHECKSUM=yCONFIG_X86_PPRO_FENCE=yCONFIG_X86_MCE=yCONFIG_NOHIGHMEM=yCONFIG_MTRR=yCONFIG_PREEMPT=yCONFIG_HAVE_DEC_LOCK=yCONFIG_ACPI=yCONFIG_ACPI_BOOT=yCONFIG_ACPI_BUS=yCONFIG_ACPI_EC=yCONFIG_ACPI_INTERPRETER=yCONFIG_ACPI_PCI=yCONFIG_ACPI_POWER=yCONFIG_ACPI_SLEEP=yCONFIG_ACPI_SYSTEM=yCONFIG_ACPI_BUTTON=yCONFIG_ACPI_PROCESSOR=yCONFIG_PCI=yCONFIG_PCI_GODIRECT=yCONFIG_PCI_DIRECT=yCONFIG_PCI_NAMES=yCONFIG_KCORE_ELF=yCONFIG_BINFMT_AOUT=mCONFIG_BINFMT_ELF=yCONFIG_BINFMT_MISC=mCONFIG_PM=yCONFIG_PNP=yCONFIG_BLK_DEV_FD=mCONFIG_BLK_DEV_LOOP=mCONFIG_PACKET=yCONFIG_PACKET_MMAP=yCONFIG_UNIX=yCONFIG_INET=yCONFIG_IP_MULTICAST=yCONFIG_INET_ECN=yCONFIG_SYN_COOKIES=yCONFIG_IDE=yCONFIG_BLK_DEV_IDE=yCONFIG_BLK_DEV_IDEDISK=yCONFIG_IDEDISK_MULTI_MODE=yCONFIG_BLK_DEV_IDESCSI=yCONFIG_BLK_DEV_IDEPCI=yCONFIG_IDEPCI_SHARE_IRQ=yCONFIG_BLK_DEV_IDEDMA_PCI=yCONFIG_IDEDMA_PCI_AUTO=yCONFIG_BLK_DEV_IDEDMA=yCONFIG_BLK_DEV_IDE_TCQ=yCONFIG_BLK_DEV_IDE_TCQ_DEFAULT=yCONFIG_BLK_DEV_IDE_TCQ_DEPTH=32CONFIG_BLK_DEV_PIIX=yCONFIG_IDEDMA_IVB=yCONFIG_IDEDMA_AUTO=yCONFIG_SCSI=yCONFIG_BLK_DEV_SR=yCONFIG_BLK_DEV_SR_VENDOR=yCONFIG_SR_EXTRA_DEVS=2CONFIG_CHR_DEV_SG=yCONFIG_NETDEVICES=yCONFIG_DUMMY=mCONFIG_NET_ETHERNET=yCONFIG_NET_TULIP=yCONFIG_DM9102=yCONFIG_INPUT=yCONFIG_INPUT_KEYBDEV=yCONFIG_INPUT_MOUSEDEV=yCONFIG_INPUT_MOUSEDEV_SCREEN_X=1024CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768CONFIG_SOUND_GAMEPORT=yCONFIG_VT=yCONFIG_VT_CONSOLE=yCONFIG_UNIX98_PTYS=yCONFIG_UNIX98_PTY_COUNT=256CONFIG_MOUSE=yCONFIG_PSMOUSE=yCONFIG_RTC=yCONFIG_AGP=yCONFIG_AGP_INTEL=yCONFIG_DRM=yCONFIG_DRM_RADEON=yCONFIG_AUTOFS4_FS=yCONFIG_REISERFS_FS=yCONFIG_FAT_FS=mCONFIG_MSDOS_FS=mCONFIG_RAMFS=yCONFIG_ISO9660_FS=mCONFIG_JOLIET=yCONFIG_ZISOFS=yCONFIG_PROC_FS=yCONFIG_DEVFS_FS=yCONFIG_DEVFS_MOUNT=yCONFIG_UDF_FS=mCONFIG_NFS_FS=mCONFIG_NFS_V3=yCONFIG_NFSD=yCONFIG_NFSD_V3=yCONFIG_NFSD_TCP=yCONFIG_SUNRPC=yCONFIG_LOCKD=yCONFIG_LOCKD_V4=yCONFIG_EXPORTFS=yCONFIG_SMB_FS=mCONFIG_SMB_NLS_DEFAULT=yCONFIG_SMB_NLS_REMOTE="cp850"CONFIG_ZISOFS_FS=mCONFIG_MSDOS_PARTITION=yCONFIG_SMB_NLS=yCONFIG_NLS=yCONFIG_NLS_DEFAULT="iso8859-15"CONFIG_NLS_CODEPAGE_437=mCONFIG_NLS_CODEPAGE_850=mCONFIG_NLS_ISO8859_1=mCONFIG_NLS_ISO8859_15=yCONFIG_NLS_UTF8=mCONFIG_VGA_CONSOLE=yCONFIG_SOUND=yCONFIG_SND=yCONFIG_SND_SEQUENCER=yCONFIG_SND_OSSEMUL=yCONFIG_SND_MIXER_OSS=yCONFIG_SND_PCM_OSS=yCONFIG_SND_SEQUENCER_OSS=yCONFIG_SND_RTCTIMER=yCONFIG_SND_CS46XX=yCONFIG_SND_CS46XX_ACCEPT_VALID=yCONFIG_INPUT_GAMEPORT=yCONFIG_USB=yCONFIG_USB_DEVICEFS=yCONFIG_USB_UHCI_ALT=yCONFIG_USB_PRINTER=mCONFIG_USB_HID=yCONFIG_USB_HIDINPUT=yCONFIG_DEBUG_KERNEL=yCONFIG_MAGIC_SYSRQ=yCONFIG_ZLIB_INFLATE=m
Quoted 4 lines · Sebastian Droege
Quoted 2 lines
Hmm strange, please send me your .config so I can see some more facts about your setup.
Attached at the bottom...
Thanks! BTW, after having reproduced, could you reproduce with preempt disabled as well?
Quoted 7 lines
Quoted 7 lines
Quoted 2 lines
ide_tcq_intr_timeout: timeout waiting for interrupt...ide_tcq_intr_timeout: hwgroup not busyWe timed out waiting for an interrupt for service or dma completion. Damn, I forgot to print which one. Please change that printk in drivers/ide/ide-tcq.c:ide_tcq_intr_timeout() to:
Quoted 5 lines
Quoted 4 lines
printk("ide_tcq_intr_timeout: timeout waiting for %s interrupt...\n", hwgroup->rq ? "completion" : "service");and reproduce!
Is this printk enough or should I handcopy the oops again? ;)
The oops is pretty irrelevant here, the fact that it triggers is enough to know. I already know the backtrace :-)
Quoted 1 line
Yes this is possible... the oops is just hand copied...
Ah makes sense, no problem.
Signature · 1 line
Jens Axboe
Quoted 4 lines · Sebastian Droege
Quoted 2 lines
Hmm strange, please send me your .config so I can see some more facts about your setup.
Attached at the bottom...
Thanks! BTW, after having reproduced, could you reproduce with preempt disabled as well?
Quoted 7 lines
Quoted 7 lines
Quoted 2 lines
ide_tcq_intr_timeout: timeout waiting for interrupt...ide_tcq_intr_timeout: hwgroup not busyWe timed out waiting for an interrupt for service or dma completion. Damn, I forgot to print which one. Please change that printk in drivers/ide/ide-tcq.c:ide_tcq_intr_timeout() to:
Quoted 5 lines
Quoted 4 lines
printk("ide_tcq_intr_timeout: timeout waiting for %s interrupt...\n", hwgroup->rq ? "completion" : "service");and reproduce!
Is this printk enough or should I handcopy the oops again? ;)
The oops is pretty irrelevant here, the fact that it triggers is enough to know. I already know the backtrace :-)
Quoted 1 line
Yes this is possible... the oops is just hand copied...
Ah makes sense, no problem.
Signature · 1 line
Jens Axboe
Quoted 7 lines · On Fri, 3 May 2002 19:01:18 +0200 Jens Axboe <[email protected]> wrote:
Quoted 7 lines
Quoted 7 lines
Quoted 2 lines
ide_tcq_intr_timeout: timeout waiting for interrupt...ide_tcq_intr_timeout: hwgroup not busyWe timed out waiting for an interrupt for service or dma completion. Damn, I forgot to print which one. Please change that printk in drivers/ide/ide-tcq.c:ide_tcq_intr_timeout() to:
Quoted 8 lines
Quoted 5 lines
Quoted 4 lines
printk("ide_tcq_intr_timeout: timeout waiting for %s interrupt...\n", hwgroup->rq ? "completion" : "service");and reproduce!
Is this printk enough or should I handcopy the oops again? ;)
The oops is pretty irrelevant here, the fact that it triggers is enough to know. I already know the backtrace :-)
It's a service interrupt....
I'm currently recompiling without preempt
Bye
Quoted 13 lines · On Fri, 3 May 2002 19:30:06 +0200 Sebastian Droege <[email protected]>…
Quoted 10 lines · On Fri, 3 May 2002 19:01:18 +0200 Jens Axboe <[email protected]> wrote:
Quoted 10 lines
Quoted 10 lines
Quoted 2 lines
ide_tcq_intr_timeout: timeout waiting for interrupt...ide_tcq_intr_timeout: hwgroup not busyWe timed out waiting for an interrupt for service or dma completion. Damn, I forgot to print which one. Please change that printk in drivers/ide/ide-tcq.c:ide_tcq_intr_timeout() to:
printk("ide_tcq_intr_timeout: timeout waiting for %s interrupt...\n", hwgroup->rq ? "completion" : "service");
Quoted 8 lines
Quoted 5 lines
Quoted 2 lines
Quoted 1 line
and reproduce!
Is this printk enough or should I handcopy the oops again? ;)
The oops is pretty irrelevant here, the fact that it triggers is enough to know. I already know the backtrace :-)
It's a service interrupt....
I'm currently recompiling without preempt
Ok... the problem doesn't solve simple by disabling preempt :(
Bye
Quoted 13 lines · Sebastian Droege
Quoted 10 lines · On Fri, 3 May 2002 19:01:18 +0200 Jens Axboe <[email protected]> wrote:
Quoted 10 lines
Quoted 10 lines
Quoted 2 lines
ide_tcq_intr_timeout: timeout waiting for interrupt...ide_tcq_intr_timeout: hwgroup not busyWe timed out waiting for an interrupt for service or dma completion. Damn, I forgot to print which one. Please change that printk in drivers/ide/ide-tcq.c:ide_tcq_intr_timeout() to:
printk("ide_tcq_intr_timeout: timeout waiting for %s interrupt...\n", hwgroup->rq ? "completion" : "service");
Quoted 7 lines
Quoted 5 lines
Quoted 2 lines
Quoted 1 line
and reproduce!
Is this printk enough or should I handcopy the oops again? ;)
The oops is pretty irrelevant here, the fact that it triggers is enough to know. I already know the backtrace :-)
It's a service interrupt....
Ok thanks, what were the other messages this time? Just the ones before the oops.
Jens
Quoted 13 lines · Sebastian Droege
Quoted 10 lines · On Fri, 3 May 2002 19:01:18 +0200 Jens Axboe <[email protected]> wrote:
Quoted 10 lines
Quoted 10 lines
Quoted 2 lines
ide_tcq_intr_timeout: timeout waiting for interrupt...ide_tcq_intr_timeout: hwgroup not busyWe timed out waiting for an interrupt for service or dma completion. Damn, I forgot to print which one. Please change that printk in drivers/ide/ide-tcq.c:ide_tcq_intr_timeout() to:
printk("ide_tcq_intr_timeout: timeout waiting for %s interrupt...\n", hwgroup->rq ? "completion" : "service");
Quoted 7 lines
Quoted 5 lines
Quoted 2 lines
Quoted 1 line
and reproduce!
Is this printk enough or should I handcopy the oops again? ;)
The oops is pretty irrelevant here, the fact that it triggers is enough to know. I already know the backtrace :-)
It's a service interrupt....
Ok thanks, what were the other messages this time? Just the ones before the oops.
Jens