sungem: update gp->reset_task flushing
authorTejun Heo <tj@kernel.org>
Sun, 12 Dec 2010 15:45:14 +0000 (16:45 +0100)
committerTejun Heo <tj@kernel.org>
Sun, 12 Dec 2010 15:45:14 +0000 (16:45 +0100)
gp->reset_task_pending is always set right before reset_task is
scheduled and as there is no synchronization between the setting and
scheduling, busy looping on reset_task_pending before flushing
reset_task doesn't really buy anything.

Directly flush gp->reset_task on suspend and cancel on detach.

Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: netdev@vger.kernel.org
drivers/net/sungem.c

index 4ceb3cf..9e992ca 100644 (file)
@@ -2380,10 +2380,8 @@ static int gem_suspend(struct pci_dev *pdev, pm_message_t state)
         */
        mutex_unlock(&gp->pm_mutex);
 
-       /* Wait for a pending reset task to complete */
-       while (gp->reset_task_pending)
-               yield();
-       flush_scheduled_work();
+       /* Wait for the pending reset task to complete */
+       flush_work_sync(&gp->reset_task);
 
        /* Shut the PHY down eventually and setup WOL */
        gem_stop_phy(gp, gp->asleep_wol);
@@ -2928,10 +2926,8 @@ static void gem_remove_one(struct pci_dev *pdev)
                /* We shouldn't need any locking here */
                gem_get_cell(gp);
 
-               /* Wait for a pending reset task to complete */
-               while (gp->reset_task_pending)
-                       yield();
-               flush_scheduled_work();
+               /* Cancel reset task */
+               cancel_work_sync(&gp->reset_task);
 
                /* Shut the PHY down */
                gem_stop_phy(gp, 0);