K 10 svn:author V 3 zml K 8 svn:date V 27 2009-09-30T19:40:51.118006Z K 7 svn:log V 1767 sched_ule in stable/7 has a bug (introduced in r180607) where a thread that is running often will appear to not be running much at all. sched_ule has a much less accurate mechanism for determining how much various threads are running. Every tick, hardclock_cpu() calls sched_tick(), and the currently running thread gets it's ts_ticks incremented. Whenever an event of interest happens to a thread, the ts_ticks value may be decayed; it's supposed to be a rough running average of the last 10 seconds. So there's a ts_ltick which is the last tick we looked at decaying ts_ticks. The increment in sched_tick() was slightly buggy on SMP, because a thread could get incremented on two different CPUs in the rare case where it was swapped from one which had run sched_tick() this tick to one which hadn't. The fix that was used relied on ts_ltick and only incremented ts_ticks if ts_ltick was not from the current tick. This is buggy, because any time the thread began running on a CPU in the current tick, we would have set ts_ltick to ticks, so if it was still running at sched_tick() we wouldn't increment. A system with a single process that hogs the CPU and is otherwise idle, therefore, would look like all threads were at 0%. The threads not running are really at 0%, and the hog is not getting its ts_ticks incremented since it went through some other runq stats that set ts_ltick. On a 2-way SMP the thread used to get shuffled regularly between CPUs (I think fallout from this bug), so it would appear a little over 50% busy. The fix is to use a separate variable to record when the last sched_tick() increment happened. Submitted by: Matthew Fleming (matthew.fleming at isilon.com) Reviewed by: zml, dfr Approved by: dfr (mentor) END