Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 17 Mar 2008 07:42:13 -0400
From:      Michael Butler <imb@protected-networks.net>
To:        Lawrence Farr <freebsd-stable@epcdirect.co.uk>
Cc:        freebsd-stable@freebsd.org, 'John Baldwin' <jhb@freebsd.org>
Subject:   Re: bin/121684: dump frequently hangs
Message-ID:  <47DE5915.50703@protected-networks.net>
In-Reply-To: <01fc01c8881b$075b5620$16120260$@co.uk>
References:  <alpine.BSF.1.00.0803132341360.1080@nc8000.tharned.org>	<200803141546.10569.jhb@freebsd.org> <01fc01c8881b$075b5620$16120260$@co.uk>

next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------060704070308050902000203
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit

Lawrence Farr wrote:
> I couldn't get this to apply cleanly against 7, is it safe to use rev
> 1.48 on 7? I have 3 machines here that hang whilst dumping and I'd
> like to test the patch.

For RELENG_7, I'm using the attached. Apply it from /usr,

	Michael


--------------060704070308050902000203
Content-Type: text/x-patch;
 name="subr_sleepqueue.c.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="subr_sleepqueue.c.diff"

*** src/sys/kern/subr_sleepqueue.c.orig	Thu Mar  6 11:13:14 2008
--- src/sys/kern/subr_sleepqueue.c	Fri Mar 14 21:58:58 2008
***************
*** 403,414 ****
  		mtx_unlock(&ps->ps_mtx);
  	}
  	/*
! 	 * Lock sleepq chain before unlocking proc
! 	 * without this, we could lose a race.
  	 */
  	mtx_lock_spin(&sc->sc_lock);
  	PROC_UNLOCK(p);
  	thread_lock(td);
  	if (ret == 0) {
  		if (!(td->td_flags & TDF_INTERRUPT)) {
  			sleepq_switch(wchan);
--- 403,417 ----
  		mtx_unlock(&ps->ps_mtx);
  	}
  	/*
! 	 * Lock the per-process spinlock prior to dropping the PROC_LOCK
! 	 * to avoid a signal delivery race.  PROC_LOCK, PROC_SLOCK, and
! 	 * thread_lock() are currently held in tdsignal().
  	 */
+ 	PROC_SLOCK(p);
  	mtx_lock_spin(&sc->sc_lock);
  	PROC_UNLOCK(p);
  	thread_lock(td);
+ 	PROC_SUNLOCK(p);
  	if (ret == 0) {
  		if (!(td->td_flags & TDF_INTERRUPT)) {
  			sleepq_switch(wchan);

--------------060704070308050902000203--



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