Re: [PATCH 1/19] MUTEX: Introduce simple mutex implementation

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Russell King <[email protected]> wrote:

> On Fri, Dec 16, 2005 at 08:46:44AM -0500, Linh Dang wrote:
>>
>> Russell King <[email protected]> wrote:
>>
>>> On Sat, Dec 17, 2005 at 12:01:27AM +1100, Nick Piggin wrote:
>>>> You were proposing a worse default, which is the reason I
>>>> suggested it.
>>>
>>> I'd like to qualify that.  "for architectures with native
>>> cmpxchg".
>>>
>>> For general consumption (not specifically related to mutex
>>> stuff)...
>>>
>>> For architectures with llsc, sequences stuch as:
>>>
>>> 	load
>>> 	modify
>>> 	cmpxchg
>>>
>>> are inefficient because they have to be implemented as:
>>>
>>> 	load
>>> 	modify
>>> 	load
>>> 	compare
>>> 	store conditional
>>>
>>
>> I dont know what arch u have in mind but for ppc it is:
>>
>> load-reserve
>> modify
>> store-conditional
>>
>> and NOT the sequence you show.
>
> Wrong - because you haven't understood what I'm getting at.  If
> you're using "cmpxchg" as the low level generic atomic operation (as
> in the atomic_cmpxchg() function) then atomic_cmpxchg _has_ to be
> implemented on llsc as:
>
> 	load (reserve if you need this detail)
> 	compare
> 	store conditional
>
> So, let's illustrate this.  Let's say you want to atomically
> multiply a value by N.
>
> 	do {
> 		old = atomic_read(&foo);
> 		new = old * N;
> 	} while(atomic_cmpxchg(&foo, old, new) != old);
>
> For an architecture supporting cmpxchg, this becomes:
>
> loop:	load foo => old
> 	new = old * N
> 	cmpxchg ret, old, new, foo
> 	compare ret & old
> 	if not equal goto loop
>
> And for architectures with llsc, this becomes:
>
> loop:	load foo => old
> 	new = old * N
> loop2:	load locked foo => ret
> 	compare ret & old
> 	if equal store conditional new in foo
> 		if store failed because we lost the lock, goto loop2
> 	compare ret & old
> 	if not equal goto loop
>
> Do you now see what I mean?  (yup, ARM is a llsc architecture.)

Well, it may be true for ARM but for ppc (i dunno what exactly llsc
means but someone in the thread put ppc in llsc group)  it's:

   loop:
        load-reserve foo => old
        new = old * N
        store-conditional new => foo
        if failed goto loop     
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux