Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 8 Feb 2001 22:21:32 +0100
From:      Bernd Walter <ticso@cicely5.cicely.de>
To:        freebsd-current@FreeBSD.ORG
Subject:   Re: atomic_ question
Message-ID:  <20010208222131.D81067@cicely5.cicely.de>
In-Reply-To: <20010209075749.Z90937@gsmx07.alcatel.com.au>; from peter.jeremy@alcatel.com.au on Fri, Feb 09, 2001 at 07:57:50AM %2B1100
References:  <20010208182106.B80741@cicely5.cicely.de> <20010209075749.Z90937@gsmx07.alcatel.com.au>

next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, Feb 09, 2001 at 07:57:50AM +1100, Peter Jeremy wrote:
> On 2001-Feb-08 18:21:07 +0100, Bernd Walter <ticso@cicely5.cicely.de> wrote:
> >Are atomic_* implementations allowed to spin/sleep?
> 
> The atomic_* operations are the primitives used to build all the
> higher level locking functions.  Therefore you are not allowed to
> sleep.
> 
> As for spinning: You can't implement them using a `normal' spinlock.
> Some architectures, eg the Alpha, don't have RMW primitives.  The
> Alpha has load-locked and store-conditional instructions which let you
> build atomic operations - you need to spin between the load and store
> if the store fails.  The store will only fail if you took an interrupt
> between the load and store or if another master updated the location
> between your load and store.  Look into /sys/alpha/alpha/atomic.s for
> code.

The alpha way of doing it is very similar to sparcv9.
But the alpha code and the code neccesary for sparcv9 has a difference
compared to normal spinning.
If you get interrupted the interupt code can modify the same value
without getting blocked while the interrupted code simply needs another
cycle.

On sparcv8 you don't have an operation doing conditionaly stores and
you don't have RMW operations.
The only way to do is to have a global lock variable on which you spin
until the current client finishes.
That means you can't use them in interrupt code!
I saw that some implementations for atomic code for sparcv8 disables
interrupts before fetching the lock to suround this problem.

Do we grant usuage of the atomic functions in interrupt code?
If yes there is a need to disable interrupts!
I'm not talking about interrupt threads.

-- 
B.Walter              COSMO-Project         http://www.cosmo-project.de
ticso@cicely.de         Usergroup           info@cosmo-project.de



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




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