Hardware devices on a modern System-on-Chip (SoC), ranging from accelerators to IO controllers, usually account for the largest portion of the chip area. It is therefore vital for Operating Systems (OS) to disable and enable these devices at run time, so that idle devices can enter low-power state timely while meeting user’s performance expectation. This is called device runtime Power Management (PM), for which individual device drivers in commodity OSes are held responsible. Based on the observations of existing drivers and their evolution, we consider counting on drivers for device runtime PM harmful.
We identify three pieces of information essential to device runtime PM, and show that all of them can be obtained without involving drivers, either by using a software inference approach atop existing ARM-based SoC, or more efficiently, by adding one register bit to each device. We thus argue for a structural change to the current Linux runtime PM framework, replacing PM code in each individual driver with one kernel module called central PM agent. We experimentally show that central PM agent is just as effective as hand-tuned driver PM code.
We also present a software tool called PowerAdvisor, as a remedy to simplify driver PM efforts without overhauling the current Linux runtime PM framework. PowerAdvisor analyzes trace generated from historic executions and suggests PM calls to be inserted at certain driver source locations. Although a best-effort tool, PowerAdvisor not only reproduces hand-tuned PM code that already exists in stock drivers, but also correctly suggests PM code never known before . Overall, our experiences show that it is promising to ultimately free driver developers from manual PM.