kmem_map too small panics with Soekris/Atheros access point [ath rate control]

Boris Kochergin spawk at acm.poly.edu
Thu Jun 24 15:47:58 UTC 2010


Sam Leffler wrote:
> Boris Kochergin wrote:
>   
>> Stef Walter wrote:
>>     
>>> Boris Kochergin wrote:
>>>  
>>>       
>> I, too, recall the days when you had multiple rate-control algorithms to
>> choose from, but that doesn't appear to be the case anymore. As a
>> workaround, I wrote a little script that checks if that part of the
>> driver is using more than 200 KiB of memory and run it every minute via
>> cron. It seems to be doing its job so far:
>>     
>
> You can still select the ath rate control module.  Static kernel config
> is unchanged; for modules you must export ATH_RATE=onoe or similar
> (check modules/ath/Makefile).  Please file a PR if this does not work.
>
> 	Sam
>   
(I had to go do some other stuff, but better late than never?)

Thanks. That does indeed work, but the problem persists with other 
rate-control algorithms (I've upgraded most of the access points to 
8.0-R, where the problem does not appear to exist, and upgraded one to 
7.3-R for continued testing--this is where it still happens). I've 
instrumented the memory-allocation bits in the ath and net80211 code 
where MALLOC/malloc was called with a type of M_80211_NODE. I've tracked 
the leak down to one of two allocations never being freed:

Line 595 of /usr/src/sys/net80211/ieee80211_node.c:

        MALLOC(ni, struct ieee80211_node *, sizeof(struct ieee80211_node),
                M_80211_NODE, M_NOWAIT | M_ZERO);

Line 3164 of /usr/src/sys/dev/ath/if_ath.c:

        an = malloc(space, M_80211_NODE, M_NOWAIT|M_ZERO);

It looks like both are supposed to be freed by node_free() in 
/usr/src/sys/net80211/ieee80211_node.c, but there is some code path 
where that doesn't happen, and should. Hopefully, this helps someone 
familiar with the code track it down. I may try it at some point, but it 
intimidates me somewhat.

-Boris


More information about the freebsd-net mailing list