> -----Original Message-----
> From: Intel-wired-lan <[email protected]> On Behalf
> Of Ivan Vecera
> Sent: Friday, January 16, 2026 7:46 PM
> To: [email protected]
> Cc: Eric Dumazet <[email protected]>; Nguyen, Anthony L
> <[email protected]>; Rob Herring <[email protected]>; Leon
> Romanovsky <[email protected]>; Lobakin, Aleksander
> <[email protected]>; [email protected]; Kitszel,
> Przemyslaw <[email protected]>; Kubalewski, Arkadiusz
> <[email protected]>; [email protected];
> Jakub Kicinski <[email protected]>; Paolo Abeni <[email protected]>;
> [email protected]; Conor Dooley <[email protected]>; Jiri
> Pirko <[email protected]>; Richard Cochran <[email protected]>;
> Saravana Kannan <[email protected]>; Prathosh Satish
> <[email protected]>; Vadim Fedorenko
> <[email protected]>; Mark Bloch <[email protected]>; linux-
> [email protected]; Tariq Toukan <[email protected]>; Andrew Lunn
> <[email protected]>; Jonathan Lemon <[email protected]>;
> Krzysztof Kozlowski <[email protected]>; Saeed Mahameed
> <[email protected]>; David S. Miller <[email protected]>
> Subject: [Intel-wired-lan] [PATCH net-next v2 09/12] dpll: Prevent
> duplicate registrations
>
> Modify the internal registration helpers dpll_xa_ref_{dpll,pin}_add()
> to reject duplicate registration attempts.
>
> Previously, if a caller attempted to register the same pin multiple
> times (with the same ops, priv, and cookie) on the same device, the
> core silently increments the reference count and return success. This
> behavior is incorrect because if the caller makes these duplicate
> registrations then for the first one dpll_pin_registration is
> allocated and for others the associated dpll_pin_ref.refcount is
> incremented. During the first unregistration the associated
> dpll_pin_registration is freed and for others WARN is fired.
>
> Fix this by updating the logic to return `-EEXIST` if a matching
> registration is found to enforce a strict "register once" policy.
>
> Signed-off-by: Ivan Vecera <[email protected]>
> ---
> drivers/dpll/dpll_core.c | 12 ++++--------
> 1 file changed, 4 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/dpll/dpll_core.c b/drivers/dpll/dpll_core.c index
> f2a77eb1b9916..8616d6285c646 100644
> --- a/drivers/dpll/dpll_core.c
> +++ b/drivers/dpll/dpll_core.c
> @@ -161,10 +161,8 @@ dpll_xa_ref_pin_add(struct xarray *xa_pins,
> struct dpll_pin *pin,
> if (ref->pin != pin)
> continue;
> reg = dpll_pin_registration_find(ref, ops, priv,
> cookie);
> - if (reg) {
> - refcount_inc(&ref->refcount);
> - return 0;
> - }
> + if (reg)
> + return -EEXIST;
> ref_exists = true;
> break;
> }
> @@ -244,10 +242,8 @@ dpll_xa_ref_dpll_add(struct xarray *xa_dplls,
> struct dpll_device *dpll,
> if (ref->dpll != dpll)
> continue;
> reg = dpll_pin_registration_find(ref, ops, priv,
> cookie);
> - if (reg) {
> - refcount_inc(&ref->refcount);
> - return 0;
> - }
> + if (reg)
> + return -EEXIST;
> ref_exists = true;
> break;
> }
> --
> 2.52.0
Reviewed-by: Aleksandr Loktionov <[email protected]>