>From: Nitka, Grzegorz <[email protected]> >Sent: Sunday, June 7, 2026 8:31 PM > >dpll_pin_on_pin_register() emits a creation notification for every >parent->dpll_refs entry, but dpll_pin_on_pin_unregister() emitted only >one deletion notification outside the loop. When a pin is registered >against multiple parent dplls, userspace sees N creates but a single >delete and leaks per-dpll state. > >Move dpll_pin_delete_ntf() into the loop and call it before >__dpll_pin_unregister() so the DPLL_REGISTERED mark is still set when >dpll_pin_available() is consulted. > >Fixes: 9d71b54b65b1 ("dpll: netlink: Add DPLL framework base functions")
Reviewed-by: Arkadiusz Kubalewski <[email protected]> >Signed-off-by: Grzegorz Nitka <[email protected]> >--- > drivers/dpll/dpll_core.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > >diff --git a/drivers/dpll/dpll_core.c b/drivers/dpll/dpll_core.c >index 80195f3a84f3..58034be07080 100644 >--- a/drivers/dpll/dpll_core.c >+++ b/drivers/dpll/dpll_core.c >@@ -1036,14 +1036,14 @@ void dpll_pin_on_pin_unregister(struct dpll_pin >*parent, struct dpll_pin *pin, > unsigned long i; > > mutex_lock(&dpll_lock); >- dpll_pin_delete_ntf(pin); >- dpll_xa_ref_pin_del(&pin->parent_refs, parent, ops, priv, pin); > xa_for_each(&pin->dpll_refs, i, ref) { > reg = dpll_pin_registration_find(ref, ops, priv, parent); > if (!reg) > continue; >+ dpll_pin_delete_ntf(pin); > __dpll_pin_unregister(ref->dpll, pin, ops, priv, parent); > } >+ dpll_xa_ref_pin_del(&pin->parent_refs, parent, ops, priv, pin); > mutex_unlock(&dpll_lock); > } > EXPORT_SYMBOL_GPL(dpll_pin_on_pin_unregister); >-- >2.39.3
