Ian Campbell [off-list ref] wrote:
On Tue, 2004-11-23 at 15:31 -0800, Andrew Morton wrote:
> One possible fix would be to remove that flush_scheduled_work() and to do
> refcounting around smc_phy_configure(): dev_hold() when scheduling the work
> (if schedule_work() returned true), dev_put() in the handler.
Something like the following?
I think so.
+static void smc_phy_configure_wq(void *data)
+{
+ struct net_device *dev = data;
+ dev_put(dev);
+ smc_phy_configure(data);
+}
You'd want to do the dev_put() after the smc_phy_configure() though. It
may still be a tiny bit racy against module unload.