From 1dde4c4b94881fd1b6087f2ab492de7ade257bd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Wed, 22 May 2024 13:48:01 +0200 Subject: [PATCH] kernel/smp: change CPUSet::SetBit() and CPUSet::ClearBit() bit order add CPUSet::And() and CPUSet::Matches(). Change-Id: I210c900527f6ee246916d5eb4547d8003c2bc631 Reviewed-on: https://review.haiku-os.org/c/haiku/+/7673 Reviewed-by: waddlesplash Tested-by: Commit checker robot Haiku-Format: Haiku-format Bot --- headers/private/kernel/smp.h | 49 ++++++++++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/headers/private/kernel/smp.h b/headers/private/kernel/smp.h index b6fec7ad5e..4736183d4a 100644 --- a/headers/private/kernel/smp.h +++ b/headers/private/kernel/smp.h @@ -55,10 +55,15 @@ public: inline bool GetBit(int32 cpu) const; + inline bool Matches(const CPUSet& mask) const; + inline CPUSet And(const CPUSet& mask) const; + inline bool IsEmpty() const; + inline uint32 Bits(uint32 index) const { return fBitmap[index];} private: - static const int kArraySize = ROUNDUP(SMP_MAX_CPUS, 32) / 32; + static const int kArrayBits = 32; + static const int kArraySize = ROUNDUP(SMP_MAX_CPUS, kArrayBits) / kArrayBits; uint32 fBitmap[kArraySize]; }; @@ -125,40 +130,62 @@ CPUSet::SetAll() inline void CPUSet::SetBit(int32 cpu) { - int32* element = (int32*)&fBitmap[cpu % kArraySize]; - *element |= 1u << (cpu / kArraySize); + int32* element = (int32*)&fBitmap[cpu / kArrayBits]; + *element |= 1u << (cpu % kArrayBits); } inline void CPUSet::ClearBit(int32 cpu) { - int32* element = (int32*)&fBitmap[cpu % kArraySize]; - *element &= ~uint32(1u << (cpu / kArraySize)); + int32* element = (int32*)&fBitmap[cpu / kArrayBits]; + *element &= ~uint32(1u << (cpu % kArrayBits)); } inline void CPUSet::SetBitAtomic(int32 cpu) { - int32* element = (int32*)&fBitmap[cpu % kArraySize]; - atomic_or(element, 1u << (cpu / kArraySize)); + int32* element = (int32*)&fBitmap[cpu / kArrayBits]; + atomic_or(element, 1u << (cpu % kArrayBits)); } inline void CPUSet::ClearBitAtomic(int32 cpu) { - int32* element = (int32*)&fBitmap[cpu % kArraySize]; - atomic_and(element, ~uint32(1u << (cpu / kArraySize))); + int32* element = (int32*)&fBitmap[cpu / kArrayBits]; + atomic_and(element, ~uint32(1u << (cpu % kArrayBits))); } inline bool CPUSet::GetBit(int32 cpu) const { - int32* element = (int32*)&fBitmap[cpu % kArraySize]; - return ((uint32)atomic_get(element) & (1u << (cpu / kArraySize))) != 0; + int32* element = (int32*)&fBitmap[cpu / kArrayBits]; + return ((uint32)atomic_get(element) & (1u << (cpu % kArrayBits))) != 0; +} + + +inline CPUSet +CPUSet::And(const CPUSet& mask) const +{ + CPUSet andSet; + for (int i = 0; i < kArraySize; i++) + andSet.fBitmap[i] = fBitmap[i] & mask.fBitmap[i]; + return andSet; +} + + +inline bool +CPUSet::Matches(const CPUSet& mask) const +{ + for (int i = 0; i < kArraySize; i++) { + if ((fBitmap[i] & mask.fBitmap[i]) != 0) + return true; + } + + return false; }