linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 0/3] console/fbcon: Add support for deferred console takeover
@ 2018-06-26 13:55 Hans de Goede
  2018-06-26 13:55 ` [PATCH v3 1/3] printk: Export is_console_locked Hans de Goede
                   ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: Hans de Goede @ 2018-06-26 13:55 UTC (permalink / raw)
  To: Bartlomiej Zolnierkiewicz, Petr Mladek, Sergey Senozhatsky
  Cc: Hans de Goede, dri-devel, linux-fbdev, Steven Rostedt, linux-kernel

Hi All,

Here is v3 of my patch, now patch-set, to delay fbcon taking over the
console (and binding to fbdev devices) until there actually is some text
output to the console. This is intended for use with the "quiet" cmdline
option, in combination with a bootloader which leaves the vendor's logo /
EFI bootgraphics put up by the firmware intact on the EFI framebuffer.

The end goal here is a boot where the firmware shows its boot graphics
and these stay in place for a couple of seconds until the GUI loads and
the GUI then smoothly takes over the framebuffer without any distruptions.

New in v3 are the following changes:
-Export is_console_locke() for use in modules (as fbcon may be built as a .ko)
-Use WARN_CONSOLE_UNLOCKED() in several places in the fbcon code to assert
 proper locking (requested by Daniel)
-Unregister the fbcon-dummycon-output-notifier on fbcon_exit() (req. by Daniel)
-Document the fbcon=nodefer commandline option (req. by Emil)

These changes mean that this patch-set now spans 2 subsystems.

Petr, the printk subsys change is really trivial (1 line addition) can we
get your Acked-by for merging all 3 patches through the fbdev tree?

Regards,

Hans



^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH v3 1/3] printk: Export is_console_locked
  2018-06-26 13:55 [PATCH v3 0/3] console/fbcon: Add support for deferred console takeover Hans de Goede
@ 2018-06-26 13:55 ` Hans de Goede
  2018-06-26 13:55 ` [PATCH v3 2/3] fbcon: Call WARN_CONSOLE_UNLOCKED() where applicable Hans de Goede
  2018-06-26 13:55 ` [PATCH v3 3/3] console/fbcon: Add support for deferred console takeover Hans de Goede
  2 siblings, 0 replies; 11+ messages in thread
From: Hans de Goede @ 2018-06-26 13:55 UTC (permalink / raw)
  To: Bartlomiej Zolnierkiewicz, Petr Mladek, Sergey Senozhatsky
  Cc: Hans de Goede, dri-devel, linux-fbdev, Steven Rostedt, linux-kernel

This is a preparation patch for adding a number of WARN_CONSOLE_UNLOCKED()
calls to the fbcon code, which may be built as a module (event though
usually it is not).

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
Changes in v3:
-New patch in v3 of this patchset
---
 kernel/printk/printk.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index 247808333ba4..3f041e7cbfc9 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -2243,6 +2243,7 @@ int is_console_locked(void)
 {
 	return console_locked;
 }
+EXPORT_SYMBOL(is_console_locked);
 
 /*
  * Check if we have any console that is capable of printing while cpu is
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH v3 2/3] fbcon: Call WARN_CONSOLE_UNLOCKED() where applicable
  2018-06-26 13:55 [PATCH v3 0/3] console/fbcon: Add support for deferred console takeover Hans de Goede
  2018-06-26 13:55 ` [PATCH v3 1/3] printk: Export is_console_locked Hans de Goede
@ 2018-06-26 13:55 ` Hans de Goede
  2018-06-26 14:00   ` Daniel Vetter
  2018-06-26 14:47   ` Steven Rostedt
  2018-06-26 13:55 ` [PATCH v3 3/3] console/fbcon: Add support for deferred console takeover Hans de Goede
  2 siblings, 2 replies; 11+ messages in thread
From: Hans de Goede @ 2018-06-26 13:55 UTC (permalink / raw)
  To: Bartlomiej Zolnierkiewicz, Petr Mladek, Sergey Senozhatsky
  Cc: Hans de Goede, dri-devel, linux-fbdev, Steven Rostedt, linux-kernel

Replace comments about places where the console lock should be held with
calls to WARN_CONSOLE_UNLOCKED() to assert that it is actually held.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
Changes in v3:
-New patch in v3 of this patchset
---
 drivers/video/fbdev/core/fbcon.c | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
index c910e74d46ff..ac2cbdf710ee 100644
--- a/drivers/video/fbdev/core/fbcon.c
+++ b/drivers/video/fbdev/core/fbcon.c
@@ -817,8 +817,6 @@ static void con2fb_init_display(struct vc_data *vc, struct fb_info *info,
  *
  *	Maps a virtual console @unit to a frame buffer device
  *	@newidx.
- *
- *	This should be called with the console lock held.
  */
 static int set_con2fb_map(int unit, int newidx, int user)
 {
@@ -828,6 +826,8 @@ static int set_con2fb_map(int unit, int newidx, int user)
 	struct fb_info *oldinfo = NULL;
  	int found, err = 0;
 
+	WARN_CONSOLE_UNLOCKED();
+
 	if (oldidx == newidx)
 		return 0;
 
@@ -3039,11 +3039,12 @@ static inline int fbcon_unbind(void)
 }
 #endif /* CONFIG_VT_HW_CONSOLE_BINDING */
 
-/* called with console_lock held */
 static int fbcon_fb_unbind(int idx)
 {
 	int i, new_idx = -1, ret = 0;
 
+	WARN_CONSOLE_UNLOCKED();
+
 	if (!fbcon_has_console_bind)
 		return 0;
 
@@ -3089,11 +3090,12 @@ static int fbcon_fb_unbind(int idx)
 	return ret;
 }
 
-/* called with console_lock held */
 static int fbcon_fb_unregistered(struct fb_info *info)
 {
 	int i, idx;
 
+	WARN_CONSOLE_UNLOCKED();
+
 	idx = info->node;
 	for (i = first_fb_vc; i <= last_fb_vc; i++) {
 		if (con2fb_map[i] == idx)
@@ -3127,10 +3129,12 @@ static int fbcon_fb_unregistered(struct fb_info *info)
 	return 0;
 }
 
-/* called with console_lock held */
 static void fbcon_remap_all(int idx)
 {
 	int i;
+
+	WARN_CONSOLE_UNLOCKED();
+
 	for (i = first_fb_vc; i <= last_fb_vc; i++)
 		set_con2fb_map(i, idx, 0);
 
@@ -3172,11 +3176,12 @@ static inline void fbcon_select_primary(struct fb_info *info)
 }
 #endif /* CONFIG_FRAMEBUFFER_DETECT_PRIMARY */
 
-/* called with console_lock held */
 static int fbcon_fb_registered(struct fb_info *info)
 {
 	int ret = 0, i, idx;
 
+	WARN_CONSOLE_UNLOCKED();
+
 	idx = info->node;
 	fbcon_select_primary(info);
 
@@ -3325,7 +3330,6 @@ static int fbcon_event_notify(struct notifier_block *self,
 		ret = fbcon_fb_unregistered(info);
 		break;
 	case FB_EVENT_SET_CONSOLE_MAP:
-		/* called with console lock held */
 		con2fb = event->data;
 		ret = set_con2fb_map(con2fb->console - 1,
 				     con2fb->framebuffer, 1);
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH v3 3/3] console/fbcon: Add support for deferred console takeover
  2018-06-26 13:55 [PATCH v3 0/3] console/fbcon: Add support for deferred console takeover Hans de Goede
  2018-06-26 13:55 ` [PATCH v3 1/3] printk: Export is_console_locked Hans de Goede
  2018-06-26 13:55 ` [PATCH v3 2/3] fbcon: Call WARN_CONSOLE_UNLOCKED() where applicable Hans de Goede
@ 2018-06-26 13:55 ` Hans de Goede
  2018-06-26 17:12   ` Andy Shevchenko
  2 siblings, 1 reply; 11+ messages in thread
From: Hans de Goede @ 2018-06-26 13:55 UTC (permalink / raw)
  To: Bartlomiej Zolnierkiewicz, Petr Mladek, Sergey Senozhatsky
  Cc: Hans de Goede, dri-devel, linux-fbdev, Steven Rostedt, linux-kernel

Currently fbcon claims fbdevs as soon as they are registered and takes over
the console as soon as the first fbdev gets registered.

This behavior is undesirable in cases where a smooth graphical bootup is
desired, in such cases we typically want the contents of the framebuffer
(typically a vendor logo) to stay in place as is.

The current solution for this problem (on embedded systems) is to not
enable fbcon.

This commit adds a new FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER config option,
which when enabled defers fbcon taking over the console from the dummy
console until the first text is displayed on the console. Together with the
"quiet" kernel commandline option, this allows fbcon to still be used
together with a smooth graphical bootup, having it take over the console as
soon as e.g. an error message is logged.

Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
Changes in v2:
-Check the whole string when checking for erases in putcs, instead of just
 the first char
-Make dummycon_blank return 1, so that a redraw gets triggered and any text
 rendered while blanked gets output so that it can trigger a deferred
 takeover if one is pending

Changes in v3:
-Call WARN_CONSOLE_UNLOCKED() from fbcon_output_notifier()
-Unregister the notifier on fbcon_exit()
-Document the fbcon=nodefer commandline option in Documentation/fb/fbcon.txt
---
 Documentation/fb/fbcon.txt       |  7 ++++
 drivers/video/console/Kconfig    | 11 +++++
 drivers/video/console/dummycon.c | 67 +++++++++++++++++++++++++----
 drivers/video/fbdev/core/fbcon.c | 72 ++++++++++++++++++++++++++++++++
 include/linux/console.h          |  5 +++
 5 files changed, 154 insertions(+), 8 deletions(-)

diff --git a/Documentation/fb/fbcon.txt b/Documentation/fb/fbcon.txt
index 79c22d096bbc..d4d642e1ce9c 100644
--- a/Documentation/fb/fbcon.txt
+++ b/Documentation/fb/fbcon.txt
@@ -155,6 +155,13 @@ C. Boot options
 	used by text. By default, this area will be black. The 'color' value
 	is an integer number that depends on the framebuffer driver being used.
 
+6. fbcon=nodefer
+
+	If the kernel is compiled with deferred fbcon takeover support, normally
+	the framebuffer contents, left in place by the firmware/bootloader, will
+	be preserved until there actually is some text is output to the console.
+	This option causes fbcon to bind immediately to the fbdev device.
+
 C. Attaching, Detaching and Unloading
 
 Before going on how to attach, detach and unload the framebuffer console, an
diff --git a/drivers/video/console/Kconfig b/drivers/video/console/Kconfig
index 4110ba7d7ca9..e91edef98633 100644
--- a/drivers/video/console/Kconfig
+++ b/drivers/video/console/Kconfig
@@ -150,6 +150,17 @@ config FRAMEBUFFER_CONSOLE_ROTATION
          such that other users of the framebuffer will remain normally
          oriented.
 
+config FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER
+	bool "Framebuffer Console Deferred Takeover"
+	depends on FRAMEBUFFER_CONSOLE=y && DUMMY_CONSOLE=y
+	help
+	  If enabled this defers the framebuffer console taking over the
+	  console from the dummy console until the first text is displayed on
+	  the console. This is useful in combination with the "quiet" kernel
+	  commandline option to keep the framebuffer contents initially put up
+	  by the firmware in place, rather then replacing the contents with a
+	  black screen as soon as fbcon loads.
+
 config STI_CONSOLE
         bool "STI text console"
 	depends on PARISC && HAS_IOMEM
diff --git a/drivers/video/console/dummycon.c b/drivers/video/console/dummycon.c
index f2eafe2ed980..45ad925ad5f8 100644
--- a/drivers/video/console/dummycon.c
+++ b/drivers/video/console/dummycon.c
@@ -26,6 +26,65 @@
 #define DUMMY_ROWS	CONFIG_DUMMY_CONSOLE_ROWS
 #endif
 
+#ifdef CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER
+/* These are both protected by the console_lock */
+static RAW_NOTIFIER_HEAD(dummycon_output_nh);
+static bool dummycon_putc_called;
+
+void dummycon_register_output_notifier(struct notifier_block *nb)
+{
+	raw_notifier_chain_register(&dummycon_output_nh, nb);
+
+	if (dummycon_putc_called)
+		nb->notifier_call(nb, 0, NULL);
+}
+
+void dummycon_unregister_output_notifier(struct notifier_block *nb)
+{
+	raw_notifier_chain_unregister(&dummycon_output_nh, nb);
+}
+
+static void dummycon_putc(struct vc_data *vc, int c, int ypos, int xpos)
+{
+	dummycon_putc_called = true;
+	raw_notifier_call_chain(&dummycon_output_nh, 0, NULL);
+}
+
+static void dummycon_putcs(struct vc_data *vc, const unsigned short *s,
+			   int count, int ypos, int xpos)
+{
+	int i;
+
+	if (!dummycon_putc_called) {
+		/* Ignore erases */
+		for (i = 0 ; i < count; i++) {
+			if (s[i] != vc->vc_video_erase_char)
+				break;
+		}
+		if (i == count)
+			return;
+
+		dummycon_putc_called = true;
+	}
+
+	raw_notifier_call_chain(&dummycon_output_nh, 0, NULL);
+}
+
+static int dummycon_blank(struct vc_data *vc, int blank, int mode_switch)
+{
+	/* Redraw, so that we get putc(s) for output done while blanked */
+	return 1;
+}
+#else
+static void dummycon_putc(struct vc_data *vc, int c, int ypos, int xpos) { }
+static void dummycon_putcs(struct vc_data *vc, const unsigned short *s,
+			   int count, int ypos, int xpos) { }
+static int dummycon_blank(struct vc_data *vc, int blank, int mode_switch)
+{
+	return 0;
+}
+#endif
+
 static const char *dummycon_startup(void)
 {
     return "dummy device";
@@ -44,9 +103,6 @@ static void dummycon_init(struct vc_data *vc, int init)
 static void dummycon_deinit(struct vc_data *vc) { }
 static void dummycon_clear(struct vc_data *vc, int sy, int sx, int height,
 			   int width) { }
-static void dummycon_putc(struct vc_data *vc, int c, int ypos, int xpos) { }
-static void dummycon_putcs(struct vc_data *vc, const unsigned short *s,
-			   int count, int ypos, int xpos) { }
 static void dummycon_cursor(struct vc_data *vc, int mode) { }
 
 static bool dummycon_scroll(struct vc_data *vc, unsigned int top,
@@ -61,11 +117,6 @@ static int dummycon_switch(struct vc_data *vc)
 	return 0;
 }
 
-static int dummycon_blank(struct vc_data *vc, int blank, int mode_switch)
-{
-	return 0;
-}
-
 static int dummycon_font_set(struct vc_data *vc, struct console_font *font,
 			     unsigned int flags)
 {
diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
index ac2cbdf710ee..bd5da263eaff 100644
--- a/drivers/video/fbdev/core/fbcon.c
+++ b/drivers/video/fbdev/core/fbcon.c
@@ -129,6 +129,12 @@ static inline void fbcon_map_override(void)
 }
 #endif /* CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY */
 
+#ifdef CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER
+static bool deferred_takeover = true;
+#else
+#define deferred_takeover false
+#endif
+
 /* font data */
 static char fontname[40];
 
@@ -499,6 +505,12 @@ static int __init fb_console_setup(char *this_opt)
 				margin_color = simple_strtoul(options, &options, 0);
 			continue;
 		}
+#ifdef CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER
+		if (!strcmp(options, "nodefer")) {
+			deferred_takeover = false;
+			continue;
+		}
+#endif
 	}
 	return 1;
 }
@@ -3096,6 +3108,9 @@ static int fbcon_fb_unregistered(struct fb_info *info)
 
 	WARN_CONSOLE_UNLOCKED();
 
+	if (deferred_takeover)
+		return 0;
+
 	idx = info->node;
 	for (i = first_fb_vc; i <= last_fb_vc; i++) {
 		if (con2fb_map[i] == idx)
@@ -3135,6 +3150,13 @@ static void fbcon_remap_all(int idx)
 
 	WARN_CONSOLE_UNLOCKED();
 
+	if (deferred_takeover) {
+		for (i = first_fb_vc; i <= last_fb_vc; i++)
+			con2fb_map_boot[i] = idx;
+		fbcon_map_override();
+		return;
+	}
+
 	for (i = first_fb_vc; i <= last_fb_vc; i++)
 		set_con2fb_map(i, idx, 0);
 
@@ -3185,6 +3207,11 @@ static int fbcon_fb_registered(struct fb_info *info)
 	idx = info->node;
 	fbcon_select_primary(info);
 
+	if (deferred_takeover) {
+		pr_info("fbcon: Deferring console take-over\n");
+		return 0;
+	}
+
 	if (info_idx == -1) {
 		for (i = first_fb_vc; i <= last_fb_vc; i++) {
 			if (con2fb_map_boot[i] == idx) {
@@ -3559,8 +3586,46 @@ static int fbcon_init_device(void)
 	return 0;
 }
 
+#ifdef CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER
+static struct notifier_block fbcon_output_nb;
+
+static int fbcon_output_notifier(struct notifier_block *nb,
+				 unsigned long action, void *data)
+{
+	int i;
+
+	WARN_CONSOLE_UNLOCKED();
+
+	pr_info("fbcon: Taking over console\n");
+
+	dummycon_unregister_output_notifier(&fbcon_output_nb);
+	deferred_takeover = false;
+	logo_shown = FBCON_LOGO_DONTSHOW;
+
+	for (i = 0; i < FB_MAX; i++) {
+		if (registered_fb[i])
+			fbcon_fb_registered(registered_fb[i]);
+	}
+
+	return NOTIFY_OK;
+}
+
+static void fbcon_register_output_notifier(void)
+{
+	fbcon_output_nb.notifier_call = fbcon_output_notifier;
+	dummycon_register_output_notifier(&fbcon_output_nb);
+}
+#else
+static inline void fbcon_register_output_notifier(void) {}
+#endif
+
 static void fbcon_start(void)
 {
+	if (deferred_takeover) {
+		fbcon_register_output_notifier();
+		return;
+	}
+
 	if (num_registered_fb) {
 		int i;
 
@@ -3587,6 +3652,13 @@ static void fbcon_exit(void)
 	if (fbcon_has_exited)
 		return;
 
+#ifdef CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER
+	if (deferred_takeover) {
+		dummycon_unregister_output_notifier(&fbcon_output_nb);
+		deferred_takeover = false;
+	}
+#endif
+
 	kfree((void *)softback_buf);
 	softback_buf = 0UL;
 
diff --git a/include/linux/console.h b/include/linux/console.h
index dfd6b0e97855..f59f3dbca65c 100644
--- a/include/linux/console.h
+++ b/include/linux/console.h
@@ -21,6 +21,7 @@ struct console_font_op;
 struct console_font;
 struct module;
 struct tty_struct;
+struct notifier_block;
 
 /*
  * this is what the terminal answers to a ESC-Z or csi0c query.
@@ -220,4 +221,8 @@ static inline bool vgacon_text_force(void) { return false; }
 
 extern void console_init(void);
 
+/* For deferred console takeover */
+void dummycon_register_output_notifier(struct notifier_block *nb);
+void dummycon_unregister_output_notifier(struct notifier_block *nb);
+
 #endif /* _LINUX_CONSOLE_H */
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH v3 2/3] fbcon: Call WARN_CONSOLE_UNLOCKED() where applicable
  2018-06-26 13:55 ` [PATCH v3 2/3] fbcon: Call WARN_CONSOLE_UNLOCKED() where applicable Hans de Goede
@ 2018-06-26 14:00   ` Daniel Vetter
  2018-06-26 14:47   ` Steven Rostedt
  1 sibling, 0 replies; 11+ messages in thread
From: Daniel Vetter @ 2018-06-26 14:00 UTC (permalink / raw)
  To: Hans de Goede
  Cc: Bartlomiej Zolnierkiewicz, Petr Mladek, Sergey Senozhatsky,
	linux-fbdev, Steven Rostedt, dri-devel, linux-kernel

On Tue, Jun 26, 2018 at 03:55:34PM +0200, Hans de Goede wrote:
> Replace comments about places where the console lock should be held with
> calls to WARN_CONSOLE_UNLOCKED() to assert that it is actually held.
> 
> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> ---
> Changes in v3:
> -New patch in v3 of this patchset

For patches 1&2:

Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>

> ---
>  drivers/video/fbdev/core/fbcon.c | 18 +++++++++++-------
>  1 file changed, 11 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
> index c910e74d46ff..ac2cbdf710ee 100644
> --- a/drivers/video/fbdev/core/fbcon.c
> +++ b/drivers/video/fbdev/core/fbcon.c
> @@ -817,8 +817,6 @@ static void con2fb_init_display(struct vc_data *vc, struct fb_info *info,
>   *
>   *	Maps a virtual console @unit to a frame buffer device
>   *	@newidx.
> - *
> - *	This should be called with the console lock held.
>   */
>  static int set_con2fb_map(int unit, int newidx, int user)
>  {
> @@ -828,6 +826,8 @@ static int set_con2fb_map(int unit, int newidx, int user)
>  	struct fb_info *oldinfo = NULL;
>   	int found, err = 0;
>  
> +	WARN_CONSOLE_UNLOCKED();
> +
>  	if (oldidx == newidx)
>  		return 0;
>  
> @@ -3039,11 +3039,12 @@ static inline int fbcon_unbind(void)
>  }
>  #endif /* CONFIG_VT_HW_CONSOLE_BINDING */
>  
> -/* called with console_lock held */
>  static int fbcon_fb_unbind(int idx)
>  {
>  	int i, new_idx = -1, ret = 0;
>  
> +	WARN_CONSOLE_UNLOCKED();
> +
>  	if (!fbcon_has_console_bind)
>  		return 0;
>  
> @@ -3089,11 +3090,12 @@ static int fbcon_fb_unbind(int idx)
>  	return ret;
>  }
>  
> -/* called with console_lock held */
>  static int fbcon_fb_unregistered(struct fb_info *info)
>  {
>  	int i, idx;
>  
> +	WARN_CONSOLE_UNLOCKED();
> +
>  	idx = info->node;
>  	for (i = first_fb_vc; i <= last_fb_vc; i++) {
>  		if (con2fb_map[i] == idx)
> @@ -3127,10 +3129,12 @@ static int fbcon_fb_unregistered(struct fb_info *info)
>  	return 0;
>  }
>  
> -/* called with console_lock held */
>  static void fbcon_remap_all(int idx)
>  {
>  	int i;
> +
> +	WARN_CONSOLE_UNLOCKED();
> +
>  	for (i = first_fb_vc; i <= last_fb_vc; i++)
>  		set_con2fb_map(i, idx, 0);
>  
> @@ -3172,11 +3176,12 @@ static inline void fbcon_select_primary(struct fb_info *info)
>  }
>  #endif /* CONFIG_FRAMEBUFFER_DETECT_PRIMARY */
>  
> -/* called with console_lock held */
>  static int fbcon_fb_registered(struct fb_info *info)
>  {
>  	int ret = 0, i, idx;
>  
> +	WARN_CONSOLE_UNLOCKED();
> +
>  	idx = info->node;
>  	fbcon_select_primary(info);
>  
> @@ -3325,7 +3330,6 @@ static int fbcon_event_notify(struct notifier_block *self,
>  		ret = fbcon_fb_unregistered(info);
>  		break;
>  	case FB_EVENT_SET_CONSOLE_MAP:
> -		/* called with console lock held */
>  		con2fb = event->data;
>  		ret = set_con2fb_map(con2fb->console - 1,
>  				     con2fb->framebuffer, 1);
> -- 
> 2.17.1
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v3 2/3] fbcon: Call WARN_CONSOLE_UNLOCKED() where applicable
  2018-06-26 13:55 ` [PATCH v3 2/3] fbcon: Call WARN_CONSOLE_UNLOCKED() where applicable Hans de Goede
  2018-06-26 14:00   ` Daniel Vetter
@ 2018-06-26 14:47   ` Steven Rostedt
  2018-06-26 18:29     ` Hans de Goede
  1 sibling, 1 reply; 11+ messages in thread
From: Steven Rostedt @ 2018-06-26 14:47 UTC (permalink / raw)
  To: Hans de Goede
  Cc: Bartlomiej Zolnierkiewicz, Petr Mladek, Sergey Senozhatsky,
	dri-devel, linux-fbdev, linux-kernel

On Tue, 26 Jun 2018 15:55:34 +0200
Hans de Goede <hdegoede@redhat.com> wrote:

> Replace comments about places where the console lock should be held with
> calls to WARN_CONSOLE_UNLOCKED() to assert that it is actually held.

Why replace the comments? I prefer them, even with the WARN. The reason
is, when using functions, I don't tend to look inside the function I'm
about to use, but instead, I expect the comment above the function to
have basic information I need to use it. Especially what locks are
expected to be held.

Please keep the comments in place, but the WARNs are fine. They are not
a replacement for the comments.

Nack on removing comments.

-- Steve

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v3 3/3] console/fbcon: Add support for deferred console takeover
  2018-06-26 13:55 ` [PATCH v3 3/3] console/fbcon: Add support for deferred console takeover Hans de Goede
@ 2018-06-26 17:12   ` Andy Shevchenko
  2018-06-26 17:13     ` Andy Shevchenko
  2018-06-26 18:29     ` Hans de Goede
  0 siblings, 2 replies; 11+ messages in thread
From: Andy Shevchenko @ 2018-06-26 17:12 UTC (permalink / raw)
  To: Hans de Goede
  Cc: Bartlomiej Zolnierkiewicz, Petr Mladek, Sergey Senozhatsky,
	dri-devel, linux-fbdev, Steven Rostedt,
	Linux Kernel Mailing List

On Tue, Jun 26, 2018 at 4:55 PM, Hans de Goede <hdegoede@redhat.com> wrote:
> Currently fbcon claims fbdevs as soon as they are registered and takes over
> the console as soon as the first fbdev gets registered.
>
> This behavior is undesirable in cases where a smooth graphical bootup is
> desired, in such cases we typically want the contents of the framebuffer
> (typically a vendor logo) to stay in place as is.
>
> The current solution for this problem (on embedded systems) is to not
> enable fbcon.
>
> This commit adds a new FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER config option,
> which when enabled defers fbcon taking over the console from the dummy
> console until the first text is displayed on the console. Together with the
> "quiet" kernel commandline option, this allows fbcon to still be used
> together with a smooth graphical bootup, having it take over the console as
> soon as e.g. an error message is logged.

> +       for (i = 0; i < FB_MAX; i++) {
> +               if (registered_fb[i])
> +                       fbcon_fb_registered(registered_fb[i]);
> +       }

Simple git grep shows that we perhaps do

#define for_each_registered_fbcon(i) ...

(As an example see for_each_pci_bridge() how it's done there)

-- 
With Best Regards,
Andy Shevchenko

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v3 3/3] console/fbcon: Add support for deferred console takeover
  2018-06-26 17:12   ` Andy Shevchenko
@ 2018-06-26 17:13     ` Andy Shevchenko
  2018-06-26 18:29     ` Hans de Goede
  1 sibling, 0 replies; 11+ messages in thread
From: Andy Shevchenko @ 2018-06-26 17:13 UTC (permalink / raw)
  To: Hans de Goede
  Cc: Bartlomiej Zolnierkiewicz, Petr Mladek, Sergey Senozhatsky,
	dri-devel, linux-fbdev, Steven Rostedt,
	Linux Kernel Mailing List

On Tue, Jun 26, 2018 at 8:12 PM, Andy Shevchenko
<andy.shevchenko@gmail.com> wrote:
> On Tue, Jun 26, 2018 at 4:55 PM, Hans de Goede <hdegoede@redhat.com> wrote:

>> +       for (i = 0; i < FB_MAX; i++) {
>> +               if (registered_fb[i])
>> +                       fbcon_fb_registered(registered_fb[i]);
>> +       }
>
> Simple git grep shows that we perhaps do
>
> #define for_each_registered_fbcon(i) ...

(Or just ..._fb() since it looks like iteration over framebuffers, not
exactly consoles)

>
> (As an example see for_each_pci_bridge() how it's done there)



-- 
With Best Regards,
Andy Shevchenko

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v3 2/3] fbcon: Call WARN_CONSOLE_UNLOCKED() where applicable
  2018-06-26 14:47   ` Steven Rostedt
@ 2018-06-26 18:29     ` Hans de Goede
  0 siblings, 0 replies; 11+ messages in thread
From: Hans de Goede @ 2018-06-26 18:29 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Bartlomiej Zolnierkiewicz, Petr Mladek, Sergey Senozhatsky,
	dri-devel, linux-fbdev, linux-kernel

Hi,

On 26-06-18 16:47, Steven Rostedt wrote:
> On Tue, 26 Jun 2018 15:55:34 +0200
> Hans de Goede <hdegoede@redhat.com> wrote:
> 
>> Replace comments about places where the console lock should be held with
>> calls to WARN_CONSOLE_UNLOCKED() to assert that it is actually held.
> 
> Why replace the comments? I prefer them, even with the WARN. The reason
> is, when using functions, I don't tend to look inside the function I'm
> about to use, but instead, I expect the comment above the function to
> have basic information I need to use it. Especially what locks are
> expected to be held.
> 
> Please keep the comments in place, but the WARNs are fine. They are not
> a replacement for the comments.
> 
> Nack on removing comments.

Ok, I will submit a v4 with the comments left in place.

Regards,

Hans


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v3 3/3] console/fbcon: Add support for deferred console takeover
  2018-06-26 17:12   ` Andy Shevchenko
  2018-06-26 17:13     ` Andy Shevchenko
@ 2018-06-26 18:29     ` Hans de Goede
  2018-06-26 18:49       ` Andy Shevchenko
  1 sibling, 1 reply; 11+ messages in thread
From: Hans de Goede @ 2018-06-26 18:29 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Bartlomiej Zolnierkiewicz, Petr Mladek, Sergey Senozhatsky,
	dri-devel, linux-fbdev, Steven Rostedt,
	Linux Kernel Mailing List

Hi,

On 26-06-18 19:12, Andy Shevchenko wrote:
> On Tue, Jun 26, 2018 at 4:55 PM, Hans de Goede <hdegoede@redhat.com> wrote:
>> Currently fbcon claims fbdevs as soon as they are registered and takes over
>> the console as soon as the first fbdev gets registered.
>>
>> This behavior is undesirable in cases where a smooth graphical bootup is
>> desired, in such cases we typically want the contents of the framebuffer
>> (typically a vendor logo) to stay in place as is.
>>
>> The current solution for this problem (on embedded systems) is to not
>> enable fbcon.
>>
>> This commit adds a new FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER config option,
>> which when enabled defers fbcon taking over the console from the dummy
>> console until the first text is displayed on the console. Together with the
>> "quiet" kernel commandline option, this allows fbcon to still be used
>> together with a smooth graphical bootup, having it take over the console as
>> soon as e.g. an error message is logged.
> 
>> +       for (i = 0; i < FB_MAX; i++) {
>> +               if (registered_fb[i])
>> +                       fbcon_fb_registered(registered_fb[i]);
>> +       }
> 
> Simple git grep shows that we perhaps do
> 
> #define for_each_registered_fbcon(i) ...
> 
> (As an example see for_each_pci_bridge() how it's done there)

This is probably a worthwhile cleanup for all the fbdev related
code / drivers. But outside of the scope of this patchset.

Regards,

Hans

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v3 3/3] console/fbcon: Add support for deferred console takeover
  2018-06-26 18:29     ` Hans de Goede
@ 2018-06-26 18:49       ` Andy Shevchenko
  0 siblings, 0 replies; 11+ messages in thread
From: Andy Shevchenko @ 2018-06-26 18:49 UTC (permalink / raw)
  To: Hans de Goede, Yisheng Xie
  Cc: Bartlomiej Zolnierkiewicz, Petr Mladek, Sergey Senozhatsky,
	dri-devel, linux-fbdev, Steven Rostedt,
	Linux Kernel Mailing List

On Tue, Jun 26, 2018 at 9:29 PM, Hans de Goede <hdegoede@redhat.com> wrote:

>>> +       for (i = 0; i < FB_MAX; i++) {
>>> +               if (registered_fb[i])
>>> +                       fbcon_fb_registered(registered_fb[i]);
>>> +       }

>> Simple git grep shows that we perhaps do
>>
>> #define for_each_registered_fbcon(i) ...
>>
>> (As an example see for_each_pci_bridge() how it's done there)
>
>
> This is probably a worthwhile cleanup for all the fbdev related
> code / drivers. But outside of the scope of this patchset.

True.

Yisheng, in case you are interested in doing such clean up...

-- 
With Best Regards,
Andy Shevchenko

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2018-06-26 18:49 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-06-26 13:55 [PATCH v3 0/3] console/fbcon: Add support for deferred console takeover Hans de Goede
2018-06-26 13:55 ` [PATCH v3 1/3] printk: Export is_console_locked Hans de Goede
2018-06-26 13:55 ` [PATCH v3 2/3] fbcon: Call WARN_CONSOLE_UNLOCKED() where applicable Hans de Goede
2018-06-26 14:00   ` Daniel Vetter
2018-06-26 14:47   ` Steven Rostedt
2018-06-26 18:29     ` Hans de Goede
2018-06-26 13:55 ` [PATCH v3 3/3] console/fbcon: Add support for deferred console takeover Hans de Goede
2018-06-26 17:12   ` Andy Shevchenko
2018-06-26 17:13     ` Andy Shevchenko
2018-06-26 18:29     ` Hans de Goede
2018-06-26 18:49       ` Andy Shevchenko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).