cvs commit: src/sys/sys proc.h sleepqueue.h src/sys/kern kern_condvar.c kern_kse.c kern_sig.c kern_synch.c kern_thread.c subr_sleepqueue.c

David Xu davidxu at
Wed Feb 15 15:52:02 PST 2006

davidxu     2006-02-15 23:52:01 UTC

  FreeBSD src repository

  Modified files:
    sys/sys              proc.h sleepqueue.h 
    sys/kern             kern_condvar.c kern_kse.c kern_sig.c 
                         kern_synch.c kern_thread.c 
  Fix a long standing race between sleep queue and thread
  suspension code. When a thread A is going to sleep, it calls
  sleepq_catch_signals() to detect any pending signals or thread
  suspension request, if nothing happens, it returns without
  holding process lock or scheduler lock, this opens a race
  window which allows thread B to come in and do process
  suspension work, however since A is still at running state,
  thread B can do nothing to A, thread A continues, and puts
  itself into actually sleeping state, but B has never seen it,
  and it sits there forever until B is woken up by other threads
  sometimes later(this can be very long delay or never
  happen). Fix this bug by forcing sleepq_catch_signals to
  return with scheduler lock held.
  Fix sleepq_abort() by passing it an interrupted code, previously,
  it worked as wakeup_one(), and the interruption can not be
  identified correctly by sleep queue code when the sleeping
  thread is resumed.
  Let thread_suspend_check() returns EINTR or ERESTART, so sleep
  queue no longer has to use SIGSTOP as a hack to build a return
  Reviewed by:    jhb
  MFC after:      1 week
  Revision  Changes    Path
  1.54      +2 -9      src/sys/kern/kern_condvar.c
  1.222     +1 -1      src/sys/kern/kern_kse.c
  1.323     +11 -6     src/sys/kern/kern_sig.c
  1.276     +2 -8      src/sys/kern/kern_synch.c
  1.229     +4 -4      src/sys/kern/kern_thread.c
  1.24      +76 -81    src/sys/kern/subr_sleepqueue.c
  1.453     +1 -1      src/sys/sys/proc.h
  1.7       +2 -4      src/sys/sys/sleepqueue.h

More information about the cvs-src mailing list