[PATCH RFC 06/15] arm_mpam: Fix cache ID sentinel from ~0UL to U32_MAX to match u32 return type
Yin Li <[email protected]>
| Newsgroups | dev.linux.lists.driver-core,org.kernel.vger.linux-arm-msm,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <20260811-mpam-resctrl-dt-knp-support-v1-6-ea6397bead59@oss.qualcomm.com> |
cache_of_calculate_id() returns u32, but callers stored the result in unsigned long variables and compared against ~0UL. On 64-bit systems, U32_MAX (0xffffffff) assigned to unsigned long becomes 0x00000000ffffffff, which does not equal ~0UL (0xffffffffffffffff), so invalid cache IDs are silently accepted instead of being rejected. Fix by changing all cache ID and component ID variables that receive the return value of cache_of_calculate_id() to u32, and replace all ~0 and ~0UL sentinel comparisons with U32_MAX. Also fix the sentinel values in cache_of_calculate_id() itself for consistency. Signed-off-by: Yin Li <[email protected]> --- drivers/base/cacheinfo.c | 6 +++--- drivers/resctrl/mpam_devices.c | 16 ++++++++-------- drivers/resctrl/mpam_internal.h | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/drivers/base/cacheinfo.c b/drivers/base/cacheinfo.c index f75e7f64038b..a4e0d1d47e71 100644 --- a/drivers/base/cacheinfo.c +++ b/drivers/base/cacheinfo.c @@ -229,7 +229,7 @@ static bool match_cache_node(struct device_node *cpu, u32 cache_of_calculate_id(struct device_node *cache_node) { struct device_node *cpu; - u32 min_id = ~0; + u32 min_id = U32_MAX; for_each_of_cpu_node(cpu) { u64 id = of_get_cpu_hwid(cpu, 0); @@ -237,7 +237,7 @@ u32 cache_of_calculate_id(struct device_node *cache_node) id = arch_compact_of_hwid(id); if (FIELD_GET(GENMASK_ULL(63, 32), id)) { of_node_put(cpu); - return ~0; + return U32_MAX; } if (match_cache_node(cpu, cache_node)) @@ -252,7 +252,7 @@ static void cache_of_set_id(struct cacheinfo *this_leaf, { u32 id = cache_of_calculate_id(cache_node); - if (id != ~0) { + if (id != U32_MAX) { this_leaf->id = id; this_leaf->attributes |= CACHE_ID; } diff --git a/drivers/resctrl/mpam_devices.c b/drivers/resctrl/mpam_devices.c index 559fa09128b4..ddc15249ec1e 100644 --- a/drivers/resctrl/mpam_devices.c +++ b/drivers/resctrl/mpam_devices.c @@ -166,13 +166,13 @@ static void mpam_free_garbage(void) /* Called recursively to walk the list of caches from a particular CPU */ static void __mpam_get_cpumask_from_cache_id(int cpu, struct device_node *cache_node, - unsigned long cache_id, + u32 cache_id, u32 cache_level, cpumask_t *affinity) { int err; u32 iter_level; - unsigned long iter_cache_id; + u32 iter_cache_id; struct device_node *iter_node __free(device_node) = of_find_next_cache_node(cache_node); if (!iter_node) @@ -187,7 +187,7 @@ static void __mpam_get_cpumask_from_cache_id(int cpu, struct device_node *cache_ * during device_initcall(). Use cache_of_calculate_id(). */ iter_cache_id = cache_of_calculate_id(iter_node); - if (iter_cache_id == ~0UL) + if (iter_cache_id == U32_MAX) return; if (iter_level == cache_level && iter_cache_id == cache_id) @@ -202,7 +202,7 @@ static void __mpam_get_cpumask_from_cache_id(int cpu, struct device_node *cache_ * The cacheinfo structures are only populated when CPUs are online. * This helper walks the device tree to include offline CPUs too. */ -int mpam_get_cpumask_from_cache_id(unsigned long cache_id, u32 cache_level, +int mpam_get_cpumask_from_cache_id(u32 cache_id, u32 cache_level, cpumask_t *affinity) { int cpu; @@ -229,7 +229,7 @@ static int get_cpumask_from_cache(struct device_node *cache, { int err; u32 cache_level; - unsigned long cache_id; + u32 cache_id; err = of_property_read_u32(cache, "cache-level", &cache_level); if (err) { @@ -238,7 +238,7 @@ static int get_cpumask_from_cache(struct device_node *cache, } cache_id = cache_of_calculate_id(cache); - if (cache_id == ~0UL) { + if (cache_id == U32_MAX) { pr_err("Failed to calculate cache-id from cache node\n"); return -ENOENT; } @@ -264,7 +264,7 @@ static int mpam_dt_parse_resource(struct mpam_msc *msc, struct device_node *np, { int err = 0; u32 class_id = 0; - unsigned long component_id = 0; + u32 component_id = 0; struct device *dev = &msc->pdev->dev; enum mpam_class_types type = MPAM_CLASS_UNKNOWN; struct device_node *cache __free(device_node) = NULL; @@ -308,7 +308,7 @@ static int mpam_dt_parse_resource(struct mpam_msc *msc, struct device_node *np, return err; } component_id = cache_of_calculate_id(cache); - if (component_id == ~0) { + if (component_id == U32_MAX) { dev_err_once(dev, "Failed to calculate cache-id\n"); return -ENOENT; } diff --git a/drivers/resctrl/mpam_internal.h b/drivers/resctrl/mpam_internal.h index def0e3a65c23..aa45d00bcd07 100644 --- a/drivers/resctrl/mpam_internal.h +++ b/drivers/resctrl/mpam_internal.h @@ -470,7 +470,7 @@ int mpam_msmon_read(struct mpam_component *comp, struct mon_cfg *ctx, enum mpam_device_features, u64 *val); void mpam_msmon_reset_mbwu(struct mpam_component *comp, struct mon_cfg *ctx); -int mpam_get_cpumask_from_cache_id(unsigned long cache_id, u32 cache_level, +int mpam_get_cpumask_from_cache_id(u32 cache_id, u32 cache_level, cpumask_t *affinity); #ifdef CONFIG_RESCTRL_FS -- 2.34.1