1*6dbdd20aSAndroid Build Coastguard Worker#!/system/bin/sh 2*6dbdd20aSAndroid Build Coastguard Worker 3*6dbdd20aSAndroid Build Coastguard Worker# Copyright (C) 2021 The Android Open Source Project 4*6dbdd20aSAndroid Build Coastguard Worker# 5*6dbdd20aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*6dbdd20aSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*6dbdd20aSAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*6dbdd20aSAndroid Build Coastguard Worker# 9*6dbdd20aSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*6dbdd20aSAndroid Build Coastguard Worker# 11*6dbdd20aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*6dbdd20aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*6dbdd20aSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*6dbdd20aSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*6dbdd20aSAndroid Build Coastguard Worker# limitations under the License. 16*6dbdd20aSAndroid Build Coastguard Worker 17*6dbdd20aSAndroid Build Coastguard Worker 18*6dbdd20aSAndroid Build Coastguard Worker# Periodically arms a perfetto trace config for mm_events 19*6dbdd20aSAndroid Build Coastguard Worker# The config is triggered by the mm_events kmem_activity trigger 20*6dbdd20aSAndroid Build Coastguard Worker# This script gets executed as a oneshot service from perfetto.rc 21*6dbdd20aSAndroid Build Coastguard Worker# when persist.mm_events.enabled is set to true. 22*6dbdd20aSAndroid Build Coastguard Worker 23*6dbdd20aSAndroid Build Coastguard WorkerDEFAULT_TRACE_CONFIG=<<EOF 24*6dbdd20aSAndroid Build Coastguard Workerunique_session_name: "perfetto_mm_events_session" 25*6dbdd20aSAndroid Build Coastguard Worker 26*6dbdd20aSAndroid Build Coastguard Workerbugreport_score: 100 27*6dbdd20aSAndroid Build Coastguard Worker 28*6dbdd20aSAndroid Build Coastguard Workerbuffers: { 29*6dbdd20aSAndroid Build Coastguard Worker size_kb: 512 30*6dbdd20aSAndroid Build Coastguard Worker fill_policy: DISCARD 31*6dbdd20aSAndroid Build Coastguard Worker} 32*6dbdd20aSAndroid Build Coastguard Worker 33*6dbdd20aSAndroid Build Coastguard Workerdata_sources: { 34*6dbdd20aSAndroid Build Coastguard Worker config { 35*6dbdd20aSAndroid Build Coastguard Worker name: "linux.sys_stats" 36*6dbdd20aSAndroid Build Coastguard Worker sys_stats_config { 37*6dbdd20aSAndroid Build Coastguard Worker vmstat_period_ms: 500 38*6dbdd20aSAndroid Build Coastguard Worker vmstat_counters: VMSTAT_NR_FREE_PAGES 39*6dbdd20aSAndroid Build Coastguard Worker vmstat_counters: VMSTAT_NR_SLAB_RECLAIMABLE 40*6dbdd20aSAndroid Build Coastguard Worker vmstat_counters: VMSTAT_NR_SLAB_UNRECLAIMABLE 41*6dbdd20aSAndroid Build Coastguard Worker vmstat_counters: VMSTAT_NR_ACTIVE_FILE 42*6dbdd20aSAndroid Build Coastguard Worker vmstat_counters: VMSTAT_NR_INACTIVE_FILE 43*6dbdd20aSAndroid Build Coastguard Worker vmstat_counters: VMSTAT_NR_ACTIVE_ANON 44*6dbdd20aSAndroid Build Coastguard Worker vmstat_counters: VMSTAT_NR_INACTIVE_ANON 45*6dbdd20aSAndroid Build Coastguard Worker vmstat_counters: VMSTAT_WORKINGSET_REFAULT 46*6dbdd20aSAndroid Build Coastguard Worker vmstat_counters: VMSTAT_WORKINGSET_ACTIVATE 47*6dbdd20aSAndroid Build Coastguard Worker vmstat_counters: VMSTAT_NR_FILE_PAGES 48*6dbdd20aSAndroid Build Coastguard Worker vmstat_counters: VMSTAT_PGPGIN 49*6dbdd20aSAndroid Build Coastguard Worker vmstat_counters: VMSTAT_PGPGOUT 50*6dbdd20aSAndroid Build Coastguard Worker vmstat_counters: VMSTAT_PSWPIN 51*6dbdd20aSAndroid Build Coastguard Worker vmstat_counters: VMSTAT_PSWPOUT 52*6dbdd20aSAndroid Build Coastguard Worker vmstat_counters: VMSTAT_PGSTEAL_KSWAPD_DMA 53*6dbdd20aSAndroid Build Coastguard Worker vmstat_counters: VMSTAT_PGSTEAL_KSWAPD_NORMAL 54*6dbdd20aSAndroid Build Coastguard Worker vmstat_counters: VMSTAT_PGSTEAL_KSWAPD_MOVABLE 55*6dbdd20aSAndroid Build Coastguard Worker vmstat_counters: VMSTAT_PGSTEAL_DIRECT_DMA 56*6dbdd20aSAndroid Build Coastguard Worker vmstat_counters: VMSTAT_PGSTEAL_DIRECT_NORMAL 57*6dbdd20aSAndroid Build Coastguard Worker vmstat_counters: VMSTAT_PGSTEAL_DIRECT_MOVABLE 58*6dbdd20aSAndroid Build Coastguard Worker vmstat_counters: VMSTAT_PGSCAN_KSWAPD_DMA 59*6dbdd20aSAndroid Build Coastguard Worker vmstat_counters: VMSTAT_PGSCAN_KSWAPD_NORMAL 60*6dbdd20aSAndroid Build Coastguard Worker vmstat_counters: VMSTAT_PGSCAN_KSWAPD_MOVABLE 61*6dbdd20aSAndroid Build Coastguard Worker vmstat_counters: VMSTAT_PGSCAN_DIRECT_DMA 62*6dbdd20aSAndroid Build Coastguard Worker vmstat_counters: VMSTAT_PGSCAN_DIRECT_NORMAL 63*6dbdd20aSAndroid Build Coastguard Worker vmstat_counters: VMSTAT_PGSCAN_DIRECT_MOVABLE 64*6dbdd20aSAndroid Build Coastguard Worker vmstat_counters: VMSTAT_COMPACT_MIGRATE_SCANNED 65*6dbdd20aSAndroid Build Coastguard Worker vmstat_counters: VMSTAT_COMPACT_FREE_SCANNED 66*6dbdd20aSAndroid Build Coastguard Worker } 67*6dbdd20aSAndroid Build Coastguard Worker } 68*6dbdd20aSAndroid Build Coastguard Worker} 69*6dbdd20aSAndroid Build Coastguard Worker 70*6dbdd20aSAndroid Build Coastguard Workerdata_sources: { 71*6dbdd20aSAndroid Build Coastguard Worker config { 72*6dbdd20aSAndroid Build Coastguard Worker name: "linux.ftrace" 73*6dbdd20aSAndroid Build Coastguard Worker ftrace_config { 74*6dbdd20aSAndroid Build Coastguard Worker ftrace_events: "vmscan/mm_vmscan_kswapd_wake" 75*6dbdd20aSAndroid Build Coastguard Worker ftrace_events: "vmscan/mm_vmscan_kswapd_sleep" 76*6dbdd20aSAndroid Build Coastguard Worker ftrace_events: "vmscan/mm_vmscan_direct_reclaim_begin" 77*6dbdd20aSAndroid Build Coastguard Worker ftrace_events: "vmscan/mm_vmscan_direct_reclaim_end" 78*6dbdd20aSAndroid Build Coastguard Worker ftrace_events: "compaction/mm_compaction_begin" 79*6dbdd20aSAndroid Build Coastguard Worker ftrace_events: "compaction/mm_compaction_end" 80*6dbdd20aSAndroid Build Coastguard Worker } 81*6dbdd20aSAndroid Build Coastguard Worker } 82*6dbdd20aSAndroid Build Coastguard Worker} 83*6dbdd20aSAndroid Build Coastguard Worker 84*6dbdd20aSAndroid Build Coastguard Workertrigger_config { 85*6dbdd20aSAndroid Build Coastguard Worker trigger_mode: START_TRACING 86*6dbdd20aSAndroid Build Coastguard Worker trigger_timeout_ms: 3600000 87*6dbdd20aSAndroid Build Coastguard Worker triggers { 88*6dbdd20aSAndroid Build Coastguard Worker name: "kmem_activity" 89*6dbdd20aSAndroid Build Coastguard Worker stop_delay_ms: 360000 90*6dbdd20aSAndroid Build Coastguard Worker } 91*6dbdd20aSAndroid Build Coastguard Worker} 92*6dbdd20aSAndroid Build Coastguard WorkerEOF 93*6dbdd20aSAndroid Build Coastguard Worker 94*6dbdd20aSAndroid Build Coastguard WorkerVENDOR_TRACE_CONFIG="/vendor/etc/mm_events.cfg" 95*6dbdd20aSAndroid Build Coastguard Worker 96*6dbdd20aSAndroid Build Coastguard WorkerBASE_SLEEP=30 97*6dbdd20aSAndroid Build Coastguard WorkerSLEEP=$BASE_SLEEP 98*6dbdd20aSAndroid Build Coastguard WorkerBACKOFF_MULTIPLIER=2 99*6dbdd20aSAndroid Build Coastguard WorkerCONSECUTIVE_FAILURES=0 100*6dbdd20aSAndroid Build Coastguard WorkerFAILURES_THRESHOLD=10 101*6dbdd20aSAndroid Build Coastguard Worker 102*6dbdd20aSAndroid Build Coastguard Worker# Keep the mm events perfetto trace config armed 103*6dbdd20aSAndroid Build Coastguard Workerwhile : 104*6dbdd20aSAndroid Build Coastguard Workerdo 105*6dbdd20aSAndroid Build Coastguard Worker sleep $SLEEP 106*6dbdd20aSAndroid Build Coastguard Worker 107*6dbdd20aSAndroid Build Coastguard Worker # If an alternate vendor trace config exists use that instead of the default. 108*6dbdd20aSAndroid Build Coastguard Worker if [ -f "$VENDOR_TRACE_CONFIG" ]; then 109*6dbdd20aSAndroid Build Coastguard Worker /system/bin/perfetto -c "$VENDOR_TRACE_CONFIG" --txt -o /dev/null 110*6dbdd20aSAndroid Build Coastguard Worker EXIT_CODE=$? 111*6dbdd20aSAndroid Build Coastguard Worker else 112*6dbdd20aSAndroid Build Coastguard Worker echo "$DEFAULT_TRACE_CONFIG" | /system/bin/perfetto -c - --txt -o /dev/null 113*6dbdd20aSAndroid Build Coastguard Worker EXIT_CODE=$? 114*6dbdd20aSAndroid Build Coastguard Worker fi 115*6dbdd20aSAndroid Build Coastguard Worker 116*6dbdd20aSAndroid Build Coastguard Worker if [[ $EXIT_CODE -ne 0 ]]; then 117*6dbdd20aSAndroid Build Coastguard Worker SLEEP=$(($SLEEP * $BACKOFF_MULTIPLIER)) 118*6dbdd20aSAndroid Build Coastguard Worker 119*6dbdd20aSAndroid Build Coastguard Worker CONSECUTIVE_FAILURES=$(($CONSECUTIVE_FAILURES + 1)) 120*6dbdd20aSAndroid Build Coastguard Worker if [ $CONSECUTIVE_FAILURES -ge $FAILURES_THRESHOLD ]; then 121*6dbdd20aSAndroid Build Coastguard Worker exit 1 122*6dbdd20aSAndroid Build Coastguard Worker fi 123*6dbdd20aSAndroid Build Coastguard Worker else 124*6dbdd20aSAndroid Build Coastguard Worker SLEEP=$BASE_SLEEP 125*6dbdd20aSAndroid Build Coastguard Worker CONSECUTIVE_FAILURES=0 126*6dbdd20aSAndroid Build Coastguard Worker fi 127*6dbdd20aSAndroid Build Coastguard Workerdone 128