From: Tejun Heo Date: Sun, 12 Dec 2010 15:45:14 +0000 (+0100) Subject: sungem: update gp->reset_task flushing X-Git-Tag: v2.6.38-rc1~476^2~200 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=fe8998c5e3b173f3d5c450bbde6173e7fbe5158d;p=platform%2Fkernel%2Flinux-3.10.git sungem: update gp->reset_task flushing 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 Cc: "David S. Miller" Cc: netdev@vger.kernel.org --- diff --git a/drivers/net/sungem.c b/drivers/net/sungem.c index 4ceb3cf..9e992ca 100644 --- a/drivers/net/sungem.c +++ b/drivers/net/sungem.c @@ -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);