public inbox for linux-scsi@vger.kernel.org
 help / color / mirror / Atom feed
* RE: eata irq abuse (was: Re: Linux 2.5.60)
@ 2003-02-12 10:08 Ballabio_Dario
  2003-02-12 15:28 ` Jeff Garzik
  0 siblings, 1 reply; 21+ messages in thread
From: Ballabio_Dario @ 2003-02-12 10:08 UTC (permalink / raw)
  To: manfred, warp; +Cc: linux-kernel, linux-scsi, linux-eata

Yes, you are correct. I used spin_unlock in order to release the local
driver lock
during the scsi_register call, but I forgot that I had the irq disabled as
well.
SO the correct fix is to use spin_unlock_irq/spin_lock_irq around the
scsi_register call. Same fix applies to the u14-34f driver.

Cheers,

*********************************
Ph.D. Dario Ballabio
EMC Computer Systems Italia spa
Mobile phone +393487978851
Office phone +390244571315
Mobile fax   +393487951622

*** Si vis pacem, para bellum ***


-----Original Message-----
From: Manfred Spraul [mailto:manfred@colorfullife.com]
Sent: Tuesday, February 11, 2003 6:46 PM
To: Zephaniah E. Hull
Cc: linux-kernel@vger.kernel.org; linux-scsi@vger.kernel.org;
linux-eata@i-connect.net
Subject: eata irq abuse (was: Re: Linux 2.5.60)


Zephaniah wrote:

>kernel BUG at mm/slab.c:1102!

Slab notices that a function that expects enabled local interrupts is called
with disabled local interrupts.


>Call Trace:
> [<c014a3b3>] do_tune_cpucache+0x83/0x240

do_tune_cpucache:
the function call smp_call_function(), and that is only permitted with
enabled local interrupts. The complain is correct.


> [<c014a300>] do_ccpupdate_local+0x0/0x30
> [<c014a5c1>] enable_cpucache+0x51/0x80
> [<c0148ea5>] kmem_cache_create+0x4a5/0x560

Within kmem_cache_create. kmem_cache_create checks for in_interrupt(), thus
someone probably does

	spin_lock_irqsave();
	kmem_cache_create();


> [<c0285dd2>] scsi_setup_command_freelist+0xa2/0x130

calls kmem_cache_create()

> [<c02887e0>] scsi_register+0x3c0/0x660

calls scsi_setup_command_freelist


> [<c02919a1>] get_pci_dev+0x31/0x50

?? probably stale

> [<c0291df2>] port_detect+0x3c2/0xe50

Do you have an eata scsi controller?

Ugs.
eata2x_detect():
* spin_lock_irqsave();
* calls port_detect();
* * spin_unlock();
* * scsi_register.

Eata maintainers: Is that necessary?
Why do the interrupts remain disabled across scsi_register?
Is that a bug workaround, or an oversight?
I'd use

	spin_unlock_irq();
	scsi_register();
	spin_lock_irq();

--
	Manfred


-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 21+ messages in thread
* RE: eata irq abuse (was: Re: Linux 2.5.60)
@ 2003-02-12 15:37 Ballabio_Dario
  0 siblings, 0 replies; 21+ messages in thread
From: Ballabio_Dario @ 2003-02-12 15:37 UTC (permalink / raw)
  To: James.Bottomley, hch; +Cc: Ballabio_Dario, manfred, warp, linux-scsi

local_irq_disable/enable could be sufficient as long as
there are not two instances of the detect routine 
running simultaneously, which is hopefully the case
with actual lk, even when loading the driver as a module.
Moreover the local_irq primitives are relatively new,
while spin_lock_irq has been available for years. 
There is nothing special with eata driver concerning
this aspect, what you see is common to the majority
of scsi low level drivers. As long as interrupts are
disabled while accessing board registers _and_ the
detect routine is known to lk to be non re-entrant, any
protection scheme would fit.
-db


-----Original Message-----
From: James Bottomley [mailto:James.Bottomley@steeleye.com]
Sent: Wednesday, February 12, 2003 3:55 PM
To: Christoph Hellwig
Cc: Ballabio_Dario@emc.com; manfred@colorfullife.com;
warp@mercury.d2dc.net; SCSI Mailing List
Subject: Re: eata irq abuse (was: Re: Linux 2.5.60)


On Wed, 2003-02-12 at 08:51, Christoph Hellwig wrote:
> On Wed, Feb 12, 2003 at 08:40:34AM -0600, James Bottomley wrote:
> > > Ah, you don't need the lock but the disabled interrupts!
> > 
> > In general, that's not correct: most HBA registers have to be accessed
> > in sequence, thus you need global protection from anyone else touching
> > them while you're at the registers.  This is what host_lock was designed
> > for.
> 
> Of course.  but that's not how driver_lock in eata.c works.  It's taken
> when we enter eata2x_detect(), dropped before scsi_register(), reacquired
> afterwards and released when we leave eata2x_detect().  I don't really
> see what it is supposed to protect.

I agree, I'll look over the driver while I'm travelling today and see if
we can do better.  I just didn't want to give the impression that
local_irq_disable() is sufficient protection when accessing board
registers (having seen one or two SMP problems related to this).

James


^ permalink raw reply	[flat|nested] 21+ messages in thread
* RE: eata irq abuse (was: Re: Linux 2.5.60)
@ 2003-02-12 14:13 Ballabio_Dario
  2003-02-12 14:25 ` Christoph Hellwig
  0 siblings, 1 reply; 21+ messages in thread
From: Ballabio_Dario @ 2003-02-12 14:13 UTC (permalink / raw)
  To: hch, Ballabio_Dario; +Cc: manfred, warp, linux-scsi

Last time I tried to run the detect routine with interrupts enabled,
it just hung at the first occurrence on an inb() from
the board registers. If someone is able to have it 
working with interrupts enabled and qualifies the
solution on all the platforms and eata boards,
I'd be more than happy to remove it.

-db


-----Original Message-----
From: Christoph Hellwig [mailto:hch@infradead.org]
Sent: Wednesday, February 12, 2003 2:17 PM
To: Ballabio_Dario@emc.com
Cc: manfred@colorfullife.com; warp@mercury.d2dc.net;
linux-scsi@vger.kernel.org
Subject: Re: eata irq abuse (was: Re: Linux 2.5.60)


On Wed, Feb 12, 2003 at 07:47:01AM -0500, Ballabio_Dario@emc.com wrote:
> The enclosed patch applies to 2.5.60 and fixes the irq issue when calling
> scsi_register for both eata and u14-34f drivers.

Any chance you could explain us

(1) what does this lock protect
(2) why does it need to disable interrupts

^ permalink raw reply	[flat|nested] 21+ messages in thread
* RE: eata irq abuse (was: Re: Linux 2.5.60)
@ 2003-02-12 12:47 Ballabio_Dario
  2003-02-12 13:17 ` Christoph Hellwig
  0 siblings, 1 reply; 21+ messages in thread
From: Ballabio_Dario @ 2003-02-12 12:47 UTC (permalink / raw)
  To: manfred, warp; +Cc: linux-scsi

[-- Attachment #1: Type: text/plain, Size: 1871 bytes --]

The enclosed patch applies to 2.5.60 and fixes the irq issue when calling
scsi_register for both eata and u14-34f drivers.
Cheers,
-db



-----Original Message-----
From: Manfred Spraul [mailto:manfred@colorfullife.com]
Sent: Tuesday, February 11, 2003 6:46 PM
To: Zephaniah E. Hull
Cc: linux-kernel@vger.kernel.org; linux-scsi@vger.kernel.org;
linux-eata@i-connect.net
Subject: eata irq abuse (was: Re: Linux 2.5.60)


Zephaniah wrote:

>kernel BUG at mm/slab.c:1102!

Slab notices that a function that expects enabled local interrupts is called
with disabled local interrupts.


>Call Trace:
> [<c014a3b3>] do_tune_cpucache+0x83/0x240

do_tune_cpucache:
the function call smp_call_function(), and that is only permitted with
enabled local interrupts. The complain is correct.


> [<c014a300>] do_ccpupdate_local+0x0/0x30
> [<c014a5c1>] enable_cpucache+0x51/0x80
> [<c0148ea5>] kmem_cache_create+0x4a5/0x560

Within kmem_cache_create. kmem_cache_create checks for in_interrupt(), thus
someone probably does

	spin_lock_irqsave();
	kmem_cache_create();


> [<c0285dd2>] scsi_setup_command_freelist+0xa2/0x130

calls kmem_cache_create()

> [<c02887e0>] scsi_register+0x3c0/0x660

calls scsi_setup_command_freelist


> [<c02919a1>] get_pci_dev+0x31/0x50

?? probably stale

> [<c0291df2>] port_detect+0x3c2/0xe50

Do you have an eata scsi controller?

Ugs.
eata2x_detect():
* spin_lock_irqsave();
* calls port_detect();
* * spin_unlock();
* * scsi_register.

Eata maintainers: Is that necessary?
Why do the interrupts remain disabled across scsi_register?
Is that a bug workaround, or an oversight?
I'd use

	spin_unlock_irq();
	scsi_register();
	spin_lock_irq();

--
	Manfred


-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[-- Attachment #2: drivers_804.diff --]
[-- Type: application/octet-stream, Size: 4508 bytes --]

diff -u -r linux.803/drivers/scsi/eata.c linux.804/drivers/scsi/eata.c
--- linux.803/drivers/scsi/eata.c	Wed Feb 12 12:14:02 2003
+++ linux.804/drivers/scsi/eata.c	Wed Feb 12 11:17:25 2003
@@ -1,6 +1,9 @@
 /*
  *      eata.c - Low-level driver for EATA/DMA SCSI host adapters.
  *
+ *      12 Feb 2003 Rev. 8.04 for linux 2.5.60
+ *        + Release irq before calling scsi_register.
+ *
  *      12 Nov 2002 Rev. 8.02 for linux 2.5.47
  *        + Release driver_lock before calling scsi_register.
  *
@@ -279,7 +282,7 @@
  *          This driver is based on the CAM (Common Access Method Committee)
  *          EATA (Enhanced AT Bus Attachment) rev. 2.0A, using DMA protocol.
  *
- *  Copyright (C) 1994-2002 Dario Ballabio (ballabio_dario@emc.com)
+ *  Copyright (C) 1994-2003 Dario Ballabio (ballabio_dario@emc.com)
  *
  *  Alternate email: dario.ballabio@inwind.it, dario.ballabio@tiscalinet.it
  *
@@ -1193,9 +1196,9 @@
    }
 #endif
 
-   spin_unlock(&driver_lock);
+   spin_unlock_irq(&driver_lock);
    sh[j] = scsi_register(tpnt, sizeof(struct hostdata));
-   spin_lock(&driver_lock);
+   spin_lock_irq(&driver_lock);
 
    if (sh[j] == NULL) {
       printk("%s: unable to register host, detaching.\n", name);
@@ -1306,7 +1309,7 @@
       tag_mode = TAG_ORDERED;
 
    if (j == 0) {
-      printk("EATA/DMA 2.0x: Copyright (C) 1994-2002 Dario Ballabio.\n");
+      printk("EATA/DMA 2.0x: Copyright (C) 1994-2003 Dario Ballabio.\n");
       printk("%s config options -> tm:%d, lc:%c, mq:%d, rs:%c, et:%c, "\
              "ip:%c, ep:%c, pp:%c.\n", driver_name, tag_mode,
              YESNO(linked_comm), max_queue_depth, YESNO(rev_scan),
diff -u -r linux.803/drivers/scsi/eata.h linux.804/drivers/scsi/eata.h
--- linux.803/drivers/scsi/eata.h	Wed Feb 12 12:14:12 2003
+++ linux.804/drivers/scsi/eata.h	Wed Feb 12 11:17:20 2003
@@ -11,7 +11,7 @@
                              sector_t, int *);
 static int eata2x_slave_configure(Scsi_Device *);
 
-#define EATA_VERSION "8.03.00"
+#define EATA_VERSION "8.04.00"
 
 #define EATA {                                                               \
                 .name              = "EATA/DMA 2.0x rev. " EATA_VERSION " ",   \
diff -u -r linux.803/drivers/scsi/u14-34f.c linux.804/drivers/scsi/u14-34f.c
--- linux.803/drivers/scsi/u14-34f.c	Wed Feb 12 12:14:56 2003
+++ linux.804/drivers/scsi/u14-34f.c	Wed Feb 12 11:17:46 2003
@@ -1,6 +1,9 @@
 /*
  *      u14-34f.c - Low-level driver for UltraStor 14F/34F SCSI host adapters.
  *
+ *      12 Feb 2003 Rev. 8.04 for linux 2.5.60
+ *        + Release irq before calling scsi_register.
+ *
  *      12 Nov 2002 Rev. 8.02 for linux 2.5.47
  *        + Release driver_lock before calling scsi_register.
  *
@@ -221,7 +224,7 @@
  *
  *          Multiple U14F and/or U34F host adapters are supported.
  *
- *  Copyright (C) 1994-2002 Dario Ballabio (ballabio_dario@emc.com)
+ *  Copyright (C) 1994-2003 Dario Ballabio (ballabio_dario@emc.com)
  *
  *  Alternate email: dario.ballabio@inwind.it, dario.ballabio@tiscalinet.it
  *
@@ -847,9 +850,9 @@
 
    if (have_old_firmware) tpnt->use_clustering = DISABLE_CLUSTERING;
 
-   spin_unlock(&driver_lock);
+   spin_unlock_irq(&driver_lock);
    sh[j] = scsi_register(tpnt, sizeof(struct hostdata));
-   spin_lock(&driver_lock);
+   spin_lock_irq(&driver_lock);
 
    if (sh[j] == NULL) {
       printk("%s: unable to register host, detaching.\n", name);
@@ -961,7 +964,7 @@
       tag_mode = TAG_ORDERED;
 
    if (j == 0) {
-      printk("UltraStor 14F/34F: Copyright (C) 1994-2002 Dario Ballabio.\n");
+      printk("UltraStor 14F/34F: Copyright (C) 1994-2003 Dario Ballabio.\n");
       printk("%s config options -> of:%c, tm:%d, lc:%c, mq:%d, et:%c.\n",
              driver_name, YESNO(have_old_firmware), tag_mode,
              YESNO(linked_comm), max_queue_depth, YESNO(ext_tran));
diff -u -r linux.803/drivers/scsi/u14-34f.h linux.804/drivers/scsi/u14-34f.h
--- linux.803/drivers/scsi/u14-34f.h	Wed Feb 12 12:15:06 2003
+++ linux.804/drivers/scsi/u14-34f.h	Wed Feb 12 11:17:54 2003
@@ -11,7 +11,7 @@
                               sector_t, int *);
 static int u14_34f_slave_configure(Scsi_Device *);
 
-#define U14_34F_VERSION "8.03.00"
+#define U14_34F_VERSION "8.04.00"
 
 #define ULTRASTOR_14_34F {                                                   \
                 .name         = "UltraStor 14F/34F rev. " U14_34F_VERSION " ", \

^ permalink raw reply	[flat|nested] 21+ messages in thread
* eata irq abuse (was: Re: Linux 2.5.60)
@ 2003-02-11 17:45 Manfred Spraul
  2003-02-11 23:01 ` Zephaniah E. Hull
  0 siblings, 1 reply; 21+ messages in thread
From: Manfred Spraul @ 2003-02-11 17:45 UTC (permalink / raw)
  To: Zephaniah E. Hull; +Cc: linux-kernel, linux-scsi, linux-eata

Zephaniah wrote:

>kernel BUG at mm/slab.c:1102!

Slab notices that a function that expects enabled local interrupts is called with disabled local interrupts.


>Call Trace:
> [<c014a3b3>] do_tune_cpucache+0x83/0x240

do_tune_cpucache:
the function call smp_call_function(), and that is only permitted with enabled local interrupts. The complain is correct.


> [<c014a300>] do_ccpupdate_local+0x0/0x30
> [<c014a5c1>] enable_cpucache+0x51/0x80
> [<c0148ea5>] kmem_cache_create+0x4a5/0x560

Within kmem_cache_create. kmem_cache_create checks for in_interrupt(), thus someone probably does

	spin_lock_irqsave();
	kmem_cache_create();


> [<c0285dd2>] scsi_setup_command_freelist+0xa2/0x130

calls kmem_cache_create()

> [<c02887e0>] scsi_register+0x3c0/0x660

calls scsi_setup_command_freelist


> [<c02919a1>] get_pci_dev+0x31/0x50

?? probably stale

> [<c0291df2>] port_detect+0x3c2/0xe50

Do you have an eata scsi controller?

Ugs.
eata2x_detect():
* spin_lock_irqsave();
* calls port_detect();
* * spin_unlock();
* * scsi_register.

Eata maintainers: Is that necessary?
Why do the interrupts remain disabled across scsi_register?
Is that a bug workaround, or an oversight?
I'd use

	spin_unlock_irq();
	scsi_register();
	spin_lock_irq();

--
	Manfred

^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2003-02-14  0:27 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-02-12 10:08 eata irq abuse (was: Re: Linux 2.5.60) Ballabio_Dario
2003-02-12 15:28 ` Jeff Garzik
2003-02-12 16:03   ` Jeff Garzik
2003-02-12 19:11     ` Suresh Kr N
2003-02-12 20:18       ` Adding a new FC disk to a linux host Suresh Kr N
2003-02-12 23:34         ` Steven Dake
2003-02-13 17:31           ` Suresh Kr N
2003-02-13 19:01             ` Suresh Kr N
2003-02-13 20:22               ` Steven Dake
2003-02-14  0:27               ` Bryan Henderson
2003-02-13 20:23             ` Steven Dake
  -- strict thread matches above, loose matches on Subject: below --
2003-02-12 15:37 eata irq abuse (was: Re: Linux 2.5.60) Ballabio_Dario
2003-02-12 14:13 Ballabio_Dario
2003-02-12 14:25 ` Christoph Hellwig
2003-02-12 14:40   ` James Bottomley
2003-02-12 14:51     ` Christoph Hellwig
2003-02-12 14:54       ` James Bottomley
2003-02-12 12:47 Ballabio_Dario
2003-02-12 13:17 ` Christoph Hellwig
2003-02-11 17:45 Manfred Spraul
2003-02-11 23:01 ` Zephaniah E. Hull

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox