[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

xserver-xorg-video-ati: Changes to 'ubuntu'



 debian/changelog                                |   19 +++
 debian/patches/101_ref-count-dri2-buffers.patch |  135 ++++++++++++++++++++++++
 debian/patches/series                           |    1 
 debian/rules                                    |    2 
 4 files changed, 156 insertions(+), 1 deletion(-)

New commits:
commit 98e23c11583dcc81b9f66c190d2f8280bc9d4dfb
Author: Christopher James Halse Rogers <christopher.halse.rogers@canonical.com>
Date:   Tue Aug 17 15:32:11 2010 +1000

    Add refrence-counting patch to fix Xserver segfault in LP: #617201

diff --git a/debian/changelog b/debian/changelog
index 9895cac..78ed5d2 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -3,6 +3,11 @@ xserver-xorg-video-ati (1:6.13.1-1ubuntu3) UNRELEASED; urgency=low
   * debian/rules:
     + Drop the upstream ChangeLog from the packages, saving precious CD
       space.
+  * debian/patches/101_ref-count-dri2-buffers.patch:
+    + Add reference-counting to DRI2 buffers, and take a reference in
+      ScheduleSwap.  Prevents the buffers from being destroyed on client
+      quit between calling ScheduleSwap and the associated vblank event.
+      Fixes Xserver segfault when a GL client quits (LP: #617201).
 
  -- Christopher James Halse Rogers <raof@ubuntu.com>  Tue, 17 Aug 2010 14:57:29 +1000
 
diff --git a/debian/patches/101_ref-count-dri2-buffers.patch b/debian/patches/101_ref-count-dri2-buffers.patch
new file mode 100644
index 0000000..b7f8e92
--- /dev/null
+++ b/debian/patches/101_ref-count-dri2-buffers.patch
@@ -0,0 +1,135 @@
+commit 823232d79211832e770c72b027b229950740605d
+Author: Christopher James Halse Rogers <christopher.halse.rogers@canonical.com>
+Date:   Tue Aug 17 12:13:09 2010 +1000
+
+    dri2: Reference-count DRI2 buffers.
+    
+    When a client calls ScheduleSwap we set up a kernel callback when the
+    relevent vblank event occurs.  However, it's possible for the client
+    to go away between calling ScheduleSwap and the vblank event,
+    resulting in the buffers being destroyed before they're passed to
+    radeon_dri2_frame_event_handler.
+    
+    Add reference-counting to the buffers and take a reference in
+    radeon_dri2_schedule_swap to ensure the buffers won't be destroyed
+    before the vblank event is dealt with.
+    
+    Fixes: http://bugs.freedesktop.org/show_bug.cgi?id=29065
+    Signed-off-by: Christopher James Halse Rogers <christopher.halse.rogers@canonical.com>
+
+diff --git a/src/radeon_dri2.c b/src/radeon_dri2.c
+index 6356711..00b5712 100644
+--- a/src/radeon_dri2.c
++++ b/src/radeon_dri2.c
+@@ -55,6 +55,7 @@ typedef DRI2Buffer2Ptr BufferPtr;
+ struct dri2_buffer_priv {
+     PixmapPtr   pixmap;
+     unsigned int attachment;
++    unsigned int refcnt;
+ };
+ 
+ 
+@@ -236,6 +237,7 @@ radeon_dri2_create_buffer(DrawablePtr drawable,
+     buffers->flags = 0; /* not tiled */
+     privates->pixmap = pixmap;
+     privates->attachment = attachment;
++    privates->refcnt = 1;
+ 
+     return buffers;
+ }
+@@ -267,13 +269,26 @@ radeon_dri2_destroy_buffer(DrawablePtr drawable, BufferPtr buffers)
+     if(buffers)
+     {
+         ScreenPtr pScreen = drawable->pScreen;
+-        struct dri2_buffer_priv *private;
++        struct dri2_buffer_priv *private = buffers->driverPrivate;
+ 
+-        private = buffers->driverPrivate;
+-        (*pScreen->DestroyPixmap)(private->pixmap);
++        /* Trying to free an already freed buffer is unlikely to end well */
++        if (private->refcnt == 0) {
++            ScrnInfoPtr scrn = xf86Screens[pScreen->myNum];
+ 
+-        free(buffers->driverPrivate);
+-        free(buffers);
++            xf86DrvMsg(scrn->scrnIndex, X_WARNING, 
++                       "Attempted to destroy previously destroyed buffer.\
++ This is a programming error\n");
++            return;
++	}
++
++        private->refcnt--;
++        if (private->refcnt == 0)
++        {
++            (*pScreen->DestroyPixmap)(private->pixmap);
++
++            free(buffers->driverPrivate);
++            free(buffers);
++        }
+     }
+ }
+ #endif
+@@ -364,6 +379,20 @@ typedef struct _DRI2FrameEvent {
+     DRI2BufferPtr back;
+ } DRI2FrameEventRec, *DRI2FrameEventPtr;
+ 
++static void
++radeon_dri2_ref_buffer(BufferPtr buffer)
++{
++    struct dri2_buffer_priv *private = buffer->driverPrivate;
++    private->refcnt++;
++}
++
++static void
++radeon_dri2_unref_buffer(BufferPtr buffer)
++{
++    struct dri2_buffer_priv *private = buffer->driverPrivate;
++    radeon_dri2_destroy_buffer(&(private->pixmap->drawable), buffer);
++}
++
+ void radeon_dri2_frame_event_handler(unsigned int frame, unsigned int tv_sec,
+                                      unsigned int tv_usec, void *event_data)
+ {
+@@ -379,6 +408,8 @@ void radeon_dri2_frame_event_handler(unsigned int frame, unsigned int tv_sec,
+     status = dixLookupDrawable(&drawable, event->drawable_id, serverClient,
+                                M_ANY, DixWriteAccess);
+     if (status != Success) {
++        radeon_dri2_unref_buffer(event->front);
++        radeon_dri2_unref_buffer(event->back);
+         free(event);
+         return;
+     }
+@@ -410,6 +441,8 @@ void radeon_dri2_frame_event_handler(unsigned int frame, unsigned int tv_sec,
+         break;
+     }
+ 
++    radeon_dri2_unref_buffer(event->front);
++    radeon_dri2_unref_buffer(event->back);
+     free(event);
+ }
+ 
+@@ -645,6 +678,13 @@ static int radeon_dri2_schedule_swap(ClientPtr client, DrawablePtr draw,
+     swap_info->front = front;
+     swap_info->back = back;
+ 
++    /* radeon_dri2_frame_event_handler will get called some unknown time in the
++     * future with these buffers.  Take a reference to ensure that they won't
++     * get destroyed before then. 
++     */
++    radeon_dri2_ref_buffer(front);
++    radeon_dri2_ref_buffer(back);
++
+     /* Get current count */
+     vbl.request.type = DRM_VBLANK_RELATIVE;
+     if (crtc > 0)
+@@ -768,6 +808,10 @@ blit_fallback:
+     DRI2SwapComplete(client, draw, 0, 0, 0, DRI2_BLIT_COMPLETE, func, data);
+     if (swap_info)
+         free(swap_info);
++
++    radeon_dri2_unref_buffer(front);
++    radeon_dri2_unref_buffer(back);
++
+     *target_msc = 0; /* offscreen, so zero out target vblank count */
+     return TRUE;
+ }
diff --git a/debian/patches/series b/debian/patches/series
index 1503711..2810ced 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1 +1,2 @@
 100_radeon-6.9.0-bgnr-enable.patch
+101_ref-count-dri2-buffers.patch

commit 30c46e49adef4aca8ff2913b0f5d4b6079fd5ec3
Author: Christopher James Halse Rogers <christopher.halse.rogers@canonical.com>
Date:   Tue Aug 17 14:58:00 2010 +1000

    Drop changelog from binary packages to save CD space

diff --git a/debian/changelog b/debian/changelog
index 7f1e890..9895cac 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,11 @@
+xserver-xorg-video-ati (1:6.13.1-1ubuntu3) UNRELEASED; urgency=low
+
+  * debian/rules:
+    + Drop the upstream ChangeLog from the packages, saving precious CD
+      space.
+
+ -- Christopher James Halse Rogers <raof@ubuntu.com>  Tue, 17 Aug 2010 14:57:29 +1000
+
 xserver-xorg-video-ati (1:6.13.1-1ubuntu2) maverick; urgency=low
 
   * No-change rebuild against new Xserver 1.9 ABI
diff --git a/debian/rules b/debian/rules
index a70327e..81aa5eb 100755
--- a/debian/rules
+++ b/debian/rules
@@ -87,7 +87,7 @@ binary-arch: build install serverabi-ati serverabi-radeon
 	dh_testroot
 
 	dh_installdocs
-	dh_installchangelogs ChangeLog
+	dh_installchangelogs
 	dh_install --sourcedir=debian/tmp --list-missing --exclude=.la --exclude=usr/share/man/man4
 	dh_installman
 	dh_link

commit 0e151380e10f8573e7b571688d193a6569aeb23e
Author: Christopher James Halse Rogers <christopher.halse.rogers@canonical.com>
Date:   Fri Aug 13 15:15:24 2010 +1000

    No-change rebuild against Xserver 1.9

diff --git a/debian/changelog b/debian/changelog
index a57af39..7f1e890 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+xserver-xorg-video-ati (1:6.13.1-1ubuntu2) maverick; urgency=low
+
+  * No-change rebuild against new Xserver 1.9 ABI
+
+ -- Christopher James Halse Rogers <raof@ubuntu.com>  Mon, 09 Aug 2010 21:13:25 +1000
+
 xserver-xorg-video-ati (1:6.13.1-1ubuntu1) maverick; urgency=low
 
   * Merge from Debian Unstable. Remainning Ubuntu changes:


Reply to: