Merge "Add Proc Vendor Sched Sepolicy Fix" into main
diff --git a/camera/lyric.mk b/camera/lyric.mk
index 0ec1d6d..adffb74 100644
--- a/camera/lyric.mk
+++ b/camera/lyric.mk
@@ -49,10 +49,6 @@
     vendor/google/camera/google_3a/libs_v4/gAF \
     vendor/google/camera/google_3a/libs_v4/gafd \
     vendor/google/camera/google_3a/libs_v4/gHAWB/native_coverage
-
-# Calibration tool for debug builds
-PRODUCT_PACKAGES_DEBUG += tarasque_test
-PRODUCT_PACKAGES_DEBUG += ProtoCalibGenerator
 endif  # BUILD_LYRIC_FROM_SOURCE
 
 # Init-time log settings for Google 3A
@@ -73,3 +69,7 @@
 
 # sepolicy dir is added in dump.mk.
 # Make doesn't deduplicate sepolicy dirs, so including it here causes build errors.
+
+# Calibration tools for debug builds
+PRODUCT_PACKAGES_DEBUG += tarasque_test
+PRODUCT_PACKAGES_DEBUG += ProtoCalibGenerator
diff --git a/interrupts/init.interrupts.rc b/interrupts/init.interrupts.rc
index 9492fdc..52fcaa5 100644
--- a/interrupts/init.interrupts.rc
+++ b/interrupts/init.interrupts.rc
@@ -1,23 +1,16 @@
 on init
     # Create the directory for the trace instance during early init
-    mkdir /sys/kernel/tracing/instances/irq_gia_google 0755 root root
+    chmod 666 /sys/kernel/tracing/instances/irq_gia_google
+    chmod 666 /sys/kernel/tracing/instances/irq_gia_google/trace
     chown system system /sys/kernel/tracing/instances/irq_gia_google
     chown system system /sys/kernel/tracing/instances/irq_gia_google/trace
 
-    # Enable gia events
-    write /sys/kernel/tracing/instances/irq_gia_google/events/irq_gia/enable 1
-
     # There are some very high frequency IRQ events happening all the time. Tracing
     # them is not absolute necessity, but a flood of them is noise for more interesting
     # events that we want to capture. All these high frequency IRQs have virq < 11.
     write /sys/kernel/tracing/instances/irq_gia_google/events/irq/filter "irq > 11"
-    write /sys/kernel/tracing/instances/irq_gia_google/events/irq/irq_handler_entry/enable 1
-    write /sys/kernel/tracing/instances/irq_gia_google/events/irq/irq_handler_exit/enable 1
 
     # Keep the buffer size small. This size is practically enough for debug purpose.
     # Having low size helps because this entire buffer gets dumped in bugreport.
     # Having a large size can impact bugreport size and time it takes to pack/unpack.
     write /sys/kernel/tracing/instances/irq_gia_google/buffer_size_kb 512
-
-    # Go!
-    write /sys/kernel/tracing/instances/irq_gia_google/tracing_on 1
diff --git a/performance/experiments/Android.bp b/performance/experiments/Android.bp
new file mode 100644
index 0000000..a2f7ebe
--- /dev/null
+++ b/performance/experiments/Android.bp
@@ -0,0 +1,10 @@
+package {
+    default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+sh_binary {
+    name: "pixel-experiments-recovery.sh",
+    src: "pixel-experiments-recovery.sh",
+    vendor: true,
+    init_rc: ["pixel-experiments-recovery.rc"],
+}
diff --git a/performance/experiments/apf/Android.bp b/performance/experiments/apf/Android.bp
new file mode 100644
index 0000000..e5e9f7c
--- /dev/null
+++ b/performance/experiments/apf/Android.bp
@@ -0,0 +1,10 @@
+package {
+    default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+prebuilt_etc {
+    name: "pixel-apf-experiment.rc",
+    src: "pixel-apf-experiment.rc",
+    vendor: true,
+    sub_dir: "init",
+}
diff --git a/performance/experiments/apf/apf.mk b/performance/experiments/apf/apf.mk
new file mode 100644
index 0000000..d8bc338
--- /dev/null
+++ b/performance/experiments/apf/apf.mk
@@ -0,0 +1 @@
+PRODUCT_PACKAGES += pixel-apf-experiment.rc
diff --git a/performance/experiments/apf/pixel-apf-experiment.rc b/performance/experiments/apf/pixel-apf-experiment.rc
new file mode 100644
index 0000000..f160dba
--- /dev/null
+++ b/performance/experiments/apf/pixel-apf-experiment.rc
@@ -0,0 +1,11 @@
+# APF experiment (go/pixel-perf-apf-experiment).
+on property:vendor.perf.allow_experiments=1 && \
+    property:vendor.pixel.system.phenotype.Perf__apf_experiment=true
+    setprop vendor.powerhal.apf_disabled true
+    setprop vendor.powerhal.apf_enabled false
+
+# Rampdown of the experiment.
+on property:vendor.perf.allow_experiments=1 && \
+    property:vendor.pixel.system.phenotype.Perf__apf_experiment=""
+    setprop vendor.powerhal.apf_disabled false
+    setprop vendor.powerhal.apf_enabled true
diff --git a/performance/experiments/experiments.mk b/performance/experiments/experiments.mk
new file mode 100644
index 0000000..b14b823
--- /dev/null
+++ b/performance/experiments/experiments.mk
@@ -0,0 +1,6 @@
+BOARD_VENDOR_SEPOLICY_DIRS += device/google/gs-common/performance/experiments/sepolicy
+
+PRODUCT_PACKAGES += pixel-experiments-recovery.sh
+
+include device/google/gs-common/performance/experiments/kswapd/kswapd.mk
+include device/google/gs-common/performance/experiments/apf/apf.mk
diff --git a/performance/experiments/kswapd/Android.bp b/performance/experiments/kswapd/Android.bp
new file mode 100644
index 0000000..23af711
--- /dev/null
+++ b/performance/experiments/kswapd/Android.bp
@@ -0,0 +1,10 @@
+package {
+    default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+prebuilt_etc {
+    name: "pixel-kswapd-experiment.rc",
+    src: "pixel-kswapd-experiment.rc",
+    vendor: true,
+    sub_dir: "init",
+}
diff --git a/performance/experiments/kswapd/kswapd.mk b/performance/experiments/kswapd/kswapd.mk
new file mode 100644
index 0000000..15d762f
--- /dev/null
+++ b/performance/experiments/kswapd/kswapd.mk
@@ -0,0 +1 @@
+PRODUCT_PACKAGES += pixel-kswapd-experiment.rc
diff --git a/performance/experiments/kswapd/pixel-kswapd-experiment.rc b/performance/experiments/kswapd/pixel-kswapd-experiment.rc
new file mode 100644
index 0000000..36dcac3
--- /dev/null
+++ b/performance/experiments/kswapd/pixel-kswapd-experiment.rc
@@ -0,0 +1,28 @@
+# Kswapd experiment - allow kswapd to run on all cores. We only target zuma and
+# zumapro because these are the only platforms where kswapd avoids big cores by
+# default.
+
+on property:vendor.perf.allow_experiments=1 \
+    && property:ro.board.platform=zuma \
+    && property:vendor.pixel.system.phenotype.Perf__kswapd_experiment=true
+    write /sys/kernel/vendor_mm/kswapd_cpu_affinity 1ff
+
+on property:vendor.perf.allow_experiments=1 \
+    && property:ro.board.platform=zumapro \
+    && property:vendor.pixel.system.phenotype.Perf__kswapd_experiment=true
+    write /sys/kernel/vendor_mm/kswapd_cpu_affinity ff
+
+
+# Kswapd experiment rampdown - restore CPU affinity to the default.
+
+on property:vendor.perf.allow_experiments=1 \
+    && property:ro.board.platform=zuma \
+    && property:vendor.pixel.system.phenotype.Perf__kswapd_experiment=""
+    # Value is from device/google/zuma/conf/init.zuma.rc
+    write /sys/kernel/vendor_mm/kswapd_cpu_affinity ff
+
+on property:vendor.perf.allow_experiments=1 \
+    && property:ro.board.platform=zumapro \
+    && property:vendor.pixel.system.phenotype.Perf__kswapd_experiment=""
+    # Value is from device/google/zumapro/conf/init.zumapro.soc.rc
+    write /sys/kernel/vendor_mm/kswapd_cpu_affinity 7f
diff --git a/performance/experiments/pixel-experiments-recovery.rc b/performance/experiments/pixel-experiments-recovery.rc
new file mode 100644
index 0000000..a8247c3
--- /dev/null
+++ b/performance/experiments/pixel-experiments-recovery.rc
@@ -0,0 +1,17 @@
+# pixel-experiments-recovery.sh waits Perf__experiments_delay_seconds and sets
+# vendor.perf.allow_experiments=1, triggering experiments.
+service pixel-experiments-recovery /vendor/bin/pixel-experiments-recovery.sh \
+    ${vendor.pixel.system.phenotype.Perf__experiments_delay_seconds}
+    class main
+    user root
+    group root system
+    oneshot
+    disabled
+
+# vendor.pixel.system.phenotype.Perf__xxx properties are set sometime after the
+# device is unlocked for the first time. The check for sys.boot_completed is not
+# strictly needed, but will prevent surprises if for some reason the property
+# is set early.
+on property:sys.boot_completed=1 && \
+    property:vendor.pixel.system.phenotype.Perf__experiments_delay_seconds=*
+    restart pixel-experiments-recovery
diff --git a/performance/experiments/pixel-experiments-recovery.sh b/performance/experiments/pixel-experiments-recovery.sh
new file mode 100755
index 0000000..188222e
--- /dev/null
+++ b/performance/experiments/pixel-experiments-recovery.sh
@@ -0,0 +1,15 @@
+#!/vendor/bin/sh
+
+# This script delays experiments by the specified amount of seconds. The delay is not needed for
+# the normal operation, but becomes essential for the rare case (which "should not happen") where
+# an experiment causes really bad issues (e.g. crashes the kernel). In such case the delay gives
+# GMSCore an opportunity to fetch fresh experiments snapshot (with the bad experiment disabled).
+#
+# See go/pixel-perf-experiment-whatif for more info.
+
+delay_seconds="$1"
+
+if [ -n "$delay_seconds" ]; then
+    sleep "$delay_seconds"
+    /vendor/bin/setprop vendor.perf.allow_experiments 1
+fi
diff --git a/performance/experiments/sepolicy/file_contexts b/performance/experiments/sepolicy/file_contexts
new file mode 100644
index 0000000..7364807
--- /dev/null
+++ b/performance/experiments/sepolicy/file_contexts
@@ -0,0 +1 @@
+/vendor/bin/pixel-experiments-recovery\.sh     u:object_r:pixel-experiments-recovery-sh_exec:s0
diff --git a/performance/experiments/sepolicy/pixel-experiments-recovery.sh.te b/performance/experiments/sepolicy/pixel-experiments-recovery.sh.te
new file mode 100644
index 0000000..2da555b
--- /dev/null
+++ b/performance/experiments/sepolicy/pixel-experiments-recovery.sh.te
@@ -0,0 +1,10 @@
+# Rules for pixel-experiments-recovery.sh
+
+type pixel-experiments-recovery-sh, domain;
+type pixel-experiments-recovery-sh_exec, exec_type, vendor_file_type, file_type;
+
+init_daemon_domain(pixel-experiments-recovery-sh)
+
+# Allow "setprop vendor.perf.allow_experiments".
+allow pixel-experiments-recovery-sh vendor_toolbox_exec:file { execute_no_trans };
+set_prop(pixel-experiments-recovery-sh, vendor_perf_allow_experiments_prop)
diff --git a/performance/experiments/sepolicy/property.te b/performance/experiments/sepolicy/property.te
new file mode 100644
index 0000000..e43312c
--- /dev/null
+++ b/performance/experiments/sepolicy/property.te
@@ -0,0 +1,3 @@
+# Properties shared between experiments.
+
+vendor_internal_prop(vendor_perf_allow_experiments_prop)
diff --git a/performance/experiments/sepolicy/property_contexts b/performance/experiments/sepolicy/property_contexts
new file mode 100644
index 0000000..50de9c1
--- /dev/null
+++ b/performance/experiments/sepolicy/property_contexts
@@ -0,0 +1 @@
+vendor.perf.allow_experiments       u:object_r:vendor_perf_allow_experiments_prop:s0
diff --git a/storage/Android.bp b/storage/Android.bp
index 3a06113..eb806bc 100644
--- a/storage/Android.bp
+++ b/storage/Android.bp
@@ -14,8 +14,15 @@
     shared_libs: [
         "libbase",
         "libdump",
-	"liblog",
+        "liblog",
     ],
     vendor: true,
     relative_install_path: "dump",
 }
+
+sh_binary {
+    name: "storage_intelligence.sh",
+    src: "storage_intelligence.sh",
+    init_rc: ["storage.intelligence.rc"],
+    vendor: true,
+}
diff --git a/storage/sepolicy/file.te b/storage/sepolicy/file.te
index 0fa9564..59b739d 100644
--- a/storage/sepolicy/file.te
+++ b/storage/sepolicy/file.te
@@ -4,3 +4,5 @@
 type sg_device, dev_type;
 type sg_util_exec, exec_type, vendor_file_type, file_type;
 
+# Intelligence Service
+type intelligence_data_file, file_type, data_file_type;
diff --git a/storage/sepolicy/file_contexts b/storage/sepolicy/file_contexts
index 1ef5a67..18527fb 100644
--- a/storage/sepolicy/file_contexts
+++ b/storage/sepolicy/file_contexts
@@ -1,9 +1,13 @@
 # storage
-/vendor/bin/dump/dump_storage      u:object_r:dump_storage_exec:s0
-/sys/devices/platform/[0-9a-z]+\.ufs/pixel/enable_pixel_ufs_logging  u:object_r:sysfs_scsi_devices_0000:s0
-/dev/sg[0-9]                       u:object_r:sg_device:s0
-/data/vendor/storage(/.*)?         u:object_r:dump_storage_data_file:s0
-/vendor/bin/sg_read_buffer         u:object_r:sg_util_exec:s0
-/dev/block/by-name/userdata_exp.*  u:object_r:userdata_exp_block_device:s0
-/vendor/bin/ufs_firmware_update\.sh                                  u:object_r:ufs_firmware_update_exec:s0
+/data/vendor/intelligence(/.*)?                                      u:object_r:intelligence_data_file:s0
+/data/vendor/storage(/.*)?                                           u:object_r:dump_storage_data_file:s0
 
+/dev/block/by-name/userdata_exp.*                                    u:object_r:userdata_exp_block_device:s0
+/dev/sg[0-9]                                                         u:object_r:sg_device:s0
+
+/sys/devices/platform/[0-9a-z]+\.ufs/pixel/enable_pixel_ufs_logging  u:object_r:sysfs_scsi_devices_0000:s0
+
+/vendor/bin/dump/dump_storage                                        u:object_r:dump_storage_exec:s0
+/vendor/bin/sg_read_buffer                                           u:object_r:sg_util_exec:s0
+/vendor/bin/storage_intelligence\.sh                                 u:object_r:storage_intelligence_exec:s0
+/vendor/bin/ufs_firmware_update\.sh                                  u:object_r:ufs_firmware_update_exec:s0
diff --git a/storage/sepolicy/init.te b/storage/sepolicy/init.te
index dc24247..464ca4b 100644
--- a/storage/sepolicy/init.te
+++ b/storage/sepolicy/init.te
@@ -1,3 +1,4 @@
 # init
 allow init sysfs_scsi_devices_0000:file w_file_perms;
 
+dontaudit init intelligence_data_file:dir mounton;
diff --git a/storage/sepolicy/kernel.te b/storage/sepolicy/kernel.te
new file mode 100644
index 0000000..55882ed
--- /dev/null
+++ b/storage/sepolicy/kernel.te
@@ -0,0 +1,3 @@
+# for intelligence service
+
+allow kernel userdata_exp_block_device:blk_file read;
diff --git a/storage/sepolicy/property.te b/storage/sepolicy/property.te
new file mode 100644
index 0000000..598c71a
--- /dev/null
+++ b/storage/sepolicy/property.te
@@ -0,0 +1,3 @@
+# for intelligence service
+
+vendor_internal_prop(vendor_intelligence_prop)
diff --git a/storage/sepolicy/property_contexts b/storage/sepolicy/property_contexts
new file mode 100644
index 0000000..b436986
--- /dev/null
+++ b/storage/sepolicy/property_contexts
@@ -0,0 +1 @@
+persist.vendor.intelligence          u:object_r:vendor_intelligence_prop:s0
diff --git a/storage/sepolicy/storage_intelligence.te b/storage/sepolicy/storage_intelligence.te
new file mode 100644
index 0000000..66d14df
--- /dev/null
+++ b/storage/sepolicy/storage_intelligence.te
@@ -0,0 +1,12 @@
+# support intelligence service
+init_daemon_domain(storage_intelligence)
+type storage_intelligence, domain;
+type storage_intelligence_exec, vendor_file_type, exec_type, file_type;
+
+set_prop(storage_intelligence, vendor_intelligence_prop);
+
+allow storage_intelligence vendor_toolbox_exec:file execute_no_trans;
+
+# for storage management
+allow storage_intelligence block_device:dir { search };
+allow storage_intelligence userdata_exp_block_device:blk_file rw_file_perms;
diff --git a/storage/sepolicy/tracking_denials/bug_map b/storage/sepolicy/tracking_denials/bug_map
new file mode 100644
index 0000000..a1e8298
--- /dev/null
+++ b/storage/sepolicy/tracking_denials/bug_map
@@ -0,0 +1 @@
+shell vendor_intelligence_prop file b/378120929
diff --git a/storage/sepolicy/vendor_init.te b/storage/sepolicy/vendor_init.te
index 73eb527..cbb2990 100644
--- a/storage/sepolicy/vendor_init.te
+++ b/storage/sepolicy/vendor_init.te
@@ -4,3 +4,5 @@
 # dirty swappiness
 allow vendor_init proc_dirty:file w_file_perms;
 
+# intelligence
+set_prop(vendor_init, vendor_intelligence_prop);
diff --git a/storage/storage.intelligence.rc b/storage/storage.intelligence.rc
new file mode 100644
index 0000000..85586ab
--- /dev/null
+++ b/storage/storage.intelligence.rc
@@ -0,0 +1,23 @@
+# For intelligence service
+# on  -> mount(ok)    -> on
+# off -> write_zeroes -> remove -> rm(ok) -> disable
+# on  -> mount(fail)  -> remove -> rm(ok) -> disable
+
+service storage_intelligence /vendor/bin/storage_intelligence.sh
+    user root
+    disabled
+    oneshot
+
+on boot && property:persist.vendor.intelligence=on
+    mkdir /data/vendor/intelligence 0770 vendor_intelligence vendor_intelligence
+    restorecon_recursive /data/vendor/intelligence
+    mount f2fs loop@/dev/block/by-name/userdata_exp.ai /data/vendor/intelligence ro
+    start storage_intelligence
+
+on boot && property:persist.vendor.intelligence=off
+    start storage_intelligence
+
+on property:persist.vendor.intelligence=remove
+    rm /data/userdata_exp.ai
+    rmdir /data/vendor/intelligence
+    setprop persist.vendor.intelligence disable
diff --git a/storage/storage_intelligence.sh b/storage/storage_intelligence.sh
new file mode 100755
index 0000000..03d2ca7
--- /dev/null
+++ b/storage/storage_intelligence.sh
@@ -0,0 +1,24 @@
+#!/vendor/bin/sh
+#
+# The script belongs to the feature of UFS FFU via OTA: go/p23-ffu-ota
+# Its purpose is to copy the corresponding firmware into partition for UFS FFU.
+
+
+property="persist.vendor.intelligence"
+partition="/dev/block/by-name/userdata_exp.ai"
+mount_point="/data/vendor/intelligence"
+backend_file="/data/userdata_exp.ai"
+
+request=`getprop $property`
+
+if [ "$request" == "on" ]; then
+	mounted=`grep $mount_point /proc/mounts`
+	if [ "$mounted" ]; then
+		setprop $property on
+	else
+		setprop $property remove
+	fi
+elif [ "$request" == "off" ]; then
+	dd if=/dev/zero of=$partition bs=4k count=2
+	setprop $property remove
+fi
diff --git a/storage/tracking_denials/bug_map b/storage/tracking_denials/bug_map
new file mode 100644
index 0000000..a1e8298
--- /dev/null
+++ b/storage/tracking_denials/bug_map
@@ -0,0 +1 @@
+shell vendor_intelligence_prop file b/378120929