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

David S. Miller
2005-12-16T22:53:06Z

From: Linus Torvalds <torvalds@osdl.org>
Date: Fri, 16 Dec 2005 14:38:47 -0800 (PST)

> A number of architectures have a "prefetch for write ownership"
> instruction that you can use for this. Exactly because "ld+cas" should
> not get a shared line initially.
>
> I though sparc had an ASI to do the same? No?

No, no special ASI exists to do that, although it would be nice. :-)
I'd have to use a prefetch for write.

BTW, it is interesting that you can use CAS to get a cache line into
the local processor in Owned state with %100 certainty (unlike
prefetch for write which might get cancelled) by doing something like:

CAS [MEM], ZERO, ZERO

and you can do this to any valid memory address without changing the
contents. This is useful for doing things like resetting parity bits
while doing memory error recorvery.

> It would seem to be the obvious thing to do for better lock performance,
> and I'd assume that locks are some of the most common cases of real cache
> interactions, so maybe the shared case only effectively happens if two
> CPU's are reading at the same time.
>
> Somebody who looks at cache protocol diagrams could check. I'm too lazy.

For both MOESI and MOSI cache coherency protocols, misses on loads
result in a Shared state cache line when another processor has the
data in it's cache too, regardless of whether that line in the other
cpu is dirty or not.

When the write comes along, the next transaction occurs to kick it
out the other cpu(s) caches and then the local line is placed into
Owned state.

I'll have to add "put write prefetch in CAS sequences" onto my sparc64
TODO list :-)