xserver: Branch 'master' - 3 commits

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Aug 9 09:02:13 UTC 2019


 hw/xfree86/drivers/modesetting/dri2.c            |    3 +-
 hw/xfree86/drivers/modesetting/driver.h          |    3 +-
 hw/xfree86/drivers/modesetting/drmmode_display.h |    1 
 hw/xfree86/drivers/modesetting/pageflip.c        |   25 +++++++++++++++++------
 hw/xfree86/drivers/modesetting/present.c         |   10 ++++-----
 5 files changed, 29 insertions(+), 13 deletions(-)

New commits:
commit c69b37e8da87c9f76dbf4add7340a77ea443c760
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Thu Aug 8 21:56:59 2019 +0200

    modesetting: Only log 1 error for consecutive flip failures
    
    Only log 1 error for consecutive flip failures, instead of filling the
    log and the disk with errors for each attempted flip.
    
    Despite our best efforts we may end up with a BO which gets refused
    when we try to import it as a framebuffer, see e.g. :
    https://bugs.freedesktop.org/show_bug.cgi?id=111306
    This should not happen, but as the above bugs shows sometimes it does
    and chances are it will happen again.
    
    Note ideally we should check if the import is possible at
    ms_present_check_flip time, like the amdgpu code is doing since:
    https://gitlab.freedesktop.org/xorg/driver/xf86-video-amdgpu/merge_requests/35
    but that requires a chunk of refactoring work on the modesetting driver,
    so for now this will have to do.
    
    Reviewed-by: Michel Dänzer <michel.daenzer at amd.com>
    Signed-off-by: Hans de Goede <hdegoede at redhat.com>

diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.h b/hw/xfree86/drivers/modesetting/drmmode_display.h
index 75c3195e4..2711a5776 100644
--- a/hw/xfree86/drivers/modesetting/drmmode_display.h
+++ b/hw/xfree86/drivers/modesetting/drmmode_display.h
@@ -123,6 +123,7 @@ typedef struct {
 
     Bool dri2_flipping;
     Bool present_flipping;
+    Bool flip_bo_import_failed;
 
     Bool dri2_enable;
     Bool present_enable;
diff --git a/hw/xfree86/drivers/modesetting/pageflip.c b/hw/xfree86/drivers/modesetting/pageflip.c
index 830ec7599..cb11bd4f9 100644
--- a/hw/xfree86/drivers/modesetting/pageflip.c
+++ b/hw/xfree86/drivers/modesetting/pageflip.c
@@ -285,9 +285,16 @@ ms_do_pageflip(ScreenPtr screen,
     new_front_bo.height = new_front->drawable.height;
     if (drmmode_bo_import(&ms->drmmode, &new_front_bo,
                           &ms->drmmode.fb_id)) {
-        xf86DrvMsg(scrn->scrnIndex, X_WARNING, "%s: Import BO failed: %s\n",
-                   log_prefix, strerror(errno));
+        if (!ms->drmmode.flip_bo_import_failed) {
+            xf86DrvMsg(scrn->scrnIndex, X_WARNING, "%s: Import BO failed: %s\n",
+                       log_prefix, strerror(errno));
+            ms->drmmode.flip_bo_import_failed = TRUE;
+        }
         goto error_out;
+    } else {
+        if (ms->drmmode.flip_bo_import_failed &&
+            new_front != screen->GetScreenPixmap(screen))
+            ms->drmmode.flip_bo_import_failed = FALSE;
     }
 
     flags = DRM_MODE_PAGE_FLIP_EVENT;
commit 3dc838f77d9a9417adf6a03cc82aa4e9337153a7
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Thu Aug 8 21:54:51 2019 +0200

    modesetting: Improve page-flip error reporting
    
    Before this commit ms_do_pageflip logged a single error for both the
    drmmode_bo_import failure path as well as for the queue_flip_on_crtc
    path. This commit splits this into 2 separate error logs so that it is
    clear what the cause of the flip-failure is.
    
    Reviewed-by: Michel Dänzer <michel.daenzer at amd.com>
    Signed-off-by: Hans de Goede <hdegoede at redhat.com>

diff --git a/hw/xfree86/drivers/modesetting/pageflip.c b/hw/xfree86/drivers/modesetting/pageflip.c
index 88a2f687c..830ec7599 100644
--- a/hw/xfree86/drivers/modesetting/pageflip.c
+++ b/hw/xfree86/drivers/modesetting/pageflip.c
@@ -284,8 +284,11 @@ ms_do_pageflip(ScreenPtr screen,
     new_front_bo.width = new_front->drawable.width;
     new_front_bo.height = new_front->drawable.height;
     if (drmmode_bo_import(&ms->drmmode, &new_front_bo,
-                          &ms->drmmode.fb_id))
+                          &ms->drmmode.fb_id)) {
+        xf86DrvMsg(scrn->scrnIndex, X_WARNING, "%s: Import BO failed: %s\n",
+                   log_prefix, strerror(errno));
         goto error_out;
+    }
 
     flags = DRM_MODE_PAGE_FLIP_EVENT;
     if (async)
@@ -309,6 +312,9 @@ ms_do_pageflip(ScreenPtr screen,
         if (!queue_flip_on_crtc(screen, crtc, flipdata,
                                 ref_crtc_vblank_pipe,
                                 flags)) {
+            xf86DrvMsg(scrn->scrnIndex, X_WARNING,
+                       "%s: Queue flip on CRTC %d failed: %s\n",
+                       log_prefix, i, strerror(errno));
             goto error_undo;
         }
     }
@@ -338,8 +344,6 @@ error_undo:
     }
 
 error_out:
-    xf86DrvMsg(scrn->scrnIndex, X_WARNING, "%s: Page flip failed: %s\n",
-               log_prefix, strerror(errno));
     drmmode_bo_destroy(&ms->drmmode, &new_front_bo);
     /* if only the local reference - free the structure,
      * else drop the local reference and return */
commit 12821852f0d82ecef686262382c84b2c1625a99f
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Mon Jul 15 14:35:49 2019 +0200

    modesetting: Avoid duplicate error messages on present-flip errors
    
    Currently on present-flip failures we log 2 messages for each failure,
    1 from ms_do_pageflip and then another one from ms_present_flip which
    is the caller of ms_do_pageflip. This commit adds a log_prefix argument
    to ms_do_pageflip so that its log messages can show if it is a DRI2 or
    a Present flip which fails and removes the redundant error message from
    ms_present_flip.
    
    Reviewed-by: Michel Dänzer <michel.daenzer at amd.com>
    Signed-off-by: Hans de Goede <hdegoede at redhat.com>

diff --git a/hw/xfree86/drivers/modesetting/dri2.c b/hw/xfree86/drivers/modesetting/dri2.c
index 29ffc24da..e4d7cdd67 100644
--- a/hw/xfree86/drivers/modesetting/dri2.c
+++ b/hw/xfree86/drivers/modesetting/dri2.c
@@ -496,7 +496,8 @@ ms_dri2_schedule_flip(ms_dri2_frame_event_ptr info)
     if (ms_do_pageflip(screen, back_priv->pixmap, event,
                        drmmode_crtc->vblank_pipe, FALSE,
                        ms_dri2_flip_handler,
-                       ms_dri2_flip_abort)) {
+                       ms_dri2_flip_abort,
+                       "DRI2-flip")) {
         ms->drmmode.dri2_flipping = TRUE;
         return TRUE;
     }
diff --git a/hw/xfree86/drivers/modesetting/driver.h b/hw/xfree86/drivers/modesetting/driver.h
index da25a4c0e..7511de6d3 100644
--- a/hw/xfree86/drivers/modesetting/driver.h
+++ b/hw/xfree86/drivers/modesetting/driver.h
@@ -177,7 +177,8 @@ Bool ms_do_pageflip(ScreenPtr screen,
                     int ref_crtc_vblank_pipe,
                     Bool async,
                     ms_pageflip_handler_proc pageflip_handler,
-                    ms_pageflip_abort_proc pageflip_abort);
+                    ms_pageflip_abort_proc pageflip_abort,
+                    const char *log_prefix);
 
 #endif
 
diff --git a/hw/xfree86/drivers/modesetting/pageflip.c b/hw/xfree86/drivers/modesetting/pageflip.c
index 9667f132d..88a2f687c 100644
--- a/hw/xfree86/drivers/modesetting/pageflip.c
+++ b/hw/xfree86/drivers/modesetting/pageflip.c
@@ -231,7 +231,8 @@ ms_do_pageflip(ScreenPtr screen,
                int ref_crtc_vblank_pipe,
                Bool async,
                ms_pageflip_handler_proc pageflip_handler,
-               ms_pageflip_abort_proc pageflip_abort)
+               ms_pageflip_abort_proc pageflip_abort,
+               const char *log_prefix)
 {
 #ifndef GLAMOR_HAS_GBM
     return FALSE;
@@ -250,7 +251,8 @@ ms_do_pageflip(ScreenPtr screen,
 
     if (!new_front_bo.gbm) {
         xf86DrvMsg(scrn->scrnIndex, X_ERROR,
-                   "Failed to get GBM bo for flip to new front.\n");
+                   "%s: Failed to get GBM BO for flip to new front.\n",
+                   log_prefix);
         return FALSE;
     }
 
@@ -258,7 +260,7 @@ ms_do_pageflip(ScreenPtr screen,
     if (!flipdata) {
         drmmode_bo_destroy(&ms->drmmode, &new_front_bo);
         xf86DrvMsg(scrn->scrnIndex, X_ERROR,
-                   "Failed to allocate flipdata.\n");
+                   "%s: Failed to allocate flipdata.\n", log_prefix);
         return FALSE;
     }
 
@@ -336,8 +338,8 @@ error_undo:
     }
 
 error_out:
-    xf86DrvMsg(scrn->scrnIndex, X_WARNING, "Page flip failed: %s\n",
-               strerror(errno));
+    xf86DrvMsg(scrn->scrnIndex, X_WARNING, "%s: Page flip failed: %s\n",
+               log_prefix, strerror(errno));
     drmmode_bo_destroy(&ms->drmmode, &new_front_bo);
     /* if only the local reference - free the structure,
      * else drop the local reference and return */
diff --git a/hw/xfree86/drivers/modesetting/present.c b/hw/xfree86/drivers/modesetting/present.c
index b87ba265f..7c4f0c43d 100644
--- a/hw/xfree86/drivers/modesetting/present.c
+++ b/hw/xfree86/drivers/modesetting/present.c
@@ -336,10 +336,9 @@ ms_present_flip(RRCrtcPtr crtc,
     event->unflip = FALSE;
 
     ret = ms_do_pageflip(screen, pixmap, event, drmmode_crtc->vblank_pipe, !sync_flip,
-                         ms_present_flip_handler, ms_present_flip_abort);
-    if (!ret)
-        xf86DrvMsg(scrn->scrnIndex, X_ERROR, "present flip failed\n");
-    else
+                         ms_present_flip_handler, ms_present_flip_abort,
+                         "Present-flip");
+    if (ret)
         ms->drmmode.present_flipping = TRUE;
 
     return ret;
@@ -367,7 +366,8 @@ ms_present_unflip(ScreenPtr screen, uint64_t event_id)
 
     if (ms_present_check_unflip(NULL, screen->root, pixmap, TRUE, NULL) &&
         ms_do_pageflip(screen, pixmap, event, -1, FALSE,
-                       ms_present_flip_handler, ms_present_flip_abort)) {
+                       ms_present_flip_handler, ms_present_flip_abort,
+                       "Present-unflip")) {
         return;
     }
 


More information about the xorg-commit mailing list