Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 30 Sep 2009 19:40:51 +0000 (UTC)
From:      Zachary Loafman <zml@FreeBSD.org>
To:        cvs-src-old@freebsd.org
Subject:   cvs commit: src/sys/kern sched_ule.c
Message-ID:  <200909301941.n8UJfDS5069574@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
zml         2009-09-30 19:40:51 UTC

  FreeBSD src repository

  Modified files:        (Branch: RELENG_7)
    sys/kern             sched_ule.c 
  Log:
  SVN rev 197652 on 2009-09-30 19:40:51Z by zml
  
  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)
  
  Revision    Changes    Path
  1.214.2.10  +4 -1      src/sys/kern/sched_ule.c



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200909301941.n8UJfDS5069574>