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@xxxxxxxxxx> > Cc: stable@xxxxxxxxxxxxxxx > 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@xxxxxxxxxxx> 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; > } > >