I've been running a dpb build for hours and I've not seen problems. On Wed, Jan 29, 2014 at 11:06:40AM +0100, Mark Kettenis wrote: > Here is a diff that makes mutexes raise their ipl to the highest level > that has interrupts that take the kernel lock. This is necessary for > the work dlg@ has been doing on making subsystems run without the > kernel lock. > > This needs to be tested on an MP system, and unfortunately that's > something I cannot do. > > > Index: include/mutex.h > =================================================================== > RCS file: /cvs/src/sys/arch/hppa/include/mutex.h,v > retrieving revision 1.4 > diff -u -p -r1.4 mutex.h > --- include/mutex.h 10 Jan 2010 04:07:18 -0000 1.4 > +++ include/mutex.h 29 Jan 2014 10:01:52 -0000 > @@ -39,9 +39,24 @@ struct mutex { > void *mtx_owner; > }; > > -void mtx_init(struct mutex *, int); > +/* > + * To prevent lock ordering problems with the kernel lock, we need to > + * make sure we block all interrupts that can grab the kernel lock. > + * The simplest way to achieve this is to make sure mutexes always > + * raise the interrupt priority level to the highest level that has > + * interrupts that grab the kernel lock. > + */ > +#ifdef MULTIPROCESSOR > +#define __MUTEX_IPL(ipl) \ > + (((ipl) > IPL_NONE && (ipl) < IPL_AUDIO) ? IPL_AUDIO : (ipl)) > +#else > +#define __MUTEX_IPL(ipl) (ipl) > +#endif > > -#define MUTEX_INITIALIZER(ipl) { MUTEX_UNLOCKED, (ipl), 0, NULL } > +#define MUTEX_INITIALIZER(ipl) { MUTEX_UNLOCKED, __MUTEX_IPL((ipl)), 0, NULL > } > + > +void __mtx_init(struct mutex *, int); > +#define mtx_init(mtx, ipl) __mtx_init((mtx), __MUTEX_IPL((ipl))) > > #ifdef DIAGNOSTIC > #define MUTEX_ASSERT_LOCKED(mtx) do { > \ > Index: hppa/mutex.c > =================================================================== > RCS file: /cvs/src/sys/arch/hppa/hppa/mutex.c,v > retrieving revision 1.11 > diff -u -p -r1.11 mutex.c > --- hppa/mutex.c 20 Apr 2011 16:10:53 -0000 1.11 > +++ hppa/mutex.c 29 Jan 2014 10:01:52 -0000 > @@ -50,7 +50,7 @@ try_lock(struct mutex *mtx) > } > > void > -mtx_init(struct mutex *mtx, int wantipl) > +__mtx_init(struct mutex *mtx, int wantipl) > { > mtx->mtx_lock[0] = 1; > mtx->mtx_lock[1] = 1; >
-- Juan Francisco Cantero Hurtado http://juanfra.info