Re: [PATCH 0/24] make atomic_read() behave consistently across allarchitectures

From: Linus Torvalds
Date: Thu Aug 16 2007 - 23:51:52 EST




On Fri, 17 Aug 2007, Nick Piggin wrote:
>
> I'm surprised too. Numbers were from the "...use asm() like the other
> atomic operations already do" thread. According to them,
>
> text data bss dec hex filename
> 3434150 249176 176128 3859454 3ae3fe atomic_normal/vmlinux
> 3436203 249176 176128 3861507 3aec03 atomic_volatile/vmlinux
>
> The first one is a stock kenel, the second is with atomic_read/set
> cast to volatile. gcc-4.1 -- maybe if you have an earlier gcc it
> won't optimise as much?

No, see my earlier reply. "volatile" really *is* an incredible piece of
crap.

Just try it yourself:

volatile int i;
int j;

int testme(void)
{
return i <= 1;
}

int testme2(void)
{
return j <= 1;
}

and compile with all the optimizations you can.

I get:

testme:
movl i(%rip), %eax
subl $1, %eax
setle %al
movzbl %al, %eax
ret

vs

testme2:
xorl %eax, %eax
cmpl $1, j(%rip)
setle %al
ret

(now, whether that "xorl + setle" is better than "setle + movzbl", I don't
really know - maybe it is. But that's not thepoint. The point is the
difference between

movl i(%rip), %eax
subl $1, %eax

and

cmpl $1, j(%rip)

and imagine this being done for *every* single volatile access.

Just do a

git grep atomic_read

to see how atomics are actually used. A lot of them are exactly the above
kind of "compare against a value".

Linus
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/