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.w...@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.w...@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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/wayland-devel _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel