Taming Intel-lpmd on Fedora

Advertisement

Intel-lpmd: short for “Intel Low Power Mode Daemon,” an official Intel background service that claims to improve “big.LITTLE scheduling.” It’s first-party, so it must have something going for it. Officially it only supports big.LITTLE chips anyway — running it on a non-hybrid CPU is pointless. And the whole thing is built around per-model tuning: users or OEMs can drop in dedicated XML configs to optimize power.

I bring this up because Fedora apparently started installing it by default a while back, and even more conveniently, Fedora pushed a version update recently that added support for two more CPUs: Arrow Lake-H and WildCat Lake.

Advertisement

c22ee555-d2a3-4aca-a3b1-9f55f73ebbb6.png

As an Arrow Lake-H user I updated right away. LPMD picked up my ARL-H just fine and enabled a profile: /etc/intel_lpmd/intel_lpmd_config_F6_M197.xml. A few minutes of use and something felt off. I opened the config file, read the first comment, and lost it.

<?xml version="1.0"?>

<!--
Intel Energy Optimizer (LPMD) configuration for Arrow Lake-H
(family 6, model 0xC5 / 197).

  Performance (PerformanceDef=-1) -> LPMD_OFF  -> all CPUs active
  Balanced    (BalancedDef= 0)    -> LPMD_AUTO -> E+L cores only (P-cores parked)
  Powersaver  (PowersaverDef= 1)  -> LPMD_ON   -> L-cores only

Design: P-cores are NEVER used in Balanced mode. All WLT states use
ActiveLcores=ALL + ActiveEcores=ALL (topology-portable, not hardcoded
CPU numbers). EPP/EPB vary per WLT state to spread the power-performance
tradeoff across E+L cores. If the user wants P-cores, they select
Performance mode or disable LPMD.-->

I don’t know what brain came up with this scheduling scheme, especially the line “P-cores are NEVER used in Balanced mode.” Most laptops run Balanced mode. You just told everyone’s big cores to sit down. Sure, power efficiency goes up — and performance falls off a cliff. You trust Intel’s E-cores and LP E-cores that much?

And the killer: this actually made it into Stable. From what I can tell it’s preinstalled by default too. No idea how many people are going to get wrecked. The bug list already has plenty of casualties:

https://bugzilla.redhat.com/show_bug.cgi?id=2532653

The fix is simple — follow the buglist, or just outsource it to an AI:

My own ARL-H 285 is set up like this:

<?xml version="1.0"?>
<Configuration>
	<lp_mode_cpus></lp_mode_cpus>
	<lp_mode_epp></lp_mode_epp>
	<Mode>1</Mode>
	<PerformanceDef>-1</PerformanceDef>
	<BalancedDef>0</BalancedDef>
	<PowersaverDef>1</PowersaverDef>
	<HfiLpmEnable>0</HfiLpmEnable>
	<WLTHintEnable>1</WLTHintEnable>
	<WLTHintPollEnable>1</WLTHintPollEnable>
	<HfiSuvEnable>0</HfiSuvEnable>
	<WLTHintMask>15</WLTHintMask>
	<IgnoreITMT>0</IgnoreITMT>
<States>
		<CPUFamily> 6 </CPUFamily>
		<CPUModel> 197 </CPUModel>
		<CPUConfig> * </CPUConfig>
		<State>
			<ID> 1 </ID>
			<Name> UTIL_IDLE </Name>
			<WLTTypeMask> 3 </WLTTypeMask>
			<ActiveLcores>ALL</ActiveLcores>
			<ActiveEcores>ALL</ActiveEcores>
			<IRQMigrate>0</IRQMigrate>
			<EPP>192</EPP>
			<EPB>8</EPB>
		</State>
		<State>
			<ID> 2 </ID>
			<Name> UTIL_IDLE_SUSTAIN </Name>
			<WLTType> 2 </WLTType>
			<ActivePcores>ALL</ActivePcores>
			<ActiveLcores>ALL</ActiveLcores>
			<ActiveEcores>ALL</ActiveEcores>
			<IRQMigrate>0</IRQMigrate>
			<EPP>64</EPP>
			<EPB>4</EPB>
		</State>
		<State>
			<ID> 3 </ID>
			<Name> UTIL_IDLE_BURSTY </Name>
			<WLTType> 3 </WLTType>
			<ActivePcores>ALL</ActivePcores>
			<ActiveLcores>ALL</ActiveLcores>
			<ActiveEcores>ALL</ActiveEcores>
			<IRQMigrate>0</IRQMigrate>
			<EPP>128</EPP>
			<EPB>6</EPB>
		</State>
	</States>
</Configuration>

The gist: in Balanced, P-cores only spin up when needed, and can be shut off under light load.

Following that setup, I wrote a separate profile for my other big.LITTLE laptop, a 1215U: /etc/intel_lpmd/intel_lpmd_config_F6_M154_T15.xml. If you don’t know which profile your CPU maps to, check the lpmd service log — it’ll tell you which file it’s looking for, so just create that file.

<?xml version="1.0"?>
<Configuration>
	<lp_mode_cpus></lp_mode_cpus>
	<lp_mode_epp></lp_mode_epp>
	<Mode>1</Mode>
	<PerformanceDef>-1</PerformanceDef>
	<BalancedDef>0</BalancedDef>
	<PowersaverDef>1</PowersaverDef>
	<HfiLpmEnable>1</HfiLpmEnable>
	<WLTHintEnable>1</WLTHintEnable>
	<WLTHintPollEnable>1</WLTHintPollEnable>
	<HfiSuvEnable>0</HfiSuvEnable>
	<WLTHintMask>15</WLTHintMask>
	<util_entry_threshold>10</util_entry_threshold>
	<util_exit_threshold>70</util_exit_threshold>
	<IgnoreITMT>0</IgnoreITMT>
	<States>
		<CPUFamily> 6 </CPUFamily>
		<CPUModel> 154 </CPUModel>
		<CPUConfig> * </CPUConfig>
		<State>
			<ID> 1 </ID>
			<Name> UTIL_IDLE </Name>
			<WLTTypeMask> 3 </WLTTypeMask>
			<ActiveEcores>ALL</ActiveEcores>
			<IRQMigrate>0</IRQMigrate>
			<EPP>192</EPP>
			<EPB>8</EPB>
		</State>
		<State>
			<ID> 2 </ID>
			<Name> UTIL_IDLE_SUSTAIN </Name>
			<WLTType> 2 </WLTType>
			<ActivePcores>ALL</ActivePcores>
			<ActiveEcores>ALL</ActiveEcores>
			<IRQMigrate>0</IRQMigrate>
			<EPP>64</EPP>
			<EPB>4</EPB>
		</State>
		<State>
			<ID> 3 </ID>
			<Name> UTIL_IDLE_BURSTY </Name>
			<WLTType> 3 </WLTType>
			<ActivePcores>ALL</ActivePcores>
			<ActiveEcores>ALL</ActiveEcores>
			<IRQMigrate>0</IRQMigrate>
			<EPP>128</EPP>
			<EPB>6</EPB>
		</State>
	</States>
</Configuration>

Same basic strategy. Write the file, restart the lpmd service.

systemctl restart intel_lpmd
systemctl status intel_lpmd

Honestly the ARL-H didn’t gain much in efficiency, but the 1215U improved noticeably — whole-system power while browsing often sits at just 5W.

Discuss this post on plumz.me

Comments are hosted on the Chinese main site. This mirror is read-only.

Table of Contents