[PATCH v7 03/23] firmware: arm_scmi: Introduce protocol instance notifiers
Cristian Marussi
cristian.marussi at arm.com
Mon Aug 10 06:35:38 PDT 2026
On Mon, Aug 03, 2026 at 11:52:05PM +0100, Fayssal Benmlih wrote:
> Hi Cristian,
>
Hi,
> A couple of notifier lifetime issues inline.
>
> > scoped_guard(mutex, &info->protocols_mtx) {
> > pi = idr_find(&info->protocols, protocol_id);
> > if (WARN_ON(!pi))
> > return;
> >
> > proto_notifier_nb = pi->pno.nb;
> > /* Ensure NULL is visible */
> > smp_store_mb(pi->pno.nb, NULL);
> > }
> >
> > if (proto_notifier_nb) {
> > int ret;
> >
> > ret = scmi_protocol_notifier_unregister(pi->handle,
> > &pi->pno);
> > if (ret)
> > dev_err(handle->dev,
> > "Failed to release protocol notifier\n");
> > }
> >
> > guard(mutex)(&info->protocols_mtx);
> > if (refcount_dec_and_test(&pi->users)) {
>
> The notifier is cleared and unregistered before decrementing the protocol
> users refcount. If the protocol instance has multiple users, the first
> user that releases it removes the protocol implementation's notifier even
> though the instance remains active for the remaining users.
>
> Should notifier removal happen only when the final protocol reference is
> released?
>
Yes, but it is not so easy to do given the current notification handlers
design (that I did :P) since notifier were not supposed to be used from
within a protocol, till Telemetry...so the attempt is to fit (cleanly)
this new use-case into the existing SCMI Notification framework..since
99% of the related handling is the same....I have reviewed this logic
in V8, improved I think, but still Sashiko has some complaints...
> The ordering may need to be reworked so the final-reference decision and
> clearing of pno are made under protocols_mtx, while the potentially
> blocking notifier unregister operation is performed without freeing the
> protocol instance underneath it.
>
Cannot be done holding the mutex with the current design...
> > if (proto_notifier_nb) {
> > int ret;
> >
> > ret = scmi_protocol_notifier_register(pi->handle, &pi->pno);
> > if (ret)
> > dev_warn(handle->dev,
> > "Failed to register protocol notifier\n");
> > }
>
> If registration fails, pi->pno.nb remains populated. Future acquisitions
> of the existing protocol instance do not retry registration, while release
> later attempts to unregister the notifier even though registration never
> succeeded.
>
> Please either clear the stored notifier on registration failure or track
> registration state separately and provide a defined retry/error path.
>
Reviewed all of this in V8.
Thanks,
Cristian
>
More information about the linux-arm-kernel
mailing list