On 2/20/24 04:41, Wu, Jiaxin wrote:
>> From C11 "5.1.2.4 Multi-threaded executions and data races":
>>
>> - paragraph 4: "Two expression evaluations conflict if one of them
>> modifies a memory location and the other one reads or modifies the same
>> memory location."
>>
>> - paragraph 25: "The execution of a program contains a data race if it
>> contains two conflicting actions in different threads, at least one of
>> which is not atomic, and neither happens before the other. Any such data
>> race results in undefined behavior."
>>
>> In this case, the outer condition (which reads the volatile UINT32
>> object "mSmmMpSyncData->BspIndex") is one access. It is a read access,
>> and it is not atomic. The other access is the
>> InterlockedCompareExchange32(). It is a read-write access, and it is
>> atomic. There is no "happens before" relationship enforced between both
>> accesses.
>>
>> Therefore, this is a data race: the pre-check on one CPU conflicts with
>> the InterlockedCompareExchange32() on another CPU, the pre-check is not
>> atomic, and there is no happens-before between them.
>>
>> A data race means undefined behavior. In particular, if there is a data
>> race, then there are no guarantees of sequential consistency, so the
>> observable values in the object could be totally inexplicable.
>>
>
> I think here data race won't cause the undefined behavior:
>
> The read operation in one processor might see the 1) old value (MAX_UINT32)
> or 2) the new value (CpuIndex), but both behaviors are explicable:
>
> If case 1, that's ok continue do the lock comxchg since BspIndex hasn't been
> elected.
> If case 2, which means another processor has already atomic invalid or write
> the BspIndex, then existing processor absolutely can skip the lock comxchg.
>
> if (mSmmMpSyncData->BspIndex == MAX_UINT32) {
> InterlockedCompareExchange32 (
> (UINT32 *)&mSmmMpSyncData->BspIndex,
> MAX_UINT32,
> (UINT32)CpuIndex
> );
> }
>
>> If you consider PiSmmCpuDxeSmm's usage of "volatile" to be "atomic",
>> then that would remove the data race; but volatile is not necessarily
>> atomic.
>>
>
> I *never* do the assumption: "volatile" is "atomic".
> BspIndex is volatile, I think it only can ensure the compiler behavior, not
> processor itself:
> 1. Compiler will not optimize this variable. All reads and writes to this
> variable will be done directly to memory, not using cached values in
> registers. But it doesn't prevent the CPU from caching that variable in its
> own internal caches.
> 2. "volatile" can prevent the compiler from optimizing and reordering
> instructions, it can't prevent the processor from reordering instructions,
> and can't guarantee the atomicity of operations.
>
> For processor reordering, I think Ray explained that reordering won't happen.
>
>> Since you linked a wikipedia article, I'll link three articles that
>> describe a similar (nearly the same) technique called "double-checked
>> locking". In the general case, that technique is broken.
>>
>> http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.
>> html
>> https://en.wikipedia.org/wiki/Double-checked_locking
>> https://preshing.com/20130930/double-checked-locking-is-fixed-in-cpp11/
>>
>> It can be made work in bare-bones C, but it requires explicit fences /
>> memory barriers.
>
> Here, the case is different to the above three "Double-checked locking".
> Cache coherency can make sure the read value for check is only 2 cases as I
> explained above.
> The only possible impact is the AP behavior: AP won't pending on lock
> comxchg, while it will continue do the following code logic after if check:
> for example performs the APHandler. But it won't has the negative-impact
> since it has the timeout BSP check in APHandler. And even failure of that, we
> still has the error handling to sync out the existing AP due to don't know
> the BSP:
>
> SmmCpuSyncCheckOutCpu (mSmmMpSyncData->SyncContext, CpuIndex);
> return;
I don't have other objections; feel free to proceed.
Thanks
Laszlo
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#115660): https://edk2.groups.io/g/devel/message/115660
Mute This Topic: https://groups.io/mt/104094808/21656
Group Owner: [email protected]
Unsubscribe: https://edk2.groups.io/g/devel/unsub [[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-