mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 04:33:26 +02:00
cpumask: Implement cpumask_or_equal()
The IPI code of x86 needs to evaluate whether the target cpumask is equal to the cpu_online_mask or equal except for the calling CPU. To replace the current implementation which requires the usage of a temporary cpumask, which might involve allocations, add a new function which compares a cpumask to the result of two other cpumasks which are or'ed together before comparison. This allows to make the required decision in one go and the calling code then can check for the calling CPU being set in the target mask with cpumask_test_cpu(). Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://lkml.kernel.org/r/20190722105220.585449120@linutronix.de
This commit is contained in:
20
lib/bitmap.c
20
lib/bitmap.c
@@ -59,6 +59,26 @@ int __bitmap_equal(const unsigned long *bitmap1,
|
||||
}
|
||||
EXPORT_SYMBOL(__bitmap_equal);
|
||||
|
||||
bool __bitmap_or_equal(const unsigned long *bitmap1,
|
||||
const unsigned long *bitmap2,
|
||||
const unsigned long *bitmap3,
|
||||
unsigned int bits)
|
||||
{
|
||||
unsigned int k, lim = bits / BITS_PER_LONG;
|
||||
unsigned long tmp;
|
||||
|
||||
for (k = 0; k < lim; ++k) {
|
||||
if ((bitmap1[k] | bitmap2[k]) != bitmap3[k])
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!(bits % BITS_PER_LONG))
|
||||
return true;
|
||||
|
||||
tmp = (bitmap1[k] | bitmap2[k]) ^ bitmap3[k];
|
||||
return (tmp & BITMAP_LAST_WORD_MASK(bits)) == 0;
|
||||
}
|
||||
|
||||
void __bitmap_complement(unsigned long *dst, const unsigned long *src, unsigned int bits)
|
||||
{
|
||||
unsigned int k, lim = BITS_TO_LONGS(bits);
|
||||
|
Reference in New Issue
Block a user