Netdev List
 help / color / mirror / Atom feed
From: Ivan Vecera <ivecera@redhat.com>
To: netdev-bot+sashiko@kernel.org
Cc: netdev@vger.kernel.org, min.li@microchip.com,
	vadim.fedorenko@linux.dev, arkadiusz.kubalewski@intel.com,
	jiri@resnulli.us, kuba@kernel.org, Prathosh.Satish@microchip.com,
	pabeni@redhat.com, linux-kernel@vger.kernel.org
Subject: Re: [PATCH net v3 4/4] dpll: zl3073x: notify sibling pin when shared output config changes
Date: Fri, 9 Oct 2026 20:51:34 +0200	[thread overview]
Message-ID: <eefa9f84-62cd-45aa-be00-9105108a2692@redhat.com> (raw)
In-Reply-To: <179147350520.434549.16772916744710272674@kernel.org>

On 10/8/26 17:31, netdev-bot+sashiko@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found more severe
> issue(s) in other patches of this series. This mail is only an FYI, in case
> you want to address the nit picks below when you respin.
> 
> Low priority / nit picks for your consideration:
> 
> - [Low] The commit message describes the old teardown incorrectly.
> - [Low] The documentation for zl3073x_dpll_output_pin_sibling_get() does
>    not match its code, and the commit message's safety claim is only…
> 
> --
> 
> dpll: zl3073x: notify sibling pin when shared output config changes
> 
> The P and N pins of a zl3073x output share the divisor, clock type,
> esync and phase compensation registers. This patch adds a sibling
> lookup helper and sends a change notification to the sibling pin from
> frequency_set(), esync_set() and phase_adjust_set(). It also changes
> the order of list_add()/list_del() on zldpll->pins relative to DPLL
> pin registration, and does both under zldpll->lock.
> 
>> diff --git a/drivers/dpll/zl3073x/dpll.c b/drivers/dpll/zl3073x/dpll.c
>> index 65107b4cc4f82..9c678acc3e777 100644
>> --- a/drivers/dpll/zl3073x/dpll.c
>> +++ b/drivers/dpll/zl3073x/dpll.c
> 
> [ ... ]
> 
>> @@ -132,11 +134,39 @@ zl3073x_dpll_pin_get_by_ref(struct zl3073x_dpll *zldpll, u8 ref_id)
>>   	return NULL;
>>   }
>>   
>> +/**
>> + * zl3073x_dpll_output_pin_sibling_get - get the other pin of an output pair
>> + * @pin: output pin whose sibling is sought
>> + *
>> + * Output pin ids are allocated in P/N pairs (P even, N odd) that share a
>> + * single HW output. Looks up the other pin of the pair, if it is
>> + * registered as a dpll_pin on this DPLL.
>> + *
>> + * Return: pointer to sibling pin, or NULL if it is not registered
>> + */
>> +static struct zl3073x_dpll_pin *
>> +zl3073x_dpll_output_pin_sibling_get(struct zl3073x_dpll_pin *pin)
>> +{
>> +	struct zl3073x_dpll_pin *sibling;
>> +
>> +	lockdep_assert_held(&pin->dpll->lock);
>> +
>> +	list_for_each_entry(sibling, &pin->dpll->pins, list) {
>> +		if (!zl3073x_dpll_is_input_pin(sibling) &&
>> +		    sibling->id == (pin->id ^ 1))
>> +			return sibling;
>> +	}
>> +
>> +	return NULL;
>> +}
> 
> [Severity: Low]
> Does this kernel-doc match what the helper does? It says NULL is
> returned when the sibling is not registered. The loop only checks list
> membership, direction and id.
> 
> This patch makes zl3073x_dpll_pin_register() and
> zl3073x_dpll_nco_pin_register() add the pin to zldpll->pins before
> dpll_pin_register(). It also makes zl3073x_dpll_pin_unregister()
> remove the pin only after dpll_pin_unregister(). During those windows
> the helper can return a pin that is not registered.
> 
> esync_set(), frequency_set() and phase_adjust_set() then pass that pin
> directly to __dpll_pin_change_ntf(), whose kernel-doc says:
> 
>   * @pin: registered pin pointer
> 
> The window looks reachable. zl3073x_dpll_register() registers the DPLL
> device before its pins, so a PIN_SET on the P pin can run while the N
> pin's dpll_pin_register() waits on dpll_lock. On teardown, the N pin is
> unregistered while the P pin is still available.
> 
> The commit message also says:
> 
>    A pin that is transiently on the list while
>    not registered is harmless: __dpll_pin_change_ntf() is a no-op for a
>    pin that is not available
> 
> Is that accurate? Only dpll_pin_event_send() checks
> dpll_pin_available(). dpll_pin_notify() runs first and calls the
> in-kernel notifier chain without any check:
> 
> __dpll_pin_change_ntf()
>      dpll_pin_notify(pin, pin->clock_id, DPLL_PIN_CHANGED);
>          call_dpll_notifiers(action, &info);
>      return dpll_pin_event_send(DPLL_CMD_PIN_CHANGE_NTF, pin);
> 
> So an in-kernel DPLL_PIN_CHANGED event can be sent for a pin that is
> not registered. Nothing in the tree seems to be affected today: the
> only in-tree notifier, ice_dpll_pin_notify(), ignores actions other
> than CREATED and DELETED.
> 
> Should the kernel-doc and the commit message be corrected? The other
> option is to check that the sibling is actually registered before it
> is notified.

Will correct.
> [ ... ]
> 
>> @@ -1784,6 +1874,13 @@ zl3073x_dpll_pin_unregister(struct zl3073x_dpll_pin *pin)
>>   	/* Unregister the pin */
>>   	dpll_pin_unregister(zldpll->dpll_dev, pin->dpll_pin, ops, pin);
>>   
>> +	/* Remove the pin from the list only after it has been unregistered so
>> +	 * that a still-registered pin is always findable as a sibling.
>> +	 */
>> +	mutex_lock(&zldpll->lock);
>> +	list_del(&pin->list);
>> +	mutex_unlock(&zldpll->lock);
>> +
>>   	dpll_pin_put(pin->dpll_pin, &pin->tracker);
>>   	pin->dpll_pin = NULL;
>>   
>> @@ -1803,9 +1900,11 @@ zl3073x_dpll_pins_unregister(struct zl3073x_dpll *zldpll)
>>   {
>>   	struct zl3073x_dpll_pin *pin, *next;
>>   
>> +	/* Unregister each pin before removing it from the list so that a
>> +	 * still-registered pin is always findable as a sibling.
>> +	 */
>>   	list_for_each_entry_safe(pin, next, &zldpll->pins, list) {
>>   		zl3073x_dpll_pin_unregister(pin);
>> -		list_del(&pin->list);
>>   		zl3073x_dpll_pin_free(pin);
>>   	}
>>   }
> 
> [Severity: Low]
> The commit message says:
> 
>    and teardown detached the whole list before unregistering any
>    pin, so a sibling that is registered - and thus reachable by a PIN_SET
>    on the other pin - could be missing from the list and never notified.
> 
> Does this describe the old teardown correctly? Before this patch,
> zl3073x_dpll_pins_unregister() already unregistered each pin before
> removing it from the list:
> 
> 	list_for_each_entry_safe(pin, next, &zldpll->pins, list) {
> 		zl3073x_dpll_pin_unregister(pin);
> 		list_del(&pin->list);
> 		zl3073x_dpll_pin_free(pin);
> 	}
> 
> drivers/dpll/zl3073x/ has no list_splice() or similar call on this
> list. A pin that was still registered therefore stayed on zldpll->pins
> during teardown.
> 
> The list and the registration state only got out of step at
> registration time, because dpll_pin_register() ran before list_add().
> On the teardown side, this hunk mainly moves list_del() under
> zldpll->lock, which the new lockdep-asserted lookup needs.
> 
> Could the commit message describe what the teardown change actually
> does?
Yes, will rewrite it in v4.

Thanks,
Ivan


      reply	other threads:[~2026-10-09 18:51 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-06 15:31 [PATCH net v3 0/4] dpll: zl3073x: fix output pin frequency, esync and sibling notifications Ivan Vecera
2026-10-06 15:31 ` [PATCH net v3 1/4] dpll: zl3073x: reject output frequencies with too small divisor Ivan Vecera
2026-10-07 18:51   ` Petr Oros
2026-10-08 15:31   ` netdev-bot+sashiko
2026-10-09 18:40     ` Ivan Vecera
2026-10-06 15:31 ` [PATCH net v3 2/4] dpll: zl3073x: make embedded sync follow the output carrier frequency Ivan Vecera
2026-10-07 18:54   ` Petr Oros
2026-10-08 15:31   ` netdev-bot+sashiko
2026-10-09 18:43     ` Ivan Vecera
2026-10-06 15:31 ` [PATCH net v3 3/4] dpll: zl3073x: reject inexact frequencies for N-divided outputs Ivan Vecera
2026-10-07 18:55   ` Petr Oros
2026-10-08 15:31   ` netdev-bot+sashiko
2026-10-09 18:48     ` Ivan Vecera
2026-10-06 15:31 ` [PATCH net v3 4/4] dpll: zl3073x: notify sibling pin when shared output config changes Ivan Vecera
2026-10-07 18:55   ` Petr Oros
2026-10-08 15:31   ` netdev-bot+sashiko
2026-10-09 18:51     ` Ivan Vecera [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=eefa9f84-62cd-45aa-be00-9105108a2692@redhat.com \
    --to=ivecera@redhat.com \
    --cc=Prathosh.Satish@microchip.com \
    --cc=arkadiusz.kubalewski@intel.com \
    --cc=jiri@resnulli.us \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=min.li@microchip.com \
    --cc=netdev-bot+sashiko@kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=vadim.fedorenko@linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox