Subject: Re: Lock benchmarks
To: None <tech-kern@netbsd.org>
From: Jason R Thorpe <thorpej@wasabisystems.com>
List: tech-kern
Date: 09/17/2002 22:44:39
On Tue, Sep 17, 2002 at 10:03:00AM +1200, Gregory McGarry wrote:

 > The assembler routines will be the ones used in the pthread library
 > if it is decided that RAS locks should be used by default on
 > uniprocessor machines.  I guess the jury is still out on that one.

I have some comments on the asm:

	1. In a RAS locking scheme, you only ever want to provide
	   or use the "lock_try" version.  This is because if the
	   lock is held, know either: (a) you need to context
	   switch, (b) you need to croak (deadlock).  If you spin
	   around, then you're just consuming cpu time, and might
	   deadlock if your threads aren't being timesliced against
	   each other.

	   You can assume these things because RAS is only used on
	   a uniprocessor.  This is also why RAS doesn't need to
	   do memory barrier ops (no other processor to notify, and
	   the compiler already sees a memory clobber because it
	   called a function).

	2. The critical section of most of them is longer than it
	   needs to be.  Case in point, the Alpha in your version:

LEAF(__ras_simple_lock, 1)
XLEAF(__ras_simple_lock_start, 1)
1:      ldl     t0, 0(a0)
        bne     t0, 1b
        ldi     t0, 1
        stl     t0, 0(a0)
XLEAF(__ras_simple_lock_end, 1)
        ret     zero, (ra), 1
END(__ras_simple_lock)

	   I'd probably write it like this (including the "lock_try" bit):

	.globl __ras_simple_lock_start
	.globl __ras_simple_lock_end

LEAF(__ras_simple_lock_try, 1)
	ldi	t1, __SIMPLELOCK_LOCKED
__ras_simple_lock_start:
	ldl	t0, 0(a0)
	bne	t0, 1f
	stl	t1, 0(a0)
__ras_simple_lock_end:
	ldi	v0, 1
	RET
1:
	mov	zero, v0
	RET
END(__ras_simple_lock_try)

-- 
        -- Jason R. Thorpe <thorpej@wasabisystems.com>