On Fri, Nov 10, 2006 at 03:15:05PM +0900, Horms wrote:
>/ On Fri, Nov 10, 2006 at 02:54:20PM +1100, Dean Manners wrote:/
>/ > Horms,/
>/ > /
>/ > ip_vs_sync.c: /
>/ > 885: __set_current_state(TASK_UNINTERRUPTIBLE);/
>/ > 886: add_wait_queue(&stop_sync_wait, &wait);/
>/ > 887: set_stop_sync(state, 1);/
>/ > 888: ip_vs_sync_state -= state;/
>/ > 889: wake_up(&sync_wait);/
>/ > 890: schedule();/
>/ > 891: __set_current_state(TASK_RUNNING);/
>/ > 892: remove_wait_queue(&stop_sync_wait, &wait);/
>/ > /
>/ > Seems to have changed? Theres no "schedule_timeout(HZ);" throughout./
>/ /
>/ Actually, that is the shutdown code./
>/ /
>/ The problem is almost certainly caused inside sync_master_loop()/
>/ somewhere. Though it is using ssleep(), but perhaps its schemantics have/
>/ changed somehow.. I can readily reproduce the problem here. I will see/
Is there any chance you could test out the change below to see if it
helps. It seems to work on my end.
--
Horms
H: http://www.vergenet.net/~horms/ <http://www.vergenet.net/%7Ehorms/>
W: http://www.valinux.co.jp/en/
[IPVS] use msleep_interruptable() instead of ssleep() aka msleep()
Dean Manners notices that when an IPVS synchonisation daemons are
started the system load slowly climbs up to 1. This seems to be related
to the call to ssleep(1) (aka msleep(1000) in the main loop. Replacing
this with a call to msleep_interruptable() seems to make the problem go
away. Though I'm not sure that it is correct.
Cc: Dean Manners <deanm@xxxxxxxxxxxxx>
Signed-Off-By: Simon Horman <horms@xxxxxxxxxxxx>
Index: linux-2.6/net/ipv4/ipvs/ip_vs_sync.c
===================================================================
--- linux-2.6.orig/net/ipv4/ipvs/ip_vs_sync.c 2006-11-10 15:33:42.000000000
+0900
+++ linux-2.6/net/ipv4/ipvs/ip_vs_sync.c 2006-11-10 15:33:52.000000000
+0900
@@ -657,7 +657,7 @@
if (stop_master_sync)
break;
- ssleep(1);
+ msleep_interruptible(1000);
}
/* clean up the sync_buff queue */