[PATCH RFC 05/15] arm_mpam: Fix device_node refcount in DT resource parsing
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-5-ea6397bead59@oss.qualcomm.com> |
When a cache-parented or memory-controller-parented MSC is probed via device tree, the parent node was assigned directly to a __free(device_node) variable without incrementing its reference count. Both the parent and the cache/memory variable are declared with __free(device_node), which causes the compiler to automatically insert an of_node_put() call for each variable when they go out of scope. Since both variables point to the same node but the reference count was only incremented once by of_get_parent(), the node ends up being released twice, causing a refcount underflow. Use of_node_get() to take an explicit reference so each __free variable holds its own reference. Signed-off-by: Yin Li <[email protected]> --- drivers/resctrl/mpam_devices.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/resctrl/mpam_devices.c b/drivers/resctrl/mpam_devices.c index 975ddab771b4..559fa09128b4 100644 --- a/drivers/resctrl/mpam_devices.c +++ b/drivers/resctrl/mpam_devices.c @@ -280,7 +280,7 @@ static int mpam_dt_parse_resource(struct mpam_msc *msc, struct device_node *np, type = MPAM_CLASS_CACHE; } else if (of_device_is_compatible(parent, "cache")) { - cache = parent; + cache = of_node_get(parent); type = MPAM_CLASS_CACHE; } else if (of_device_is_compatible(np, "arm,mpam-memory")) { memory = of_parse_phandle(np, "arm,mpam-device", 0); @@ -290,7 +290,7 @@ static int mpam_dt_parse_resource(struct mpam_msc *msc, struct device_node *np, } type = MPAM_CLASS_MEMORY; } else if (of_device_is_compatible(np, "arm,mpam-memory-controller-msc")) { - memory = parent; + memory = of_node_get(parent); type = MPAM_CLASS_MEMORY; } else { /* -- 2.34.1