EAS Development for Mainline Linux

EAS development for mainline Linux takes place on LKML and Linaro eas-dev mailing lists where proposed patches are discussed with the community. Arm now provides a pre-integrated version of latest EAS patches for mainline, for upstream development use.

EAS mainline is a moving integration branch tracking tip sched/core, mainline release candidate or linux-pm testing and adding the latest versions of EAS related patch sets targeted at the mainline kernel. The patches may already be under discussion on relevant open source mailing lists or waiting here while their dependencies get resolved and merged upstream.

The integration branch comes as is with synthetic test case testing only. The intention is to have a single branch containing the full EAS picture for mainline Linux kernel developers interested in tracking progress. This EAS mainline integration branch is not suitable for product development. For product, please use the AOSP common kernel.

Source code

EAS mainline integration branches are made available regularly on:


The releases are tagged with the date e.g. -20190310 so old integrations are available for comparison

Latest: integration-20190705

Tree: eas/next/integration

Base: eas/next/integration-base

New changes:

  1. Tracepoint patch-set v3 and util_clamp v10 (core and per-task interface) now in base (tip sched/core).
  2. 'Make schedutil energy aware' v2 from LKML.
  3. New FVP platform branch.


  1. Util(ization) clamping, i.e. a mechanism which allows to "clamp" (i.e. filter) the utilization generated by RT and FAIR task within a range defined from user-space.
  2. EAS (and over-utilization) related tracepoints.
  3. Miscellaneous EAS and asymmetric CPU capacity related small fixes destined for mainline.

Features now in mainline:

  1. Frequency Invariant Engine (FIE) and CPU Invariant Engine (v4.13/v4.15).
  2. Idle CPU PELT (Per-Entity Load-Tracking) update (v4.17).
  3. Util(ization) Est(imated) (v4.17).
  4. Misfit task, i.e. forcing migration of running tasks that do not fit on the CPU they are currently running on (v4.20).
  5. Runtime scheduler domain flag detection (v4.20).
  6. Per-cpu Energy Model and Energy Aware Scheduling (v5.0).

Supported platforms:

  1. Arm Juno r0 (arm64)
  2. Arm Juno r2 (arm64)
  3. Hikey960 (arm64) (needs out-of-tree patches, provided by the hikey960_mainline topic branch which comes with this integration)
  4. Arm TC2 (arm32)

Next work items:

Work on getting a 100% pass-rate on all supported platforms.


  • Test Results (integration 20190705)
    • Platform Juno r0
    • Test case passed if failure rate < 10%


    • EAS behaviour:

                                                                          pass rate
      EnergyModelWakeMigration: test_slack:               passed  250/250 (100.0%)
      EnergyModelWakeMigration: test_task_placement: passed 250/250 (100.0%)
      OneSmallTask: test_slack: passed 250/250 (100.0%)
      OneSmallTask: test_task_placement: passed 248/248 (100.0%)
      RampDown: test_slack: passed 250/250 (100.0%)
      RampDown: test_task_placement: passed 250/250 (100.0%)
      RampUp: test_slack: passed 250/250 (100.0%)
      RampUp: test_task_placement: passed 250/250 (100.0%)
      ThreeSmallTasks: test_slack: passed 250/250 (100.0%)
      ThreeSmallTasks: test_task_placement: passed 213/213 (100.0%)
      TwoBigTasks: test_slack: passed  250/250 (100.0%)
      TwoBigTasks: test_task_placement: passed 250/250 (100.0%)
      TwoBigThreeSmall: test_slack: passed 250/250 (100.0%)
      TwoBigThreeSmall: test_task_placement: passed  189/189 (100.0%)

    • load tracking:

                                                                          pass rate
      Invariance:               test_cpu_invariance:      passed  250/250 (100.0%)
      Invariance: test_freq_invariance: passed  250/250 (100.0%)
      Invariance: test_task_load_avg: passed  250/250 (100.0%)
      Invariance: test_task_util_avg: passed 250/250 (100.0%)
      OneTaskCPUMigration: test_util_task_migration: passed 250/250 (100.0%) PELTTasksTest: test_load_avg_behaviour: passed 250/250 (100.0%)
      PELTTasksTest: test_load_avg_range: passed 250/250 (100.0%)
      PELTTasksTest: test_util_avg_behaviour: passed 250/250 (100.0%)
      PELTTasksTest: test_util_avg_range: passed 250/250 (100.0%)
      TwoTasksCPUMigration: test_util_task_migration: passed 250/250 (100.0%)
    • misfit:

                                                                          pass rate
      StaggeredFinishes:        test_preempt_time:        passed  250/250 (100.0%)
      StaggeredFinishes: test_throughput: passed  250/250 (100.0%)
    • other:

                                                                          pass rate
      CapacitySanity:           test_capacity_sanity:     passed  250/250 (100.0%)
      UserspaceSanity: test_performance_sanity: passed  250/250 (100.0%)
    • hotplug:

                                                                          pass rate
      HotplugTorture:           test_cpus_alive:          passed  250/250 (100.0%)
      HotplugTorture: test_target_alive: passed  250/250 (100.0%)