[PATCH RFC]: Bus_dma eats all available memory

Scott Long scottl at samsco.org
Fri Jun 26 14:01:22 UTC 2009


Piotr Zięcik wrote:
> Thursday 25 June 2009 20:30:27 Scott Long napisał(a):
>> Piotr Zięcik wrote:
>>> Hi
>>>
>>> While working on new driver for FreeBSD I have found a problem in bus_dma
>>> subsystem. Every time when bus_dmamap_create() is called on bus_dma tag
>>> using bounce zone, at least 1 page in bounce zone is allocated. This
>>> causes eating of all avaible memory by bounce zone. Problem affects i386,
>>> amd64 and arm.
>> The code block that you point at can only be entered if the maxpages
>> limit has not been reached.  However, the max limit is per zone, not
>> global, and there's no easy way to make it be global.  Are you creating
>> an excessive number of tags/zones?
> 
> Driver creates one tag and and one map everytime when new request arrives.
> Both are freed after processing. Driver can queue maximum 64 requests, so
> it there will not be more than 64 tags and 64 maps. Debugging shows that the 
> limit is never reached and number of tags and maps is around 30 - 40. In my 
> oppinion this is not excessive number of tags.
> 

Tags and maps should be allocated at driver initialization time, not
every time a request comes in.  The problem here isn't the MAX() test,
it's that the MIN_ALLOC_COMP test is getting fooled because the tag
keeps on getting recycled.  The correct fix is likely to move the flag
into the bounce zone object.  But in general, you should not be
allocating and freeing tags and maps so often, they are meant to have a
long lifespan.

Scott


More information about the freebsd-current mailing list