ixgbe: only process one ixgbe_watchdog_task at a time.
authorJohn Fastabend <john.r.fastabend@intel.com>
Wed, 3 Feb 2010 14:23:32 +0000 (14:23 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 4 Feb 2010 03:39:56 +0000 (19:39 -0800)
commit10eec95569513206877769ad9336591c08015cfe
treec372678363eb4d192a138fa11d2abf08a10b1897
parent9c119ba54c0fcae72881948af3d37b47a2f8e1f9
ixgbe: only process one ixgbe_watchdog_task at a time.

Processing multiple ixgbe_watchdog_task calls may cause
the link_up variable and IXGBE_FLAG_NEED_LINK_UPDATE flag
to be set incorrectly.  In the worse case this is causing
the netif_carrier_off to be called inappropriately which
results in an interface that can't be brought up.

Although schedule_work() will only schedule the task if
it is not already on the work queue the WORK_STRUCT_PENDING
bits are cleared just before calling the work function.
This allows WORK_STRUCT_PENDING to be cleared, the work
function to start and meanwhile schedule another task.

This patch adds a mutex to the watchdog task. This bug is
actualized by changing DCB settings or doing extended
cable pull or reset tests.

Signed-off-by: John Fastabend <john.r.fastabend@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ixgbe/ixgbe.h
drivers/net/ixgbe/ixgbe_main.c