diff mbox series

[v1] iio: magnetometer: ak8974: Silence deferred-probe error

Message ID 20200414222713.32660-1-digetx@gmail.com (mailing list archive)
State New, archived
Headers show
Series [v1] iio: magnetometer: ak8974: Silence deferred-probe error | expand

Commit Message

Dmitry Osipenko April 14, 2020, 10:27 p.m. UTC
It's not uncommon that voltage regulator becomes available later during
kernel's boot process, in this case there is no need to print a noisy
error message. This patch moves the message about unavailable regulator
to the debug level in a case of the deferred-probe error and also amends
the message with error code.

Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---
 drivers/iio/magnetometer/ak8974.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

Comments

Linus Walleij April 16, 2020, 11:33 a.m. UTC | #1
Hi Dmitry,

thanks for your patch!

On Wed, Apr 15, 2020 at 12:27 AM Dmitry Osipenko <digetx@gmail.com> wrote:

> It's not uncommon that voltage regulator becomes available later during
> kernel's boot process, in this case there is no need to print a noisy
> error message. This patch moves the message about unavailable regulator
> to the debug level in a case of the deferred-probe error and also amends
> the message with error code.
>
> Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
> ---
>  drivers/iio/magnetometer/ak8974.c | 7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/iio/magnetometer/ak8974.c b/drivers/iio/magnetometer/ak8974.c
> index d32996702110..cc3861f97d42 100644
> --- a/drivers/iio/magnetometer/ak8974.c
> +++ b/drivers/iio/magnetometer/ak8974.c
> @@ -718,6 +718,7 @@ static const struct regmap_config ak8974_regmap_config = {
>  static int ak8974_probe(struct i2c_client *i2c,
>                         const struct i2c_device_id *id)
>  {
> +       const char *level = KERN_ERR;
>         struct iio_dev *indio_dev;
>         struct ak8974 *ak8974;
>         unsigned long irq_trig;
> @@ -746,7 +747,11 @@ static int ak8974_probe(struct i2c_client *i2c,
>                                       ARRAY_SIZE(ak8974->regs),
>                                       ak8974->regs);
>         if (ret < 0) {
> -               dev_err(&i2c->dev, "cannot get regulators\n");
> +               if (ret == -EPROBE_DEFER)
> +                       level = KERN_DEBUG;
> +
> +               dev_printk(level, &i2c->dev, "cannot get regulators: %d\n",

This misses some important aspects of dev_dbg(), notably this:

#if defined(CONFIG_DYNAMIC_DEBUG)
#define dev_dbg(dev, fmt, ...)                                          \
        dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
#elif defined(DEBUG)
#define dev_dbg(dev, fmt, ...)                                          \
        dev_printk(KERN_DEBUG, dev, dev_fmt(fmt), ##__VA_ARGS__)
#else
#define dev_dbg(dev, fmt, ...)                                          \
({                                                                      \
        if (0)                                                          \
                dev_printk(KERN_DEBUG, dev, dev_fmt(fmt), ##__VA_ARGS__); \
})
#endif

If DEBUG is not defined the entire dev_dbg() message is enclodes in if (0)
and compiled out of the kernel, saving space. The above does not
fulfil that.

Yours,
Linus Walleij
Dmitry Osipenko April 16, 2020, 2:45 p.m. UTC | #2
16.04.2020 14:33, Linus Walleij пишет:
> Hi Dmitry,
> 
> thanks for your patch!
> 
> On Wed, Apr 15, 2020 at 12:27 AM Dmitry Osipenko <digetx@gmail.com> wrote:
> 
>> It's not uncommon that voltage regulator becomes available later during
>> kernel's boot process, in this case there is no need to print a noisy
>> error message. This patch moves the message about unavailable regulator
>> to the debug level in a case of the deferred-probe error and also amends
>> the message with error code.
>>
>> Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
>> ---
>>  drivers/iio/magnetometer/ak8974.c | 7 ++++++-
>>  1 file changed, 6 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/iio/magnetometer/ak8974.c b/drivers/iio/magnetometer/ak8974.c
>> index d32996702110..cc3861f97d42 100644
>> --- a/drivers/iio/magnetometer/ak8974.c
>> +++ b/drivers/iio/magnetometer/ak8974.c
>> @@ -718,6 +718,7 @@ static const struct regmap_config ak8974_regmap_config = {
>>  static int ak8974_probe(struct i2c_client *i2c,
>>                         const struct i2c_device_id *id)
>>  {
>> +       const char *level = KERN_ERR;
>>         struct iio_dev *indio_dev;
>>         struct ak8974 *ak8974;
>>         unsigned long irq_trig;
>> @@ -746,7 +747,11 @@ static int ak8974_probe(struct i2c_client *i2c,
>>                                       ARRAY_SIZE(ak8974->regs),
>>                                       ak8974->regs);
>>         if (ret < 0) {
>> -               dev_err(&i2c->dev, "cannot get regulators\n");
>> +               if (ret == -EPROBE_DEFER)
>> +                       level = KERN_DEBUG;
>> +
>> +               dev_printk(level, &i2c->dev, "cannot get regulators: %d\n",
> 
> This misses some important aspects of dev_dbg(), notably this:
> 
> #if defined(CONFIG_DYNAMIC_DEBUG)
> #define dev_dbg(dev, fmt, ...)                                          \
>         dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
> #elif defined(DEBUG)
> #define dev_dbg(dev, fmt, ...)                                          \
>         dev_printk(KERN_DEBUG, dev, dev_fmt(fmt), ##__VA_ARGS__)
> #else
> #define dev_dbg(dev, fmt, ...)                                          \
> ({                                                                      \
>         if (0)                                                          \
>                 dev_printk(KERN_DEBUG, dev, dev_fmt(fmt), ##__VA_ARGS__); \
> })
> #endif
> 
> If DEBUG is not defined the entire dev_dbg() message is enclodes in if (0)
> and compiled out of the kernel, saving space. The above does not
> fulfil that.

Hello Linus,

After some recent discussions in regards to the EPROBE_DEFER handling,
Thierry Reding suggested the form which is used in my patch and we
started to use it recently in the Tegra DRM driver [1]. The reason is
that we don't want to miss any deferred-probe messages under any
circumstances, for example like in a case of a disabled DYNAMIC_DEBUG.
The debug messages are usually disabled in a release-build and when not
a very experienced person hands you KMSG for diagnosing a problem, the
KMSG is pretty much useless if error is hidden silently.

By moving the message to a debug level, we reduce the noise in the KMSG
because usually people look for a bold-red error messages. Secondly, we
don't introduce an additional overhead to the kernel size since the same
text is reused for all error conditions.

[1]
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e32c8c2a5fbe1514e4ae9063a49e76ecf486ffb8

I can change this patch to something like this:

if (ret == -EPROBE_DEFER)
	dev_dbg("deferring probe\n");
else
	dev_err("cannot...");

but in general this should be a less useful variant, don't you agree?
Linus Walleij April 16, 2020, 4:51 p.m. UTC | #3
On Thu, Apr 16, 2020 at 4:45 PM Dmitry Osipenko <digetx@gmail.com> wrote:
> 16.04.2020 14:33, Linus Walleij пишет:

> > This misses some important aspects of dev_dbg(), notably this:
> >
> > #if defined(CONFIG_DYNAMIC_DEBUG)
> > #define dev_dbg(dev, fmt, ...)                                          \
> >         dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
> > #elif defined(DEBUG)
> > #define dev_dbg(dev, fmt, ...)                                          \
> >         dev_printk(KERN_DEBUG, dev, dev_fmt(fmt), ##__VA_ARGS__)
> > #else
> > #define dev_dbg(dev, fmt, ...)                                          \
> > ({                                                                      \
> >         if (0)                                                          \
> >                 dev_printk(KERN_DEBUG, dev, dev_fmt(fmt), ##__VA_ARGS__); \
> > })
> > #endif
> >
> > If DEBUG is not defined the entire dev_dbg() message is enclodes in if (0)
> > and compiled out of the kernel, saving space. The above does not
> > fulfil that.
>
> Hello Linus,
>
> After some recent discussions in regards to the EPROBE_DEFER handling,
> Thierry Reding suggested the form which is used in my patch and we
> started to use it recently in the Tegra DRM driver [1]. The reason is
> that we don't want to miss any deferred-probe messages under any
> circumstances, for example like in a case of a disabled DYNAMIC_DEBUG.

I have a hard time to accept this reasoning.

Who doesn't feel that way about their subsystem? If you don't want
to miss the message under any circumstances then use dev_info().
Don't override the default behaviour of dev_dbg().

> The debug messages are usually disabled in a release-build and when not
> a very experienced person hands you KMSG for diagnosing a problem, the
> KMSG is pretty much useless if error is hidden silently.

So use dev_info().

> By moving the message to a debug level, we reduce the noise in the KMSG
> because usually people look for a bold-red error messages. Secondly, we
> don't introduce an additional overhead to the kernel size since the same
> text is reused for all error conditions.

dev_info() is not supposed to be an error message, it is supposed to
be information, so use that.

Yours,
Linus Walleij
Dmitry Osipenko April 16, 2020, 5:35 p.m. UTC | #4
16.04.2020 19:51, Linus Walleij пишет:
> On Thu, Apr 16, 2020 at 4:45 PM Dmitry Osipenko <digetx@gmail.com> wrote:
>> 16.04.2020 14:33, Linus Walleij пишет:
> 
>>> This misses some important aspects of dev_dbg(), notably this:
>>>
>>> #if defined(CONFIG_DYNAMIC_DEBUG)
>>> #define dev_dbg(dev, fmt, ...)                                          \
>>>         dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
>>> #elif defined(DEBUG)
>>> #define dev_dbg(dev, fmt, ...)                                          \
>>>         dev_printk(KERN_DEBUG, dev, dev_fmt(fmt), ##__VA_ARGS__)
>>> #else
>>> #define dev_dbg(dev, fmt, ...)                                          \
>>> ({                                                                      \
>>>         if (0)                                                          \
>>>                 dev_printk(KERN_DEBUG, dev, dev_fmt(fmt), ##__VA_ARGS__); \
>>> })
>>> #endif
>>>
>>> If DEBUG is not defined the entire dev_dbg() message is enclodes in if (0)
>>> and compiled out of the kernel, saving space. The above does not
>>> fulfil that.
>>
>> Hello Linus,
>>
>> After some recent discussions in regards to the EPROBE_DEFER handling,
>> Thierry Reding suggested the form which is used in my patch and we
>> started to use it recently in the Tegra DRM driver [1]. The reason is
>> that we don't want to miss any deferred-probe messages under any
>> circumstances, for example like in a case of a disabled DYNAMIC_DEBUG.
> 
> I have a hard time to accept this reasoning.
> 
> Who doesn't feel that way about their subsystem? If you don't want
> to miss the message under any circumstances then use dev_info().
> Don't override the default behaviour of dev_dbg().
> 
>> The debug messages are usually disabled in a release-build and when not
>> a very experienced person hands you KMSG for diagnosing a problem, the
>> KMSG is pretty much useless if error is hidden silently.
> 
> So use dev_info().
> 
>> By moving the message to a debug level, we reduce the noise in the KMSG
>> because usually people look for a bold-red error messages. Secondly, we
>> don't introduce an additional overhead to the kernel size since the same
>> text is reused for all error conditions.
> 
> dev_info() is not supposed to be an error message, it is supposed to
> be information, so use that.

Okay, I'll make a v2. Thank you for the review.
Jonathan Cameron April 18, 2020, 2:37 p.m. UTC | #5
On Thu, 16 Apr 2020 20:35:56 +0300
Dmitry Osipenko <digetx@gmail.com> wrote:

> 16.04.2020 19:51, Linus Walleij пишет:
> > On Thu, Apr 16, 2020 at 4:45 PM Dmitry Osipenko <digetx@gmail.com> wrote:  
> >> 16.04.2020 14:33, Linus Walleij пишет:  
> >   
> >>> This misses some important aspects of dev_dbg(), notably this:
> >>>
> >>> #if defined(CONFIG_DYNAMIC_DEBUG)
> >>> #define dev_dbg(dev, fmt, ...)                                          \
> >>>         dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
> >>> #elif defined(DEBUG)
> >>> #define dev_dbg(dev, fmt, ...)                                          \
> >>>         dev_printk(KERN_DEBUG, dev, dev_fmt(fmt), ##__VA_ARGS__)
> >>> #else
> >>> #define dev_dbg(dev, fmt, ...)                                          \
> >>> ({                                                                      \
> >>>         if (0)                                                          \
> >>>                 dev_printk(KERN_DEBUG, dev, dev_fmt(fmt), ##__VA_ARGS__); \
> >>> })
> >>> #endif
> >>>
> >>> If DEBUG is not defined the entire dev_dbg() message is enclodes in if (0)
> >>> and compiled out of the kernel, saving space. The above does not
> >>> fulfil that.  
> >>
> >> Hello Linus,
> >>
> >> After some recent discussions in regards to the EPROBE_DEFER handling,
> >> Thierry Reding suggested the form which is used in my patch and we
> >> started to use it recently in the Tegra DRM driver [1]. The reason is
> >> that we don't want to miss any deferred-probe messages under any
> >> circumstances, for example like in a case of a disabled DYNAMIC_DEBUG.  
> > 
> > I have a hard time to accept this reasoning.
> > 
> > Who doesn't feel that way about their subsystem? If you don't want
> > to miss the message under any circumstances then use dev_info().
> > Don't override the default behaviour of dev_dbg().
> >   
> >> The debug messages are usually disabled in a release-build and when not
> >> a very experienced person hands you KMSG for diagnosing a problem, the
> >> KMSG is pretty much useless if error is hidden silently.  
> > 
> > So use dev_info().
> >   
> >> By moving the message to a debug level, we reduce the noise in the KMSG
> >> because usually people look for a bold-red error messages. Secondly, we
> >> don't introduce an additional overhead to the kernel size since the same
> >> text is reused for all error conditions.  
> > 
> > dev_info() is not supposed to be an error message, it is supposed to
> > be information, so use that.  
> 
> Okay, I'll make a v2. Thank you for the review.

Ah I commented on this in v2 - now I see why you did it :)
Nope to dev_info. That will often spam normal logs and as Andy pointed
out for v2 that can be dozens of entries on a sophisticated board.  Much
better to stick to dev_dbg but I'd like to see it done explicitly in the
form you mention with the if / else

Thanks,

Jonathan
Dmitry Osipenko April 18, 2020, 2:49 p.m. UTC | #6
18.04.2020 17:37, Jonathan Cameron пишет:
> On Thu, 16 Apr 2020 20:35:56 +0300
> Dmitry Osipenko <digetx@gmail.com> wrote:
> 
>> 16.04.2020 19:51, Linus Walleij пишет:
>>> On Thu, Apr 16, 2020 at 4:45 PM Dmitry Osipenko <digetx@gmail.com> wrote:  
>>>> 16.04.2020 14:33, Linus Walleij пишет:  
>>>   
>>>>> This misses some important aspects of dev_dbg(), notably this:
>>>>>
>>>>> #if defined(CONFIG_DYNAMIC_DEBUG)
>>>>> #define dev_dbg(dev, fmt, ...)                                          \
>>>>>         dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
>>>>> #elif defined(DEBUG)
>>>>> #define dev_dbg(dev, fmt, ...)                                          \
>>>>>         dev_printk(KERN_DEBUG, dev, dev_fmt(fmt), ##__VA_ARGS__)
>>>>> #else
>>>>> #define dev_dbg(dev, fmt, ...)                                          \
>>>>> ({                                                                      \
>>>>>         if (0)                                                          \
>>>>>                 dev_printk(KERN_DEBUG, dev, dev_fmt(fmt), ##__VA_ARGS__); \
>>>>> })
>>>>> #endif
>>>>>
>>>>> If DEBUG is not defined the entire dev_dbg() message is enclodes in if (0)
>>>>> and compiled out of the kernel, saving space. The above does not
>>>>> fulfil that.  
>>>>
>>>> Hello Linus,
>>>>
>>>> After some recent discussions in regards to the EPROBE_DEFER handling,
>>>> Thierry Reding suggested the form which is used in my patch and we
>>>> started to use it recently in the Tegra DRM driver [1]. The reason is
>>>> that we don't want to miss any deferred-probe messages under any
>>>> circumstances, for example like in a case of a disabled DYNAMIC_DEBUG.  
>>>
>>> I have a hard time to accept this reasoning.
>>>
>>> Who doesn't feel that way about their subsystem? If you don't want
>>> to miss the message under any circumstances then use dev_info().
>>> Don't override the default behaviour of dev_dbg().
>>>   
>>>> The debug messages are usually disabled in a release-build and when not
>>>> a very experienced person hands you KMSG for diagnosing a problem, the
>>>> KMSG is pretty much useless if error is hidden silently.  
>>>
>>> So use dev_info().
>>>   
>>>> By moving the message to a debug level, we reduce the noise in the KMSG
>>>> because usually people look for a bold-red error messages. Secondly, we
>>>> don't introduce an additional overhead to the kernel size since the same
>>>> text is reused for all error conditions.  
>>>
>>> dev_info() is not supposed to be an error message, it is supposed to
>>> be information, so use that.  
>>
>> Okay, I'll make a v2. Thank you for the review.
> 
> Ah I commented on this in v2 - now I see why you did it :)
> Nope to dev_info. That will often spam normal logs and as Andy pointed
> out for v2 that can be dozens of entries on a sophisticated board.  Much
> better to stick to dev_dbg but I'd like to see it done explicitly in the
> form you mention with the if / else

Alright, I'll make a v3.
diff mbox series

Patch

diff --git a/drivers/iio/magnetometer/ak8974.c b/drivers/iio/magnetometer/ak8974.c
index d32996702110..cc3861f97d42 100644
--- a/drivers/iio/magnetometer/ak8974.c
+++ b/drivers/iio/magnetometer/ak8974.c
@@ -718,6 +718,7 @@  static const struct regmap_config ak8974_regmap_config = {
 static int ak8974_probe(struct i2c_client *i2c,
 			const struct i2c_device_id *id)
 {
+	const char *level = KERN_ERR;
 	struct iio_dev *indio_dev;
 	struct ak8974 *ak8974;
 	unsigned long irq_trig;
@@ -746,7 +747,11 @@  static int ak8974_probe(struct i2c_client *i2c,
 				      ARRAY_SIZE(ak8974->regs),
 				      ak8974->regs);
 	if (ret < 0) {
-		dev_err(&i2c->dev, "cannot get regulators\n");
+		if (ret == -EPROBE_DEFER)
+			level = KERN_DEBUG;
+
+		dev_printk(level, &i2c->dev, "cannot get regulators: %d\n",
+			   ret);
 		return ret;
 	}