Hi,

I reported a DMA buffer allocation problem earlier today with glean. It
terminated with "Error: Could not get dma buffer ... exiting". I looked
into it a bit more now. I made a glean run with RADEON_DEBUG_DMA and
wrote a small TCL script to analyse the output. It revealed a leak of
DMA buffers. It might be a bug with my script, but I'm pretty sure it's
ok. It is obvious that towards the end of the log only a subset of the
available DMA buffers is used.

The script keeps track of allocating, discarding and releasing DMA
buffers based on the RADEON_DEBUG_DMA output. Each time the allocation
status of a DMA buffer changes it outputs 32 columns, one for each DMA
buffer, indicating one out of four states: free (0), allocated (1),
discarded but not yet released (X), and unkown (?). It also outputs
error messages in some cases, e.g. the number of released buffers does
not match the number of discarded buffers (the only ones which occur
actually).

Here is an example of the output of my script:

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 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 1 1 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 X 1 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 X 1 1 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 X X 1 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 X X 1 1 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 X X X 1 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 X X X 1 1 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 X X X X 1 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 1 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 X 0 0 0 0 0 0 0 0
Error: Number of released buffers (0) doesn't match number of discarded buffers (1).
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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 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 1 1 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 X 1 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 X 1 1 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 X X 1 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 X X 1 1 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 X X X 1 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 X X X 1 1 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 X X X X 1 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 X X X X 1 1 0 ? 0 0 0 0 0 0 0 0
                                    ----------^

After that the marked buffer stays in unknown state forever, it is never
allocated again. One by one all buffers change to that state. The end of
the story looks like this:

? ? ? ? ? ? ? ? ? ? ? ? 0 ? ? ? ? 0 ? ? ? ? X ? ? ? ? ? ? ? ? 0
Error: Number of released buffers (0) doesn't match number of discarded buffers (1).
? ? ? ? ? ? ? ? ? ? ? ? 0 ? ? ? ? 0 ? ? ? ? ? ? ? ? ? ? ? ? ? 0
? ? ? ? ? ? ? ? ? ? ? ? 1 ? ? ? ? 0 ? ? ? ? ? ? ? ? ? ? ? ? ? 0
? ? ? ? ? ? ? ? ? ? ? ? 1 ? ? ? ? 1 ? ? ? ? ? ? ? ? ? ? ? ? ? 0
? ? ? ? ? ? ? ? ? ? ? ? X ? ? ? ? 1 ? ? ? ? ? ? ? ? ? ? ? ? ? 0
? ? ? ? ? ? ? ? ? ? ? ? X ? ? ? ? 1 ? ? ? ? ? ? ? ? ? ? ? ? ? 1
? ? ? ? ? ? ? ? ? ? ? ? X ? ? ? ? X ? ? ? ? ? ? ? ? ? ? ? ? ? 1
? ? ? ? ? ? ? ? ? ? ? ? 0 ? ? ? ? 0 ? ? ? ? ? ? ? ? ? ? ? ? ? 1
? ? ? ? ? ? ? ? ? ? ? ? 0 ? ? ? ? 0 ? ? ? ? ? ? ? ? ? ? ? ? ? X
Error: Number of released buffers (0) doesn't match number of discarded buffers (1).
? ? ? ? ? ? ? ? ? ? ? ? 0 ? ? ? ? 0 ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? 0 ? ? ? ? 1 ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? 1 ? ? ? ? 1 ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? 1 ? ? ? ? X ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? 1 ? ? ? ? 0 ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? 1 ? ? ? ? 1 ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? X ? ? ? ? 1 ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? 0 ? ? ? ? 1 ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? 0 ? ? ? ? X ? ? ? ? ? ? ? ? ? ? ? ? ? ?
Error: Number of released buffers (0) doesn't match number of discarded buffers (1).
? ? ? ? ? ? ? ? ? ? ? ? 0 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? 1 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

I attached my script, if someone wants to check it.

Good night,
   Felix

               __\|/__    ___     ___     ___
__Tschüß_______\_6 6_/___/__ \___/__ \___/___\___You can do anything,___
_____Felix_______\Ä/\ \_____\ \_____\ \______U___just not everything____
  [EMAIL PROTECTED]    >o<__/   \___/   \___/        at the same time!
#!/usr/bin/tclsh

array set buffers {
    0 0
    1 0
    2 0
    3 0
    4 0
    5 0
    6 0
    7 0
    8 0
    9 0
    10 0
    11 0
    12 0
    13 0
    14 0
    15 0
    16 0
    17 0
    18 0
    19 0
    20 0
    21 0
    22 0
    23 0
    24 0
    25 0
    26 0
    27 0
    28 0
    29 0
    30 0
    31 0
}
set discardedBuffers ""

while {![eof stdin]} {
    set line [gets stdin]
#   puts "$line"
    if {[regexp ".*(Alloc|DISCARD|Releasing)\[^0-9\]*(\[0-9\]+)" "$line" match type num]} {
	set changed 0
	if {![string compare "$type" "Releasing"]} {
	    if {$num != [llength $discardedBuffers]} {
		puts "Error: Number of released buffers ($num) doesn't match number of discarded buffers ([llength $discardedBuffers])."
		foreach buf $discardedBuffers {
		    set buffers($buf) ?
		}
		set changed 1
		set discardedBuffers ""
	    } elseif {[llength $discardedBuffers] != 0} {
		foreach buf $discardedBuffers {
		    set buffers($buf) 0
		}
		set changed 1
		set discardedBuffers ""
	    }
	} else {
	    set buf $num
	    if {$buf < 0 || $buf > 31} {
		puts "Error: buf=$buf out of range"
		exit
	    }
	    if {![string compare "$type" "Alloc"]} {
		if {$buffers($buf) != 0} {
		    puts "Error: allocating $buf which is not free."
		}
		set buffers($buf) 1
		set changed 1
	    } else {
		if {$buffers($buf) != 1} {
		    puts "Error: discarding $buf which is not allocated."
		}
		lappend discardedBuffers $buf
		set buffers($buf) X
		set changed 1
	    }
	}
	if {$changed} {
	    puts "$buffers(0) $buffers(1) $buffers(2) $buffers(3)\
$buffers(4) $buffers(5) $buffers(6) $buffers(7)\
$buffers(8) $buffers(9) $buffers(10) $buffers(11)\
$buffers(12) $buffers(13) $buffers(14) $buffers(15)\
$buffers(16) $buffers(17) $buffers(18) $buffers(19)\
$buffers(20) $buffers(21) $buffers(22) $buffers(23)\
$buffers(24) $buffers(25) $buffers(26) $buffers(27)\
$buffers(28) $buffers(29) $buffers(30) $buffers(31)"
	}
    }
}

Reply via email to