Howto: Powersaving tweaks with a udev rule


Recommended Posts

I previously made a guide showing how you can utilize pm-utils scripts to enable extra powersaving settings in linux: http://www.neowin.ne...-with-pm-utils/.

I've since found a solution I like better, because its much simpler and I am also trying to lessen my dependence on pm-utils (it seems there's been no active development for the past few years). I'm hoping I'll be able to uninstall it eventually since the latest upower can now use systemd instead of pm-utils for suspend/hibernate, but it still seems to require pm-utils for some things.

Anyway, on to the guide. I found this solution over on the arch forums: https://bbs.archlinu...163335#p1163335.

Basically all this solution is: A udev rule that detects whether your system is on AC or Battery, then runs a script, and passes a true or false value to the script depending on whether you are on AC or Battery.

1. Create the udev rule. Create a file named /etc/udev/rules.d/50-powersave.rules. Place the following in the file:


SUBSYSTEM=="power_supply", ENV{POWER_SUPPLY_ONLINE}=="0", RUN+="/usr/bin/powersave true"
SUBSYSTEM=="power_supply", ENV{POWER_SUPPLY_ONLINE}=="1", RUN+="/usr/bin/powersave false"
[/CODE]

In this example my powersaving script is located at /usr/bin/powersave. If you want your script in a different location, make sure to change the path there.

2. Create the powersaving script. I've saved my script at /usr/bin/powersave. Here is an example script, this is the one I use on my system. With this type of thing your mileage will vary, you may have to use different commands depending on your hardware and/or preferences. My example script is fairly conservative and should work fine for most:

[CODE]
#!/bin/sh
case "$1" in
true) # Enable power saving settings on battery
# Device Runtime-PM
for dpcontrol in /sys/bus/{pci,spi,i2c}/devices/*/power/control; do echo auto > $dpcontrol; done
# Disable nmi_watchdog
echo 0 > /proc/sys/kernel/nmi_watchdog
# kernel write mode
echo 5 > /proc/sys/vm/laptop_mode
echo 1500 > /proc/sys/vm/dirty_writeback_centisecs
# disk powersave
hdparm -S 36 -B 128 /dev/sda &> /dev/null
for i in /sys/class/scsi_host/host*/link_power_management_policy; do echo min_power > $i; done
# sound card powersave
echo 10 > /sys/module/snd_hda_intel/parameters/power_save
echo Y > /sys/module/snd_hda_intel/parameters/power_save_controller
# wlan0 powersave
iw dev wlan0 set power_save on &> /dev/null
;;
false) # Return to default on AC power
# Device Runtime-PM
for dpcontrol in /sys/bus/{pci,spi,i2c}/devices/*/power/control; do echo on > $dpcontrol; done
# Enable nmi_watchdog
echo 1 > /proc/sys/kernel/nmi_watchdog
# kernel write mode
echo 0 > /proc/sys/vm/laptop_mode
echo 500 > /proc/sys/vm/dirty_writeback_centisecs
# disk powersave
hdparm -S 0 -B 254 /dev/sda &> /dev/null
for i in /sys/class/scsi_host/host*/link_power_management_policy; do echo max_performance > $i; done
# sound card powersave
echo 300 > /sys/module/snd_hda_intel/parameters/power_save
echo Y > /sys/module/snd_hda_intel/parameters/power_save_controller
# wlan0 powersave
iw dev wlan0 set power_save off &> /dev/null
;;
esac
exit 0
[/CODE]

3. Then you just make the powersave script executable, and run [b]udevadm control --reload-rules[/b] to make udev recognize the rule we added.

4. Tweak the script to your liking! Below I've explained what the commands in the example do, and some possible things to try out and/or look out for:

[b]Runtime-PM:[/b] [size=4][font=arial,helvetica,sans-serif]The first command in the script enables runtime-pm for everything except USB devices (since the kernel does it automatically on my machine, as I explain in the USB autosuspend section. In addition my system requires USB modules to be unloaded before suspend or else it hangs, and I do this via a systemd sleep hook. If I mess with toggling usb powersaving settings on my machine, the values get set inconsistently after suspend/resume). The command to enable runtime-pm for all devices on your machine would be:[/font][/size] [color=#333333][font=Consolas,][b]for i in /sys/bus/*/devices/*/power/control; do echo auto > $i; done[/b]. [font=arial,helvetica,sans-serif][size=4]You can echo "on" instead of auto if you want to disable it on AC. If you don't have bugs like my machine has the above command should work fine :)[/size][/font][/font][/color]

[color=#333333][font=Consolas,][font=arial,helvetica,sans-serif][size=4][b]NMI Watchdog:[/b] This is safe to disable, disabling it saves a bit of battery life.[/size][/font][/font][/color]

[color=#333333][font=Consolas,][font=arial,helvetica,sans-serif][size=4][b]VM Writeback:[/b] Increasing the vm_writeback value on battery causes less disk writes and can save a bit of power (and can help allow the disk to spindown). The value in my example script is the one recommended by powertop and is safe. [/size][/font][/font][/color]

[b]USB autosuspend:[/b] I don't have any usb autosuspend settings in my script, because the newest kernels seem to enable this automatically (on my arch system, even with no powersaving tweaks via pm-utils or this method, usb autosuspend is enabled by default with a 2 second timeout). If you need to enable it manually, you could use these commands:

[CODE]
# usb autosuspend

for i in /sys/bus/usb/devices/*/power/autosuspend; do echo 1 > $i; done
for i in /sys/bus/usb/devices/*/power/level; do echo auto > $i; done
[/CODE]

The first command sets the timeout of how many seconds to wait to suspend usb devices after they've been idle, this example uses 1 second. The second command enables usb autosuspend. To disable USB autosuspend you would echo "0" and "on" instead of "1" and "auto".

[b]HDparm Settings: [/b]My script uses pretty conservative hdparm settings that shouldn't spin down your drive like crazy. I use hdparm -S 36 to set the disk spindown timeout to 3 minutes, and hdparm -B 128 which is the most conservative value that still allows disk spindown. If you don't want to use disk spindown at all use [b][color=#333333]hdparm -S 0 -B 254 /dev/sda &> /dev/null[/color][/b] instead.

[b]Sata Link Power Management: [/b]sata aplm is known to be buggy on certain hardware (potentially causing data loss) so only enable this option if you know it works on your machine. To disable it comment out the [color=#333333][font=Consolas,][b]link_power_management_policy[/b] [size=4]line.[/size][/font][/color]

[b]Intel Audio Powersave:[/b] My script enables intel audio powersave on both battery and AC, but with a 5 minute timeout on AC, and 10 seconds on battery. I have intel controller powersave enabled on both AC and Battery due to a bug (If you toggle that one on and off then your audio codecs run at 100% all the time even when they are supposed to be in powersave). So if you want to enable this option this is the recommended way to do it. However enabling controller powersave can produce audible clicks when powersaving goes in and out of effect. If this annoys you, try increasing the timeout values or disabling controller powersave on both ac and battery (by echoing N instead of Y)

[b]Wireless:[/b] Mileage may vary on this one, it depends on the wireless tools your distro uses. My example uses the iw tool to enable wireless powersaving, other distros may use iwconfig. If you need to use iwconfig the command would be:[b] [color=#333333]iwconfig wlan0 power on &> /dev/null[/color][/b]

[b]Screen Brightness: [/b]Gnome does this for me, so there is no screen brightness settings in my script. If you wanted to add this an example would be:

To lower brightness and enable display power management on battery:

[CODE]
for i in /sys/class/backlight/acpi_video*/brightness; do echo 0 > $i; done

xset +dpms
xset dpms 0 0 120
[/CODE]

To restore brightness and disable dpms:

[CODE]
for i in /sys/class/backlight/acpi_video*/brightness; do echo 9 > $i; done

xset -dpms
[/CODE]

Remember you want to put any settings you want enabled on battery under the "True" section of the script, and settings you want on AC in the "false" section.

I have only tested this method in arch, but see no reason why it wouldn't work in other distros.

  • 2 months later...
This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • Not sure there is good value here.... the only real choice is 2GB w/ Controller since 1. 512GB would disappear fast based on today's PC game installs 2. Controller is back ordered until 2027. The appeal of playing PC games on TV (along with PS5) sounds interesting, but I am not too lazy to fire up the huge PC either. Not really sure this would be "worth" it.
    • This might work, but the boot menu F12 only shows hdd and dvd+/- and Niks In the bios all usb are enabled. the usb stick is in place and in the boot menu it does not show up in the bios boot order.
    • Because we were never offered a UFC game to review it in the past. Sometimes it's not a conspiracy, the reviewer does not even live in the U.S. and didn't ask for it.
    • Apple releases iOS 27 Beta 2 for developers and power users by Aditya Tiwari It's been a couple of weeks since Apple previewed the iOS 27 update during the WWDC official keynote. The upcoming iOS version will bring even more refinements to the Liquid Glass design language, an upgraded Siri AI assistant, and several new Apple Intelligence features. Interestingly, the latest WWDC keynote was different than previous years. Apple has released the iOS 27 beta 2 (build 24A5370h) for developers who want to test the new features being baked for the iPhone and optimize their apps. If you're interested in downloading the latest beta, go to Settings > General > Software Update > beta Updates, then choose iOS 27 Developer Beta. You can download the latest iOS 27 beta on more than 30 supported iPhones. Make sure you know what you are doing since developer betas can be unstable and unexpected at times. If you want to be on the safer side, you can wait for the public beta, which will arrive next month. It's been a while since Apple discontinued its AirPort router lineup. Now, the company said in the iOS 27 beta 2 release notes that the AirPort Utility is deprecated and won't be available for new downloads from the App Store. Apple added that if you previously downloaded the app, you can re-download it. However, the functionality isn't guaranteed when using the AirPort Utility on iOS 27 or later. Speaking of known issues, Apple said that the Portrait mode blur effect might render incorrectly for photos; you may be unable to stop an alarm from the lock screen without unlocking your iPhone; the "Add a Control" button in Control Center edit mode might appear small or clipped. There are several new features in iOS 27 beta 2 as well. It comes with Neural Engine improvements for Apple Intelligence, including better performance when loading large models over 1GB. HomeKit Secure Video recordings are processed on-device and through Private Cloud Compute for video descriptions and search, when Apple Intelligence is enabled in the Home app. That said, you can also download the second betas of macOS 27 Golden Gate, iPadOS 27, watchOS 27, and other Apple operating systems.
  • Recent Achievements

    • Rookie
      dorf went up a rank
      Rookie
    • First Post
      mike_rumble earned a badge
      First Post
    • Dedicated
      tuben earned a badge
      Dedicated
    • Week One Done
      mnsgroup earned a badge
      Week One Done
    • Conversation Starter
      sumytbe earned a badge
      Conversation Starter
  • Popular Contributors

    1. 1
      +primortal
      501
    2. 2
      +Edouard
      203
    3. 3
      PsYcHoKiLLa
      98
    4. 4
      Michael Scrip
      80
    5. 5
      neufuse
      67
  • Tell a friend

    Love Neowin? Tell a friend!