[PATCH 1/3] x86/sbm: Fix domain shift calculation and sbm_find_next_bit()

From: Chen Yu

Date: Sun May 10 2026 - 12:11:25 EST


---
arch/x86/kernel/cpu/topology.c | 2 +-
include/linux/sbm.h | 2 +-
lib/sbm.c | 6 +++---
3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/arch/x86/kernel/cpu/topology.c b/arch/x86/kernel/cpu/topology.c
index 6f3d18288600..751b7517f2d5 100644
--- a/arch/x86/kernel/cpu/topology.c
+++ b/arch/x86/kernel/cpu/topology.c
@@ -565,7 +565,7 @@ void __init topology_init_possible_cpus(void)
for_each_possible_cpu(cpu)
apicid = max(apicid, cpuid_to_apicid[cpu]);

- arch_sbm_shift = x86_topo_system.dom_shifts[TOPO_DIE_DOMAIN] - 1;
+ arch_sbm_shift = x86_topo_system.dom_shifts[TOPO_DIE_DOMAIN - 1];
arch_sbm_leafs = 1 + (apicid >> arch_sbm_shift);
arch_sbm_mask = (1 << arch_sbm_shift) - 1;
arch_sbm_bits = arch_sbm_shift;
diff --git a/include/linux/sbm.h b/include/linux/sbm.h
index 8beade6c0585..a25a96366694 100644
--- a/include/linux/sbm.h
+++ b/include/linux/sbm.h
@@ -36,7 +36,7 @@ struct sbm {
};

extern struct sbm *sbm_alloc(void);
-extern unsigned int sbm_find_next_bit(struct sbm *sbm, int start);
+extern int sbm_find_next_bit(struct sbm *sbm, int start);

#define __sbm_op(sbm, func) \
({ \
diff --git a/lib/sbm.c b/lib/sbm.c
index 167cf857cd32..8006f9b04b62 100644
--- a/lib/sbm.c
+++ b/lib/sbm.c
@@ -34,7 +34,7 @@ struct sbm *sbm_alloc(void)
return NULL;
}

-unsigned int sbm_find_next_bit(struct sbm *sbm, int start)
+int sbm_find_next_bit(struct sbm *sbm, int start)
{
struct sbm_leaf *leaf = (void *)sbm;
struct sbm_root *root = (void *)sbm;
@@ -45,8 +45,8 @@ unsigned int sbm_find_next_bit(struct sbm *sbm, int start)
for (; nr < arch_sbm_leafs; nr++, mask = ~0UL) {
leaf = root->leafs[nr];
tmp = leaf->bitmap & mask;
- if (!tmp)
- continue;
+ if (tmp)
+ break;
}
} else {
tmp = leaf->bitmap & mask;
--
2.25.1