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)" } } }