register_irq()/free_irq() problem [Kernel 2.0.34/SCSI/AIC7xxx]

strohm@quijote.mpi-stuttgart.mpg.de
Wed, 9 Jun 1999 14:30:52 +0100


[Kernel 2.0.34/SCSI/AIC7xxx]

I have a problem with a SCSI driver (aic7xxx, but this may be a problem
related to the generic SCSI layer). I can install this module and use it.
It works perfectly. When I try to remove it (rmmod), I get the message
'Trying to free free IRQ...'. If then I 'cat /proc/interrupts', I get an
Oops.

The reason is (IMHO) that the IRQ gets registered in
aic7xxx.c:aic7xxx_register() with a dev_id parameter which corresponds to
the struct aic7xxx_host of the device (and, in particular, is not NULL).
When closing the device, the IRQ is tried to be freed, but this time by the
scsi layer in scsi.c:scsi_unregister_host(). This does free_irq(something,
NULL), which clearly fails (dev_id!=NULL). The module, however, cannot
notice this because free_irq does not return an error (void
free_irq(blabla)). It is removed from the kernel and the struct irqaction
remains in the kernel. If I 'cat /proc/interrupts', I get an Oops, because
irq_action[irq]->name points to a free page :-).

I did not find a patch so far. Does anyone have an idea?

Regards,
Thomas.

PS: Please 'CC' me, because I'm not subscribed to the mailing list...

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/