[U-Boot] [PATCH 0/9] Fixup set_bit/clear_bit definition and usage

Bryan O'Donoghue pure.logic at nexus-software.ie
Mon Apr 30 10:36:54 UTC 2018


On 28/04/18 00:38, Bin Meng wrote:
> Hi Bryan,
> 
> On Fri, Apr 27, 2018 at 11:08 PM, Bryan O'Donoghue
> <pure.logic at nexus-software.ie> wrote:
>> Following on from a discussion with Marek and Lukasz re: a namespace
>> collision with set_bit and clear_bit in f_mass_storage, I noticed some
>> inconsistencies in the definition and usage of PLATFORM__SET_BIT and
>> PLATFORM__CLEAR_BIT as well as a similar use of __set_bit in the composite
>> USB gadget driver.
>>
>> __set_bit is lock-prefixed on x86 whereas set_bit is not and the analog
>> driver in upstream Linux does set_bit() not __set_bit().
>>
> 
> I am confused. So this changes enables x86's own __set_bit which is
> lock-prefixed.

No sorry Bin,

It's the other way around.

Let me reword this for you..

/**
  * set_bit - Atomically set a bit in memory
  * @nr: the bit to set
  * @addr: the address to start counting from
  *
  * This function is atomic and may not be reordered.  See __set_bit()
  * if you do not require the atomic guarantees.
  * Note that @nr may be almost arbitrarily large; this function is not
  * restricted to acting on a single-word quantity.
  */
static __inline__ void set_bit(int nr, volatile void * addr)
{
         __asm__ __volatile__( LOCK_PREFIX
                 "btsl %1,%0"
                 :"=m" (ADDR)
                 :"Ir" (nr));
}

/**
  * __set_bit - Set a bit in memory
  * @nr: the bit to set
  * @addr: the address to start counting from
  *
  * Unlike set_bit(), this function is non-atomic and may be reordered.
  * If it's called on the same region of memory simultaneously, the effect
  * may be that only one operation succeeds.
  */
static __inline__ void __set_bit(int nr, volatile void * addr)
{
         __asm__(
                 "btsl %1,%0"
                 :"=m" (ADDR)
                 :"Ir" (nr));
}



More information about the U-Boot mailing list