Doug, I'm vague about this, but it seems right and it fixes the bug that I'm running into. It seems like dcache_invalidate_line needs to remove the block from the in use list at the same time as adding it to the freed list. The problem that bit me was getting the two lists cross-linked, which eventually led to an infinite loop behavior in dcache_invalidate.