On Sun, 31 Mar 2019, Mikulas Patocka wrote:
On Sat, 30 Mar 2019, Mikulas Patocka wrote:
Hi
The patch a6dbe442755999960ca54a9b8ecfd9606be0ea75 ("vt: perform safe console erase in the right order") introduces a bug.
drivers/tty/vt/vt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Index: linux-5.0.5/drivers/tty/vt/vt.c
--- linux-5.0.5.orig/drivers/tty/vt/vt.c 2019-03-30 19:29:26.000000000 +0100 +++ linux-5.0.5/drivers/tty/vt/vt.c 2019-03-30 19:30:50.000000000 +0100 @@ -1518,7 +1518,7 @@ static void csi_J(struct vc_data *vc, in return; } scr_memsetw(start, vc->vc_video_erase_char, 2 * count);
- update_region(vc, (unsigned long) start, count);
- do_update_region(vc, (unsigned long) start, count);
^^^^ this is wrong too - it will clear the screen if \e[2J is printed on inactive console. We need to use con_should_update(vc), just like it was before:
The patch a6dbe442755999960ca54a9b8ecfd9606be0ea75 ("vt: perform safe console erase in the right order") introduces a bug.
In order to reproduce the bug
- use framebuffer console with the AMDGPU driver
- type "links" to start the console www browser
- press 'q' and space to exit links
--- now, the cursor line will be permanently visible in the center of the screen. It will stay there until something overwrites it.
Before the patch, there was a call to do_update_region, the patch changes it to update_region - and this seems to cause the bug with the cursor.
The bug goes away if we change update_region back to do_update_region.
Signed-off-by: Mikulas Patocka mpatocka@redhat.com Cc: stable@vger.kernel.org Fixes: a6dbe4427559 ("vt: perform safe console erase in the right order")
The code in update_region(() does call do_update_region() conditionally on con_should_update(vc).
But it does a set_cursor(vc) too which is the problem. So for the patch below:
Acked-by: Nicolas Pitre nico@fluxnic.net
However there is another unconditional call to do_update_region() in do_con_trol() (see case EShash) which might require a separate fix.
drivers/tty/vt/vt.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
Index: linux-5.0.5/drivers/tty/vt/vt.c
--- linux-5.0.5.orig/drivers/tty/vt/vt.c 2019-03-30 19:29:26.000000000 +0100 +++ linux-5.0.5/drivers/tty/vt/vt.c 2019-03-31 13:06:24.000000000 +0200 @@ -1518,7 +1518,8 @@ static void csi_J(struct vc_data *vc, in return; } scr_memsetw(start, vc->vc_video_erase_char, 2 * count);
- update_region(vc, (unsigned long) start, count);
- if (con_should_update(vc))
do_update_region(vc, (unsigned long) start, count);
vc->vc_need_wrap = 0; }