Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 21 Jun 2013 01:55:02 +0200
From:      Bengt Ahlgren <bengta@sics.se>
To:        Konstantin Belousov <kostikbel@gmail.com>
Cc:        Michiel Boland <boland37@xs4all.nl>, FreeBSD Stable <freebsd-stable@freebsd.org>
Subject:   Re: system sporadically hangs on shutdown after switching to WITH_NEW_XORG
Message-ID:  <uh7obb0tk15.fsf@P142.sics.se>
In-Reply-To: <20130617193726.GR91021@kib.kiev.ua> (Konstantin Belousov's message of "Mon, 17 Jun 2013 22:37:26 %2B0300")
References:  <51BDD593.5000102@xs4all.nl> <51BF60A8.6000503@xs4all.nl> <20130617193726.GR91021@kib.kiev.ua>

next in thread | previous in thread | raw e-mail | index | archive | help
Konstantin Belousov <kostikbel@gmail.com> writes:

> On Mon, Jun 17, 2013 at 09:16:56PM +0200, Michiel Boland wrote:
>> On 06/16/2013 17:11, Michiel Boland wrote:
>> > Hi. Recently I switched to WITH_NEW_XORG, primarily because the
>> > stock X server
>> > with Intel driver has some issues that make it unusable for me.
>> >
>> > The new X server and Intel driver works extremely well, so kudos
>> > to whoever made
>> > this possible.
>> >
>> > Unfortunately, I am now experiencing random hangs on shutdown. On
>> > shutdown the
>> > system randomly freezes after
>> >
>> > [...] syslogd: exiting on signal 15
>> >
>> > I would then expect to see 'Waiting (max 60 seconds) for system
>> > process 'XXX' to
>> > stop messages, but these never arrive.
>> 
>> So it turns out that init hangs because vga_txtmouse (draw_txtmouse in fact) is 
>> hogging the clock swi. The routine is waiting for a vertical retrace which never 
>> arrives. (The new intel driver can't return to text console, so the screen just 
>> goes blank when X exits.)
>> 
>> Some workarounds:
>> 
>> - don't run moused (i.e. disable it in rc.conf and devd.conf)
>>    instead run the X server in combination with hald
>> 
>> - do run moused, but then either
>> 
>>   - unplug the mouse before shutting down
>> 
>>    - build a kernel with VGA_NO_FONT_LOADING
>> 
>> Of course the long-term fix is to remove the possibly infinite loop in 
>> draw_txtmouse.
>> 
>> Thanks to Konstantin for his patience in helping me track this down.
>
> The following patch, although a hack, should fix the issue.
> Michiel tested it.
>
> diff --git a/sys/dev/drm2/i915/intel_fb.c b/sys/dev/drm2/i915/intel_fb.c
> index 3cb3b78..e41a49f 100644
> --- a/sys/dev/drm2/i915/intel_fb.c
> +++ b/sys/dev/drm2/i915/intel_fb.c
> @@ -207,6 +207,8 @@ static void intel_fbdev_destroy(struct drm_device *dev,
>  	}
>  }
>  
> +extern int sc_txtmouse_no_retrace_wait;
> +
>  int intel_fbdev_init(struct drm_device *dev)
>  {
>  	struct intel_fbdev *ifbdev;
> @@ -229,6 +231,7 @@ int intel_fbdev_init(struct drm_device *dev)
>  
>  	drm_fb_helper_single_add_all_connectors(&ifbdev->helper);
>  	drm_fb_helper_initial_config(&ifbdev->helper, 32);
> +	sc_txtmouse_no_retrace_wait = 1;
>  	return 0;
>  }
>  
> diff --git a/sys/dev/syscons/scvgarndr.c b/sys/dev/syscons/scvgarndr.c
> index 6e6663c..fc7f02f 100644
> --- a/sys/dev/syscons/scvgarndr.c
> +++ b/sys/dev/syscons/scvgarndr.c
> @@ -395,6 +395,8 @@ vga_txtblink(scr_stat *scp, int at, int flip)
>  {
>  }
>  
> +int sc_txtmouse_no_retrace_wait;
> +
>  #ifndef SC_NO_CUTPASTE
>  
>  static void
> @@ -445,7 +447,9 @@ draw_txtmouse(scr_stat *scp, int x, int y)
>  #if 1
>  	/* wait for vertical retrace to avoid jitter on some videocards */
>  	crtc_addr = scp->sc->adp->va_crtc_addr;
> -	while (!(inb(crtc_addr + 6) & 0x08)) /* idle */ ;
> +	while (!sc_txtmouse_no_retrace_wait &&
> +	    !(inb(crtc_addr + 6) & 0x08))
> +		/* idle */ ;
>  #endif
>  	c = scp->sc->mouse_char;
>  	vidd_load_font(scp->sc->adp, 0, 32, 8, font_buf, c, 4); 

This patch fixes the shutdown hangs after KMS is initialised for me (on
a Thinkpad X201 w recent 9-STABLE)!  Thanks!

9.1-REL does not hang, however.  Don't know whether this is interesting,
but I bisected 9-STABLE to find out where the problem started (kernel
only together with 9.1-REL userland).  9-STABLE up to and including
r246775 works as it should, but starting with r246785, it hangs on
shutdown.  See (yes, it is mouse related!):

http://svnweb.freebsd.org/base?view=revision&revision=246785

Just to be clear: These hangs _only_ occur if KMS gets initialised.
When testing this, I booted, started kdm, and then chose shutdown in the
kdm menu.  moused was running.

Bengt



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?uh7obb0tk15.fsf>