Subject: re: kern/34895: panic: sched_lock: locked
To: None <gnats-bugs@NetBSD.org>
From: matthew green <mrg@eterna.com.au>
List: netbsd-bugs
Date: 10/26/2006 15:13:15
please try the following patch.  i have not yet had a chance to
properly test it but it should help (and includes a change that
i had included in earlier tests.)


.mrg.


Index: kern_sig.c
===================================================================
RCS file: /cvsroot/src/sys/kern/kern_sig.c,v
retrieving revision 1.231
diff -p -r1.231 kern_sig.c
*** kern_sig.c	22 Oct 2006 20:48:45 -0000	1.231
--- kern_sig.c	26 Oct 2006 05:10:45 -0000
*************** kpsignal2(struct proc *p, const ksiginfo
*** 1153,1172 ****
  	}
  
  	/*
! 	 * Allocate a ksiginfo_t incase we need to insert it with
! 	 * the scheduler lock held.
  	 */
! 	newkp = pool_get(&ksiginfo_pool, PR_NOWAIT);
! 	if (newkp == NULL) {
  #ifdef DIAGNOSTIC
! 		printf("kpsignal2: couldn't allocated from ksiginfo_pool\n");
  #endif
! 		return;
  	}
  
  	/* XXXSMP: works, but icky */
  	if (dolock)
  		SCHED_LOCK(s);
  
  	if (p->p_flag & P_SA) {
  		allsusp = 0;
--- 1153,1176 ----
  	}
  
  	/*
! 	 * Allocate a ksiginfo_t incase we need to insert it with the
! 	 * scheduler lock held, but only if this ksiginfo_t isn't empty.
  	 */
! 	if (dolock && !KSI_EMPTY_P(ksi)) {
! 		newkp = pool_get(&ksiginfo_pool, PR_NOWAIT);
! 		if (newkp == NULL) {
  #ifdef DIAGNOSTIC
! 			printf("kpsignal2: couldn't allocated from ksiginfo_pool\n");
  #endif
! 			return;
! 		}
  	}
  
  	/* XXXSMP: works, but icky */
  	if (dolock)
  		SCHED_LOCK(s);
+ 	else
+ 		newkp = NULL;
  
  	if (p->p_flag & P_SA) {
  		allsusp = 0;