bug fix inactive encoder when weston restart

Wang, Quanxian quanxian.wang at intel.com
Thu Jul 26 13:03:26 PDT 2012


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.

===
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


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/wayland-devel/attachments/20120726/e3204aaf/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: bug_fix_for_previous_inactive_encoder.patch
Type: application/octet-stream
Size: 1889 bytes
Desc: bug_fix_for_previous_inactive_encoder.patch
URL: <http://lists.freedesktop.org/archives/wayland-devel/attachments/20120726/e3204aaf/attachment-0001.obj>


More information about the wayland-devel mailing list