| #!/system/bin/sh |
| |
| # Copyright (C) 2021 The Android Open Source Project |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| |
| # Periodically arms a perfetto trace config for mm_events |
| # The config is triggered by the mm_events kmem_activity trigger |
| # This script gets executed as a oneshot service from perfetto.rc |
| # when persist.mm_events.enabled is set to true. |
| |
| DEFAULT_TRACE_CONFIG=<<EOF |
| unique_session_name: "perfetto_mm_events_session" |
| |
| bugreport_score: 100 |
| |
| buffers: { |
| size_kb: 512 |
| fill_policy: DISCARD |
| } |
| |
| data_sources: { |
| config { |
| name: "linux.sys_stats" |
| sys_stats_config { |
| vmstat_period_ms: 500 |
| vmstat_counters: VMSTAT_NR_FREE_PAGES |
| vmstat_counters: VMSTAT_NR_SLAB_RECLAIMABLE |
| vmstat_counters: VMSTAT_NR_SLAB_UNRECLAIMABLE |
| vmstat_counters: VMSTAT_NR_ACTIVE_FILE |
| vmstat_counters: VMSTAT_NR_INACTIVE_FILE |
| vmstat_counters: VMSTAT_NR_ACTIVE_ANON |
| vmstat_counters: VMSTAT_NR_INACTIVE_ANON |
| vmstat_counters: VMSTAT_WORKINGSET_REFAULT |
| vmstat_counters: VMSTAT_WORKINGSET_ACTIVATE |
| vmstat_counters: VMSTAT_NR_FILE_PAGES |
| vmstat_counters: VMSTAT_PGPGIN |
| vmstat_counters: VMSTAT_PGPGOUT |
| vmstat_counters: VMSTAT_PSWPIN |
| vmstat_counters: VMSTAT_PSWPOUT |
| vmstat_counters: VMSTAT_PGSTEAL_KSWAPD_DMA |
| vmstat_counters: VMSTAT_PGSTEAL_KSWAPD_NORMAL |
| vmstat_counters: VMSTAT_PGSTEAL_KSWAPD_MOVABLE |
| vmstat_counters: VMSTAT_PGSTEAL_DIRECT_DMA |
| vmstat_counters: VMSTAT_PGSTEAL_DIRECT_NORMAL |
| vmstat_counters: VMSTAT_PGSTEAL_DIRECT_MOVABLE |
| vmstat_counters: VMSTAT_PGSCAN_KSWAPD_DMA |
| vmstat_counters: VMSTAT_PGSCAN_KSWAPD_NORMAL |
| vmstat_counters: VMSTAT_PGSCAN_KSWAPD_MOVABLE |
| vmstat_counters: VMSTAT_PGSCAN_DIRECT_DMA |
| vmstat_counters: VMSTAT_PGSCAN_DIRECT_NORMAL |
| vmstat_counters: VMSTAT_PGSCAN_DIRECT_MOVABLE |
| vmstat_counters: VMSTAT_COMPACT_MIGRATE_SCANNED |
| vmstat_counters: VMSTAT_COMPACT_FREE_SCANNED |
| } |
| } |
| } |
| |
| data_sources: { |
| config { |
| name: "linux.ftrace" |
| ftrace_config { |
| ftrace_events: "vmscan/mm_vmscan_kswapd_wake" |
| ftrace_events: "vmscan/mm_vmscan_kswapd_sleep" |
| ftrace_events: "vmscan/mm_vmscan_direct_reclaim_begin" |
| ftrace_events: "vmscan/mm_vmscan_direct_reclaim_end" |
| ftrace_events: "compaction/mm_compaction_begin" |
| ftrace_events: "compaction/mm_compaction_end" |
| } |
| } |
| } |
| |
| trigger_config { |
| trigger_mode: START_TRACING |
| trigger_timeout_ms: 3600000 |
| triggers { |
| name: "kmem_activity" |
| stop_delay_ms: 360000 |
| } |
| } |
| EOF |
| |
| VENDOR_TRACE_CONFIG="/vendor/etc/mm_events.cfg" |
| |
| BASE_SLEEP=30 |
| SLEEP=$BASE_SLEEP |
| BACKOFF_MULTIPLIER=2 |
| CONSECUTIVE_FAILURES=0 |
| FAILURES_THRESHOLD=10 |
| |
| # Keep the mm events perfetto trace config armed |
| while : |
| do |
| sleep $SLEEP |
| |
| # If an alternate vendor trace config exists use that instead of the default. |
| if [ -f "$VENDOR_TRACE_CONFIG" ]; then |
| /system/bin/perfetto -c "$VENDOR_TRACE_CONFIG" --txt -o /dev/null |
| EXIT_CODE=$? |
| else |
| echo "$DEFAULT_TRACE_CONFIG" | /system/bin/perfetto -c - --txt -o /dev/null |
| EXIT_CODE=$? |
| fi |
| |
| if [[ $EXIT_CODE -ne 0 ]]; then |
| SLEEP=$(($SLEEP * $BACKOFF_MULTIPLIER)) |
| |
| CONSECUTIVE_FAILURES=$(($CONSECUTIVE_FAILURES + 1)) |
| if [ $CONSECUTIVE_FAILURES -ge $FAILURES_THRESHOLD ]; then |
| exit 1 |
| fi |
| else |
| SLEEP=$BASE_SLEEP |
| CONSECUTIVE_FAILURES=0 |
| fi |
| done |