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

    • Seems to be working fine for me.
    • Latest Rufus update improves new Windows 11 install method by Taras Buria Pete Batard, the maker of Rufus, a very popular app for creating bootable Windows (and other OS) media, has released a new beta version of its app. Rufus 4.15 beta is now out, and while it offers no new features, there are all sorts of improvements and fixes, including for the new Windows 11 installation method that was introduced in version 4.14 in early May. The "Silent Windows 11 installation" is a new feature whose goal is to automate operating system installation. All you have to do is boot from the drive, and then Rufus takes over, doing all things for you, such as setting up a new account, skipping ads and prompts, and more. It is a very handy tool, but initially, it had some bugs and issues that required addressing. With version 4.15 beta, Rufus is fixing that, particularly a bug with installation failing at 75%, crashes on Snapdragon X-based PCs, and more. Here is the changelog: Rufus 4.15 beta is now available for download from its GitHub repository. If you have never used Rufus before, you can check out our guide here. It is a very useful utility to have, as it allows you to deal with plenty of Windows 11's annoyances, which are still there, despite Microsoft's ongoing efforts to fix them.
    • Microsoft fixes one of Excel Copilot's most frustrating limitations by Usama Jawad Microsoft began integrating Copilot into Excel a couple of years ago and has been upgrading it with new functionalities since then. While some changes have been controversial, Microsoft is hoping to win over users by allowing them to be more productive via Copilot. To that end, it has now announced a Copilot improvement that may actually be appreciated by people who use it regularly. Excel customers often use the Copilot prompt box to issue instructions to format and customize their data, but it can become quite tiring to keep repeating the same instructions again and again. Microsoft now allows you to define Copilot personalization rules for formatting, naming conventions, formulas, and report styles. These can be accessed via Settings > Personalization, where you can explain your rules in natural language like "Always format currency in USD with no decimals", and just let Copilot take care of the rest. Microsoft is going a step further in this direction by allowing you to set workbook rules too. These rules are stored as a .Rules sheet, and are preserved while the workbook is shared. This fosters collaboration while making sure that standard rules govern the Copilot editing experience across the organization. Other advantages of this capability include pointing it to specific examples, defining dynamic formulas, and referencing an entire sheet and asking Copilot to infer rules based on that. You can leverage this feature by opening Copilot in Excel, clicking on "+", and selecting Create workbook rules. If you have an existing .Rules sheet, you can simply start listing the rules in column A as well. Personalization features are available to all Copilot in Excel users across the web, Mac, and Windows. Meanwhile, workbook rules are currently being previewed for Windows and Mac customers on the Insiders channel. General availability is scheduled after a few weeks, but a concrete date is currently unknown. Overall, the Excel capability is quite similar to ChatGPT's memory features, which allow you to permanently store items in the AI model's context window.
    • Imagine you still haven't discovered Total Commander that is doing all those things for three decades already...
    • This sounds like underneath the nice marketing spin, either someone at Adobe got tired of their lazy devs and asked Microsoft to help them sort at least some of Adobe's ancestral spaghetti code to make it go faster, or Microsoft wanted Adobe's crap to run better on Windows to make it look better when compared to Apple, so they offered to intervene. Either way, GOOD.
  • Recent Achievements

    • One Month Later
      Vincian earned a badge
      One Month Later
    • First Post
      Jocimo earned a badge
      First Post
    • Week One Done
      suprememobiles48 earned a badge
      Week One Done
    • One Month Later
      Windows Guy earned a badge
      One Month Later
    • One Month Later
      Prasann earned a badge
      One Month Later
  • Popular Contributors

    1. 1
      +primortal
      509
    2. 2
      +Edouard
      172
    3. 3
      PsYcHoKiLLa
      90
    4. 4
      Steven P.
      77
    5. 5
      neufuse
      68
  • Tell a friend

    Love Neowin? Tell a friend!