[Madwifi-users] Possible memory leak in station mode
Status: Beta
Brought to you by:
otaku
From: Ray O. <rov...@mi...> - 2008-01-21 22:22:21
|
I believe I've found a memory leak with the madwifi driver and I'm hoping for help in resolving/confirming the problem. Set up: I am running madwifi on an IXP425 embedded platform with the Snapgear 3.4 distro (kernel version 2.6.17). I have verified that the problem exists in madwifi trunk r2708 (which we are using) as well madwifi-ng r3117. I wrote a test script (for the station) that automates restarting our radio, verifying an association, and then pings the AP. This is done in a while loop that I set up for 30,000 iterations. I ran this over the weekend and got an oom (out of memory) failure on the 4,664th iteration. I dug into the details for a while and realized that the slab allocation was climbing slowly and steadily. Over 40 MBytes had been allocated to the size-2048 slab. I isolated it to the madwifi driver (got rid of all other supporting processes such as syslog, wpa_supplicant, etc). The problem still occurs even if I modprobe/rmmod ath_pci in the restart script. I can see the slab allocation go up by 4kbytes almost every restart with /proc/meminfo and I can see the size-2048 slab slowly increase with /proc/slabinfo. My system has 64MBytes of DRAM, but if I set min_free_kbytes to 40Meg, the unit runs out of memory very quickly, as expected. Should I open a ticket? I haven't tested the AP side yet but I will... Here is the script (apologies for the cryptic variable names): #!/bin/sh var1=0 var2=0 var3=0 result=0 pinged=0 text="" while [ $var1 -lt 200000 ] do echo "" text=`date -R` echo "Iteration $var1 at $text" service radio restart #dmesg var2=0 text="" while [ "$text" == "" ]; do #echo "Not associated on iteration $var2" #text="" text=`wlanconfig ath0 list` #echo "text = $text" if [ $var2 -gt 60 ]; then echo "Could not associate, aborting test" exit fi let var2=$var2+1 sleep 1 done echo "Associated on iteration $var2" #check if can ping, 30 times, once a second var3=0 pinged=0 while [ $pinged -eq 0 ] do ping 192.168.3.200 -c 1 > /dev/null let result=$? #echo "Return value == $result" if [ $result -ne 0 ]; then #echo "Return value == $result" echo "Failed to ping host" let var3=$var3+1 if [ $var3 -gt 30 ]; then echo "Could not ping host, aborting test..." exit fi else #echo "AP contacted" let pinged=1 fi #sleep 1 done #ping 192.168.3.200 -c 1 auth=1 echo "Host found on iteration $var3" let var1=$var1+1 done Start script: wlanconfig ath0 create wlandev wifi0 wlanmode sta nosbeacon -bssid ifconfig wifi0 up if [ "$RATE" == "auto" ]; then iwconfig ath0 rate auto else iwconfig ath0 rate $RATE fixed fi iwconfig ath0 channel $CHANNEL #iwpriv ath0 mode $MODE iwconfig ath0 txpower 0 iwconfig ath0 essid $SSID if [ "$ALG" = "WEP" ]; then iwconfig ath0 key [1] $KEY1 iwconfig ath0 key [2] $KEY2 iwconfig ath0 key [3] $KEY3 iwconfig ath0 key [4] $KEY4 iwconfig ath0 key [$IDX] fi if [ "$ALG" = "NONE" ]; then iwconfig ath0 key 0 fi iwpriv ath0 wds 1 iwpriv ath0 inact 60 # Load Networking Config echo -n "Adding into bridge ..." brctl addif br0 ath0 ifconfig ath0 0.0.0.0 up sleep 2 iwconfig ath0 txpower $TXP echo "done." Stop script #Destroy all vaps! vaps=$(ifconfig -a -s | grep ath | sed -e 's/\(ath[0-9]\+\).*/\1/g') for vap in $vaps; do ifconfig $vap down brctl delif br0 $vap wlanconfig $vap destroy done -- Ray Overland BSc. EE Senior Software Engineer Microhard Systems Inc. http://www.microhardcorp.com Phone: (403)248-0028 ext 230 Email: rov...@mi... |