[Mesa-dev] questions about assertion hit in vmwgfx/svga driver

Chris Fester camaronut at gmail.com
Thu Oct 11 14:00:18 PDT 2012

On Wed, Oct 10, 2012 at 5:14 PM, Brian Paul <brianp at vmware.com> wrote:
> On 10/10/2012 04:03 PM, Chris Fester wrote:
>> Hi all,
>> I'm working on a project involving virtualizing a rather old Linux
>> distribution with 3D support.  Some of the details of the setup:
>> Host: Ubuntu 12.04 AMD64, fglrx-updates package installed
>> -- Vmware guest: Ubuntu 12.04 32 bit, stock packages
>> ---- chrooted sandbox environment: Fedora Core 2 with gcc 3.3.3 (many
>> modifications)
>> The chrooted environment properly mounts up /proc, /dev/shm, /dev/pts,
>> /sys, etc.  It also bind mounts /tmp so we get the socket for X11
>> communication, as well as /dev/dri.
>> It has been a long process getting all the dependencies to compile,
>> writing a little assembly to mimic compiler built-ins, using
>> libatomicops instead of compiler built-ins, and finally getting mesa
>> to build.  But I am now able to run glxgears from within the chrooted
>> sandbox at about 100fps.  Also glxinfo reports that I do have direct
>> rendering.  Woohoo!
>> All of the source that I have built has been obtained with apt-get
>> source<ubuntu package name>.  I wanted to be sure that everything
>> being compiled in the chroot was exactly the same version as what I
>> was running in the guest OS.  Specifically, the Ubuntu version of the
>> mesa source package: mesa_8.0.3+8.0.2-0ubuntu3.2.
>> So the down side... I have hit an assertion in
>> src/gallium/drivers/svga/svga_resource_buffer_upload.c while running
>> my company's GL application.  The assertion details:
>> src/gallium/drivers/svga/svga_resource_buffer_upload.c:591
>> assert(!sbuf->head.prev&&  !sbuf->head.next);
>> The prev and next pointers happen to be the same value.  They're also
>> identical to the prev and next pointers in svga->dirty_buffers.  And
>> topping it all off, the pointers all point to the location of
>> &svga->dirty_buffers.
>> Below I've pasted more details from GDB.  My question is regarding the
>> linked list handling.  I've noticed in the Linux doubly-linked-list
>> implementation, the following happens on a deletion (from
>> /usr/include/linux/list.h):
>> static __inline__ void list_del(struct list_head *entry)
>> {
>>          __list_del(entry->prev, entry->next);
>>          entry->next = entry->prev = 0;  //<------------------- set to 0!
>> }
>> And the code from src/gallium/auxiliary/util/u_double_list.h:
>> static INLINE void list_del(struct list_head *item)
>> {
>>      item->prev->next = item->next;
>>      item->next->prev = item->prev;
>> }
>> Note that next and prev are not zero-ed out here.
>> I also noticed this bit of code:
>> svga_resource_buffer_upload.c:290 (in svga_buffer_upload_flush()):
>>     LIST_DEL(&sbuf->head);
>> #ifdef DEBUG
>>     sbuf->head.next = sbuf->head.prev = NULL;
>> #endif
>> Why the #ifdef DEBUG here?  Should the setting of next and prev to
>> NULL take place all the time?  Or should they be set to NULL in the
>> u_double_list.h header's list_del()?
>> I realize that my setup is pretty unique and this assertion may be my
>> responsibility.  If the svga/list code as it stands is correct, then
>> I'd appreciate any advice on what may be incorrect in my setup  that
>> could cause the error.  If I remove the assert, the application
>> continues on happily, although I need to give it more soak time.
>> Thanks for your efforts and your time!
>> Chris Fester

(snipping out the GDB info)

> You might want to try the latest Mesa sources from git.  It should be easy
> to build/install in your guest if you've got the other pieces in place.
> Otherwise, if your app is proprietary, maybe you could make an apitrace of
> the GL calls and send it to me for testing.
> https://github.com/apitrace/apitrace
> -Brian

Hi Brian,

I was able to build the latest git sources.  I hit the same assertion
with the list pointers.  The patch below fixes it for me.  Let me know
what you think.  If I get some time I'll attempt to build/run apitrace
and get you a trace as well.  That will take some time as I will need
to remove some of my company's artwork/images.


diff --git a/src/gallium/auxiliary/util/u_double_list.h b/src/gallium/auxiliary/
index 9d1129b..408c26d 100644
--- a/src/gallium/auxiliary/util/u_double_list.h
+++ b/src/gallium/auxiliary/util/u_double_list.h
@@ -82,6 +82,7 @@ static INLINE void list_del(struct list_head *item)
     item->prev->next = item->next;
     item->next->prev = item->prev;
+    item->prev = item->next = NULL;

 static INLINE void list_delinit(struct list_head *item)

Oh, meltdown... It's one of these annoying buzzwords. We prefer to
call it an unrequested fission surplus.
-- Mr. Burns, The Simpsons

More information about the mesa-dev mailing list