[Mesa-dev] questions about assertion hit in vmwgfx/svga driver
Chris Fester
camaronut at gmail.com
Wed Oct 10 15:03:53 PDT 2012
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
GDB information (email me directly if you require more context)
follows. Note that I had to replace the assert with code that would
generate a segfault, due to the application I am running replaces the
default assert mechanism and stomps on the stack :(.
(gdb) p svga->dirty_buffers
$19 = {prev = 0x9563728, next = 0x9563728}
(gdb) p sbuf->head
$20 = {prev = 0x9563728, next = 0x9563728}
(gdb) p &svga->dirty_buffers
$21 = (struct list_head *) 0x9563728
(gdb) bt
#0 0x413e56b8 in svga_buffer_handle (svga=0x955f490, buf=0x1)
at svga_resource_buffer_upload.c:597
#1 0x413e78d8 in svga_hwtnl_flush (hwtnl=0x9538b18) at svga_draw.c:184
#2 0x413eb6ed in update_state (svga=0x955f490, atoms=0x416f49e0,
state=0x9563710) at svga_state.c:131
#3 0x413eb85f in svga_update_state (svga=0x955f490, max_level=0)
at svga_state.c:209
#4 0x413eb8cc in svga_update_state_retry (svga=0x955f490, max_level=0)
at svga_state.c:234
#5 0x413e96c3 in svga_draw_vbo (pipe=0x955f490, info=0xbfcc4050)
at svga_pipe_draw.c:348
#6 0x41481521 in st_draw_vbo (ctx=0x95af2b8, arrays=0x960cc38,
prims=0x960b520, nr_prims=1, ib=0x0, index_bounds_valid=0 '\0',
min_index=0, max_index=4, tfb_vertcount=0x0)
at state_tracker/st_draw.c:1112
#7 0x4152ead3 in vbo_exec_vtx_flush (exec=0x960b100, keepUnmapped=1 '\001')
at vbo/vbo_context.h:91
#8 0x4152a9b2 in vbo_exec_FlushVertices_internal (exec=0x960b100,
unmap=0 '\0') at vbo/vbo_exec_api.c:444
#9 0x4152bf8c in vbo_exec_FlushVertices (ctx=0x95af2b8, flags=4294967292)
at vbo/vbo_exec_api.c:1195
#10 0x414fea84 in _mesa_set_enable (ctx=0x95af2b8, cap=2929, state=1 '\001')
at main/enable.c:350
(frame 0 - buf was optimized out, but sbuf is as follows):
(gdb) p *sbuf
$23 = {b = {b = {reference = {count = 5}, screen = 0x95488e0,
target = PIPE_BUFFER, format = PIPE_FORMAT_R8_UNORM, width0 = 65536,
height0 = 1, depth0 = 1, array_size = 1, last_level = 0, nr_samples = 0,
usage = 4, bind = 16, flags = 0}, vtbl = 0x416f49a0}, swbuf = 0x0,
user = 0 '\0', key = {flags = 20, format = SVGA3D_BUFFER, size = {
width = 65536, height = 1, depth = 1}, numFaces = 1, numMipLevels = 1,
cachable = 1}, handle = 0x95f4528, map = {count = 0, ranges = {{
start = 160, end = 240}, {start = 0, end = 0} <repeats 31 times>},
num_ranges = 1}, uploaded = {buffer = 0x0, offset = 0, start = 0,
end = 0}, hwbuf = 0x960f6e8, dma = {pending = 1 '\001', flags = {
discard = 0, unsynchronized = 1, reserved = 0}, boxes = 0x9563824,
svga = 0x955f490}, head = {prev = 0x9563728, next = 0x9563728}}
(gdb) p *svga
$24 = {pipe = {winsys = 0x0, screen = 0x95488e0, priv = 0x0, draw = 0x9539800,
<function pointers here>
texture_barrier = 0, create_video_decoder = 0, create_video_buffer = 0},
swc = 0x9563738, debug = {no_swtnl = 0 '\0', force_swtnl = 0 '\0',
use_min_mipmap = 0 '\0', shader_id = 4, disable_shader = 4294967295,
no_line_width = 0 '\0', force_hw_line_stipple = 0 '\0'}, swtnl = {
draw = 0x9539800, backend = 0x95356e8, hw_prim = 0, new_vbuf = 0 '\0',
new_vdecl = 0 '\0'}, fs_bm = 0x95478d0, vs_bm = 0x95487d0, state = {
dirty = {0, 0, 0, 4294967295}, texture_timestamp = 9, sw = {ve_format = {
1, 0 <repeats 31 times>}, need_swvfetch = 0 '\0',
need_pipeline = 0 '\0', need_swtnl = 0 '\0', in_swtnl_draw = 0 '\0'},
hw_draw = {rs = {3452816845, 0, 3452816845, 0, 3452816845, 1, 3452816845,
3452816845, 0, 3452816845, 3452816845, 0, 3452816845, 0, 3452816845,
3452816845, 3452816845, 3452816845, 3452816845, 1065353216, 0,
1117782016, 3452816845, 3452816845, 3452816845, 3452816845,
3452816845, 0, 3452816845, 3452816845, 2, 0, 5, 6, 1, 1,
3452816845 <repeats 11 times>, 15, 3452816845, 3452816845, 3452816845,
3452816845, 3452816845, 3452816845, 3452816845, 0, 0, 0, 3452816845,
3452816845, 3452816845, 3452816845, 3452816845, 0, 0, 3452816845,
3452816845, 0, 3452816845 <repeats 17 times>, 0, 3452816845,
3452816845, 3452816845, 3452816845, 3452816845, 3452816845,
3452816845, 0, 3452816845, 3452816845, 3452816845, 3452816845,
3452816845, 3452816845}, ts = {{
3452816845 <repeats 30 times>} <repeats 16 times>}, cb = {{{
0.00249999994, 0, 0, 0}, {0, -0.00333333341, 0, 0}, {0, 0, -1, 0},
{-1, 1, 0, 1}, {1, 1, 0.5, 1}, {-0.00124999997, 0.00166666671, 0.5,
0}, {-431602080, -431602080, -431602080,
-431602080} <repeats 250 times>}, {{0, 0, 0, 1}, {1, 0, 0, 0}, {0,
0, 1, 1}, {0, 0, 0, 0.999599993}, {-431602080, -431602080,
-431602080, -431602080} <repeats 252 times>}, {{-431602080,
-431602080, -431602080, -431602080} <repeats 256 times>}},
fs = 0x985aa68, vs = 0x985c4e8, views = {{texture = 0x0, v = 0x0,
min_lod = 0, max_lod = 0, dirty = 0} <repeats 16 times>},
num_views = 0}, hw_clear = {viewport = {x = 0, y = 0, w = 800, h = 600},
depthrange = {zmin = 0, zmax = 1}, framebuffer = {width = 0, height = 0,
nr_cbufs = 0, cbufs = {0x985de10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
zsbuf = 0x985de68}, prescale = {translate = {-0.00124999997,
0.00166666671, 0.5, 0}, scale = {1, 1, 0.5, 1},
enabled = 1 '\001'}}}, curr = {blend = 0x985a860, depth = 0x9860038,
rast = 0x985a7e0, sampler = {0x0 <repeats 16 times>}, velems = 0x985bad0,
sampler_views = {0x0 <repeats 16 times>}, fs = 0x9859c00, vs = 0x985ac88,
vb = {{stride = 8, buffer_offset = 200, buffer = 0x960ed90}, {stride = 0,
buffer_offset = 0, buffer = 0x0} <repeats 31 times>}, ib = {
index_size = 0, offset = 0, buffer = 0x0}, cb = {0x97f7450, 0x960f740,
0x0}, framebuffer = {width = 800, height = 600, nr_cbufs = 1, cbufs = {
0x985de10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, zsbuf = 0x985de68},
depthscale = 1.1920929e-07, nr_fbs = 1, poly_stipple = {stipple = {
0 <repeats 32 times>}}, scissor = {minx = 0, miny = 0, maxx = 800,
maxy = 600}, blend_color = {color = {0, 0, 0, 0}}, stencil_ref = {
ref_value = "\000"}, clip = {ucp = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0,
0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0,
0, 0, 0}}}, viewport = {scale = {400, -300, 0.5, 1}, translate = {
400, 300, 0.5, 0}}, num_samplers = 0, num_sampler_views = 0,
num_vertex_buffers = 1, reduced_prim = 4, tex_flags = {flag_1d = 0,
flag_srgb = 0}, any_user_vertex_buffers = 0 '\0',
zero_stride_vertex_elements = 0, num_zero_stride_vertex_elements = 0,
zero_stride_constants = {0 <repeats 128 times>}}, dirty = 1568, rebind = {
rendertargets = 0, texture_samplers = 1}, upload_ib = 0x9548828,
upload_vb = 0x9548850, hwtnl = 0x9538b18, sq = 0x0, dirty_buffers = {
prev = 0x9563728, next = 0x9563728}}
This all was initiated by our application doing a glEnable( GL_DEPTH_TEST ).
--
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