Files
linux-apfs/include/linux
Maciej W. Rozycki 0ac4952731 PHYLIB: IRQ event workqueue handling fixes
Keep track of disable_irq_nosync() invocations and call enable_irq() the
right number of times if work has been cancelled that would include them.

Now that the call to flush_work_keventd() (problematic because of
rtnl_mutex being held) has been replaced by cancel_work_sync() another
issue has arisen and been left unresolved.  As the MDIO bus cannot be
accessed from the interrupt context the PHY interrupt handler uses
disable_irq_nosync() to prevent from looping and schedules some work to be
done as a softirq, which, apart from handling the state change of the
originating PHY, is responsible for reenabling the interrupt.  Now if the
interrupt line is shared by another device and a call to the softirq
handler has been cancelled, that call to enable_irq() never happens and the
other device cannot use its interrupt anymore as its stuck disabled.

I decided to use a counter rather than a flag because there may be more
than one call to phy_change() cancelled in the queue -- a real one and a
fake one triggered by free_irq() if DEBUG_SHIRQ is used, if nothing else.
Therefore because of its nesting property enable_irq() has to be called the
right number of times to match the number disable_irq_nosync() was called
and restore the original state.  This DEBUG_SHIRQ feature is also the
reason why free_irq() has to be called before cancel_work_sync().

While at it I updated the comment about phy_stop_interrupts() being called
from `keventd' -- this is no longer relevant as the use of
cancel_work_sync() makes such an approach unnecessary.  OTOH a similar
comment referring to flush_scheduled_work() in phy_stop() still applies as
using cancel_work_sync() there would be dangerous.

Checked with checkpatch.pl and at the run time (with and without
DEBUG_SHIRQ).

Signed-off-by: Maciej W. Rozycki <macro@linux-mips.org>
Cc: Andy Fleming <afleming@freescale.com>
Cc: Jeff Garzik <jgarzik@pobox.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
2007-10-10 16:53:55 -07:00
..
2007-07-12 15:41:24 -07:00
2007-07-26 01:53:39 +02:00
2007-07-19 10:04:52 -07:00
2007-07-31 15:39:44 -07:00
2007-10-10 16:53:11 -07:00
2007-09-11 04:22:16 -07:00
2007-07-19 10:04:43 -07:00
2007-10-10 16:51:59 -07:00
2007-10-10 16:49:02 -07:00
2007-07-19 10:04:45 -07:00
2007-08-11 22:34:48 +02:00
2007-07-31 10:43:05 -05:00
2007-07-10 17:18:59 -07:00
2007-07-16 09:05:46 -07:00
2007-07-17 10:23:04 -07:00
2007-10-10 16:52:43 -07:00
2007-07-09 08:22:54 +01:00
2007-07-09 08:23:17 +01:00
2007-07-11 16:09:00 -07:00
2007-07-19 10:04:54 -07:00
2007-07-12 10:55:56 -07:00
2007-07-17 10:23:06 -07:00
2007-06-01 08:18:29 -07:00
2007-07-16 09:05:52 -07:00
2007-07-16 09:05:52 -07:00
2007-07-18 09:15:20 -04:00
2007-07-18 09:15:20 -04:00
2007-07-17 10:23:13 -07:00
2007-07-16 09:05:45 -07:00
2007-07-18 18:29:37 -04:00
2007-07-16 09:05:41 -07:00
2007-06-18 09:48:41 -07:00
2007-07-17 10:22:59 -07:00
2007-07-10 00:35:17 -04:00
2007-07-09 18:51:58 +02:00
2007-07-19 10:04:41 -07:00
2007-07-31 15:39:41 -07:00
2007-07-16 09:05:34 -07:00
2007-10-10 16:51:59 -07:00
2007-07-14 18:55:06 -07:00
2007-10-10 16:52:04 -07:00
2007-08-11 15:58:13 -07:00
2007-07-16 09:05:50 -07:00
2007-07-16 09:05:47 -07:00
2007-07-31 15:39:41 -07:00
2007-08-26 18:35:34 -07:00
2007-09-11 17:21:20 -07:00
2007-09-04 23:16:04 -04:00
2007-07-18 08:47:40 -07:00
2007-07-30 14:25:12 -07:00
2007-09-11 22:24:45 +01:00
2007-07-17 10:23:03 -07:00
2007-07-17 10:23:13 -07:00
2007-07-19 10:04:49 -07:00
2007-05-18 20:46:30 -07:00
2007-07-24 12:24:59 -07:00
2007-07-16 09:05:34 -07:00
2007-07-18 08:47:45 -07:00
2007-07-16 09:05:42 -07:00
2007-07-19 10:04:45 -07:00
2007-07-16 09:05:51 -07:00
2007-07-20 13:41:56 +10:00
2007-07-20 13:10:22 +10:00
2007-10-10 16:51:34 -07:00
2007-07-26 11:35:21 -07:00
2007-07-26 11:35:21 -07:00
2007-07-16 09:05:50 -07:00
2007-07-16 09:05:46 -07:00
2007-07-17 10:23:03 -07:00
2007-07-18 08:47:40 -07:00
2007-07-21 18:37:10 -07:00
2007-05-17 05:23:06 -07:00
2007-07-16 09:05:50 -07:00
2007-07-22 11:03:37 -07:00
2007-09-20 13:19:59 -07:00
2007-09-16 16:21:16 -07:00
2007-07-20 12:33:44 -07:00
2007-05-21 21:47:27 -07:00
2007-07-16 09:05:45 -07:00
2007-07-16 09:05:46 -07:00
2007-07-19 10:04:49 -07:00
2007-07-16 09:05:40 -07:00
2007-07-18 08:47:40 -07:00
2007-07-17 10:22:59 -07:00
2007-07-31 15:39:39 -07:00
2007-05-11 08:29:36 -07:00
2007-07-20 11:23:02 -07:00
2007-08-11 15:47:41 -07:00
2007-07-18 15:57:15 -07:00
2007-07-30 13:27:44 -07:00
2007-09-19 11:24:18 -07:00
2007-07-17 10:22:59 -07:00
2007-07-09 18:52:01 +02:00