[PATCH] fbcon: use default if cursor blink interval is not valid

Subsystems: console subsystem, framebuffer layer, the rest

STALE3765d

20 messages, 7 authors, 2016-06-12 · open the first message on its own page

[PATCH] fbcon: use default if cursor blink interval is not valid

From: Scot Doyle <hidden>
Date: 2016-05-19 04:22:42

Two current [1] and three previous [2] systems locked during boot
because the cursor flash timer was set using an ops->cur_blink_jiffies
value of 0. Previous patches attempted to solve the problem by moving
variable initialization earlier in the setup sequence [2].

Use the normal cursor blink default interval of 200 ms if
ops->cur_blink_jiffies is not in the range specified in commit
bd63364caa8d. Since invalid values are not used, specific system
initialization timings should not cause lockups.

[1] https://bugs.launchpad.net/bugs/1574814
[2] see commits: 2a17d7e80f1d, f235f664a8af, a1e533ec07d5

Signed-off-by: Scot Doyle <redacted>
Cc: <redacted> [v4.2]
---
 drivers/video/console/fbcon.c | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c
index 6e92917..da61d87 100644
--- a/drivers/video/console/fbcon.c
+++ b/drivers/video/console/fbcon.c
@@ -396,13 +396,23 @@ static void fb_flashcursor(struct work_struct *work)
 	console_unlock();
 }
 
+static int cursor_blink_jiffies(int candidate)
+{
+	if (candidate >= msecs_to_jiffies(50) &&
+	    candidate <= msecs_to_jiffies(USHRT_MAX))
+		return candidate;
+	else
+		return HZ / 5;
+}
+
 static void cursor_timer_handler(unsigned long dev_addr)
 {
 	struct fb_info *info = (struct fb_info *) dev_addr;
 	struct fbcon_ops *ops = info->fbcon_par;
 
 	queue_work(system_power_efficient_wq, &info->queue);
-	mod_timer(&ops->cursor_timer, jiffies + ops->cur_blink_jiffies);
+	mod_timer(&ops->cursor_timer, jiffies +
+	    cursor_blink_jiffies(ops->cur_blink_jiffies));
 }
 
 static void fbcon_add_cursor_timer(struct fb_info *info)
@@ -417,7 +427,8 @@ static void fbcon_add_cursor_timer(struct fb_info *info)
 
 		init_timer(&ops->cursor_timer);
 		ops->cursor_timer.function = cursor_timer_handler;
-		ops->cursor_timer.expires = jiffies + ops->cur_blink_jiffies;
+		ops->cursor_timer.expires = jiffies +
+		    cursor_blink_jiffies(ops->cur_blink_jiffies);
 		ops->cursor_timer.data = (unsigned long ) info;
 		add_timer(&ops->cursor_timer);
 		ops->flags |= FBCON_FLAGS_CURSOR_TIMER;
@@ -709,7 +720,6 @@ static int con2fb_acquire_newinfo(struct vc_data *vc, struct fb_info *info,
 	}
 
 	if (!err) {
-		ops->cur_blink_jiffies = HZ / 5;
 		info->fbcon_par = ops;
 
 		if (vc)
@@ -957,7 +967,6 @@ static const char *fbcon_startup(void)
 	ops->currcon = -1;
 	ops->graphics = 1;
 	ops->cur_rotate = -1;
-	ops->cur_blink_jiffies = HZ / 5;
 	info->fbcon_par = ops;
 	p->con_rotate = initial_rotation;
 	set_blitting_type(vc, info);
-- 
2.1.4

Re: [PATCH] fbcon: use default if cursor blink interval is not valid

From: Jeremy Kerr <jk@ozlabs.org>
Date: 2016-05-19 07:25:56

Hi Scot,
Use the normal cursor blink default interval of 200 ms if
ops->cur_blink_jiffies is not in the range specified in commit
bd63364caa8d. Since invalid values are not used, specific system
initialization timings should not cause lockups.
This fixes an issue we're seeing with the ast driver on OpenPOWER
machines, thanks!

Acked-by: Jeremy Kerr <jk@ozlabs.org>

Cheers,


Jeremy

Re: [PATCH] fbcon: use default if cursor blink interval is not valid

From: Ming Lei <hidden>
Date: 2016-05-19 08:30:00

On Thu, May 19, 2016 at 12:21 PM, Scot Doyle [off-list ref] wrote:
Two current [1] and three previous [2] systems locked during boot
because the cursor flash timer was set using an ops->cur_blink_jiffies
value of 0. Previous patches attempted to solve the problem by moving
variable initialization earlier in the setup sequence [2].

Use the normal cursor blink default interval of 200 ms if
ops->cur_blink_jiffies is not in the range specified in commit
bd63364caa8d. Since invalid values are not used, specific system
initialization timings should not cause lockups.

[1] https://bugs.launchpad.net/bugs/1574814
[2] see commits: 2a17d7e80f1d, f235f664a8af, a1e533ec07d5

Signed-off-by: Scot Doyle <redacted>
Cc: <redacted> [v4.2]
Tested-by: Ming Lei <redacted>
quoted hunk
---
 drivers/video/console/fbcon.c | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c
index 6e92917..da61d87 100644
--- a/drivers/video/console/fbcon.c
+++ b/drivers/video/console/fbcon.c
@@ -396,13 +396,23 @@ static void fb_flashcursor(struct work_struct *work)
        console_unlock();
 }

+static int cursor_blink_jiffies(int candidate)
+{
+       if (candidate >= msecs_to_jiffies(50) &&
+           candidate <= msecs_to_jiffies(USHRT_MAX))
+               return candidate;
+       else
+               return HZ / 5;
+}
+
 static void cursor_timer_handler(unsigned long dev_addr)
 {
        struct fb_info *info = (struct fb_info *) dev_addr;
        struct fbcon_ops *ops = info->fbcon_par;

        queue_work(system_power_efficient_wq, &info->queue);
-       mod_timer(&ops->cursor_timer, jiffies + ops->cur_blink_jiffies);
+       mod_timer(&ops->cursor_timer, jiffies +
+           cursor_blink_jiffies(ops->cur_blink_jiffies));
 }

 static void fbcon_add_cursor_timer(struct fb_info *info)
@@ -417,7 +427,8 @@ static void fbcon_add_cursor_timer(struct fb_info *info)

                init_timer(&ops->cursor_timer);
                ops->cursor_timer.function = cursor_timer_handler;
-               ops->cursor_timer.expires = jiffies + ops->cur_blink_jiffies;
+               ops->cursor_timer.expires = jiffies +
+                   cursor_blink_jiffies(ops->cur_blink_jiffies);
                ops->cursor_timer.data = (unsigned long ) info;
                add_timer(&ops->cursor_timer);
                ops->flags |= FBCON_FLAGS_CURSOR_TIMER;
@@ -709,7 +720,6 @@ static int con2fb_acquire_newinfo(struct vc_data *vc, struct fb_info *info,
        }

        if (!err) {
-               ops->cur_blink_jiffies = HZ / 5;
                info->fbcon_par = ops;

                if (vc)
@@ -957,7 +967,6 @@ static const char *fbcon_startup(void)
        ops->currcon = -1;
        ops->graphics = 1;
        ops->cur_rotate = -1;
-       ops->cur_blink_jiffies = HZ / 5;
        info->fbcon_par = ops;
        p->con_rotate = initial_rotation;
        set_blitting_type(vc, info);
--
2.1.4

Re: [PATCH] fbcon: use default if cursor blink interval is not valid

From: Pavel Machek <hidden>
Date: 2016-05-19 09:01:45

Hi!
Two current [1] and three previous [2] systems locked during boot
because the cursor flash timer was set using an ops->cur_blink_jiffies
value of 0. Previous patches attempted to solve the problem by moving
variable initialization earlier in the setup sequence [2].

Use the normal cursor blink default interval of 200 ms if
ops->cur_blink_jiffies is not in the range specified in commit
bd63364caa8d. Since invalid values are not used, specific system
initialization timings should not cause lockups.

[1] https://bugs.launchpad.net/bugs/1574814
[2] see commits: 2a17d7e80f1d, f235f664a8af, a1e533ec07d5
Acked-by: Pavel Machek <redacted>
quoted hunk
 static void cursor_timer_handler(unsigned long dev_addr)
 {
 	struct fb_info *info = (struct fb_info *) dev_addr;
 	struct fbcon_ops *ops = info->fbcon_par;
 
 	queue_work(system_power_efficient_wq, &info->queue);
-	mod_timer(&ops->cursor_timer, jiffies + ops->cur_blink_jiffies);
+	mod_timer(&ops->cursor_timer, jiffies +
+	    cursor_blink_jiffies(ops->cur_blink_jiffies));
 }
 
 static void fbcon_add_cursor_timer(struct fb_info *info)
And actually... perhaps mod_timer should have some check for too low
timeouts..?

WARN_ON?
									Pavel

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html

Re: [PATCH] fbcon: use default if cursor blink interval is not valid

From: Scot Doyle <hidden>
Date: 2016-05-19 14:22:34

On Thu, 19 May 2016, Pavel Machek wrote:
Hi!
quoted
Two current [1] and three previous [2] systems locked during boot
because the cursor flash timer was set using an ops->cur_blink_jiffies
value of 0. Previous patches attempted to solve the problem by moving
variable initialization earlier in the setup sequence [2].

Use the normal cursor blink default interval of 200 ms if
ops->cur_blink_jiffies is not in the range specified in commit
bd63364caa8d. Since invalid values are not used, specific system
initialization timings should not cause lockups.

[1] https://bugs.launchpad.net/bugs/1574814
[2] see commits: 2a17d7e80f1d, f235f664a8af, a1e533ec07d5
Acked-by: Pavel Machek <redacted>
quoted
 static void cursor_timer_handler(unsigned long dev_addr)
 {
 	struct fb_info *info = (struct fb_info *) dev_addr;
 	struct fbcon_ops *ops = info->fbcon_par;
 
 	queue_work(system_power_efficient_wq, &info->queue);
-	mod_timer(&ops->cursor_timer, jiffies + ops->cur_blink_jiffies);
+	mod_timer(&ops->cursor_timer, jiffies +
+	    cursor_blink_jiffies(ops->cur_blink_jiffies));
 }
 
 static void fbcon_add_cursor_timer(struct fb_info *info)
And actually... perhaps mod_timer should have some check for too low
timeouts..?

WARN_ON?
									Pavel

Interesting idea. I applied this patch to a couple systems and 
receive the same warning on both:
diff --git a/kernel/time/timer.c b/kernel/time/timer.c
index 73164c3..f6c0b69 100644
--- a/kernel/time/timer.c
+++ b/kernel/time/timer.c
@@ -788,6 +788,7 @@ __mod_timer(struct timer_list *timer, unsigned long expires,
 
 	timer_stats_timer_set_start_info(timer);
 	BUG_ON(!timer->function);
+	WARN_ONCE(expires = jiffies, "timer should expire in the future");
 
 	base = lock_timer_base(timer, &flags);
 
------
[    2.060474] ------------[ cut here ]------------
[    2.061613] WARNING: CPU: 0 PID: 164 at kernel/time/timer.c:791 mod_timer+0x233/0x240
[    2.062740] timer should expire in the future
[    2.062757] CPU: 0 PID: 164 Comm: kworker/0:2 Not tainted 4.6.0+ #7
[    2.065870] Hardware name: Toshiba Leon, BIOS          12/04/2013
[    2.067828] Workqueue: events_power_efficient hub_init_func3
[    2.069762]  0000000000000000 ffff88007443bbb8 ffffffff8139932b ffff88007443bc08
[    2.071701]  0000000000000000 ffff88007443bbf8 ffffffff8112e57c 0000031700000000
[    2.073655]  ffff88007486a0b0 00000000fffea2da ffff88007486a000 0000000000000202
[    2.075594] Call Trace:
[    2.077503]  [<ffffffff8139932b>] dump_stack+0x4d/0x72
[    2.079426]  [<ffffffff8112e57c>] __warn+0xcc/0xf0
[    2.081325]  [<ffffffff8112e5ef>] warn_slowpath_fmt+0x4f/0x60
[    2.083212]  [<ffffffff813ad5e5>] ? find_next_bit+0x15/0x20
[    2.085022]  [<ffffffff8139914f>] ? cpumask_next_and+0x2f/0x40
[    2.086696]  [<ffffffff81188a93>] mod_timer+0x233/0x240
[    2.088362]  [<ffffffff815fff02>] usb_hcd_submit_urb+0x3f2/0x8c0
[    2.090026]  [<ffffffff81601dc4>] ? urb_destroy+0x24/0x30
[    2.091698]  [<ffffffff81142ba8>] ? insert_work+0x58/0xb0
[    2.093349]  [<ffffffff81602297>] usb_submit_urb+0x287/0x530
[    2.094985]  [<ffffffff815f986d>] hub_activate+0x1fd/0x5d0
[    2.096625]  [<ffffffff81150188>] ? finish_task_switch+0x78/0x1f0
[    2.098268]  [<ffffffff815f9cca>] hub_init_func3+0x1a/0x20
[    2.099908]  [<ffffffff811438e0>] process_one_work+0x140/0x3e0
[    2.101539]  [<ffffffff81143bce>] worker_thread+0x4e/0x480
[    2.103173]  [<ffffffff81143b80>] ? process_one_work+0x3e0/0x3e0
[    2.104790]  [<ffffffff81143b80>] ? process_one_work+0x3e0/0x3e0
[    2.106259]  [<ffffffff81149829>] kthread+0xc9/0xe0
[    2.107731]  [<ffffffff81856152>] ret_from_fork+0x22/0x40
[    2.109215]  [<ffffffff81149760>] ? __kthread_parkme+0x70/0x70
[    2.110704] ---[ end trace 3519886a1a990d99 ]---

mod_timer is called from over a thousand places. Should timers always 
expire in the future?

Re: [PATCH] fbcon: use default if cursor blink interval is not valid

From: Ming Lei <hidden>
Date: 2016-05-19 15:31:48

On Thu, May 19, 2016 at 10:22 PM, Scot Doyle [off-list ref] wrote:
On Thu, 19 May 2016, Pavel Machek wrote:
quoted
Hi!
quoted
Two current [1] and three previous [2] systems locked during boot
because the cursor flash timer was set using an ops->cur_blink_jiffies
value of 0. Previous patches attempted to solve the problem by moving
variable initialization earlier in the setup sequence [2].

Use the normal cursor blink default interval of 200 ms if
ops->cur_blink_jiffies is not in the range specified in commit
bd63364caa8d. Since invalid values are not used, specific system
initialization timings should not cause lockups.

[1] https://bugs.launchpad.net/bugs/1574814
[2] see commits: 2a17d7e80f1d, f235f664a8af, a1e533ec07d5
Acked-by: Pavel Machek <redacted>
quoted
 static void cursor_timer_handler(unsigned long dev_addr)
 {
    struct fb_info *info = (struct fb_info *) dev_addr;
    struct fbcon_ops *ops = info->fbcon_par;

    queue_work(system_power_efficient_wq, &info->queue);
-   mod_timer(&ops->cursor_timer, jiffies + ops->cur_blink_jiffies);
+   mod_timer(&ops->cursor_timer, jiffies +
+       cursor_blink_jiffies(ops->cur_blink_jiffies));
 }

 static void fbcon_add_cursor_timer(struct fb_info *info)
And actually... perhaps mod_timer should have some check for too low
timeouts..?

WARN_ON?
                                                                      Pavel

Interesting idea. I applied this patch to a couple systems and
receive the same warning on both:
If 'jiffies' is passed to mod_timer() for same timer unusually OR
mod_timer() isn't called from the timer handler, it shoudln't cause
soft lockup.

In the case of fbcon, 'jiffies' is always passed to mod_timer() and
mod_timer() is called from the timer handler meantime, that is a
real lockup.
quoted hunk
diff --git a/kernel/time/timer.c b/kernel/time/timer.c
index 73164c3..f6c0b69 100644
--- a/kernel/time/timer.c
+++ b/kernel/time/timer.c
@@ -788,6 +788,7 @@ __mod_timer(struct timer_list *timer, unsigned long expires,

        timer_stats_timer_set_start_info(timer);
        BUG_ON(!timer->function);
+       WARN_ONCE(expires = jiffies, "timer should expire in the future");

        base = lock_timer_base(timer, &flags);

------
[    2.060474] ------------[ cut here ]------------
[    2.061613] WARNING: CPU: 0 PID: 164 at kernel/time/timer.c:791 mod_timer+0x233/0x240
[    2.062740] timer should expire in the future
[    2.062757] CPU: 0 PID: 164 Comm: kworker/0:2 Not tainted 4.6.0+ #7
[    2.065870] Hardware name: Toshiba Leon, BIOS          12/04/2013
[    2.067828] Workqueue: events_power_efficient hub_init_func3
[    2.069762]  0000000000000000 ffff88007443bbb8 ffffffff8139932b ffff88007443bc08
[    2.071701]  0000000000000000 ffff88007443bbf8 ffffffff8112e57c 0000031700000000
[    2.073655]  ffff88007486a0b0 00000000fffea2da ffff88007486a000 0000000000000202
[    2.075594] Call Trace:
[    2.077503]  [<ffffffff8139932b>] dump_stack+0x4d/0x72
[    2.079426]  [<ffffffff8112e57c>] __warn+0xcc/0xf0
[    2.081325]  [<ffffffff8112e5ef>] warn_slowpath_fmt+0x4f/0x60
[    2.083212]  [<ffffffff813ad5e5>] ? find_next_bit+0x15/0x20
[    2.085022]  [<ffffffff8139914f>] ? cpumask_next_and+0x2f/0x40
[    2.086696]  [<ffffffff81188a93>] mod_timer+0x233/0x240
[    2.088362]  [<ffffffff815fff02>] usb_hcd_submit_urb+0x3f2/0x8c0
[    2.090026]  [<ffffffff81601dc4>] ? urb_destroy+0x24/0x30
[    2.091698]  [<ffffffff81142ba8>] ? insert_work+0x58/0xb0
[    2.093349]  [<ffffffff81602297>] usb_submit_urb+0x287/0x530
[    2.094985]  [<ffffffff815f986d>] hub_activate+0x1fd/0x5d0
[    2.096625]  [<ffffffff81150188>] ? finish_task_switch+0x78/0x1f0
[    2.098268]  [<ffffffff815f9cca>] hub_init_func3+0x1a/0x20
[    2.099908]  [<ffffffff811438e0>] process_one_work+0x140/0x3e0
[    2.101539]  [<ffffffff81143bce>] worker_thread+0x4e/0x480
[    2.103173]  [<ffffffff81143b80>] ? process_one_work+0x3e0/0x3e0
[    2.104790]  [<ffffffff81143b80>] ? process_one_work+0x3e0/0x3e0
[    2.106259]  [<ffffffff81149829>] kthread+0xc9/0xe0
[    2.107731]  [<ffffffff81856152>] ret_from_fork+0x22/0x40
[    2.109215]  [<ffffffff81149760>] ? __kthread_parkme+0x70/0x70
[    2.110704] ---[ end trace 3519886a1a990d99 ]---

mod_timer is called from over a thousand places. Should timers always
expire in the future?

Re: [PATCH] fbcon: use default if cursor blink interval is not valid

From: David Daney <hidden>
Date: 2016-05-19 16:13:34

On 05/18/2016 09:21 PM, Scot Doyle wrote:
Two current [1] and three previous [2] systems locked during boot
because the cursor flash timer was set using an ops->cur_blink_jiffies
value of 0. Previous patches attempted to solve the problem by moving
variable initialization earlier in the setup sequence [2].

Use the normal cursor blink default interval of 200 ms if
ops->cur_blink_jiffies is not in the range specified in commit
bd63364caa8d. Since invalid values are not used, specific system
initialization timings should not cause lockups.
This patch just papers over the problem that you yourself introduced in 
commit bd63364caa8d ("vt: add cursor blink interval escape sequence").

As you know, I have a patch that fixes the problem at the source:
https://lkml.org/lkml/2016/5/17/455

I don't like the idea of silently ignoring bad values passed in from 
other code (drivers/tty/vt/vt.c), and much less doing the check for bad 
values each time the timer expires rather than just once, where the bad 
value is first introduced.

I think it would be preferable to WARN() at the site the bad value is 
introduced, so that we can easily find the real source of the problem. 
Initialize cur_blink_jiffies to a sane default value, then if something 
attempts to set it to a value that would cause soft lockup, WARN and 
refuse to change it.

Also there is a stylistic issue...

quoted hunk
[1] https://bugs.launchpad.net/bugs/1574814
[2] see commits: 2a17d7e80f1d, f235f664a8af, a1e533ec07d5

Signed-off-by: Scot Doyle <redacted>
Cc: <redacted> [v4.2]
---
  drivers/video/console/fbcon.c | 17 +++++++++++++----
  1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c
index 6e92917..da61d87 100644
--- a/drivers/video/console/fbcon.c
+++ b/drivers/video/console/fbcon.c
@@ -396,13 +396,23 @@ static void fb_flashcursor(struct work_struct *work)
  	console_unlock();
  }

+static int cursor_blink_jiffies(int candidate)
+{
+	if (candidate >= msecs_to_jiffies(50) &&
+	    candidate <= msecs_to_jiffies(USHRT_MAX))
+		return candidate;
+	else
+		return HZ / 5;
You use msecs_to_jiffies() is several places, then here open code the 
division.  Please use  msecs_to_jiffies(), that is it's intended job.

quoted hunk
+}
+
  static void cursor_timer_handler(unsigned long dev_addr)
  {
  	struct fb_info *info = (struct fb_info *) dev_addr;
  	struct fbcon_ops *ops = info->fbcon_par;

  	queue_work(system_power_efficient_wq, &info->queue);
-	mod_timer(&ops->cursor_timer, jiffies + ops->cur_blink_jiffies);
+	mod_timer(&ops->cursor_timer, jiffies +
+	    cursor_blink_jiffies(ops->cur_blink_jiffies));
  }

  static void fbcon_add_cursor_timer(struct fb_info *info)
@@ -417,7 +427,8 @@ static void fbcon_add_cursor_timer(struct fb_info *info)

  		init_timer(&ops->cursor_timer);
  		ops->cursor_timer.function = cursor_timer_handler;
-		ops->cursor_timer.expires = jiffies + ops->cur_blink_jiffies;
+		ops->cursor_timer.expires = jiffies +
+		    cursor_blink_jiffies(ops->cur_blink_jiffies);
  		ops->cursor_timer.data = (unsigned long ) info;
  		add_timer(&ops->cursor_timer);
  		ops->flags |= FBCON_FLAGS_CURSOR_TIMER;
@@ -709,7 +720,6 @@ static int con2fb_acquire_newinfo(struct vc_data *vc, struct fb_info *info,
  	}

  	if (!err) {
-		ops->cur_blink_jiffies = HZ / 5;
  		info->fbcon_par = ops;

  		if (vc)
@@ -957,7 +967,6 @@ static const char *fbcon_startup(void)
  	ops->currcon = -1;
  	ops->graphics = 1;
  	ops->cur_rotate = -1;
-	ops->cur_blink_jiffies = HZ / 5;
  	info->fbcon_par = ops;
  	p->con_rotate = initial_rotation;
  	set_blitting_type(vc, info);

Re: [PATCH] fbcon: use default if cursor blink interval is not valid

From: Scot Doyle <hidden>
Date: 2016-05-19 22:26:10

On Thu, 19 May 2016, David Daney wrote:
On 05/18/2016 09:21 PM, Scot Doyle wrote:
quoted
Two current [1] and three previous [2] systems locked during boot
because the cursor flash timer was set using an ops->cur_blink_jiffies
value of 0. Previous patches attempted to solve the problem by moving
variable initialization earlier in the setup sequence [2].

Use the normal cursor blink default interval of 200 ms if
ops->cur_blink_jiffies is not in the range specified in commit
bd63364caa8d. Since invalid values are not used, specific system
initialization timings should not cause lockups.
This patch just papers over the problem that you yourself introduced in commit
bd63364caa8d ("vt: add cursor blink interval escape sequence").

As you know, I have a patch that fixes the problem at the source:
https://lkml.org/lkml/2016/5/17/455

I don't like the idea of silently ignoring bad values passed in from other
code (drivers/tty/vt/vt.c), and much less doing the check for bad values each
time the timer expires rather than just once, where the bad value is first
introduced.

I think it would be preferable to WARN() at the site the bad value is
introduced, so that we can easily find the real source of the problem.
Initialize cur_blink_jiffies to a sane default value, then if something
attempts to set it to a value that would cause soft lockup, WARN and refuse to
change it.
I agree this approach would be cleaner and am willing to give it a try
by submitting an alternative patch and ack'ing yours. Thanks for taking 
the time to critique my proposal.

[PATCH] fbcon: warn on invalid cursor blink intervals

From: Scot Doyle <hidden>
Date: 2016-05-19 22:31:50

Two systems are locking on boot [1] because ops->cur_blink_jiffies
is set to zero from vc->vc_cur_blink_ms.

Ignore such invalid intervals and log a warning.

[1] https://bugs.launchpad.net/bugs/1574814

Suggested-by: David Daney <redacted>
Signed-off-by: Scot Doyle <redacted>
Cc: <redacted> [v4.2]
---
 drivers/video/console/fbcon.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c
index 6e92917..fad5b89 100644
--- a/drivers/video/console/fbcon.c
+++ b/drivers/video/console/fbcon.c
@@ -1095,7 +1095,13 @@ static void fbcon_init(struct vc_data *vc, int init)
 		con_copy_unimap(vc, svc);
 
 	ops = info->fbcon_par;
-	ops->cur_blink_jiffies = msecs_to_jiffies(vc->vc_cur_blink_ms);
+
+	if (vc->vc_cur_blink_ms >= 50)
+		ops->cur_blink_jiffies +		    msecs_to_jiffies(vc->vc_cur_blink_ms);
+	else
+		WARN_ONCE(1, "blink interval < 50 ms");
+
 	p->con_rotate = initial_rotation;
 	set_blitting_type(vc, info);
 
@@ -1309,7 +1315,11 @@ static void fbcon_cursor(struct vc_data *vc, int mode)
 	int y;
  	int c = scr_readw((u16 *) vc->vc_pos);
 
-	ops->cur_blink_jiffies = msecs_to_jiffies(vc->vc_cur_blink_ms);
+	if (vc->vc_cur_blink_ms >= 50)
+		ops->cur_blink_jiffies +		    msecs_to_jiffies(vc->vc_cur_blink_ms);
+	else
+		WARN_ONCE(1, "blink interval < 50 ms");
 
 	if (fbcon_is_inactive(vc, info) || vc->vc_deccm != 1)
 		return;
-- 
2.1.4

Re: [PATCH] fbcon: warn on invalid cursor blink intervals

From: David Daney <hidden>
Date: 2016-05-19 22:50:20

On 05/19/2016 03:31 PM, Scot Doyle wrote:
Two systems are locking on boot [1] because ops->cur_blink_jiffies
is set to zero from vc->vc_cur_blink_ms.

Ignore such invalid intervals and log a warning.

[1] https://bugs.launchpad.net/bugs/1574814

Suggested-by: David Daney <redacted>
Signed-off-by: Scot Doyle <redacted>
Cc: <redacted> [v4.2]
This seems better. I didn't test it, but...

Acked-by: David Daney <redacted>

quoted hunk
---
  drivers/video/console/fbcon.c | 14 ++++++++++++--
  1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c
index 6e92917..fad5b89 100644
--- a/drivers/video/console/fbcon.c
+++ b/drivers/video/console/fbcon.c
@@ -1095,7 +1095,13 @@ static void fbcon_init(struct vc_data *vc, int init)
  		con_copy_unimap(vc, svc);

  	ops = info->fbcon_par;
-	ops->cur_blink_jiffies = msecs_to_jiffies(vc->vc_cur_blink_ms);
+
+	if (vc->vc_cur_blink_ms >= 50)
+		ops->cur_blink_jiffies > +		    msecs_to_jiffies(vc->vc_cur_blink_ms);
+	else
+		WARN_ONCE(1, "blink interval < 50 ms");
+
  	p->con_rotate = initial_rotation;
  	set_blitting_type(vc, info);
@@ -1309,7 +1315,11 @@ static void fbcon_cursor(struct vc_data *vc, int mode)
  	int y;
   	int c = scr_readw((u16 *) vc->vc_pos);

-	ops->cur_blink_jiffies = msecs_to_jiffies(vc->vc_cur_blink_ms);
+	if (vc->vc_cur_blink_ms >= 50)
+		ops->cur_blink_jiffies > +		    msecs_to_jiffies(vc->vc_cur_blink_ms);
+	else
+		WARN_ONCE(1, "blink interval < 50 ms");

  	if (fbcon_is_inactive(vc, info) || vc->vc_deccm != 1)
  		return;

Re: [PATCH] fbcon: warn on invalid cursor blink intervals

From: Jeremy Kerr <jk@ozlabs.org>
Date: 2016-05-20 01:22:08

Hi Scot,
Two systems are locking on boot [1] because ops->cur_blink_jiffies
is set to zero from vc->vc_cur_blink_ms.

Ignore such invalid intervals and log a warning.
This prevents a lockup on AST BMC machines, but (as expected) generates
a warning against the fbcon driver, which is a significantly better
result.

Tested-by: Jeremy Kerr <jk@ozlabs.org>

[now to sort out the issue in the ast driver...]

Cheers,


Jeremy

Re: [PATCH] fbcon: warn on invalid cursor blink intervals

From: Ming Lei <hidden>
Date: 2016-05-20 02:17:13

On Fri, May 20, 2016 at 6:31 AM, Scot Doyle [off-list ref] wrote:
Two systems are locking on boot [1] because ops->cur_blink_jiffies
is set to zero from vc->vc_cur_blink_ms.

Ignore such invalid intervals and log a warning.

[1] https://bugs.launchpad.net/bugs/1574814

Suggested-by: David Daney <redacted>
Signed-off-by: Scot Doyle <redacted>
Cc: <redacted> [v4.2]
Not sure this one is needed for stable because it justs dumps
a warning, and not set a valid period to ops->cur_blink_jiffies.

So I guess other fix patch is still required for the soft lockup issue, right?

Thanks,
quoted hunk
---
 drivers/video/console/fbcon.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c
index 6e92917..fad5b89 100644
--- a/drivers/video/console/fbcon.c
+++ b/drivers/video/console/fbcon.c
@@ -1095,7 +1095,13 @@ static void fbcon_init(struct vc_data *vc, int init)
                con_copy_unimap(vc, svc);

        ops = info->fbcon_par;
-       ops->cur_blink_jiffies = msecs_to_jiffies(vc->vc_cur_blink_ms);
+
+       if (vc->vc_cur_blink_ms >= 50)
+               ops->cur_blink_jiffies > +                   msecs_to_jiffies(vc->vc_cur_blink_ms);
+       else
+               WARN_ONCE(1, "blink interval < 50 ms");
+
        p->con_rotate = initial_rotation;
        set_blitting_type(vc, info);
@@ -1309,7 +1315,11 @@ static void fbcon_cursor(struct vc_data *vc, int mode)
        int y;
        int c = scr_readw((u16 *) vc->vc_pos);

-       ops->cur_blink_jiffies = msecs_to_jiffies(vc->vc_cur_blink_ms);
+       if (vc->vc_cur_blink_ms >= 50)
+               ops->cur_blink_jiffies > +                   msecs_to_jiffies(vc->vc_cur_blink_ms);
+       else
+               WARN_ONCE(1, "blink interval < 50 ms");

        if (fbcon_is_inactive(vc, info) || vc->vc_deccm != 1)
                return;
--
2.1.4

Re: [PATCH] fbcon: warn on invalid cursor blink intervals

From: Jeremy Kerr <jk@ozlabs.org>
Date: 2016-05-20 02:26:29

Hi Ming,
Not sure this one is needed for stable because it justs dumps
a warning, and not set a valid period to ops->cur_blink_jiffies.

So I guess other fix patch is still required for the soft lockup
issue, right?
The main thing is that we don't set cur_blink_jiffies to the < 50ms
value. As far as I can tell, it means we'll still get the original
default, set in fbcon_startup():

	ops->cur_blink_jiffies = HZ / 5;

And so don't end up spinning on the timer expiry.

Cheers,


Jeremy

Re: [PATCH] fbcon: warn on invalid cursor blink intervals

From: Ming Lei <hidden>
Date: 2016-05-20 02:48:19

On Fri, May 20, 2016 at 10:26 AM, Jeremy Kerr [off-list ref] wrote:
Hi Ming,
quoted
Not sure this one is needed for stable because it justs dumps
a warning, and not set a valid period to ops->cur_blink_jiffies.

So I guess other fix patch is still required for the soft lockup
issue, right?
The main thing is that we don't set cur_blink_jiffies to the < 50ms
value. As far as I can tell, it means we'll still get the original
default, set in fbcon_startup():

        ops->cur_blink_jiffies = HZ / 5;

And so don't end up spinning on the timer expiry.
Jeremy, your theory is correct, thanks for your clarification! And my test
just shows that this patch does fix the soft lockup too, so

      Tested-by: Ming Lei [off-list ref]

Then looks there are two fix patches acked & tested:

     - the patch in this thread
     - another one "[PATCH] tty: vt: Fix soft lockup in fbcon cursor
blink timer."
     https://lkml.org/lkml/2016/5/17/455

So which one will be pushed to linus?

Thanks,
Ming
Cheers,


Jeremy

Re: [PATCH] fbcon: warn on invalid cursor blink intervals

From: Jeremy Kerr <jk@ozlabs.org>
Date: 2016-05-20 05:04:43

Hi Ming,
Then looks there are two fix patches acked & tested:

- the patch in this thread
- another one "[PATCH] tty: vt: Fix soft lockup in fbcon cursor
blink timer."
https://lkml.org/lkml/2016/5/17/455

So which one will be pushed to linus?
Not that it's my call, but we may want both; the first as a safety
measure to prevent an invalid cur_blink_jiffies ever being set, and the
second one to actually fix the initialisation of vc_cur_blink_ms (and
address the warning introduced by the first).

I guess we could just go with the latter for stable...

Cheers,


Jeremy

Re: [PATCH] fbcon: warn on invalid cursor blink intervals

From: Scot Doyle <hidden>
Date: 2016-05-20 16:27:48

On Fri, 20 May 2016, Jeremy Kerr wrote:
Hi Ming,
quoted
Then looks there are two fix patches acked & tested:

- the patch in this thread
- another one "[PATCH] tty: vt: Fix soft lockup in fbcon cursor
blink timer."
https://lkml.org/lkml/2016/5/17/455

So which one will be pushed to linus?
Not that it's my call, but we may want both; the first as a safety
measure to prevent an invalid cur_blink_jiffies ever being set, and the
second one to actually fix the initialisation of vc_cur_blink_ms (and
address the warning introduced by the first).
Tomi / Greg,

I'd suggest
- applying "tty: vt: Fix soft lockup in fbcon cursor blink timer." to 4.7 and stable[4.2]
- applying "fbcon: warn on invalid cursor blink intervals" to 4.7
- ignoring "fbcon: use default if cursor blink interval is not valid"

Note: the patches don't depend on each other

I guess we could just go with the latter for stable...

Cheers,

Jeremy

Re: [PATCH] fbcon: warn on invalid cursor blink intervals

From: Scot Doyle <hidden>
Date: 2016-05-24 01:20:07

On Fri, 20 May 2016, Scot Doyle wrote:
On Fri, 20 May 2016, Jeremy Kerr wrote:
quoted
Hi Ming,
quoted
Then looks there are two fix patches acked & tested:

- the patch in this thread
- another one "[PATCH] tty: vt: Fix soft lockup in fbcon cursor
blink timer."
https://lkml.org/lkml/2016/5/17/455

So which one will be pushed to linus?
Not that it's my call, but we may want both; the first as a safety
measure to prevent an invalid cur_blink_jiffies ever being set, and the
second one to actually fix the initialisation of vc_cur_blink_ms (and
address the warning introduced by the first).
Tomi / Greg,

I'd suggest
- applying "tty: vt: Fix soft lockup in fbcon cursor blink timer." to 4.7 and stable[4.2]
- applying "fbcon: warn on invalid cursor blink intervals" to 4.7
- ignoring "fbcon: use default if cursor blink interval is not valid"

Note: the patches don't depend on each other
"tty: vt: Fix soft lockup..." should be applied first in order to avoid 
unnecessary reports due to the log warning in "fbcon: warn on invalid..."
quoted
I guess we could just go with the latter for stable...

Cheers,

Jeremy

Re: [PATCH] fbcon: warn on invalid cursor blink intervals

From: Henrique de Moraes Holschuh <hmh@hmh.eng.br>
Date: 2016-05-28 11:45:22

On Thu, 19 May 2016, Scot Doyle wrote:
Two systems are locking on boot [1] because ops->cur_blink_jiffies
is set to zero from vc->vc_cur_blink_ms.

Ignore such invalid intervals and log a warning.

[1] https://bugs.launchpad.net/bugs/1574814

Suggested-by: David Daney <redacted>
Signed-off-by: Scot Doyle <redacted>
Cc: <redacted> [v4.2]
FWIW:
Tested-by: Henrique de Moraes Holschuh <hmh@hmh.eng.br> on top of 4.4.11.

And nothing caused it to issue warnings here, so far (with the other
recommended patch applied first).
quoted hunk
---
 drivers/video/console/fbcon.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c
index 6e92917..fad5b89 100644
--- a/drivers/video/console/fbcon.c
+++ b/drivers/video/console/fbcon.c
@@ -1095,7 +1095,13 @@ static void fbcon_init(struct vc_data *vc, int init)
 		con_copy_unimap(vc, svc);
 
 	ops = info->fbcon_par;
-	ops->cur_blink_jiffies = msecs_to_jiffies(vc->vc_cur_blink_ms);
+
+	if (vc->vc_cur_blink_ms >= 50)
+		ops->cur_blink_jiffies > +		    msecs_to_jiffies(vc->vc_cur_blink_ms);
+	else
+		WARN_ONCE(1, "blink interval < 50 ms");
+
 	p->con_rotate = initial_rotation;
 	set_blitting_type(vc, info);
 
@@ -1309,7 +1315,11 @@ static void fbcon_cursor(struct vc_data *vc, int mode)
 	int y;
  	int c = scr_readw((u16 *) vc->vc_pos);
 
-	ops->cur_blink_jiffies = msecs_to_jiffies(vc->vc_cur_blink_ms);
+	if (vc->vc_cur_blink_ms >= 50)
+		ops->cur_blink_jiffies > +		    msecs_to_jiffies(vc->vc_cur_blink_ms);
+	else
+		WARN_ONCE(1, "blink interval < 50 ms");
 
 	if (fbcon_is_inactive(vc, info) || vc->vc_deccm != 1)
 		return;
-- 
  "One disk to rule them all, One disk to find them. One disk to bring
  them all and in the darkness grind them. In the Land of Redmond
  where the shadows lie." -- The Silicon Valley Tarot
  Henrique Holschuh

Re: [PATCH] fbcon: warn on invalid cursor blink intervals

From: Henrique de Moraes Holschuh <hmh@hmh.eng.br>
Date: 2016-05-28 11:48:54

On Fri, 20 May 2016, Scot Doyle wrote:
On Fri, 20 May 2016, Jeremy Kerr wrote:
quoted
quoted
Then looks there are two fix patches acked & tested:

- the patch in this thread
- another one "[PATCH] tty: vt: Fix soft lockup in fbcon cursor
blink timer."
https://lkml.org/lkml/2016/5/17/455

So which one will be pushed to linus?
Not that it's my call, but we may want both; the first as a safety
measure to prevent an invalid cur_blink_jiffies ever being set, and the
second one to actually fix the initialisation of vc_cur_blink_ms (and
address the warning introduced by the first).
Tomi / Greg,

I'd suggest
- applying "tty: vt: Fix soft lockup in fbcon cursor blink timer." to 4.7 and stable[4.2]
- applying "fbcon: warn on invalid cursor blink intervals" to 4.7
- ignoring "fbcon: use default if cursor blink interval is not valid"

Note: the patches don't depend on each other
I applied both recommended patches on top of 4.4.11 for testing, and they
made things a lot better here.

I suggest the second patch should be backported to stable too, might as well
fix this thing for good *and keep the door closed*.

-- 
  "One disk to rule them all, One disk to find them. One disk to bring
  them all and in the darkness grind them. In the Land of Redmond
  where the shadows lie." -- The Silicon Valley Tarot
  Henrique Holschuh

RE: [PATCH] fbcon: warn on invalid cursor blink intervals

From: Chintakuntla, Radha <hidden>
Date: 2016-06-12 05:39:34

-----Original Message-----
From: Henrique de Moraes Holschuh [mailto:hmh@hmh.eng.br]
Sent: Saturday, May 28, 2016 4:49 AM
To: Scot Doyle <redacted>
Cc: Tomi Valkeinen <redacted>; Jean-Christophe Plagniol-
Villard [off-list ref]; Greg Kroah-Hartman
[off-list ref]; Jeremy Kerr [off-list ref]; Ming Lei
[off-list ref]; Daney, David [off-list ref];
Dann Frazier [off-list ref]; Peter Hurley
[off-list ref]; Pavel Machek [off-list ref]; Jonathan Liu
[off-list ref]; Alistair Popple [off-list ref]; Jean-Philippe
Brucker [off-list ref]; Chintakuntla, Radha
[off-list ref]; Jiri Slaby [off-list ref]; David
Airlie [off-list ref]; David Daney [off-list ref]; dri-
devel@lists.freedesktop.org; linux-fbdev@vger.kernel.org; Linux Kernel
Mailing List [off-list ref]; stable
[off-list ref]
Subject: Re: [PATCH] fbcon: warn on invalid cursor blink intervals

On Fri, 20 May 2016, Scot Doyle wrote:
quoted
On Fri, 20 May 2016, Jeremy Kerr wrote:
quoted
quoted
Then looks there are two fix patches acked & tested:

- the patch in this thread
- another one "[PATCH] tty: vt: Fix soft lockup in fbcon cursor
blink timer."
https://lkml.org/lkml/2016/5/17/455

So which one will be pushed to linus?
Not that it's my call, but we may want both; the first as a safety
measure to prevent an invalid cur_blink_jiffies ever being set, and the
second one to actually fix the initialisation of vc_cur_blink_ms (and
address the warning introduced by the first).
Tomi / Greg,

I'd suggest
- applying "tty: vt: Fix soft lockup in fbcon cursor blink timer." to 4.7 and
stable[4.2]
quoted
- applying "fbcon: warn on invalid cursor blink intervals" to 4.7
- ignoring "fbcon: use default if cursor blink interval is not valid"

Note: the patches don't depend on each other
I applied both recommended patches on top of 4.4.11 for testing, and they
made things a lot better here.

I suggest the second patch should be backported to stable too, might as well
fix this thing for good *and keep the door closed*.
Is this patch available on some tree so that I can point to ?
And hope it will make it to linux-next soon ?
quoted hunk

--
  "One disk to rule them all, One disk to find them. One disk to bring
  them all and in the darkness grind them. In the Land of Redmond
  where the shadows lie." -- The Silicon Valley Tarot
  Henrique Holschuh
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help