From 35221b53381c8823e237c04a71d9c2549114c52f Mon Sep 17 00:00:00 2001 From: Suren Baghdasaryan Date: Fri, 20 Nov 2020 17:08:51 -0800 Subject: [PATCH] libprocessgroup: Support per-API level task profiles When task profiles changes happen, devices released under older API levels might have to use the same profiles as before. This might be due to for missing kernel features or some other reasons. Add support for per-API task profiles to accommodate this scenario. With this mechanism when ro.product.first_api_level is non-empty, the system looks for /system/etc/profiles/task_profiles_.json file and uses it if it exists. If ro.product.first_api_level is not defined or per-API task profiles file does not exist the system falls back to the default /system/etc/profiles/task_profiles.json file. As before, these task profiles can be competely overwritten using /vendor/etc/task_profiles.json if needed. Bug: 172066799 Test: boot with per-API task profiles Signed-off-by: Suren Baghdasaryan Change-Id: I1671b341b3a0fb5e99d0b0788315c61088326b09 --- libprocessgroup/profiles/Android.bp | 46 ++ libprocessgroup/profiles/cgroups_28.json | 59 ++ libprocessgroup/profiles/cgroups_29.json | 59 ++ libprocessgroup/profiles/cgroups_30.json | 59 ++ .../profiles/task_profiles_28.json | 627 ++++++++++++++++++ .../profiles/task_profiles_29.json | 627 ++++++++++++++++++ .../profiles/task_profiles_30.json | 627 ++++++++++++++++++ libprocessgroup/setup/cgroup_map_write.cpp | 18 +- libprocessgroup/task_profiles.cpp | 25 +- 9 files changed, 2141 insertions(+), 6 deletions(-) create mode 100644 libprocessgroup/profiles/cgroups_28.json create mode 100644 libprocessgroup/profiles/cgroups_29.json create mode 100644 libprocessgroup/profiles/cgroups_30.json create mode 100644 libprocessgroup/profiles/task_profiles_28.json create mode 100644 libprocessgroup/profiles/task_profiles_29.json create mode 100644 libprocessgroup/profiles/task_profiles_30.json diff --git a/libprocessgroup/profiles/Android.bp b/libprocessgroup/profiles/Android.bp index c371ef7ab..a496237cb 100644 --- a/libprocessgroup/profiles/Android.bp +++ b/libprocessgroup/profiles/Android.bp @@ -15,6 +15,11 @@ prebuilt_etc { name: "cgroups.json", src: "cgroups.json", + required: [ + "cgroups_28.json", + "cgroups_29.json", + "cgroups_30.json", + ], } prebuilt_etc { @@ -24,9 +29,50 @@ prebuilt_etc { src: "cgroups.recovery.json", } +prebuilt_etc { + name: "cgroups_28.json", + src: "cgroups_28.json", + sub_dir: "task_profiles", +} + +prebuilt_etc { + name: "cgroups_29.json", + src: "cgroups_29.json", + sub_dir: "task_profiles", +} + +prebuilt_etc { + name: "cgroups_30.json", + src: "cgroups_30.json", + sub_dir: "task_profiles", +} + prebuilt_etc { name: "task_profiles.json", src: "task_profiles.json", + required: [ + "task_profiles_28.json", + "task_profiles_29.json", + "task_profiles_30.json", + ], +} + +prebuilt_etc { + name: "task_profiles_28.json", + src: "task_profiles_28.json", + sub_dir: "task_profiles", +} + +prebuilt_etc { + name: "task_profiles_29.json", + src: "task_profiles_29.json", + sub_dir: "task_profiles", +} + +prebuilt_etc { + name: "task_profiles_30.json", + src: "task_profiles_30.json", + sub_dir: "task_profiles", } cc_defaults { diff --git a/libprocessgroup/profiles/cgroups_28.json b/libprocessgroup/profiles/cgroups_28.json new file mode 100644 index 000000000..451848711 --- /dev/null +++ b/libprocessgroup/profiles/cgroups_28.json @@ -0,0 +1,59 @@ +{ + "Cgroups": [ + { + "Controller": "blkio", + "Path": "/dev/blkio", + "Mode": "0755", + "UID": "system", + "GID": "system" + }, + { + "Controller": "cpu", + "Path": "/dev/cpuctl", + "Mode": "0755", + "UID": "system", + "GID": "system" + }, + { + "Controller": "cpuacct", + "Path": "/acct", + "Mode": "0555" + }, + { + "Controller": "cpuset", + "Path": "/dev/cpuset", + "Mode": "0755", + "UID": "system", + "GID": "system" + }, + { + "Controller": "memory", + "Path": "/dev/memcg", + "Mode": "0700", + "UID": "root", + "GID": "system" + }, + { + "Controller": "schedtune", + "Path": "/dev/stune", + "Mode": "0755", + "UID": "system", + "GID": "system" + } + ], + "Cgroups2": { + "Path": "/sys/fs/cgroup", + "Mode": "0755", + "UID": "system", + "GID": "system", + "Controllers": [ + { + "Controller": "freezer", + "Path": "freezer", + "Mode": "0755", + "UID": "system", + "GID": "system" + } + ] + } +} diff --git a/libprocessgroup/profiles/cgroups_29.json b/libprocessgroup/profiles/cgroups_29.json new file mode 100644 index 000000000..451848711 --- /dev/null +++ b/libprocessgroup/profiles/cgroups_29.json @@ -0,0 +1,59 @@ +{ + "Cgroups": [ + { + "Controller": "blkio", + "Path": "/dev/blkio", + "Mode": "0755", + "UID": "system", + "GID": "system" + }, + { + "Controller": "cpu", + "Path": "/dev/cpuctl", + "Mode": "0755", + "UID": "system", + "GID": "system" + }, + { + "Controller": "cpuacct", + "Path": "/acct", + "Mode": "0555" + }, + { + "Controller": "cpuset", + "Path": "/dev/cpuset", + "Mode": "0755", + "UID": "system", + "GID": "system" + }, + { + "Controller": "memory", + "Path": "/dev/memcg", + "Mode": "0700", + "UID": "root", + "GID": "system" + }, + { + "Controller": "schedtune", + "Path": "/dev/stune", + "Mode": "0755", + "UID": "system", + "GID": "system" + } + ], + "Cgroups2": { + "Path": "/sys/fs/cgroup", + "Mode": "0755", + "UID": "system", + "GID": "system", + "Controllers": [ + { + "Controller": "freezer", + "Path": "freezer", + "Mode": "0755", + "UID": "system", + "GID": "system" + } + ] + } +} diff --git a/libprocessgroup/profiles/cgroups_30.json b/libprocessgroup/profiles/cgroups_30.json new file mode 100644 index 000000000..451848711 --- /dev/null +++ b/libprocessgroup/profiles/cgroups_30.json @@ -0,0 +1,59 @@ +{ + "Cgroups": [ + { + "Controller": "blkio", + "Path": "/dev/blkio", + "Mode": "0755", + "UID": "system", + "GID": "system" + }, + { + "Controller": "cpu", + "Path": "/dev/cpuctl", + "Mode": "0755", + "UID": "system", + "GID": "system" + }, + { + "Controller": "cpuacct", + "Path": "/acct", + "Mode": "0555" + }, + { + "Controller": "cpuset", + "Path": "/dev/cpuset", + "Mode": "0755", + "UID": "system", + "GID": "system" + }, + { + "Controller": "memory", + "Path": "/dev/memcg", + "Mode": "0700", + "UID": "root", + "GID": "system" + }, + { + "Controller": "schedtune", + "Path": "/dev/stune", + "Mode": "0755", + "UID": "system", + "GID": "system" + } + ], + "Cgroups2": { + "Path": "/sys/fs/cgroup", + "Mode": "0755", + "UID": "system", + "GID": "system", + "Controllers": [ + { + "Controller": "freezer", + "Path": "freezer", + "Mode": "0755", + "UID": "system", + "GID": "system" + } + ] + } +} diff --git a/libprocessgroup/profiles/task_profiles_28.json b/libprocessgroup/profiles/task_profiles_28.json new file mode 100644 index 000000000..142b0bac6 --- /dev/null +++ b/libprocessgroup/profiles/task_profiles_28.json @@ -0,0 +1,627 @@ +{ + "Attributes": [ + { + "Name": "LowCapacityCPUs", + "Controller": "cpuset", + "File": "background/cpus" + }, + { + "Name": "HighCapacityCPUs", + "Controller": "cpuset", + "File": "foreground/cpus" + }, + { + "Name": "MaxCapacityCPUs", + "Controller": "cpuset", + "File": "top-app/cpus" + }, + { + "Name": "MemLimit", + "Controller": "memory", + "File": "memory.limit_in_bytes" + }, + { + "Name": "MemSoftLimit", + "Controller": "memory", + "File": "memory.soft_limit_in_bytes" + }, + { + "Name": "MemSwappiness", + "Controller": "memory", + "File": "memory.swappiness" + }, + { + "Name": "STuneBoost", + "Controller": "schedtune", + "File": "schedtune.boost" + }, + { + "Name": "STunePreferIdle", + "Controller": "schedtune", + "File": "schedtune.prefer_idle" + }, + { + "Name": "UClampMin", + "Controller": "cpu", + "File": "cpu.uclamp.min" + }, + { + "Name": "UClampMax", + "Controller": "cpu", + "File": "cpu.uclamp.max" + }, + { + "Name": "FreezerState", + "Controller": "freezer", + "File": "cgroup.freeze" + } + ], + + "Profiles": [ + { + "Name": "HighEnergySaving", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "schedtune", + "Path": "background" + } + } + ] + }, + { + "Name": "Frozen", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "freezer", + "Path": "" + } + } + ] + }, + { + "Name": "Unfrozen", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "freezer", + "Path": "../" + } + } + ] + }, + { + "Name": "NormalPerformance", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "schedtune", + "Path": "" + } + } + ] + }, + { + "Name": "HighPerformance", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "schedtune", + "Path": "foreground" + } + } + ] + }, + { + "Name": "MaxPerformance", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "schedtune", + "Path": "top-app" + } + } + ] + }, + { + "Name": "RealtimePerformance", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "schedtune", + "Path": "rt" + } + } + ] + }, + { + "Name": "CameraServicePerformance", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "schedtune", + "Path": "camera-daemon" + } + } + ] + }, + { + "Name": "NNApiHALPerformance", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "schedtune", + "Path": "nnapi-hal" + } + } + ] + }, + + { + "Name": "CpuPolicySpread", + "Actions": [ + { + "Name": "SetAttribute", + "Params": + { + "Name": "STunePreferIdle", + "Value": "1" + } + } + ] + }, + { + "Name": "CpuPolicyPack", + "Actions": [ + { + "Name": "SetAttribute", + "Params": + { + "Name": "STunePreferIdle", + "Value": "0" + } + } + ] + }, + + { + "Name": "VrKernelCapacity", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "" + } + } + ] + }, + { + "Name": "VrServiceCapacityLow", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "system/background" + } + } + ] + }, + { + "Name": "VrServiceCapacityNormal", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "system" + } + } + ] + }, + { + "Name": "VrServiceCapacityHigh", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "system/performance" + } + } + ] + }, + { + "Name": "VrProcessCapacityLow", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "application/background" + } + } + ] + }, + { + "Name": "VrProcessCapacityNormal", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "application" + } + } + ] + }, + { + "Name": "VrProcessCapacityHigh", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "application/performance" + } + } + ] + }, + + { + "Name": "ProcessCapacityLow", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "background" + } + } + ] + }, + { + "Name": "ProcessCapacityNormal", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "" + } + } + ] + }, + { + "Name": "ProcessCapacityHigh", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "foreground" + } + } + ] + }, + { + "Name": "ProcessCapacityMax", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "top-app" + } + } + ] + }, + + { + "Name": "ServiceCapacityLow", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "system-background" + } + } + ] + }, + { + "Name": "ServiceCapacityRestricted", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "restricted" + } + } + ] + }, + + { + "Name": "CameraServiceCapacity", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "camera-daemon" + } + } + ] + }, + + { + "Name": "LowIoPriority", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "blkio", + "Path": "background" + } + } + ] + }, + { + "Name": "NormalIoPriority", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "blkio", + "Path": "" + } + } + ] + }, + { + "Name": "HighIoPriority", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "blkio", + "Path": "" + } + } + ] + }, + { + "Name": "MaxIoPriority", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "blkio", + "Path": "" + } + } + ] + }, + + { + "Name": "TimerSlackHigh", + "Actions": [ + { + "Name": "SetTimerSlack", + "Params": + { + "Slack": "40000000" + } + } + ] + }, + { + "Name": "TimerSlackNormal", + "Actions": [ + { + "Name": "SetTimerSlack", + "Params": + { + "Slack": "50000" + } + } + ] + }, + + { + "Name": "PerfBoost", + "Actions": [ + { + "Name": "SetClamps", + "Params": + { + "Boost": "50%", + "Clamp": "0" + } + } + ] + }, + { + "Name": "PerfClamp", + "Actions": [ + { + "Name": "SetClamps", + "Params": + { + "Boost": "0", + "Clamp": "30%" + } + } + ] + }, + + { + "Name": "LowMemoryUsage", + "Actions": [ + { + "Name": "SetAttribute", + "Params": + { + "Name": "MemSoftLimit", + "Value": "16MB" + } + }, + { + "Name": "SetAttribute", + "Params": + { + "Name": "MemSwappiness", + "Value": "150" + + } + } + ] + }, + { + "Name": "HighMemoryUsage", + "Actions": [ + { + "Name": "SetAttribute", + "Params": + { + "Name": "MemSoftLimit", + "Value": "512MB" + } + }, + { + "Name": "SetAttribute", + "Params": + { + "Name": "MemSwappiness", + "Value": "100" + } + } + ] + }, + { + "Name": "SystemMemoryProcess", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "memory", + "Path": "system" + } + } + ] + }, + { + "Name": "FreezerDisabled", + "Actions": [ + { + "Name": "SetAttribute", + "Params": + { + "Name": "FreezerState", + "Value": "0" + } + } + ] + }, + { + "Name": "FreezerEnabled", + "Actions": [ + { + "Name": "SetAttribute", + "Params": + { + "Name": "FreezerState", + "Value": "1" + } + } + ] + } + ], + + "AggregateProfiles": [ + { + "Name": "SCHED_SP_DEFAULT", + "Profiles": [ "TimerSlackNormal" ] + }, + { + "Name": "SCHED_SP_BACKGROUND", + "Profiles": [ "HighEnergySaving", "LowIoPriority", "TimerSlackHigh" ] + }, + { + "Name": "SCHED_SP_FOREGROUND", + "Profiles": [ "HighPerformance", "HighIoPriority", "TimerSlackNormal" ] + }, + { + "Name": "SCHED_SP_TOP_APP", + "Profiles": [ "MaxPerformance", "MaxIoPriority", "TimerSlackNormal" ] + }, + { + "Name": "SCHED_SP_RT_APP", + "Profiles": [ "RealtimePerformance", "MaxIoPriority", "TimerSlackNormal" ] + }, + { + "Name": "CPUSET_SP_DEFAULT", + "Profiles": [ "TimerSlackNormal" ] + }, + { + "Name": "CPUSET_SP_BACKGROUND", + "Profiles": [ "HighEnergySaving", "ProcessCapacityLow", "LowIoPriority", "TimerSlackHigh" ] + }, + { + "Name": "CPUSET_SP_FOREGROUND", + "Profiles": [ "HighPerformance", "ProcessCapacityHigh", "HighIoPriority", "TimerSlackNormal" ] + }, + { + "Name": "CPUSET_SP_TOP_APP", + "Profiles": [ "MaxPerformance", "ProcessCapacityMax", "MaxIoPriority", "TimerSlackNormal" ] + }, + { + "Name": "CPUSET_SP_SYSTEM", + "Profiles": [ "ServiceCapacityLow", "TimerSlackNormal" ] + }, + { + "Name": "CPUSET_SP_RESTRICTED", + "Profiles": [ "ServiceCapacityRestricted", "TimerSlackNormal" ] + } + ] +} diff --git a/libprocessgroup/profiles/task_profiles_29.json b/libprocessgroup/profiles/task_profiles_29.json new file mode 100644 index 000000000..142b0bac6 --- /dev/null +++ b/libprocessgroup/profiles/task_profiles_29.json @@ -0,0 +1,627 @@ +{ + "Attributes": [ + { + "Name": "LowCapacityCPUs", + "Controller": "cpuset", + "File": "background/cpus" + }, + { + "Name": "HighCapacityCPUs", + "Controller": "cpuset", + "File": "foreground/cpus" + }, + { + "Name": "MaxCapacityCPUs", + "Controller": "cpuset", + "File": "top-app/cpus" + }, + { + "Name": "MemLimit", + "Controller": "memory", + "File": "memory.limit_in_bytes" + }, + { + "Name": "MemSoftLimit", + "Controller": "memory", + "File": "memory.soft_limit_in_bytes" + }, + { + "Name": "MemSwappiness", + "Controller": "memory", + "File": "memory.swappiness" + }, + { + "Name": "STuneBoost", + "Controller": "schedtune", + "File": "schedtune.boost" + }, + { + "Name": "STunePreferIdle", + "Controller": "schedtune", + "File": "schedtune.prefer_idle" + }, + { + "Name": "UClampMin", + "Controller": "cpu", + "File": "cpu.uclamp.min" + }, + { + "Name": "UClampMax", + "Controller": "cpu", + "File": "cpu.uclamp.max" + }, + { + "Name": "FreezerState", + "Controller": "freezer", + "File": "cgroup.freeze" + } + ], + + "Profiles": [ + { + "Name": "HighEnergySaving", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "schedtune", + "Path": "background" + } + } + ] + }, + { + "Name": "Frozen", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "freezer", + "Path": "" + } + } + ] + }, + { + "Name": "Unfrozen", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "freezer", + "Path": "../" + } + } + ] + }, + { + "Name": "NormalPerformance", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "schedtune", + "Path": "" + } + } + ] + }, + { + "Name": "HighPerformance", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "schedtune", + "Path": "foreground" + } + } + ] + }, + { + "Name": "MaxPerformance", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "schedtune", + "Path": "top-app" + } + } + ] + }, + { + "Name": "RealtimePerformance", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "schedtune", + "Path": "rt" + } + } + ] + }, + { + "Name": "CameraServicePerformance", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "schedtune", + "Path": "camera-daemon" + } + } + ] + }, + { + "Name": "NNApiHALPerformance", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "schedtune", + "Path": "nnapi-hal" + } + } + ] + }, + + { + "Name": "CpuPolicySpread", + "Actions": [ + { + "Name": "SetAttribute", + "Params": + { + "Name": "STunePreferIdle", + "Value": "1" + } + } + ] + }, + { + "Name": "CpuPolicyPack", + "Actions": [ + { + "Name": "SetAttribute", + "Params": + { + "Name": "STunePreferIdle", + "Value": "0" + } + } + ] + }, + + { + "Name": "VrKernelCapacity", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "" + } + } + ] + }, + { + "Name": "VrServiceCapacityLow", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "system/background" + } + } + ] + }, + { + "Name": "VrServiceCapacityNormal", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "system" + } + } + ] + }, + { + "Name": "VrServiceCapacityHigh", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "system/performance" + } + } + ] + }, + { + "Name": "VrProcessCapacityLow", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "application/background" + } + } + ] + }, + { + "Name": "VrProcessCapacityNormal", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "application" + } + } + ] + }, + { + "Name": "VrProcessCapacityHigh", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "application/performance" + } + } + ] + }, + + { + "Name": "ProcessCapacityLow", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "background" + } + } + ] + }, + { + "Name": "ProcessCapacityNormal", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "" + } + } + ] + }, + { + "Name": "ProcessCapacityHigh", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "foreground" + } + } + ] + }, + { + "Name": "ProcessCapacityMax", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "top-app" + } + } + ] + }, + + { + "Name": "ServiceCapacityLow", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "system-background" + } + } + ] + }, + { + "Name": "ServiceCapacityRestricted", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "restricted" + } + } + ] + }, + + { + "Name": "CameraServiceCapacity", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "camera-daemon" + } + } + ] + }, + + { + "Name": "LowIoPriority", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "blkio", + "Path": "background" + } + } + ] + }, + { + "Name": "NormalIoPriority", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "blkio", + "Path": "" + } + } + ] + }, + { + "Name": "HighIoPriority", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "blkio", + "Path": "" + } + } + ] + }, + { + "Name": "MaxIoPriority", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "blkio", + "Path": "" + } + } + ] + }, + + { + "Name": "TimerSlackHigh", + "Actions": [ + { + "Name": "SetTimerSlack", + "Params": + { + "Slack": "40000000" + } + } + ] + }, + { + "Name": "TimerSlackNormal", + "Actions": [ + { + "Name": "SetTimerSlack", + "Params": + { + "Slack": "50000" + } + } + ] + }, + + { + "Name": "PerfBoost", + "Actions": [ + { + "Name": "SetClamps", + "Params": + { + "Boost": "50%", + "Clamp": "0" + } + } + ] + }, + { + "Name": "PerfClamp", + "Actions": [ + { + "Name": "SetClamps", + "Params": + { + "Boost": "0", + "Clamp": "30%" + } + } + ] + }, + + { + "Name": "LowMemoryUsage", + "Actions": [ + { + "Name": "SetAttribute", + "Params": + { + "Name": "MemSoftLimit", + "Value": "16MB" + } + }, + { + "Name": "SetAttribute", + "Params": + { + "Name": "MemSwappiness", + "Value": "150" + + } + } + ] + }, + { + "Name": "HighMemoryUsage", + "Actions": [ + { + "Name": "SetAttribute", + "Params": + { + "Name": "MemSoftLimit", + "Value": "512MB" + } + }, + { + "Name": "SetAttribute", + "Params": + { + "Name": "MemSwappiness", + "Value": "100" + } + } + ] + }, + { + "Name": "SystemMemoryProcess", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "memory", + "Path": "system" + } + } + ] + }, + { + "Name": "FreezerDisabled", + "Actions": [ + { + "Name": "SetAttribute", + "Params": + { + "Name": "FreezerState", + "Value": "0" + } + } + ] + }, + { + "Name": "FreezerEnabled", + "Actions": [ + { + "Name": "SetAttribute", + "Params": + { + "Name": "FreezerState", + "Value": "1" + } + } + ] + } + ], + + "AggregateProfiles": [ + { + "Name": "SCHED_SP_DEFAULT", + "Profiles": [ "TimerSlackNormal" ] + }, + { + "Name": "SCHED_SP_BACKGROUND", + "Profiles": [ "HighEnergySaving", "LowIoPriority", "TimerSlackHigh" ] + }, + { + "Name": "SCHED_SP_FOREGROUND", + "Profiles": [ "HighPerformance", "HighIoPriority", "TimerSlackNormal" ] + }, + { + "Name": "SCHED_SP_TOP_APP", + "Profiles": [ "MaxPerformance", "MaxIoPriority", "TimerSlackNormal" ] + }, + { + "Name": "SCHED_SP_RT_APP", + "Profiles": [ "RealtimePerformance", "MaxIoPriority", "TimerSlackNormal" ] + }, + { + "Name": "CPUSET_SP_DEFAULT", + "Profiles": [ "TimerSlackNormal" ] + }, + { + "Name": "CPUSET_SP_BACKGROUND", + "Profiles": [ "HighEnergySaving", "ProcessCapacityLow", "LowIoPriority", "TimerSlackHigh" ] + }, + { + "Name": "CPUSET_SP_FOREGROUND", + "Profiles": [ "HighPerformance", "ProcessCapacityHigh", "HighIoPriority", "TimerSlackNormal" ] + }, + { + "Name": "CPUSET_SP_TOP_APP", + "Profiles": [ "MaxPerformance", "ProcessCapacityMax", "MaxIoPriority", "TimerSlackNormal" ] + }, + { + "Name": "CPUSET_SP_SYSTEM", + "Profiles": [ "ServiceCapacityLow", "TimerSlackNormal" ] + }, + { + "Name": "CPUSET_SP_RESTRICTED", + "Profiles": [ "ServiceCapacityRestricted", "TimerSlackNormal" ] + } + ] +} diff --git a/libprocessgroup/profiles/task_profiles_30.json b/libprocessgroup/profiles/task_profiles_30.json new file mode 100644 index 000000000..142b0bac6 --- /dev/null +++ b/libprocessgroup/profiles/task_profiles_30.json @@ -0,0 +1,627 @@ +{ + "Attributes": [ + { + "Name": "LowCapacityCPUs", + "Controller": "cpuset", + "File": "background/cpus" + }, + { + "Name": "HighCapacityCPUs", + "Controller": "cpuset", + "File": "foreground/cpus" + }, + { + "Name": "MaxCapacityCPUs", + "Controller": "cpuset", + "File": "top-app/cpus" + }, + { + "Name": "MemLimit", + "Controller": "memory", + "File": "memory.limit_in_bytes" + }, + { + "Name": "MemSoftLimit", + "Controller": "memory", + "File": "memory.soft_limit_in_bytes" + }, + { + "Name": "MemSwappiness", + "Controller": "memory", + "File": "memory.swappiness" + }, + { + "Name": "STuneBoost", + "Controller": "schedtune", + "File": "schedtune.boost" + }, + { + "Name": "STunePreferIdle", + "Controller": "schedtune", + "File": "schedtune.prefer_idle" + }, + { + "Name": "UClampMin", + "Controller": "cpu", + "File": "cpu.uclamp.min" + }, + { + "Name": "UClampMax", + "Controller": "cpu", + "File": "cpu.uclamp.max" + }, + { + "Name": "FreezerState", + "Controller": "freezer", + "File": "cgroup.freeze" + } + ], + + "Profiles": [ + { + "Name": "HighEnergySaving", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "schedtune", + "Path": "background" + } + } + ] + }, + { + "Name": "Frozen", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "freezer", + "Path": "" + } + } + ] + }, + { + "Name": "Unfrozen", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "freezer", + "Path": "../" + } + } + ] + }, + { + "Name": "NormalPerformance", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "schedtune", + "Path": "" + } + } + ] + }, + { + "Name": "HighPerformance", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "schedtune", + "Path": "foreground" + } + } + ] + }, + { + "Name": "MaxPerformance", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "schedtune", + "Path": "top-app" + } + } + ] + }, + { + "Name": "RealtimePerformance", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "schedtune", + "Path": "rt" + } + } + ] + }, + { + "Name": "CameraServicePerformance", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "schedtune", + "Path": "camera-daemon" + } + } + ] + }, + { + "Name": "NNApiHALPerformance", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "schedtune", + "Path": "nnapi-hal" + } + } + ] + }, + + { + "Name": "CpuPolicySpread", + "Actions": [ + { + "Name": "SetAttribute", + "Params": + { + "Name": "STunePreferIdle", + "Value": "1" + } + } + ] + }, + { + "Name": "CpuPolicyPack", + "Actions": [ + { + "Name": "SetAttribute", + "Params": + { + "Name": "STunePreferIdle", + "Value": "0" + } + } + ] + }, + + { + "Name": "VrKernelCapacity", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "" + } + } + ] + }, + { + "Name": "VrServiceCapacityLow", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "system/background" + } + } + ] + }, + { + "Name": "VrServiceCapacityNormal", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "system" + } + } + ] + }, + { + "Name": "VrServiceCapacityHigh", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "system/performance" + } + } + ] + }, + { + "Name": "VrProcessCapacityLow", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "application/background" + } + } + ] + }, + { + "Name": "VrProcessCapacityNormal", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "application" + } + } + ] + }, + { + "Name": "VrProcessCapacityHigh", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "application/performance" + } + } + ] + }, + + { + "Name": "ProcessCapacityLow", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "background" + } + } + ] + }, + { + "Name": "ProcessCapacityNormal", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "" + } + } + ] + }, + { + "Name": "ProcessCapacityHigh", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "foreground" + } + } + ] + }, + { + "Name": "ProcessCapacityMax", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "top-app" + } + } + ] + }, + + { + "Name": "ServiceCapacityLow", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "system-background" + } + } + ] + }, + { + "Name": "ServiceCapacityRestricted", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "restricted" + } + } + ] + }, + + { + "Name": "CameraServiceCapacity", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "cpuset", + "Path": "camera-daemon" + } + } + ] + }, + + { + "Name": "LowIoPriority", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "blkio", + "Path": "background" + } + } + ] + }, + { + "Name": "NormalIoPriority", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "blkio", + "Path": "" + } + } + ] + }, + { + "Name": "HighIoPriority", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "blkio", + "Path": "" + } + } + ] + }, + { + "Name": "MaxIoPriority", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "blkio", + "Path": "" + } + } + ] + }, + + { + "Name": "TimerSlackHigh", + "Actions": [ + { + "Name": "SetTimerSlack", + "Params": + { + "Slack": "40000000" + } + } + ] + }, + { + "Name": "TimerSlackNormal", + "Actions": [ + { + "Name": "SetTimerSlack", + "Params": + { + "Slack": "50000" + } + } + ] + }, + + { + "Name": "PerfBoost", + "Actions": [ + { + "Name": "SetClamps", + "Params": + { + "Boost": "50%", + "Clamp": "0" + } + } + ] + }, + { + "Name": "PerfClamp", + "Actions": [ + { + "Name": "SetClamps", + "Params": + { + "Boost": "0", + "Clamp": "30%" + } + } + ] + }, + + { + "Name": "LowMemoryUsage", + "Actions": [ + { + "Name": "SetAttribute", + "Params": + { + "Name": "MemSoftLimit", + "Value": "16MB" + } + }, + { + "Name": "SetAttribute", + "Params": + { + "Name": "MemSwappiness", + "Value": "150" + + } + } + ] + }, + { + "Name": "HighMemoryUsage", + "Actions": [ + { + "Name": "SetAttribute", + "Params": + { + "Name": "MemSoftLimit", + "Value": "512MB" + } + }, + { + "Name": "SetAttribute", + "Params": + { + "Name": "MemSwappiness", + "Value": "100" + } + } + ] + }, + { + "Name": "SystemMemoryProcess", + "Actions": [ + { + "Name": "JoinCgroup", + "Params": + { + "Controller": "memory", + "Path": "system" + } + } + ] + }, + { + "Name": "FreezerDisabled", + "Actions": [ + { + "Name": "SetAttribute", + "Params": + { + "Name": "FreezerState", + "Value": "0" + } + } + ] + }, + { + "Name": "FreezerEnabled", + "Actions": [ + { + "Name": "SetAttribute", + "Params": + { + "Name": "FreezerState", + "Value": "1" + } + } + ] + } + ], + + "AggregateProfiles": [ + { + "Name": "SCHED_SP_DEFAULT", + "Profiles": [ "TimerSlackNormal" ] + }, + { + "Name": "SCHED_SP_BACKGROUND", + "Profiles": [ "HighEnergySaving", "LowIoPriority", "TimerSlackHigh" ] + }, + { + "Name": "SCHED_SP_FOREGROUND", + "Profiles": [ "HighPerformance", "HighIoPriority", "TimerSlackNormal" ] + }, + { + "Name": "SCHED_SP_TOP_APP", + "Profiles": [ "MaxPerformance", "MaxIoPriority", "TimerSlackNormal" ] + }, + { + "Name": "SCHED_SP_RT_APP", + "Profiles": [ "RealtimePerformance", "MaxIoPriority", "TimerSlackNormal" ] + }, + { + "Name": "CPUSET_SP_DEFAULT", + "Profiles": [ "TimerSlackNormal" ] + }, + { + "Name": "CPUSET_SP_BACKGROUND", + "Profiles": [ "HighEnergySaving", "ProcessCapacityLow", "LowIoPriority", "TimerSlackHigh" ] + }, + { + "Name": "CPUSET_SP_FOREGROUND", + "Profiles": [ "HighPerformance", "ProcessCapacityHigh", "HighIoPriority", "TimerSlackNormal" ] + }, + { + "Name": "CPUSET_SP_TOP_APP", + "Profiles": [ "MaxPerformance", "ProcessCapacityMax", "MaxIoPriority", "TimerSlackNormal" ] + }, + { + "Name": "CPUSET_SP_SYSTEM", + "Profiles": [ "ServiceCapacityLow", "TimerSlackNormal" ] + }, + { + "Name": "CPUSET_SP_RESTRICTED", + "Profiles": [ "ServiceCapacityRestricted", "TimerSlackNormal" ] + } + ] +} diff --git a/libprocessgroup/setup/cgroup_map_write.cpp b/libprocessgroup/setup/cgroup_map_write.cpp index 25f16a6e9..a53132e4b 100644 --- a/libprocessgroup/setup/cgroup_map_write.cpp +++ b/libprocessgroup/setup/cgroup_map_write.cpp @@ -45,7 +45,7 @@ #include "cgroup_descriptor.h" -using android::base::GetBoolProperty; +using android::base::GetUintProperty; using android::base::StringPrintf; using android::base::unique_fd; @@ -55,6 +55,8 @@ namespace cgrouprc { static constexpr const char* CGROUPS_DESC_FILE = "/etc/cgroups.json"; static constexpr const char* CGROUPS_DESC_VENDOR_FILE = "/vendor/etc/cgroups.json"; +static constexpr const char* TEMPLATE_CGROUPS_DESC_API_FILE = "/etc/task_profiles/cgroups_%u.json"; + static bool ChangeDirModeAndOwner(const std::string& path, mode_t mode, const std::string& uid, const std::string& gid, bool permissive_mode = false) { uid_t pw_uid = -1; @@ -212,8 +214,20 @@ static bool ReadDescriptorsFromFile(const std::string& file_name, } static bool ReadDescriptors(std::map* descriptors) { + unsigned int api_level = GetUintProperty("ro.product.first_api_level", 0); + std::string sys_cgroups_path = CGROUPS_DESC_FILE; + + // load API-level specific system cgroups descriptors if available + if (api_level > 0) { + std::string api_cgroups_path = + android::base::StringPrintf(TEMPLATE_CGROUPS_DESC_API_FILE, api_level); + if (!access(api_cgroups_path.c_str(), F_OK) || errno != ENOENT) { + sys_cgroups_path = api_cgroups_path; + } + } + // load system cgroup descriptors - if (!ReadDescriptorsFromFile(CGROUPS_DESC_FILE, descriptors)) { + if (!ReadDescriptorsFromFile(sys_cgroups_path, descriptors)) { return false; } diff --git a/libprocessgroup/task_profiles.cpp b/libprocessgroup/task_profiles.cpp index 4e767db52..db4422803 100644 --- a/libprocessgroup/task_profiles.cpp +++ b/libprocessgroup/task_profiles.cpp @@ -23,6 +23,7 @@ #include #include +#include #include #include #include @@ -38,13 +39,17 @@ #endif using android::base::GetThreadId; +using android::base::GetUintProperty; using android::base::StringPrintf; using android::base::StringReplace; using android::base::unique_fd; using android::base::WriteStringToFile; -#define TASK_PROFILE_DB_FILE "/etc/task_profiles.json" -#define TASK_PROFILE_DB_VENDOR_FILE "/vendor/etc/task_profiles.json" +static constexpr const char* TASK_PROFILE_DB_FILE = "/etc/task_profiles.json"; +static constexpr const char* TASK_PROFILE_DB_VENDOR_FILE = "/vendor/etc/task_profiles.json"; + +static constexpr const char* TEMPLATE_TASK_PROFILE_API_FILE = + "/etc/task_profiles/task_profiles_%u.json"; void ProfileAttribute::Reset(const CgroupController& controller, const std::string& file_name) { controller_ = controller; @@ -386,9 +391,21 @@ TaskProfiles& TaskProfiles::GetInstance() { } TaskProfiles::TaskProfiles() { + unsigned int api_level = GetUintProperty("ro.product.first_api_level", 0); + std::string sys_profiles_path = TASK_PROFILE_DB_FILE; + + // load API-level specific system task profiles if available + if (api_level > 0) { + std::string api_profiles_path = + android::base::StringPrintf(TEMPLATE_TASK_PROFILE_API_FILE, api_level); + if (!access(api_profiles_path.c_str(), F_OK) || errno != ENOENT) { + sys_profiles_path = api_profiles_path; + } + } + // load system task profiles - if (!Load(CgroupMap::GetInstance(), TASK_PROFILE_DB_FILE)) { - LOG(ERROR) << "Loading " << TASK_PROFILE_DB_FILE << " for [" << getpid() << "] failed"; + if (!Load(CgroupMap::GetInstance(), sys_profiles_path)) { + LOG(ERROR) << "Loading " << sys_profiles_path << " for [" << getpid() << "] failed"; } // load vendor task profiles if the file exists