Konstantin Belousov <kostik...@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
_______________________________________________
freebsd-stable@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-stable
To unsubscribe, send any mail to "freebsd-stable-unsubscr...@freebsd.org"

Reply via email to