kernel/smp: Distinguish CPUSet::GetBit from GetBitAtomic.

I checked all invocations of GetBit; as far as I can tell,
only the two adjusted here in smp.cpp are done while the Set
may be concurrently modified, and even then I don't know
that they really need to be atomics, anyway.
This commit is contained in:
Augustin Cavalier
2026-03-09 20:58:54 -04:00
parent 97a65a027d
commit dd24eecac1
2 changed files with 11 additions and 2 deletions
+9
View File
@@ -54,6 +54,7 @@ public:
inline void ClearBitAtomic(int32 cpu); inline void ClearBitAtomic(int32 cpu);
inline bool GetBit(int32 cpu) const; inline bool GetBit(int32 cpu) const;
inline bool GetBitAtomic(int32 cpu) const;
inline bool Matches(const CPUSet& mask) const; inline bool Matches(const CPUSet& mask) const;
inline CPUSet And(const CPUSet& mask) const; inline CPUSet And(const CPUSet& mask) const;
@@ -161,6 +162,14 @@ CPUSet::ClearBitAtomic(int32 cpu)
inline bool inline bool
CPUSet::GetBit(int32 cpu) const CPUSet::GetBit(int32 cpu) const
{
int32* element = (int32*)&fBitmap[cpu / kArrayBits];
return ((uint32)*element & (1u << (cpu % kArrayBits))) != 0;
}
inline bool
CPUSet::GetBitAtomic(int32 cpu) const
{ {
int32* element = (int32*)&fBitmap[cpu / kArrayBits]; int32* element = (int32*)&fBitmap[cpu / kArrayBits];
return ((uint32)atomic_get(element) & (1u << (cpu % kArrayBits))) != 0; return ((uint32)atomic_get(element) & (1u << (cpu % kArrayBits))) != 0;
+2 -2
View File
@@ -760,7 +760,7 @@ check_for_message(int currentCPU, mailbox_source& sourceMailbox)
msg = sBroadcastMessages; msg = sBroadcastMessages;
while (msg != NULL) { while (msg != NULL) {
if (!msg->proc_bitmap.GetBit(currentCPU)) { if (!msg->proc_bitmap.GetBitAtomic(currentCPU)) {
// we have handled this one already // we have handled this one already
msg = msg->next; msg = msg->next;
continue; continue;
@@ -1260,7 +1260,7 @@ smp_trap_non_boot_cpus(int32 cpu, uint32* rendezVous)
smp_cpu_rendezvous(rendezVous); smp_cpu_rendezvous(rendezVous);
while (sBootCPUSpin == 0) { while (sBootCPUSpin == 0) {
if (sEarlyCPUCallSet.GetBit(cpu)) if (sEarlyCPUCallSet.GetBitAtomic(cpu))
process_early_cpu_call(cpu); process_early_cpu_call(cpu);
cpu_pause(); cpu_pause();