Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 31 May 2005 20:19:08 +0000
From:      Alexander Kabaev <kan@freebsd.org>
To:        Maksim Yevmenkin <maksim.yevmenkin@savvis.net>
Cc:        Norbert Koch <NKoch@demig.de>, freebsd-hackers@freebsd.org
Subject:   Re: mutual exclusion in vkbd
Message-ID:  <20050531201908.GA77068@freefall.freebsd.org>
In-Reply-To: <429C93AE.8060509@savvis.net>
References:  <000001c565f6$d46b7720$4801a8c0@ws-ew-3.W2KDEMIG> <429C93AE.8060509@savvis.net>

Next in thread | Previous in thread | Raw E-Mail | Index | Archive | Help
On Tue, May 31, 2005 at 09:41:18AM -0700, Maksim Yevmenkin wrote:
> Norbert,
> 
> >I am currently trying to backport vkbd to FreeBSD 4.
> 
> ok
> 
> >Maksim Yevmenkin uses mtx_lock()/mtx_unlock() for
> >protecting access to data structures under FreeBSD 5/6
> >between the device functions and the kernel thread.
> >
> >How should I best do this under FreeBSD 4?
> >
> >Would something like splhigh() work in that context?
> >Or should I use lockmgr with LK_EXCLUSIVE/LK_RELEASE?
> >Is there any (pseudo)process context inside a kernel task?
> 
> spltty() is what you probably need to use. you could just adjust the 
> following defines like
> 
> #define VKBD_LOCK_DECL		int
> #define VKBD_LOCK_INIT(s)	/* noop */
> #define VKBD_LOCK_DESTROY(s)	/* noop */	
> #define VKBD_LOCK(s)		(s)->ks_lock = spltty()
> #define VKBD_UNLOCK(s)		splx((s)->ks_lock)
> #define VKBD_LOCK_ASSERT(s, w)
> #define VKBD_SLEEP(s, f, d, t) \
> 	tsleep(&(s)->f, PCATCH | (PZERO + 1), d, t)
> 

The code above will probably crash the kernel in many spectacular and
unpredictable ways. You will need to save interrupt flags locally to each
VKBD_LOCK caller or they will end up restoring each other's flags.

--
Alexander Kabaev



Want to link to this message? Use this URL: <http://docs.FreeBSD.org/cgi/mid.cgi?20050531201908.GA77068>