Hi.
Sometimes it is usefull to unload a complete stack of modules.
This patch implements that:
Index: pm/functions
===================================================================
RCS file: /cvs/pm-utils/pm-utils/pm/functions,v
retrieving revision 1.20
diff -u -p -r1.20 functions
--- pm/functions 28 Sep 2006 21:25:36 -0000 1.20
+++ pm/functions 5 Oct 2006 16:00:39 -0000
@@ -113,13 +113,46 @@ pm_main()
return 0
}
+# this recursively unloads the given modules and all that depend on it
+# first parameter is the module to be unloaded
modunload()
{
- /sbin/lsmod 2>/dev/null | grep -q "$1"
- if [ "$?" == "0" ]; then
- echo "export ${1}_MODULE_LOAD=yes" >> /var/run/pm-suspend
- /sbin/modprobe -r "$1" >/dev/null 2>&1
- fi
+ local MOD D C USED MODS I
+ local UNL=$1 RET=1
+ # RET is the return code. If at least one module was unloaded, return 0.
+ # if the module was not loaded, also return 0 since this is no
error.
+ # if no module was unloaded successfully, return 1
+ while read MOD D C USED D; do
+ [ "$MOD" != "$UNL" ] && continue
+ if [ "$USED" == "-" ]; then
+ if [ $C -eq 0 ]; then
+ if rmmod $UNL; then
+ echo "export ${UNL}_MODULE_LOAD=yes" >>
/var/run/pm-suspend
+ RET=0
+ else
+ echo "## could not unload '$UNL', usage
count was 0" \
+ >> /var/run/pm-suspend
+ fi
+ else
+ echo "## could not unload '$UNL', usage count:
$C" >> \
+ /var/run/pm-suspend
+ fi
+ else
+ USED=${USED//,/ }
+ MODS=($USED)
+ # it seems slightly more likely to rmmod in one pass,
if we try backwards.
+ for I in `seq [EMAIL PROTECTED] -1 0`; do
+ MOD=${MODS[$I]}
+ modunload $MOD && RET=0
+ done
+ # if we unloaded at least one module, then let's try
again!
+ [ $RET -eq 0 ] && modunload $UNL
+ RET=$?
+ fi
+ return $RET
+ done < /proc/modules
+ # if we came this far, there was nothing to do, the module is no longer
loaded.
+ return 0
}
modreload()
--
Stefan Seyfried
QA / R&D Team Mobile Devices | "Any ideas, John?"
SUSE LINUX Products GmbH, Nürnberg | "Well, surrounding them's out."
Index: pm/functions
===================================================================
RCS file: /cvs/pm-utils/pm-utils/pm/functions,v
retrieving revision 1.20
diff -u -p -r1.20 functions
--- pm/functions 28 Sep 2006 21:25:36 -0000 1.20
+++ pm/functions 5 Oct 2006 16:00:39 -0000
@@ -113,13 +113,46 @@ pm_main()
return 0
}
+# this recursively unloads the given modules and all that depend on it
+# first parameter is the module to be unloaded
modunload()
{
- /sbin/lsmod 2>/dev/null | grep -q "$1"
- if [ "$?" == "0" ]; then
- echo "export ${1}_MODULE_LOAD=yes" >> /var/run/pm-suspend
- /sbin/modprobe -r "$1" >/dev/null 2>&1
- fi
+ local MOD D C USED MODS I
+ local UNL=$1 RET=1
+ # RET is the return code. If at least one module was unloaded, return 0.
+ # if the module was not loaded, also return 0 since this is no error.
+ # if no module was unloaded successfully, return 1
+ while read MOD D C USED D; do
+ [ "$MOD" != "$UNL" ] && continue
+ if [ "$USED" == "-" ]; then
+ if [ $C -eq 0 ]; then
+ if rmmod $UNL; then
+ echo "export ${UNL}_MODULE_LOAD=yes" >> /var/run/pm-suspend
+ RET=0
+ else
+ echo "## could not unload '$UNL', usage count was 0" \
+ >> /var/run/pm-suspend
+ fi
+ else
+ echo "## could not unload '$UNL', usage count: $C" >> \
+ /var/run/pm-suspend
+ fi
+ else
+ USED=${USED//,/ }
+ MODS=($USED)
+ # it seems slightly more likely to rmmod in one pass, if we try backwards.
+ for I in `seq [EMAIL PROTECTED] -1 0`; do
+ MOD=${MODS[$I]}
+ modunload $MOD && RET=0
+ done
+ # if we unloaded at least one module, then let's try again!
+ [ $RET -eq 0 ] && modunload $UNL
+ RET=$?
+ fi
+ return $RET
+ done < /proc/modules
+ # if we came this far, there was nothing to do, the module is no longer loaded.
+ return 0
}
modreload()
_______________________________________________
Pm-utils mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/pm-utils