Patch: sym(4) "VTOBUS FAILED" panics on amd64, amd64/89550

Scott Long scottl at
Thu Sep 21 21:38:41 PDT 2006

Jan Mikkelsen wrote:

> Hi,
> Doug White wrote:
>>On Fri, 22 Sep 2006, Jan Mikkelsen wrote:
>>>Quick summary:  sym(4) assumes on amd64 that virtual 
>>addresses provided by
>>>bus_dmamem_alloc() have the same alignment as the physical 
>>addresses (in
>>>this case, 2*PAGE_SIZE).  They don't, and stuff breaks.  
>>This patch works
>>>around that.
>>Why is this? busdma supports alignment constraints; why not 
>>just set the 
>>alignment to what you need it set at? I realize sym has its own hand 
>>rolled DMA management craziness but alignment is something 
>>busdma can take 
>>care of easily.
> sym has the alignment requirement on the virtual address because of the
> buddy memory allocation algorithm; changing how sym allocates memory
> internally would remove the requirement.  The buddy algorithm with 2^13
> bytes aligned on a 2^12 byte (but not a 2^13 byte) boundary can provide two
> chunks of 2^12 bytes but nothing greater than 2^12 bytes.
> The VTOBUS failure is caused by the buddy implementation making alignment
> assumptions which aren't true, and then getting the virtual addresses wrong.
> Perhaps I'm just doing something wrong with bus_dma.  I believe I set the
> alignment requirements to be 2*PAGE_SIZE, and this is what I see for the
> physical address.  However the virtual address seems to only be page
> aligned.
> I can't see any mention of virtual address alignment in the bus_dma man
> page.  Can it take care of virtual address alignment?  If so, how?

busdma makes no guarantees on virtual addresses.

Sigh, sorry I never got this fixed.  The custom memory allocator made me
unhappy, and I never had time to dig into it.  Do real docs on sym exist
somewhere?  I'm not against sitting down and re-writing the physical
memory handling to both work and conform to the FreeBSD APIs.


More information about the freebsd-stable mailing list