diff mbox

[v2,1/1] fbdev/core: Disable console-lock warnings when fb.lockless_register_fb is set

Message ID 20180718093002.4596-2-tzimmermann@suse.de (mailing list archive)
State New, archived
Headers show

Commit Message

Thomas Zimmermann July 18, 2018, 9:30 a.m. UTC
If the console is unlocked during registration, the console subsystem
generates significant amounts of warnings, which obfuscate actual
debugging messages. Setting ignore_console_lock_warning while debugging
console registration avoid the noise.

v2:
	- restore ignore_console_lock_warning if lock_fb_info() fails

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/video/fbdev/core/fbmem.c | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

Comments

Hans de Goede July 18, 2018, 9:34 a.m. UTC | #1
Hi,

On 18-07-18 11:30, Thomas Zimmermann wrote:
> If the console is unlocked during registration, the console subsystem
> generates significant amounts of warnings, which obfuscate actual
> debugging messages. Setting ignore_console_lock_warning while debugging
> console registration avoid the noise.
> 
> v2:
> 	- restore ignore_console_lock_warning if lock_fb_info() fails
> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>

Patch looks good to me, thanks:

Reviewed-by: Hans de Goede <hdegoede@redhat.com>

For "[PATCH v2] console: Replace #if 1 with a bool to ignore"
Petr wrote:

"Acked-by: Petr Mladek <pmladek@suse.com>

I assume that it will go via fbdev tree with the other changes
unless I hear otherwise."

So that patch and this one can both be picked up by Bartlomiej for
merging through the fbdev tree when he is back.

Regards,

Hans





> ---
>   drivers/video/fbdev/core/fbmem.c | 15 +++++++++++----
>   1 file changed, 11 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c
> index 9e2f9d3c760e..432c26eeabfb 100644
> --- a/drivers/video/fbdev/core/fbmem.c
> +++ b/drivers/video/fbdev/core/fbmem.c
> @@ -1627,6 +1627,7 @@ static int do_register_framebuffer(struct fb_info *fb_info)
>   	int i, ret;
>   	struct fb_event event;
>   	struct fb_videomode mode;
> +	bool saved_ignore_console_lock_warning = ignore_console_lock_warning;
>   
>   	if (fb_check_foreignness(fb_info))
>   		return -ENOSYS;
> @@ -1691,17 +1692,23 @@ static int do_register_framebuffer(struct fb_info *fb_info)
>   	event.info = fb_info;
>   	if (!lockless_register_fb)
>   		console_lock();
> +	else
> +		ignore_console_lock_warning = true;
>   	if (!lock_fb_info(fb_info)) {
> -		if (!lockless_register_fb)
> -			console_unlock();
> -		return -ENODEV;
> +		ret = -ENODEV;
> +		goto unlock_console;
>   	}
> +	ret = 0;
>   
>   	fb_notifier_call_chain(FB_EVENT_FB_REGISTERED, &event);
>   	unlock_fb_info(fb_info);
> +unlock_console:
>   	if (!lockless_register_fb)
>   		console_unlock();
> -	return 0;
> +	else
> +		ignore_console_lock_warning =
> +			saved_ignore_console_lock_warning;
> +	return ret;
>   }
>   
>   static int do_unregister_framebuffer(struct fb_info *fb_info)
>
kernel test robot July 18, 2018, 7:53 p.m. UTC | #2
Hi Thomas,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on sof-driver-fuweitax/master]
[also build test ERROR on v4.18-rc5 next-20180718]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Thomas-Zimmermann/fbdev-core-Disable-console-lock-warnings-when-fb-lockless_register_fb-is-set/20180719-023522
base:   https://github.com/fuweitax/linux master
config: i386-randconfig-s1-07181402 (attached as .config)
compiler: gcc-6 (Debian 6.4.0-9) 6.4.0 20171026
reproduce:
        # save the attached .config to linux build tree
        make ARCH=i386 

All errors (new ones prefixed by >>):

   drivers/video/fbdev/core/fbmem.c: In function 'do_register_framebuffer':
>> drivers/video/fbdev/core/fbmem.c:1642:43: error: 'ignore_console_lock_warning' undeclared (first use in this function)
     bool saved_ignore_console_lock_warning = ignore_console_lock_warning;
                                              ^~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/video/fbdev/core/fbmem.c:1642:43: note: each undeclared identifier is reported only once for each function it appears in

vim +/ignore_console_lock_warning +1642 drivers/video/fbdev/core/fbmem.c

  1631	
  1632	static bool lockless_register_fb;
  1633	module_param_named_unsafe(lockless_register_fb, lockless_register_fb, bool, 0400);
  1634	MODULE_PARM_DESC(lockless_register_fb,
  1635		"Lockless framebuffer registration for debugging [default=off]");
  1636	
  1637	static int do_register_framebuffer(struct fb_info *fb_info)
  1638	{
  1639		int i, ret;
  1640		struct fb_event event;
  1641		struct fb_videomode mode;
> 1642		bool saved_ignore_console_lock_warning = ignore_console_lock_warning;
  1643	
  1644		if (fb_check_foreignness(fb_info))
  1645			return -ENOSYS;
  1646	
  1647		ret = do_remove_conflicting_framebuffers(fb_info->apertures,
  1648							 fb_info->fix.id,
  1649							 fb_is_primary_device(fb_info));
  1650		if (ret)
  1651			return ret;
  1652	
  1653		if (num_registered_fb == FB_MAX)
  1654			return -ENXIO;
  1655	
  1656		num_registered_fb++;
  1657		for (i = 0 ; i < FB_MAX; i++)
  1658			if (!registered_fb[i])
  1659				break;
  1660		fb_info->node = i;
  1661		atomic_set(&fb_info->count, 1);
  1662		mutex_init(&fb_info->lock);
  1663		mutex_init(&fb_info->mm_lock);
  1664	
  1665		fb_info->dev = device_create(fb_class, fb_info->device,
  1666					     MKDEV(FB_MAJOR, i), NULL, "fb%d", i);
  1667		if (IS_ERR(fb_info->dev)) {
  1668			/* Not fatal */
  1669			printk(KERN_WARNING "Unable to create device for framebuffer %d; errno = %ld\n", i, PTR_ERR(fb_info->dev));
  1670			fb_info->dev = NULL;
  1671		} else
  1672			fb_init_device(fb_info);
  1673	
  1674		if (fb_info->pixmap.addr == NULL) {
  1675			fb_info->pixmap.addr = kmalloc(FBPIXMAPSIZE, GFP_KERNEL);
  1676			if (fb_info->pixmap.addr) {
  1677				fb_info->pixmap.size = FBPIXMAPSIZE;
  1678				fb_info->pixmap.buf_align = 1;
  1679				fb_info->pixmap.scan_align = 1;
  1680				fb_info->pixmap.access_align = 32;
  1681				fb_info->pixmap.flags = FB_PIXMAP_DEFAULT;
  1682			}
  1683		}	
  1684		fb_info->pixmap.offset = 0;
  1685	
  1686		if (!fb_info->pixmap.blit_x)
  1687			fb_info->pixmap.blit_x = ~(u32)0;
  1688	
  1689		if (!fb_info->pixmap.blit_y)
  1690			fb_info->pixmap.blit_y = ~(u32)0;
  1691	
  1692		if (!fb_info->modelist.prev || !fb_info->modelist.next)
  1693			INIT_LIST_HEAD(&fb_info->modelist);
  1694	
  1695		if (fb_info->skip_vt_switch)
  1696			pm_vt_switch_required(fb_info->dev, false);
  1697		else
  1698			pm_vt_switch_required(fb_info->dev, true);
  1699	
  1700		fb_var_to_videomode(&mode, &fb_info->var);
  1701		fb_add_videomode(&mode, &fb_info->modelist);
  1702		registered_fb[i] = fb_info;
  1703	
  1704		event.info = fb_info;
  1705		if (!lockless_register_fb)
  1706			console_lock();
  1707		else
  1708			ignore_console_lock_warning = true;
  1709		if (!lock_fb_info(fb_info)) {
  1710			ret = -ENODEV;
  1711			goto unlock_console;
  1712		}
  1713		ret = 0;
  1714	
  1715		fb_notifier_call_chain(FB_EVENT_FB_REGISTERED, &event);
  1716		unlock_fb_info(fb_info);
  1717	unlock_console:
  1718		if (!lockless_register_fb)
  1719			console_unlock();
  1720		else
  1721			ignore_console_lock_warning =
  1722				saved_ignore_console_lock_warning;
  1723		return ret;
  1724	}
  1725	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
Petr Mladek July 19, 2018, 8:53 a.m. UTC | #3
On Wed 2018-07-18 11:30:02, Thomas Zimmermann wrote:
> If the console is unlocked during registration, the console subsystem
> generates significant amounts of warnings, which obfuscate actual
> debugging messages. Setting ignore_console_lock_warning while debugging
> console registration avoid the noise.
> 
> v2:
> 	- restore ignore_console_lock_warning if lock_fb_info() fails
> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> ---
>  drivers/video/fbdev/core/fbmem.c | 15 +++++++++++----
>  1 file changed, 11 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c
> index 9e2f9d3c760e..432c26eeabfb 100644
> --- a/drivers/video/fbdev/core/fbmem.c
> +++ b/drivers/video/fbdev/core/fbmem.c
> @@ -1627,6 +1627,7 @@ static int do_register_framebuffer(struct fb_info *fb_info)
>  	int i, ret;
>  	struct fb_event event;
>  	struct fb_videomode mode;
> +	bool saved_ignore_console_lock_warning = ignore_console_lock_warning;

Hmm, this approach is racy if there are other users
saving/setting/restoring ignore_console_lock_warning in parallel.
I mean that this works only when the entire safe/set/restore
operation is nested or sequential.

We might need another approach if there are more users,
e.g. use an atomic counter for ignore_console_lock_warning.

On the other hand, I wonder if there ever will be other user.
Also it is "just" for debugging. We could keep it simple for now.
It might be enough to add a comment into include/linux/console.h,
something like:

/*
 * Set ignore_console_lock_warning to true if you need to quiet
 * WARN_CONSOLE_UNLOCKED() for debugging purposes. Might need
 * another approach if manipulated by more users in parallel.
 */

Best Regards,
Petr
Sergey Senozhatsky July 19, 2018, 10:05 a.m. UTC | #4
On (07/19/18 10:53), Petr Mladek wrote:
> Hmm, this approach is racy if there are other users
> saving/setting/restoring ignore_console_lock_warning in parallel.
> I mean that this works only when the entire safe/set/restore
> operation is nested or sequential.

Good point!

However, I tend to think that we don't need to care about it
that much. Having a counter to permit nesting would probably be
better, but, like you said, it's unlikely that we will see any
problems with ignore_console_lock_warning anyway. So we can keep
it simple [IOW - the way it is].

	-ss
Thomas Zimmermann July 19, 2018, 10:20 a.m. UTC | #5
Hi

Am 19.07.2018 um 12:05 schrieb Sergey Senozhatsky:
> On (07/19/18 10:53), Petr Mladek wrote:
>> Hmm, this approach is racy if there are other users
>> saving/setting/restoring ignore_console_lock_warning in parallel.
>> I mean that this works only when the entire safe/set/restore
>> operation is nested or sequential.
> 
> Good point!
> 
> However, I tend to think that we don't need to care about it
> that much. Having a counter to permit nesting would probably be
> better, but, like you said, it's unlikely that we will see any
> problems with ignore_console_lock_warning anyway. So we can keep
> it simple [IOW - the way it is].

I just sent a new patch set based on atomic_t and TBH it's easier to use
that this version. I only had to introduce the save-state variable in
the caller because I couldn't do inc/dec.

Best regards
Thomas

> 
> 	-ss
>
Sergey Senozhatsky July 19, 2018, 10:33 a.m. UTC | #6
Hi,

On (07/19/18 12:20), Thomas Zimmermann wrote:
> Am 19.07.2018 um 12:05 schrieb Sergey Senozhatsky:
> > On (07/19/18 10:53), Petr Mladek wrote:
> >> Hmm, this approach is racy if there are other users
> >> saving/setting/restoring ignore_console_lock_warning in parallel.
> >> I mean that this works only when the entire safe/set/restore
> >> operation is nested or sequential.
> > 
> > Good point!
> > 
> > However, I tend to think that we don't need to care about it
> > that much. Having a counter to permit nesting would probably be
> > better, but, like you said, it's unlikely that we will see any
> > problems with ignore_console_lock_warning anyway. So we can keep
> > it simple [IOW - the way it is].
> 
> I just sent a new patch set based on atomic_t

Ah, just saw the new version.

> and TBH it's easier to use that this version. I only had to introduce
> the save-state variable in the caller because I couldn't do inc/dec.

No objections, if it makes your life easier.
Thanks.

	-ss
Hans de Goede July 19, 2018, 11:43 a.m. UTC | #7
Hi,

On 19-07-18 10:53, Petr Mladek wrote:
> On Wed 2018-07-18 11:30:02, Thomas Zimmermann wrote:
>> If the console is unlocked during registration, the console subsystem
>> generates significant amounts of warnings, which obfuscate actual
>> debugging messages. Setting ignore_console_lock_warning while debugging
>> console registration avoid the noise.
>>
>> v2:
>> 	- restore ignore_console_lock_warning if lock_fb_info() fails
>>
>> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
>> ---
>>   drivers/video/fbdev/core/fbmem.c | 15 +++++++++++----
>>   1 file changed, 11 insertions(+), 4 deletions(-)
>>
>> diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c
>> index 9e2f9d3c760e..432c26eeabfb 100644
>> --- a/drivers/video/fbdev/core/fbmem.c
>> +++ b/drivers/video/fbdev/core/fbmem.c
>> @@ -1627,6 +1627,7 @@ static int do_register_framebuffer(struct fb_info *fb_info)
>>   	int i, ret;
>>   	struct fb_event event;
>>   	struct fb_videomode mode;
>> +	bool saved_ignore_console_lock_warning = ignore_console_lock_warning;
> 
> Hmm, this approach is racy if there are other users
> saving/setting/restoring ignore_console_lock_warning in parallel.
> I mean that this works only when the entire safe/set/restore
> operation is nested or sequential.
> 
> We might need another approach if there are more users,
> e.g. use an atomic counter for ignore_console_lock_warning.

I noticed this would be racy too, but this only gets used when
console-locking should be disabled when registering fbdev-s
for debugging purposes at which point everything console related
is racy already anyways, so I think this is fine as is.

> On the other hand, I wonder if there ever will be other user.
> Also it is "just" for debugging. We could keep it simple for now.
> It might be enough to add a comment into include/linux/console.h,
> something like:

Ack, lets keep this simple / as is in v2 of the patch.

Regards,

Hans



> 
> /*
>   * Set ignore_console_lock_warning to true if you need to quiet
>   * WARN_CONSOLE_UNLOCKED() for debugging purposes. Might need
>   * another approach if manipulated by more users in parallel.
>   */
> 
> Best Regards,
> Petr
>
diff mbox

Patch

diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c
index 9e2f9d3c760e..432c26eeabfb 100644
--- a/drivers/video/fbdev/core/fbmem.c
+++ b/drivers/video/fbdev/core/fbmem.c
@@ -1627,6 +1627,7 @@  static int do_register_framebuffer(struct fb_info *fb_info)
 	int i, ret;
 	struct fb_event event;
 	struct fb_videomode mode;
+	bool saved_ignore_console_lock_warning = ignore_console_lock_warning;
 
 	if (fb_check_foreignness(fb_info))
 		return -ENOSYS;
@@ -1691,17 +1692,23 @@  static int do_register_framebuffer(struct fb_info *fb_info)
 	event.info = fb_info;
 	if (!lockless_register_fb)
 		console_lock();
+	else
+		ignore_console_lock_warning = true;
 	if (!lock_fb_info(fb_info)) {
-		if (!lockless_register_fb)
-			console_unlock();
-		return -ENODEV;
+		ret = -ENODEV;
+		goto unlock_console;
 	}
+	ret = 0;
 
 	fb_notifier_call_chain(FB_EVENT_FB_REGISTERED, &event);
 	unlock_fb_info(fb_info);
+unlock_console:
 	if (!lockless_register_fb)
 		console_unlock();
-	return 0;
+	else
+		ignore_console_lock_warning =
+			saved_ignore_console_lock_warning;
+	return ret;
 }
 
 static int do_unregister_framebuffer(struct fb_info *fb_info)