Re: [patch] spinlocks: remove 'volatile'

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

 



On Sat, 8 Jul 2006, J.A. Magallón wrote:

#include <stdint.h>

//volatile
uint32_t spinvar = 1;
uint32_t mtx;

void lock(uint32_t* l)
{
   *l = 1;
}

void unlock(uint32_t* l)
{
   *l = 0;
}

void spin()
{
   uint32_t local;

   for (;;)
   {
       lock(&mtx);
       local = spinvar;
       unlock(&mtx);
       if (!local)
           break;
   }
}

This is _totally_ incorrect. Your "lock" functions are broken, because they do not introduce syncronization points or locked bus operations. Due to this huge failure, the compiler and/or processor is free to re-order your loads and stores, resulting in totally unpredictable runtime behavior.

without the volatile:

spin:
   pushl   %ebp
   movl    spinvar, %eax
   movl    %esp, %ebp
   testl   %eax, %eax
   je  .L7
.L10:
   jmp .L10
.L7:
   movl    $0, mtx
   popl    %ebp
   ret

so the compiler did something like

  local = spinvar;
  if (local)
	for (;;);

(notice the dead lock/unlock inlined code elimination).

...which indicates that your code is wrong.

With the volatile, the code is correct:

spin:
   pushl   %ebp
   movl    %esp, %ebp
   .p2align 4,,7
.L7:
   movl    spinvar, %eax
   testl   %eax, %eax
   jne .L7
   movl    $0, mtx
   popl    %ebp
   ret

Actually, it's not. It's never setting "mtx" to 1, and it's certainly not doing any sync or locked ops.

So think about all you inlined spinlocks, mutexes and so on.

Yes, you got it wrong, and the current code gets it right. (Linus's patch of =m to +m, combined with -volatile, is best)

And if you do

void lock(volatile uint32_t* l)
...
void unlock(volatile uint32_t* l)
...

the code is even better:

spin:
   pushl   %ebp
   movl    %esp, %ebp
   .p2align 4,,7
.L7:
   movl    $1, mtx    <=========
   movl    spinvar, %eax
   movl    $0, mtx    <=========
   testl   %eax, %eax
   jne .L7
   popl    %ebp
   ret

NO! It's not better. You're still not syncing or locking the bus! If you refer to the fact that the "movl $1" has magically appeared, that's because you've just PAPERED OVER THE PROBLEM WITH "volatile", which is _exactly_ what Linus is telling you NOT TO DO.

So volatile just means 'dont trust this does not change even you don't see
why'.


No.

Thanks,
Chase

[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