--- net/core/link_watch.c.old 2003-12-26 20:38:25.000000000 +0100 +++ net/core/link_watch.c 2004-01-30 20:07:57.000000000 +0100 @@ -84,6 +84,8 @@ static void linkwatch_event(void *dummy) { + if (rtnl_shlock_nowait()) goto out_err1; + if (rtnl_exlock_nowait()) goto out_err2; /* Limit the number of linkwatch events to one * per second so that a runaway driver does not * cause a storm of messages on the netlink @@ -92,11 +94,16 @@ linkwatch_nextevent = jiffies + HZ; clear_bit(LW_RUNNING, &linkwatch_flags); - rtnl_shlock(); - rtnl_exlock(); linkwatch_run_queue(); rtnl_exunlock(); rtnl_shunlock(); + + return; + +out_err2: + rtnl_shunlock(); +out_err1: + schedule_delayed_work(&linkwatch_work, HZ / 10); }