Re: [announce, patch, RFC] "big IRQ lock" removal, IRQ cleanups.

Ingo Molnar
2002-07-21T21:15:14Z

Martin,

On Sat, 20 Jul 2002, Marcin Dalecki wrote:

> Well I would like to allow myself to allow a tad bit of advocacy for
> this step.

the attached patch was a quick hack to get rid of the global cli() from
drivers/ide/main.c - but it's obviously broken and i'd like to fix it.

how can this be done cleanly - should we do a:

synchronize_irq(drive->channel->irq);

before unregistering the driver?

this might not even be necessery i believe, since the implicit (?)
free_irq() synchronizes with all pending instances of that interrupt
source.

is there something else i'm missing, something else we need to synchronize
with - perhaps the timers?

Ingo

--- linux/drivers/ide/main.c.orig Sun Jul 21 20:37:12 2002
+++ linux/drivers/ide/main.c Sun Jul 21 21:06:28 2002
@@ -1091,18 +1091,18 @@
{
unsigned long flags;

- save_flags(flags); /* all CPUs */
- cli(); /* all CPUs */
+ __save_flags(flags); // FIXME: is this safe?
+ __cli();

#if 0
if (__MOD_IN_USE(ata_ops(drive)->owner)) {
- restore_flags(flags);
+ __restore_flags(flags); // FIXME: is this safe?
return 1;
}
#endif

if (drive->usage || drive->busy || !ata_ops(drive)) {
- restore_flags(flags); /* all CPUs */
+ __restore_flags(flags); // FIXME: is this safe?
return 1;
}

@@ -1111,7 +1111,7 @@
#endif
drive->driver = NULL;

- restore_flags(flags); /* all CPUs */
+ __restore_flags(flags); // FIXME: is this safe?

return 0;
}