bug fix inactive encoder when weston restart

Wang, Quanxian quanxian.wang at intel.com
Mon Jul 30 18:46:50 PDT 2012


Thanks for your review and your changes.

> -----Original Message-----
> From: Kristian Høgsberg [mailto:hoegsberg at gmail.com]
> Sent: Tuesday, July 31, 2012 6:15 AM
> To: Wang, Quanxian
> Cc: wayland-devel at lists.freedesktop.org
> Subject: Re: bug fix inactive encoder when weston restart
> 
> On Thu, Jul 26, 2012 at 08:03:26PM +0000, Wang, Quanxian wrote:
> > Hi, All
> >
> > Please help review the patch.
> >
> > Thanks
> >
> > Background:
> > If we use 'pkill -9 weston', when restart weston, weston could not get the
> active encoder attached on connector and exit abnormally.
> > This is because when weston is pkilled, drm cleanups the encoders attached
> to active connector in KMS.
> > This patch will ignore the active encode checking, weston has the ability to
> re-initialize encoder and reattached it into connector.
> 
> Good catch.  We don't handle connectors that aren't attached to a crtc, which
> happens in your case above, but also just when hotplugging a monitor.  I
> applied your patch with a few changes, mostly to deal with how we don't have
> the built-in mode.  We now just exit if we don't find any modes to the output.
> 
> Kristian
> 
> > commit 7f991195c20d9dd57e14faf88cd36db0c77df424
> > Author: Wang Quanxian <quanxian.wang at intel.com>
> > Date:   Thu Jul 19 19:11:04 2012 +0800
> >     User sends SIGKILL to weston, KMS will clean up encoder
> >     attached with connector. When weston restarts again, it causes
> >     exit of weston because no active encoder is attached to connector.
> >     This patch will ignore the checking and weston will initialize
> >     encoder again and re-attach it to connector in the following process.
> >
> >     Sign-Off-By Quanxian Wang <quanxian.wang at intel.com>
> >
> > diff --git a/src/compositor-drm.c b/src/compositor-drm.c index
> > 47cd512..bb1b138 100644
> > --- a/src/compositor-drm.c
> > +++ b/src/compositor-drm.c
> > @@ -1348,26 +1348,28 @@ create_output_for_connector(struct
> drm_compositor *ec,
> >         /* Get the current mode on the crtc that's currently driving
> >          * this connector. */
> >         encoder = drmModeGetEncoder(ec->drm.fd,
> connector->encoder_id);
> > -       if (encoder == NULL)
> > -               goto err_free;
> > -       crtc = drmModeGetCrtc(ec->drm.fd, encoder->crtc_id);
> > -       drmModeFreeEncoder(encoder);
> > -       if (crtc == NULL)
> > -               goto err_free;
> > -
> > -       /* if don't get mode from drm driver, use default 800x480 */
> > -        if (crtc->mode.clock != 0)
> > -       {
> > +       if (encoder != NULL)
> > +        {
> > +               crtc = drmModeGetCrtc(ec->drm.fd, encoder->crtc_id);
> > +               drmModeFreeEncoder(encoder);
> > +               if (crtc == NULL)
> > +                       goto err_free;
> >                 crtc_mode = crtc->mode;
> > -       } else {
> > +               drmModeFreeCrtc(crtc);
> > +       }
> > +       /*
> > +        * No actiave encoder is connected with the connector
> > +        * If connector has no mode available, takes detault mode
> > +        * Or takes the first mode from connector
> > +        */
> > +       if (encoder == NULL || crtc_mode.clock == 0)
> > +        {
> >                 if (connector->count_modes == 0)
> >                         crtc_mode = builtin_800x480;
> >                 else
> >                         crtc_mode = connector->modes[0];
> >         }
> >
> > -       drmModeFreeCrtc(crtc);
> > -
> >         if (connector->count_modes == 0) {
> >                 ret = drm_output_add_mode(output, &crtc_mode);
> >                 if (ret)
> >
> >
> > Thanks
> >
> > Quanxian Wang
> >
> >
> 
> 
> > _______________________________________________
> > wayland-devel mailing list
> > wayland-devel at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/wayland-devel



More information about the wayland-devel mailing list