Re: [PATCH v4 01/13] notifier: add device-managed registration APIs

Uwe Kleine-König <[email protected]> Mon, 10 Aug 2026 06:37:25 +0200
Newsgroups org.kernel.vger.linux-input,org.kernel.vger.linux-acpi,org.kernel.vger.linux-gpio,org.kernel.vger.linux-iio,org.kernel.vger.linux-kernel,org.kernel.vger.linux-pwm,org.kernel.vger.platform-driver-x86
Message-ID <anlUQXtxrghA8kNT@monoceros>
Hello,

On Sun, Jul 26, 2026 at 10:17:27AM +0000, Eliav Farber wrote:
> diff --git a/kernel/notifier.c b/kernel/notifier.c
> index 2f9fe7c30287..c1a66fa0c331 100644
> --- a/kernel/notifier.c
> +++ b/kernel/notifier.c
> @@ -1,4 +1,5 @@
>  // SPDX-License-Identifier: GPL-2.0-only
> +#include <linux/device/devres.h>
>  #include <linux/kdebug.h>
>  #include <linux/kprobes.h>
>  #include <linux/export.h>
> @@ -197,6 +198,56 @@ int atomic_notifier_chain_unregister(struct atomic_notifier_head *nh,
>  }
>  EXPORT_SYMBOL_GPL(atomic_notifier_chain_unregister);
>  
> +struct atomic_notifier_chain_devres {
> +	struct atomic_notifier_head *nh;
> +	struct notifier_block *nb;
> +};
> +
> +static void devm_atomic_notifier_chain_unregister(struct device *dev, void *res)
> +{
> +	struct atomic_notifier_chain_devres *dr = res;
> +
> +	atomic_notifier_chain_unregister(dr->nh, dr->nb);
> +}
> +
> +/**
> + *	devm_atomic_notifier_chain_register - Device-managed atomic notifier registration
> + *	@dev: Device to tie the notifier lifetime to
> + *	@nh: Pointer to head of the atomic notifier chain
> + *	@n: New entry in notifier chain
> + *
> + *	Adds a notifier to an atomic notifier chain and registers a cleanup
> + *	action to automatically unregister it when @dev is unbound.
> + *
> + *	Return:
> + *	0 on success, negative errno on error.
> + */
> +int devm_atomic_notifier_chain_register(struct device *dev,
> +					struct atomic_notifier_head *nh,
> +					struct notifier_block *n)
> +{
> +	struct atomic_notifier_chain_devres *dr;
> +	int ret;
> +
> +	dr = devres_alloc(devm_atomic_notifier_chain_unregister,
> +			  sizeof(*dr), GFP_KERNEL);
> +	if (!dr)
> +		return -ENOMEM;
> +
> +	ret = atomic_notifier_chain_register(nh, n);
> +	if (ret) {
> +		devres_free(dr);
> +		return ret;
> +	}
> +
> +	dr->nh = nh;
> +	dr->nb = n;
> +	devres_add(dev, dr);
> +
> +	return 0;
> +}
> +EXPORT_SYMBOL_GPL(devm_atomic_notifier_chain_register);

IMHO devm_atomic_notifier_chain_register() should look as follows:

	ret = atomic_notifier_chain_register(nh, n);
	if (ret)
		return ret;

	return devm_add_action_or_reset(dev, devm_atomic_notifier_chain_unregister, dr)

which is much easier and includes less details from the inner workings
of devm. Same for the blocking variant.

Best regards
Uwe
signature.asc (application/pgp-signature, 488 B)
-----BEGIN PGP SIGNATURE-----

iQEzBAABCgAdFiEEP4GsaTp6HlmJrf7Tj4D7WH0S/k4FAmp5VYEACgkQj4D7WH0S
/k4A9Af+Ojn2E+l4xDQpsSDbVEqgiXv61C4OfU2RE50xgQP4qAZidi+pc4zGxtUg
0z13yR8gFAmrMM9N6O1VhriVFGIUA9vMYDtAyeU2TLjBIjMLKUFrr2vChSm/skP1
t/4Z+hc+YzosxSB0JIgsL5Bb3AwUCzwX/8tP18KNafUyRr8aQ9oOXfu/M+YNzh7a
3mc1JDU1vaCOJFX/SPtRdy9YLa7m9KEvawXtOChlmpMAxSCbHrjSAPJMkiBFc4k2
zqsTCnh/psoYVGSnNg/gfrXxINJkt3GkiKT84w3/SX02KB37Sx+CwIYavuUv/zEj
P5J9NCBIC3tSQpekexPhQywVL+yAsQ==
=Jvr3
-----END PGP SIGNATURE-----