diff --git a/android/abi_gki_aarch64.xml b/android/abi_gki_aarch64.xml
index 06d41dd2254d..a9334233428c 100644
--- a/android/abi_gki_aarch64.xml
+++ b/android/abi_gki_aarch64.xml
@@ -232,12 +232,15 @@
+
+
+
@@ -254,11 +257,15 @@
+
+
+
+
@@ -274,8 +281,10 @@
+
+
@@ -283,6 +292,8 @@
+
+
@@ -306,6 +317,9 @@
+
+
+
@@ -631,6 +645,7 @@
+
@@ -2753,6 +2768,7 @@
+
@@ -3760,12 +3776,15 @@
+
+
+
@@ -3782,11 +3801,15 @@
+
+
+
+
@@ -3802,8 +3825,10 @@
+
+
@@ -3811,6 +3836,8 @@
+
+
@@ -3834,6 +3861,9 @@
+
+
+
@@ -9979,23 +10009,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -45184,11 +45198,6 @@
-
-
-
-
-
@@ -101711,6 +101720,7 @@
+
@@ -105092,6 +105102,7 @@
+
@@ -110387,8 +110398,8 @@
-
-
+
+
@@ -110805,6 +110816,11 @@
+
+
+
+
+
@@ -110846,6 +110862,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
@@ -110963,10 +110991,28 @@
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -110996,6 +111042,12 @@
+
+
+
+
+
+
@@ -111046,9 +111098,9 @@
-
-
-
+
+
+
@@ -111081,13 +111133,19 @@
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
@@ -111102,6 +111160,11 @@
+
+
+
+
+
@@ -111150,6 +111213,16 @@
+
+
+
+
+
+
+
+
+
+
@@ -111299,6 +111372,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -111477,12 +111566,15 @@
+
+
+
@@ -111499,11 +111591,15 @@
-
+
+
+
+
+
@@ -111512,15 +111608,17 @@
-
+
-
+
+
+
@@ -111528,6 +111626,8 @@
+
+
@@ -111551,6 +111651,9 @@
+
+
+
@@ -113065,30 +113168,30 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -113105,25 +113208,25 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
@@ -113165,9 +113268,9 @@
-
-
-
+
+
+
@@ -113206,24 +113309,24 @@
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
@@ -113240,9 +113343,9 @@
-
-
-
+
+
+
@@ -113263,6 +113366,12 @@
+
+
+
+
+
+
@@ -119374,16 +119483,16 @@
-
-
-
+
+
+
-
-
-
-
-
+
+
+
+
+
@@ -119512,8 +119621,8 @@
-
-
+
+
@@ -119537,29 +119646,29 @@
-
-
-
+
+
+
-
-
-
-
-
+
+
+
+
+
-
-
-
+
+
+
-
-
+
+
-
-
+
+
@@ -119632,10 +119741,10 @@
-
-
-
-
+
+
+
+
@@ -120915,10 +121024,10 @@
-
+
-
+
@@ -123873,8 +123982,8 @@
-
-
+
+
@@ -124184,12 +124293,12 @@
-
-
-
-
-
-
+
+
+
+
+
+
@@ -124251,6 +124360,10 @@
+
+
+
+
@@ -127391,11 +127504,11 @@
-
-
-
-
-
+
+
+
+
+
@@ -127477,8 +127590,8 @@
-
-
+
+
@@ -128771,16 +128884,16 @@
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
@@ -128827,23 +128940,23 @@
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
-
+
+
+
+
+
diff --git a/android/abi_gki_aarch64_generic b/android/abi_gki_aarch64_generic
index d9a45368005a..b02c2b60c7a2 100644
--- a/android/abi_gki_aarch64_generic
+++ b/android/abi_gki_aarch64_generic
@@ -189,6 +189,7 @@
cfg80211_vendor_cmd_reply
__cfi_slowpath
__check_object_size
+ check_preempt_curr
__class_create
class_destroy
class_interface_unregister
@@ -1804,6 +1805,7 @@
__request_percpu_irq
__request_region
request_threaded_irq
+ resched_curr
resume_cpus
return_address
revalidate_disk_size
@@ -2223,12 +2225,15 @@
__traceiter_android_rvh_post_init_entity_util_avg
__traceiter_android_rvh_preempt_disable
__traceiter_android_rvh_preempt_enable
+ __traceiter_android_rvh_prepare_prio_fork
__traceiter_android_rvh_remove_entity_load_avg
__traceiter_android_rvh_sched_fork
__traceiter_android_rvh_select_task_rq_fair
__traceiter_android_rvh_select_task_rq_rt
__traceiter_android_rvh_set_iowait
+ __traceiter_android_rvh_setscheduler
__traceiter_android_rvh_set_task_cpu
+ __traceiter_android_rvh_set_user_nice
__traceiter_android_rvh_typec_tcpci_chk_contaminant
__traceiter_android_rvh_typec_tcpci_get_vbus
__traceiter_android_rvh_uclamp_eff_get
@@ -2241,11 +2246,15 @@
__traceiter_android_rvh_update_rt_rq_load_avg
__traceiter_android_rvh_util_est_update
__traceiter_android_vh_arch_set_freq_scale
+ __traceiter_android_vh_bh_lru_install
+ __traceiter_android_vh_binder_restore_priority
+ __traceiter_android_vh_binder_set_priority
__traceiter_android_vh_cma_alloc_adjust
__traceiter_android_vh_cma_alloc_finish
__traceiter_android_vh_cma_alloc_start
__traceiter_android_vh_cpu_idle_enter
__traceiter_android_vh_cpu_idle_exit
+ __traceiter_android_vh_do_madvise_blk_plug
__traceiter_android_vh_dump_throttled_rt_tasks
__traceiter_android_vh_dup_task_struct
__traceiter_android_vh_early_resume_begin
@@ -2260,14 +2269,18 @@
__traceiter_android_vh_mm_compaction_end
__traceiter_android_vh_of_i2c_get_board_info
__traceiter_android_vh_pagecache_get_page
+ __traceiter_android_vh_pagevec_drain
__traceiter_android_vh_pin_user_pages
__traceiter_android_vh_rebuild_root_domains_bypass
+ __traceiter_android_vh_reclaim_pages_plug
__traceiter_android_vh_resume_end
__traceiter_android_vh_rmqueue
__traceiter_android_vh_sched_setaffinity_early
__traceiter_android_vh_scheduler_tick
__traceiter_android_vh_setscheduler_uclamp
__traceiter_android_vh_show_max_freq
+ __traceiter_android_vh_shrink_inactive_list_blk_plug
+ __traceiter_android_vh_skip_lru_disable
__traceiter_android_vh_snd_compr_use_pause_in_drain
__traceiter_android_vh_sound_usb_support_cpu_suspend
__traceiter_android_vh_sysrq_crash
@@ -2291,6 +2304,9 @@
__traceiter_android_vh_ufs_update_sysfs
__traceiter_android_vh_usb_dev_resume
__traceiter_android_vh_usb_dev_suspend
+ __traceiter_android_vh_zap_pte_range_tlb_end
+ __traceiter_android_vh_zap_pte_range_tlb_force_flush
+ __traceiter_android_vh_zap_pte_range_tlb_start
__traceiter_clock_set_rate
__traceiter_cpu_frequency
__traceiter_device_pm_callback_end
@@ -2340,12 +2356,15 @@
__tracepoint_android_rvh_post_init_entity_util_avg
__tracepoint_android_rvh_preempt_disable
__tracepoint_android_rvh_preempt_enable
+ __tracepoint_android_rvh_prepare_prio_fork
__tracepoint_android_rvh_remove_entity_load_avg
__tracepoint_android_rvh_sched_fork
__tracepoint_android_rvh_select_task_rq_fair
__tracepoint_android_rvh_select_task_rq_rt
__tracepoint_android_rvh_set_iowait
+ __tracepoint_android_rvh_setscheduler
__tracepoint_android_rvh_set_task_cpu
+ __tracepoint_android_rvh_set_user_nice
__tracepoint_android_rvh_typec_tcpci_chk_contaminant
__tracepoint_android_rvh_typec_tcpci_get_vbus
__tracepoint_android_rvh_uclamp_eff_get
@@ -2358,11 +2377,15 @@
__tracepoint_android_rvh_update_rt_rq_load_avg
__tracepoint_android_rvh_util_est_update
__tracepoint_android_vh_arch_set_freq_scale
+ __tracepoint_android_vh_bh_lru_install
+ __tracepoint_android_vh_binder_restore_priority
+ __tracepoint_android_vh_binder_set_priority
__tracepoint_android_vh_cma_alloc_adjust
__tracepoint_android_vh_cma_alloc_finish
__tracepoint_android_vh_cma_alloc_start
__tracepoint_android_vh_cpu_idle_enter
__tracepoint_android_vh_cpu_idle_exit
+ __tracepoint_android_vh_do_madvise_blk_plug
__tracepoint_android_vh_dump_throttled_rt_tasks
__tracepoint_android_vh_dup_task_struct
__tracepoint_android_vh_early_resume_begin
@@ -2377,14 +2400,18 @@
__tracepoint_android_vh_mm_compaction_end
__tracepoint_android_vh_of_i2c_get_board_info
__tracepoint_android_vh_pagecache_get_page
+ __tracepoint_android_vh_pagevec_drain
__tracepoint_android_vh_pin_user_pages
__tracepoint_android_vh_rebuild_root_domains_bypass
+ __tracepoint_android_vh_reclaim_pages_plug
__tracepoint_android_vh_resume_end
__tracepoint_android_vh_rmqueue
__tracepoint_android_vh_sched_setaffinity_early
__tracepoint_android_vh_scheduler_tick
__tracepoint_android_vh_setscheduler_uclamp
__tracepoint_android_vh_show_max_freq
+ __tracepoint_android_vh_shrink_inactive_list_blk_plug
+ __tracepoint_android_vh_skip_lru_disable
__tracepoint_android_vh_snd_compr_use_pause_in_drain
__tracepoint_android_vh_sound_usb_support_cpu_suspend
__tracepoint_android_vh_sysrq_crash
@@ -2408,6 +2435,9 @@
__tracepoint_android_vh_ufs_update_sysfs
__tracepoint_android_vh_usb_dev_resume
__tracepoint_android_vh_usb_dev_suspend
+ __tracepoint_android_vh_zap_pte_range_tlb_end
+ __tracepoint_android_vh_zap_pte_range_tlb_force_flush
+ __tracepoint_android_vh_zap_pte_range_tlb_start
__tracepoint_clock_set_rate
__tracepoint_cpu_frequency
__tracepoint_device_pm_callback_end
diff --git a/android/abi_gki_aarch64_rockchip b/android/abi_gki_aarch64_rockchip
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/arch/arm64/configs/rockchip_gki.fragment b/arch/arm64/configs/rockchip_gki.fragment
new file mode 100644
index 000000000000..6253108101a8
--- /dev/null
+++ b/arch/arm64/configs/rockchip_gki.fragment
@@ -0,0 +1,342 @@
+CONFIG_AP6XXX=m
+CONFIG_ARCH_ROCKCHIP=y
+CONFIG_ARM_ROCKCHIP_BUS_DEVFREQ=m
+CONFIG_ARM_ROCKCHIP_CPUFREQ=m
+CONFIG_ARM_ROCKCHIP_DMC_DEVFREQ=m
+CONFIG_BACKLIGHT_PWM=m
+CONFIG_BATTERY_CW2015=m
+CONFIG_BATTERY_CW2017=m
+CONFIG_BATTERY_CW221X=m
+CONFIG_BATTERY_RK817=m
+CONFIG_BATTERY_RK818=m
+CONFIG_BLK_DEV_NVME=m
+CONFIG_BMA2XX_ACC=m
+CONFIG_CHARGER_BQ25700=m
+CONFIG_CHARGER_BQ25890=m
+CONFIG_CHARGER_RK817=m
+CONFIG_CHARGER_RK818=m
+CONFIG_CHARGER_SC89890=m
+CONFIG_CHARGER_SGM41542=m
+CONFIG_CHR_DEV_SCH=m
+CONFIG_CHR_DEV_SG=m
+CONFIG_COMMON_CLK_PWM=m
+CONFIG_COMMON_CLK_RK808=m
+CONFIG_COMMON_CLK_ROCKCHIP=m
+CONFIG_COMMON_CLK_SCMI=m
+CONFIG_COMPASS_AK8963=m
+CONFIG_COMPASS_AK8975=m
+CONFIG_COMPASS_DEVICE=m
+CONFIG_CPUFREQ_DT=m
+CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+CONFIG_CPU_FREQ_GOV_USERSPACE=m
+CONFIG_CPU_RK3588=y
+CONFIG_CRYPTO_AES_ARM64_CE_CCM=m
+CONFIG_CRYPTO_DEV_ROCKCHIP=m
+CONFIG_CRYPTO_DEV_ROCKCHIP_DEV=m
+CONFIG_CRYPTO_GHASH_ARM64_CE=m
+CONFIG_CRYPTO_SHA1_ARM64_CE=m
+CONFIG_CRYPTO_TWOFISH=m
+CONFIG_DEVFREQ_EVENT_ROCKCHIP_NOCP=m
+CONFIG_DMABUF_HEAPS_CMA=m
+CONFIG_DMABUF_HEAPS_SYSTEM=m
+CONFIG_DRAGONRISE_FF=y
+CONFIG_DRM_DISPLAY_CONNECTOR=m
+CONFIG_DRM_DW_HDMI_CEC=m
+CONFIG_DRM_DW_HDMI_I2S_AUDIO=m
+CONFIG_DRM_MAXIM_MAX96745=m
+CONFIG_DRM_MAXIM_MAX96752F=m
+CONFIG_DRM_MAXIM_MAX96755F=m
+CONFIG_DRM_PANEL_SIMPLE=m
+CONFIG_DRM_RK1000_TVE=m
+CONFIG_DRM_RK630_TVE=m
+CONFIG_DRM_ROCKCHIP=m
+CONFIG_DRM_ROCKCHIP_RK628=m
+CONFIG_DRM_ROHM_BU18XL82=m
+CONFIG_DRM_SII902X=m
+CONFIG_DTC_SYMBOLS=y
+CONFIG_DW_WATCHDOG=m
+CONFIG_GPIO_ROCKCHIP=m
+CONFIG_GREENASIA_FF=y
+CONFIG_GSENSOR_DEVICE=m
+CONFIG_GS_DA223=m
+CONFIG_GS_KXTJ9=m
+CONFIG_GS_LIS3DH=m
+CONFIG_GS_LSM303D=m
+CONFIG_GS_MC3230=m
+CONFIG_GS_MMA7660=m
+CONFIG_GS_MMA8452=m
+CONFIG_GS_MXC6655XA=m
+CONFIG_GS_SC7660=m
+CONFIG_GS_SC7A20=m
+CONFIG_GS_SC7A30=m
+CONFIG_GYROSCOPE_DEVICE=m
+CONFIG_GYRO_EWTSA=m
+CONFIG_GYRO_L3G20D=m
+CONFIG_GYRO_L3G4200D=m
+CONFIG_GYRO_LSM330=m
+CONFIG_GYRO_MPU6500=m
+CONFIG_GYRO_MPU6880=m
+CONFIG_HALL_DEVICE=m
+CONFIG_HID_A4TECH=m
+CONFIG_HID_ACRUX=m
+CONFIG_HID_ACRUX_FF=y
+CONFIG_HID_ALPS=m
+CONFIG_HID_APPLEIR=m
+CONFIG_HID_AUREAL=m
+CONFIG_HID_BELKIN=m
+CONFIG_HID_CHERRY=m
+CONFIG_HID_CHICONY=m
+CONFIG_HID_CYPRESS=m
+CONFIG_HID_DRAGONRISE=m
+CONFIG_HID_EMS_FF=m
+CONFIG_HID_EZKEY=m
+CONFIG_HID_GREENASIA=m
+CONFIG_HID_GYRATION=m
+CONFIG_HID_HOLTEK=m
+CONFIG_HID_ICADE=m
+CONFIG_HID_KENSINGTON=m
+CONFIG_HID_KEYTOUCH=m
+CONFIG_HID_KYE=m
+CONFIG_HID_LCPOWER=m
+CONFIG_HID_LENOVO=m
+CONFIG_HID_MONTEREY=m
+CONFIG_HID_NTRIG=m
+CONFIG_HID_ORTEK=m
+CONFIG_HID_PANTHERLORD=m
+CONFIG_HID_PETALYNX=m
+CONFIG_HID_PRIMAX=m
+CONFIG_HID_SAITEK=m
+CONFIG_HID_SAMSUNG=m
+CONFIG_HID_SMARTJOYPLUS=m
+CONFIG_HID_SPEEDLINK=m
+CONFIG_HID_STEELSERIES=m
+CONFIG_HID_SUNPLUS=m
+CONFIG_HID_THINGM=m
+CONFIG_HID_THRUSTMASTER=m
+CONFIG_HID_TIVO=m
+CONFIG_HID_TOPSEED=m
+CONFIG_HID_TWINHAN=m
+CONFIG_HID_WALTOP=m
+CONFIG_HID_ZEROPLUS=m
+CONFIG_HID_ZYDACRON=m
+CONFIG_HS_MH248=m
+CONFIG_HW_RANDOM_ROCKCHIP=m
+CONFIG_I2C_CHARDEV=m
+CONFIG_I2C_GPIO=m
+CONFIG_I2C_HID=m
+CONFIG_I2C_RK3X=m
+CONFIG_IEP=m
+CONFIG_IIO_BUFFER_CB=m
+CONFIG_INPUT_RK805_PWRKEY=m
+CONFIG_KEYBOARD_ADC=m
+CONFIG_LEDS_GPIO=m
+CONFIG_LEDS_RGB13H=m
+CONFIG_LEDS_TRIGGER_BACKLIGHT=m
+CONFIG_LEDS_TRIGGER_DEFAULT_ON=m
+CONFIG_LEDS_TRIGGER_HEARTBEAT=m
+CONFIG_LIGHT_DEVICE=m
+CONFIG_LSM330_ACC=m
+CONFIG_LS_CM3217=m
+CONFIG_LS_CM3218=m
+CONFIG_LS_STK3410=m
+CONFIG_LS_UCS14620=m
+CONFIG_MALI_BIFROST=m
+CONFIG_MALI_BIFROST_DEBUG=y
+CONFIG_MALI_BIFROST_EXPERT=y
+CONFIG_MALI_CSF_SUPPORT=y
+CONFIG_MALI_PLATFORM_NAME="rk"
+CONFIG_MALI_PWRSOFT_765=y
+CONFIG_MFD_RK628=m
+CONFIG_MFD_RK630_I2C=m
+CONFIG_MFD_RK806_SPI=m
+CONFIG_MFD_RK808=m
+CONFIG_MMC_DW=m
+CONFIG_MMC_DW_ROCKCHIP=m
+CONFIG_MMC_SDHCI_OF_ARASAN=m
+CONFIG_MMC_SDHCI_OF_DWCMSHC=m
+CONFIG_MPU6500_ACC=m
+CONFIG_MPU6880_ACC=m
+CONFIG_OPTEE=m
+CONFIG_PANTHERLORD_FF=y
+CONFIG_PCIEASPM_EXT=m
+CONFIG_PCIE_DW_ROCKCHIP=m
+CONFIG_PCIE_ROCKCHIP_HOST=m
+CONFIG_PHY_ROCKCHIP_CSI2_DPHY=m
+CONFIG_PHY_ROCKCHIP_DP=m
+CONFIG_PHY_ROCKCHIP_EMMC=m
+CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY=m
+CONFIG_PHY_ROCKCHIP_INNO_HDMI=m
+CONFIG_PHY_ROCKCHIP_INNO_USB2=m
+CONFIG_PHY_ROCKCHIP_INNO_USB3=m
+CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY=m
+CONFIG_PHY_ROCKCHIP_NANENG_EDP=m
+CONFIG_PHY_ROCKCHIP_PCIE=m
+CONFIG_PHY_ROCKCHIP_SAMSUNG_DCPHY=m
+CONFIG_PHY_ROCKCHIP_SAMSUNG_HDPTX=m
+CONFIG_PHY_ROCKCHIP_SAMSUNG_HDPTX_HDMI=m
+CONFIG_PHY_ROCKCHIP_SNPS_PCIE3=m
+CONFIG_PHY_ROCKCHIP_TYPEC=m
+CONFIG_PHY_ROCKCHIP_USB=m
+CONFIG_PHY_ROCKCHIP_USBDP=m
+CONFIG_PINCTRL_RK805=m
+CONFIG_PINCTRL_RK806=m
+CONFIG_PINCTRL_ROCKCHIP=m
+CONFIG_PL330_DMA=m
+CONFIG_PROXIMITY_DEVICE=m
+CONFIG_PS_STK3410=m
+CONFIG_PS_UCS14620=m
+CONFIG_PWM_ROCKCHIP=m
+CONFIG_REGULATOR_ACT8865=m
+CONFIG_REGULATOR_FAN53555=m
+CONFIG_REGULATOR_GPIO=m
+CONFIG_REGULATOR_LP8752=m
+CONFIG_REGULATOR_MP8865=m
+CONFIG_REGULATOR_PWM=m
+CONFIG_REGULATOR_RK806=m
+CONFIG_REGULATOR_RK808=m
+CONFIG_REGULATOR_RK860X=m
+CONFIG_REGULATOR_TPS65132=m
+CONFIG_REGULATOR_WL2868C=m
+CONFIG_REGULATOR_XZ3216=m
+CONFIG_RFKILL_RK=m
+CONFIG_RK_CONSOLE_THREAD=y
+CONFIG_RK_HEADSET=m
+CONFIG_ROCKCHIP_ANALOGIX_DP=y
+CONFIG_ROCKCHIP_CDN_DP=y
+CONFIG_ROCKCHIP_CPUINFO=m
+CONFIG_ROCKCHIP_DEBUG=m
+CONFIG_ROCKCHIP_DW_DP=y
+CONFIG_ROCKCHIP_DW_HDCP2=m
+CONFIG_ROCKCHIP_DW_HDMI=y
+CONFIG_ROCKCHIP_DW_MIPI_DSI=y
+CONFIG_ROCKCHIP_EFUSE=m
+CONFIG_ROCKCHIP_GRF=m
+CONFIG_ROCKCHIP_INNO_HDMI=y
+CONFIG_ROCKCHIP_IODOMAIN=m
+CONFIG_ROCKCHIP_IOMMU=m
+CONFIG_ROCKCHIP_IPA=m
+CONFIG_ROCKCHIP_LVDS=y
+CONFIG_ROCKCHIP_MPP_AV1DEC=y
+CONFIG_ROCKCHIP_MPP_IEP2=y
+CONFIG_ROCKCHIP_MPP_JPGDEC=y
+CONFIG_ROCKCHIP_MPP_RKVDEC=y
+CONFIG_ROCKCHIP_MPP_RKVDEC2=y
+CONFIG_ROCKCHIP_MPP_RKVENC=y
+CONFIG_ROCKCHIP_MPP_RKVENC2=y
+CONFIG_ROCKCHIP_MPP_SERVICE=m
+CONFIG_ROCKCHIP_MPP_VDPU1=y
+CONFIG_ROCKCHIP_MPP_VDPU2=y
+CONFIG_ROCKCHIP_MPP_VEPU1=y
+CONFIG_ROCKCHIP_MPP_VEPU2=y
+CONFIG_ROCKCHIP_MULTI_RGA=m
+CONFIG_ROCKCHIP_OPP=m
+CONFIG_ROCKCHIP_OTP=m
+CONFIG_ROCKCHIP_PHY=m
+CONFIG_ROCKCHIP_PM_DOMAINS=m
+CONFIG_ROCKCHIP_PVTM=m
+CONFIG_ROCKCHIP_REMOTECTL=m
+CONFIG_ROCKCHIP_REMOTECTL_PWM=m
+CONFIG_ROCKCHIP_RGB=y
+CONFIG_ROCKCHIP_RKNPU=m
+CONFIG_ROCKCHIP_SARADC=m
+CONFIG_ROCKCHIP_SIP=m
+CONFIG_ROCKCHIP_SUSPEND_MODE=m
+CONFIG_ROCKCHIP_SYSTEM_MONITOR=m
+CONFIG_ROCKCHIP_THERMAL=m
+CONFIG_ROCKCHIP_TIMER=m
+CONFIG_ROCKCHIP_VENDOR_STORAGE=m
+CONFIG_ROCKCHIP_VENDOR_STORAGE_UPDATE_LOADER=y
+CONFIG_RTC_DRV_HYM8563=m
+CONFIG_RTC_DRV_RK808=m
+CONFIG_SENSOR_DEVICE=m
+CONFIG_SERIAL_8250_DW=m
+CONFIG_SMARTJOYPLUS_FF=y
+CONFIG_SND_SIMPLE_CARD=m
+CONFIG_SND_SOC_BT_SCO=m
+CONFIG_SND_SOC_CX2072X=m
+CONFIG_SND_SOC_DUMMY_CODEC=m
+CONFIG_SND_SOC_ES7202=m
+CONFIG_SND_SOC_ES7210=m
+CONFIG_SND_SOC_ES7243E=m
+CONFIG_SND_SOC_ES8311=m
+CONFIG_SND_SOC_ES8316=m
+CONFIG_SND_SOC_ES8323=m
+CONFIG_SND_SOC_ES8326=m
+CONFIG_SND_SOC_ES8396=m
+CONFIG_SND_SOC_RK3328=m
+CONFIG_SND_SOC_RK817=m
+CONFIG_SND_SOC_RK_CODEC_DIGITAL=m
+CONFIG_SND_SOC_ROCKCHIP=m
+CONFIG_SND_SOC_ROCKCHIP_HDMI=m
+CONFIG_SND_SOC_ROCKCHIP_I2S=m
+CONFIG_SND_SOC_ROCKCHIP_I2S_TDM=m
+CONFIG_SND_SOC_ROCKCHIP_MULTICODECS=m
+CONFIG_SND_SOC_ROCKCHIP_PDM=m
+CONFIG_SND_SOC_ROCKCHIP_SPDIF=m
+CONFIG_SND_SOC_ROCKCHIP_SPDIFRX=m
+CONFIG_SND_SOC_RT5640=m
+CONFIG_SND_SOC_SPDIF=m
+CONFIG_SPI_ROCKCHIP=m
+CONFIG_SPI_SPIDEV=m
+CONFIG_SW_SYNC=m
+CONFIG_SYSCON_REBOOT_MODE=m
+CONFIG_TEE=m
+CONFIG_TEST_POWER=m
+CONFIG_TOUCHSCREEN_ELAN5515=m
+CONFIG_TOUCHSCREEN_GSL3673=m
+CONFIG_TOUCHSCREEN_GSLX680_PAD=m
+CONFIG_TYPEC_DP_ALTMODE=m
+CONFIG_TYPEC_FUSB302=m
+CONFIG_TYPEC_HUSB311=m
+CONFIG_UCS12CM0=m
+CONFIG_USB_DWC2=m
+CONFIG_USB_NET_CDC_MBIM=m
+CONFIG_USB_NET_DM9601=m
+CONFIG_USB_NET_GL620A=m
+CONFIG_USB_NET_KALMIA=m
+CONFIG_USB_NET_MCS7830=m
+CONFIG_USB_NET_PLUSB=m
+CONFIG_USB_NET_SMSC75XX=m
+CONFIG_USB_NET_SMSC95XX=m
+CONFIG_USB_OHCI_HCD=m
+# CONFIG_USB_OHCI_HCD_PCI is not set
+CONFIG_USB_OHCI_HCD_PLATFORM=m
+CONFIG_USB_PRINTER=m
+CONFIG_USB_SERIAL=m
+CONFIG_USB_SERIAL_GENERIC=y
+CONFIG_USB_TRANCEVIBRATOR=m
+CONFIG_VIDEO_AW36518=m
+CONFIG_VIDEO_AW8601=m
+CONFIG_VIDEO_CN3927V=m
+CONFIG_VIDEO_DW9714=m
+CONFIG_VIDEO_FP5510=m
+CONFIG_VIDEO_GC2145=m
+CONFIG_VIDEO_GC2385=m
+CONFIG_VIDEO_GC4C33=m
+CONFIG_VIDEO_GC8034=m
+CONFIG_VIDEO_IMX415=m
+CONFIG_VIDEO_LT6911UXC=m
+CONFIG_VIDEO_LT7911D=m
+CONFIG_VIDEO_NVP6188=m
+CONFIG_VIDEO_OV02B10=m
+CONFIG_VIDEO_OV13850=m
+CONFIG_VIDEO_OV13855=m
+CONFIG_VIDEO_OV50C40=m
+CONFIG_VIDEO_OV5695=m
+CONFIG_VIDEO_OV8858=m
+CONFIG_VIDEO_RK628_BT1120=m
+CONFIG_VIDEO_RK628_CSI=m
+CONFIG_VIDEO_RK_IRCUT=m
+CONFIG_VIDEO_ROCKCHIP_CIF=m
+CONFIG_VIDEO_ROCKCHIP_ISP=m
+CONFIG_VIDEO_ROCKCHIP_ISPP=m
+CONFIG_VIDEO_S5K3L6XX=m
+CONFIG_VIDEO_S5KJN1=m
+CONFIG_VIDEO_SGM3784=m
+CONFIG_VIDEO_THCV244=m
+CONFIG_VL6180=m
+CONFIG_WIFI_BUILD_MODULE=y
+CONFIG_WL_ROCKCHIP=m
+CONFIG_ZRAM=m
+CONFIG_ZSMALLOC=m
+# CONFIG_USB_DUMMY_HCD is not set
diff --git a/arch/arm64/kvm/hyp/nvhe/iommu/s2mpu.c b/arch/arm64/kvm/hyp/nvhe/iommu/s2mpu.c
index ff5d7d1044e5..20c65f7489ed 100644
--- a/arch/arm64/kvm/hyp/nvhe/iommu/s2mpu.c
+++ b/arch/arm64/kvm/hyp/nvhe/iommu/s2mpu.c
@@ -24,6 +24,10 @@
#define PA_MAX ((phys_addr_t)SZ_1G * NR_GIGABYTES)
+#define SYNC_MAX_RETRIES 5
+#define SYNC_TIMEOUT 5
+#define SYNC_TIMEOUT_MULTIPLIER 3
+
#define CTX_CFG_ENTRY(ctxid, nr_ctx, vid) \
(CONTEXT_CFG_VALID_VID_CTX_VID(ctxid, vid) \
| (((ctxid) < (nr_ctx)) ? CONTEXT_CFG_VALID_VID_CTX_VALID(ctxid) : 0))
@@ -158,11 +162,20 @@ static void __set_control_regs(struct pkvm_iommu *dev)
writel_relaxed(ctrl0, dev->va + REG_NS_CTRL0);
}
-/* Poll the given SFR until its value has all bits of a given mask set. */
-static void __wait_until(void __iomem *addr, u32 mask)
+/*
+ * Poll the given SFR until its value has all bits of a given mask set.
+ * Returns true if successful, false if not successful after a given number of
+ * attempts.
+ */
+static bool __wait_until(void __iomem *addr, u32 mask, size_t max_attempts)
{
- while ((readl_relaxed(addr) & mask) != mask)
- continue;
+ size_t i;
+
+ for (i = 0; i < max_attempts; i++) {
+ if ((readl_relaxed(addr) & mask) == mask)
+ return true;
+ }
+ return false;
}
/* Poll the given SFR as long as its value has all bits of a given mask set. */
@@ -175,14 +188,27 @@ static void __wait_while(void __iomem *addr, u32 mask)
static void __wait_for_invalidation_complete(struct pkvm_iommu *dev)
{
struct pkvm_iommu *sync;
+ size_t i, timeout;
/*
* Wait for transactions to drain if SysMMU_SYNCs were registered.
* Assumes that they are in the same power domain as the S2MPU.
+ *
+ * The algorithm will try initiating the SYNC if the SYNC_COMP_COMPLETE
+ * bit has not been set after a given number of attempts, increasing the
+ * timeout exponentially each time. If this cycle fails a given number
+ * of times, the algorithm will give up completely to avoid deadlock.
*/
for_each_child(sync, dev) {
- writel_relaxed(SYNC_CMD_SYNC, sync->va + REG_NS_SYNC_CMD);
- __wait_until(sync->va + REG_NS_SYNC_COMP, SYNC_COMP_COMPLETE);
+ timeout = SYNC_TIMEOUT;
+ for (i = 0; i < SYNC_MAX_RETRIES; i++) {
+ writel_relaxed(SYNC_CMD_SYNC, sync->va + REG_NS_SYNC_CMD);
+ if (__wait_until(sync->va + REG_NS_SYNC_COMP,
+ SYNC_COMP_COMPLETE, timeout)) {
+ break;
+ }
+ timeout *= SYNC_TIMEOUT_MULTIPLIER;
+ }
}
/* Must not access SFRs while S2MPU is busy invalidating (v9 only). */
diff --git a/build.config.gki.aarch64 b/build.config.gki.aarch64
index dde70d69dd33..ad7b6b86db07 100644
--- a/build.config.gki.aarch64
+++ b/build.config.gki.aarch64
@@ -18,6 +18,7 @@ android/abi_gki_aarch64_generic
android/abi_gki_aarch64_virtual_device
android/abi_gki_aarch64_db845c
android/abi_gki_aarch64_hikey960
+android/abi_gki_aarch64_rockchip
"
FILES="${FILES}
diff --git a/build.config.rockchip b/build.config.rockchip
new file mode 100644
index 000000000000..297c4c95a14b
--- /dev/null
+++ b/build.config.rockchip
@@ -0,0 +1,8 @@
+. ${ROOT_DIR}/${KERNEL_DIR}/build.config.gki.aarch64
+
+
+DEFCONFIG=rockchip_aarch64_gki_defconfig
+KMI_SYMBOL_LIST=android/abi_gki_aarch64_rockchip
+PRE_DEFCONFIG_CMDS="KCONFIG_CONFIG=${ROOT_DIR}/common/arch/arm64/configs/${DEFCONFIG} ${ROOT_DIR}/common/scripts/kconfig/merge_config.sh -m -r ${ROOT_DIR}/common/arch/arm64/configs/gki_defconfig ${ROOT_DIR}/common/arch/arm64/configs/rockchip_gki.fragment"
+POST_DEFCONFIG_CMDS="rm ${ROOT_DIR}/common/arch/arm64/configs/${DEFCONFIG}"
+
diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c
index 73efd5503d2f..bfd9a74a0f61 100644
--- a/drivers/android/vendor_hooks.c
+++ b/drivers/android/vendor_hooks.c
@@ -61,6 +61,7 @@
#include
#include
#include
+#include
#ifdef __GENKSYMS__
#include
#endif
@@ -225,6 +226,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_calc_alloc_flags);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_compaction_begin);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_compaction_end);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rmqueue);
+EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_pagevec_drain);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_pagecache_get_page);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_filemap_fault_get_page);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_filemap_fault_cache_page);
@@ -281,6 +283,14 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_get_from_fragment_pool);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_exclude_reserved_zone);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_include_reserved_zone);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_alloc_pages_slowpath);
+EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_do_madvise_blk_plug);
+EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_shrink_inactive_list_blk_plug);
+EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_reclaim_pages_plug);
+EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_zap_pte_range_tlb_start);
+EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_zap_pte_range_tlb_force_flush);
+EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_zap_pte_range_tlb_end);
+EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_bh_lru_install);
+EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_skip_lru_disable);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cma_alloc_adjust);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_show_mem);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_print_slabinfo_header);
diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c
index 9157257925e1..94ac50ea6956 100644
--- a/drivers/net/wireless/mac80211_hwsim.c
+++ b/drivers/net/wireless/mac80211_hwsim.c
@@ -3678,6 +3678,8 @@ static int hwsim_cloned_frame_received_nl(struct sk_buff *skb_2,
rx_status.band = channel->band;
rx_status.rate_idx = nla_get_u32(info->attrs[HWSIM_ATTR_RX_RATE]);
+ if (rx_status.rate_idx >= data2->hw->wiphy->bands[rx_status.band]->n_bitrates)
+ goto out;
rx_status.signal = nla_get_u32(info->attrs[HWSIM_ATTR_SIGNAL]);
hdr = (void *)skb->data;
diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
index f102519ccefb..b4260a830e78 100644
--- a/drivers/video/fbdev/core/fbcon.c
+++ b/drivers/video/fbdev/core/fbcon.c
@@ -2510,6 +2510,11 @@ static int fbcon_set_font(struct vc_data *vc, struct console_font *font,
if (charcount != 256 && charcount != 512)
return -EINVAL;
+ /* font bigger than screen resolution ? */
+ if (w > FBCON_SWAP(info->var.rotate, info->var.xres, info->var.yres) ||
+ h > FBCON_SWAP(info->var.rotate, info->var.yres, info->var.xres))
+ return -EINVAL;
+
/* Make sure drawing engine can handle the font */
if (!(info->pixmap.blit_x & (1 << (font->width - 1))) ||
!(info->pixmap.blit_y & (1 << (font->height - 1))))
@@ -2771,6 +2776,34 @@ void fbcon_update_vcs(struct fb_info *info, bool all)
}
EXPORT_SYMBOL(fbcon_update_vcs);
+/* let fbcon check if it supports a new screen resolution */
+int fbcon_modechange_possible(struct fb_info *info, struct fb_var_screeninfo *var)
+{
+ struct fbcon_ops *ops = info->fbcon_par;
+ struct vc_data *vc;
+ unsigned int i;
+
+ WARN_CONSOLE_UNLOCKED();
+
+ if (!ops)
+ return 0;
+
+ /* prevent setting a screen size which is smaller than font size */
+ for (i = first_fb_vc; i <= last_fb_vc; i++) {
+ vc = vc_cons[i].d;
+ if (!vc || vc->vc_mode != KD_TEXT ||
+ registered_fb[con2fb_map[i]] != info)
+ continue;
+
+ if (vc->vc_font.width > FBCON_SWAP(var->rotate, var->xres, var->yres) ||
+ vc->vc_font.height > FBCON_SWAP(var->rotate, var->yres, var->xres))
+ return -EINVAL;
+ }
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(fbcon_modechange_possible);
+
int fbcon_mode_deleted(struct fb_info *info,
struct fb_videomode *mode)
{
diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c
index 00939ca2065a..3b3ccb235522 100644
--- a/drivers/video/fbdev/core/fbmem.c
+++ b/drivers/video/fbdev/core/fbmem.c
@@ -1019,6 +1019,16 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var)
if (ret)
return ret;
+ /* verify that virtual resolution >= physical resolution */
+ if (var->xres_virtual < var->xres ||
+ var->yres_virtual < var->yres) {
+ pr_warn("WARNING: fbcon: Driver '%s' missed to adjust virtual screen size (%ux%u vs. %ux%u)\n",
+ info->fix.id,
+ var->xres_virtual, var->yres_virtual,
+ var->xres, var->yres);
+ return -EINVAL;
+ }
+
if ((var->activate & FB_ACTIVATE_MASK) != FB_ACTIVATE_NOW)
return 0;
@@ -1109,7 +1119,9 @@ static long do_fb_ioctl(struct fb_info *info, unsigned int cmd,
return -EFAULT;
console_lock();
lock_fb_info(info);
- ret = fb_set_var(info, &var);
+ ret = fbcon_modechange_possible(info, &var);
+ if (!ret)
+ ret = fb_set_var(info, &var);
if (!ret)
fbcon_update_vcs(info, var.activate & FB_ACTIVATE_ALL);
unlock_fb_info(info);
diff --git a/fs/buffer.c b/fs/buffer.c
index 13dd0f71f762..029e806a85bd 100644
--- a/fs/buffer.c
+++ b/fs/buffer.c
@@ -51,6 +51,8 @@
#include "internal.h"
+#include
+
static int fsync_buffers_list(spinlock_t *lock, struct list_head *list);
static int submit_bh_wbc(int op, int op_flags, struct buffer_head *bh,
enum rw_hint hint, struct writeback_control *wbc);
@@ -1262,6 +1264,7 @@ static void bh_lru_install(struct buffer_head *bh)
struct buffer_head *evictee = bh;
struct bh_lru *b;
int i;
+ bool skip = false;
check_irqs_on();
/*
@@ -1273,6 +1276,10 @@ static void bh_lru_install(struct buffer_head *bh)
if (lru_cache_disabled())
return;
+ trace_android_vh_bh_lru_install(bh->b_page, &skip);
+ if (skip)
+ return;
+
bh_lru_lock();
b = this_cpu_ptr(&bh_lrus);
diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c
index 0de98abd7282..b93695d28e43 100644
--- a/fs/f2fs/namei.c
+++ b/fs/f2fs/namei.c
@@ -623,6 +623,8 @@ static int f2fs_unlink(struct inode *dir, struct dentry *dentry)
goto fail;
}
f2fs_delete_entry(de, page, dir, inode);
+ f2fs_unlock_op(sbi);
+
#ifdef CONFIG_UNICODE
/* VFS negative dentries are incompatible with Encoding and
* Case-insensitiveness. Eventually we'll want avoid
@@ -633,8 +635,6 @@ static int f2fs_unlink(struct inode *dir, struct dentry *dentry)
if (IS_CASEFOLDED(dir))
d_invalidate(dentry);
#endif
- f2fs_unlock_op(sbi);
-
if (IS_DIRSYNC(dir))
f2fs_sync_fs(sbi->sb, 1);
fail:
diff --git a/include/linux/fbcon.h b/include/linux/fbcon.h
index ff5596dd30f8..2382dec6d6ab 100644
--- a/include/linux/fbcon.h
+++ b/include/linux/fbcon.h
@@ -15,6 +15,8 @@ void fbcon_new_modelist(struct fb_info *info);
void fbcon_get_requirement(struct fb_info *info,
struct fb_blit_caps *caps);
void fbcon_fb_blanked(struct fb_info *info, int blank);
+int fbcon_modechange_possible(struct fb_info *info,
+ struct fb_var_screeninfo *var);
void fbcon_update_vcs(struct fb_info *info, bool all);
void fbcon_remap_all(struct fb_info *info);
int fbcon_set_con2fb_map_ioctl(void __user *argp);
@@ -33,6 +35,8 @@ static inline void fbcon_new_modelist(struct fb_info *info) {}
static inline void fbcon_get_requirement(struct fb_info *info,
struct fb_blit_caps *caps) {}
static inline void fbcon_fb_blanked(struct fb_info *info, int blank) {}
+static inline int fbcon_modechange_possible(struct fb_info *info,
+ struct fb_var_screeninfo *var) { return 0; }
static inline void fbcon_update_vcs(struct fb_info *info, bool all) {}
static inline void fbcon_remap_all(struct fb_info *info) {}
static inline int fbcon_set_con2fb_map_ioctl(void __user *argp) { return 0; }
diff --git a/include/trace/hooks/buffer.h b/include/trace/hooks/buffer.h
new file mode 100644
index 000000000000..50e8f71dab9f
--- /dev/null
+++ b/include/trace/hooks/buffer.h
@@ -0,0 +1,22 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM buffer
+
+#define TRACE_INCLUDE_PATH trace/hooks
+
+#if !defined(_TRACE_HOOK_BUFFER_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_HOOK_BUFFER_H
+
+#include
+#include
+
+DECLARE_HOOK(android_vh_bh_lru_install,
+ TP_PROTO(struct page *page, bool *flush),
+ TP_ARGS(page, flush));
+
+/* macro versions of hooks are no longer required */
+
+#endif /* _TRACE_HOOK_BUFFER_H */
+
+/* This part must be outside protection */
+#include
diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h
index 263b867d453c..236aaeeff274 100644
--- a/include/trace/hooks/mm.h
+++ b/include/trace/hooks/mm.h
@@ -61,6 +61,9 @@ DECLARE_HOOK(android_vh_rmqueue,
unsigned int alloc_flags, int migratetype),
TP_ARGS(preferred_zone, zone, order,
gfp_flags, alloc_flags, migratetype));
+DECLARE_HOOK(android_vh_pagevec_drain,
+ TP_PROTO(struct page *page, bool *ret),
+ TP_ARGS(page, ret));
DECLARE_HOOK(android_vh_pagecache_get_page,
TP_PROTO(struct address_space *mapping, pgoff_t index,
int fgp_flags, gfp_t gfp_mask, struct page *page),
@@ -97,6 +100,27 @@ DECLARE_HOOK(android_vh_alloc_pages_slowpath,
DECLARE_HOOK(android_vh_cma_alloc_adjust,
TP_PROTO(struct zone *zone, bool *is_cma_alloc),
TP_ARGS(zone, is_cma_alloc));
+DECLARE_HOOK(android_vh_do_madvise_blk_plug,
+ TP_PROTO(int behavior, bool *do_plug),
+ TP_ARGS(behavior, do_plug));
+DECLARE_HOOK(android_vh_shrink_inactive_list_blk_plug,
+ TP_PROTO(bool *do_plug),
+ TP_ARGS(do_plug));
+DECLARE_HOOK(android_vh_reclaim_pages_plug,
+ TP_PROTO(bool *do_plug),
+ TP_ARGS(do_plug));
+DECLARE_HOOK(android_vh_zap_pte_range_tlb_start,
+ TP_PROTO(void *unused),
+ TP_ARGS(unused));
+DECLARE_HOOK(android_vh_zap_pte_range_tlb_force_flush,
+ TP_PROTO(struct page *page, bool *flush),
+ TP_ARGS(page, flush));
+DECLARE_HOOK(android_vh_zap_pte_range_tlb_end,
+ TP_PROTO(void *unused),
+ TP_ARGS(unused));
+DECLARE_HOOK(android_vh_skip_lru_disable,
+ TP_PROTO(bool *skip),
+ TP_ARGS(skip));
DECLARE_HOOK(android_vh_print_slabinfo_header,
TP_PROTO(struct seq_file *m),
TP_ARGS(m));
diff --git a/mm/madvise.c b/mm/madvise.c
index 8920a7125389..937301fb9bc5 100644
--- a/mm/madvise.c
+++ b/mm/madvise.c
@@ -31,6 +31,7 @@
#include
#include
#include
+#include
#include
@@ -1266,6 +1267,7 @@ int do_madvise(struct mm_struct *mm, unsigned long start, size_t len_in, int beh
int write;
size_t len;
struct blk_plug plug;
+ bool do_plug = true;
start = untagged_addr(start);
@@ -1300,10 +1302,13 @@ int do_madvise(struct mm_struct *mm, unsigned long start, size_t len_in, int beh
mmap_read_lock(mm);
}
- blk_start_plug(&plug);
+ trace_android_vh_do_madvise_blk_plug(behavior, &do_plug);
+ if (do_plug)
+ blk_start_plug(&plug);
error = madvise_walk_vmas(mm, start, end, behavior,
madvise_vma_behavior);
- blk_finish_plug(&plug);
+ if (do_plug)
+ blk_finish_plug(&plug);
if (write)
mmap_write_unlock(mm);
else
diff --git a/mm/memory.c b/mm/memory.c
index a038d72a8110..f0fa06835537 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -1233,12 +1233,14 @@ static unsigned long zap_pte_range(struct mmu_gather *tlb,
tlb_change_page_size(tlb, PAGE_SIZE);
again:
+ trace_android_vh_zap_pte_range_tlb_start(NULL);
init_rss_vec(rss);
start_pte = pte_offset_map_lock(mm, pmd, addr, &ptl);
pte = start_pte;
flush_tlb_batched_pending(mm);
arch_enter_lazy_mmu_mode();
do {
+ bool flush = false;
pte_t ptent = *pte;
if (pte_none(ptent))
continue;
@@ -1279,8 +1281,9 @@ again:
page_remove_rmap(page, false);
if (unlikely(page_mapcount(page) < 0))
print_bad_pte(vma, addr, ptent, page);
+ trace_android_vh_zap_pte_range_tlb_force_flush(page, &flush);
if (unlikely(__tlb_remove_page(tlb, page)) ||
- lru_cache_disabled()) {
+ lru_cache_disabled() || flush) {
force_flush = 1;
addr += PAGE_SIZE;
break;
@@ -1346,6 +1349,7 @@ again:
tlb_flush_mmu(tlb);
}
+ trace_android_vh_zap_pte_range_tlb_end(NULL);
if (addr != end) {
cond_resched();
goto again;
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 46102392b423..fb3f1190753c 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -8837,6 +8837,8 @@ static int __alloc_contig_migrate_range(struct compact_control *cc,
unsigned int tries = 0;
unsigned int max_tries = 5;
int ret = 0;
+ bool skip = false;
+
struct page *page;
struct migration_target_control mtc = {
.nid = zone_to_nid(cc->zone),
@@ -8846,7 +8848,9 @@ static int __alloc_contig_migrate_range(struct compact_control *cc,
if (cc->alloc_contig && cc->mode == MIGRATE_ASYNC)
max_tries = 1;
- lru_cache_disable();
+ trace_android_vh_skip_lru_disable(&skip);
+ if (!skip)
+ lru_cache_disable();
while (pfn < end || !list_empty(&cc->migratepages)) {
if (fatal_signal_pending(current)) {
@@ -8881,7 +8885,8 @@ static int __alloc_contig_migrate_range(struct compact_control *cc,
info->nr_migrated += cc->nr_migratepages;
}
- lru_cache_enable();
+ if (!skip)
+ lru_cache_enable();
if (ret < 0) {
if (ret == -EBUSY) {
alloc_contig_dump_pages(&cc->migratepages);
diff --git a/mm/swap.c b/mm/swap.c
index 2f69e44ca737..467282ac2e96 100644
--- a/mm/swap.c
+++ b/mm/swap.c
@@ -43,6 +43,9 @@
#define CREATE_TRACE_POINTS
#include
+#undef CREATE_TRACE_POINTS
+#include
+
/* How many pages do we try to swap or page in/out together? */
int page_cluster;
@@ -267,6 +270,7 @@ static bool pagevec_add_and_need_flush(struct pagevec *pvec, struct page *page)
lru_cache_disabled())
ret = true;
+ trace_android_vh_pagevec_drain(page, &ret);
return ret;
}
diff --git a/mm/vmscan.c b/mm/vmscan.c
index d09d63861544..f4a22e18951d 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -70,6 +70,9 @@
#undef CREATE_TRACE_POINTS
#include
+#undef CREATE_TRACE_POINTS
+#include
+
EXPORT_TRACEPOINT_SYMBOL_GPL(mm_vmscan_direct_reclaim_begin);
EXPORT_TRACEPOINT_SYMBOL_GPL(mm_vmscan_direct_reclaim_end);
@@ -2005,6 +2008,8 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec,
enum vm_event_item item;
struct pglist_data *pgdat = lruvec_pgdat(lruvec);
bool stalled = false;
+ struct blk_plug plug;
+ bool do_plug = false;
while (unlikely(too_many_isolated(pgdat, file, sc))) {
if (stalled)
@@ -2038,11 +2043,16 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec,
if (nr_taken == 0)
return 0;
+ trace_android_vh_shrink_inactive_list_blk_plug(&do_plug);
+ if (do_plug)
+ blk_start_plug(&plug);
nr_reclaimed = shrink_page_list(&page_list, pgdat, sc, &stat, false);
spin_lock_irq(&pgdat->lru_lock);
move_pages_to_lru(lruvec, &page_list);
+ if (do_plug)
+ blk_finish_plug(&plug);
__mod_node_page_state(pgdat, NR_ISOLATED_ANON + file, -nr_taken);
lru_note_cost(lruvec, file, stat.nr_pageout);
@@ -2188,6 +2198,8 @@ unsigned long reclaim_pages(struct list_head *page_list)
LIST_HEAD(node_page_list);
struct reclaim_stat dummy_stat;
struct page *page;
+ struct blk_plug plug;
+ bool do_plug = false;
struct scan_control sc = {
.gfp_mask = GFP_KERNEL,
.priority = DEF_PRIORITY,
@@ -2196,6 +2208,10 @@ unsigned long reclaim_pages(struct list_head *page_list)
.may_swap = 1,
};
+ trace_android_vh_reclaim_pages_plug(&do_plug);
+ if (do_plug)
+ blk_start_plug(&plug);
+
while (!list_empty(page_list)) {
page = lru_to_page(page_list);
if (nid == NUMA_NO_NODE) {
@@ -2231,6 +2247,8 @@ unsigned long reclaim_pages(struct list_head *page_list)
putback_lru_page(page);
}
}
+ if (do_plug)
+ blk_finish_plug(&plug);
return nr_reclaimed;
}
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index fe8f586886b4..5bfa4e1ff9b8 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -1480,7 +1480,6 @@ struct ieee802_11_elems {
const u8 *supp_rates;
const u8 *ds_params;
const struct ieee80211_tim_ie *tim;
- const u8 *challenge;
const u8 *rsn;
const u8 *rsnx;
const u8 *erp_info;
@@ -1533,7 +1532,6 @@ struct ieee802_11_elems {
u8 ssid_len;
u8 supp_rates_len;
u8 tim_len;
- u8 challenge_len;
u8 rsn_len;
u8 rsnx_len;
u8 ext_supp_rates_len;
@@ -1548,6 +1546,8 @@ struct ieee802_11_elems {
u8 country_elem_len;
u8 bssid_index_len;
+ void *nontx_profile;
+
/* whether a parse error occurred while retrieving these elements */
bool parse_error;
};
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 0dba353d3f8f..2d133e5c5799 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -2899,14 +2899,14 @@ static void ieee80211_auth_challenge(struct ieee80211_sub_if_data *sdata,
{
struct ieee80211_local *local = sdata->local;
struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data;
+ const struct element *challenge;
u8 *pos;
- struct ieee802_11_elems elems;
u32 tx_flags = 0;
pos = mgmt->u.auth.variable;
- ieee802_11_parse_elems(pos, len - (pos - (u8 *)mgmt), false, &elems,
- mgmt->bssid, auth_data->bss->bssid);
- if (!elems.challenge)
+ challenge = cfg80211_find_elem(WLAN_EID_CHALLENGE, pos,
+ len - (pos - (u8 *)mgmt));
+ if (!challenge)
return;
auth_data->expected_transaction = 4;
drv_mgd_prepare_tx(sdata->local, sdata, 0);
@@ -2914,7 +2914,8 @@ static void ieee80211_auth_challenge(struct ieee80211_sub_if_data *sdata,
tx_flags = IEEE80211_TX_CTL_REQ_TX_STATUS |
IEEE80211_TX_INTFL_MLME_CONN_TX;
ieee80211_send_auth(sdata, 3, auth_data->algorithm, 0,
- elems.challenge - 2, elems.challenge_len + 2,
+ (void *)challenge,
+ challenge->datalen + sizeof(*challenge),
auth_data->bss->bssid, auth_data->bss->bssid,
auth_data->key, auth_data->key_len,
auth_data->key_idx, tx_flags);
@@ -3299,7 +3300,7 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
}
capab_info = le16_to_cpu(mgmt->u.assoc_resp.capab_info);
ieee802_11_parse_elems(pos, len - (pos - (u8 *)mgmt), false, elems,
- mgmt->bssid, assoc_data->bss->bssid);
+ mgmt->bssid, NULL);
if (elems->aid_resp)
aid = le16_to_cpu(elems->aid_resp->aid);
@@ -3393,6 +3394,7 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
sdata_info(sdata,
"AP bug: VHT operation missing from AssocResp\n");
}
+ kfree(bss_elems.nontx_profile);
}
/*
@@ -3701,7 +3703,7 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
return;
ieee802_11_parse_elems(pos, len - (pos - (u8 *)mgmt), false, &elems,
- mgmt->bssid, assoc_data->bss->bssid);
+ mgmt->bssid, NULL);
if (status_code == WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY &&
elems.timeout_int &&
@@ -4038,6 +4040,7 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
ifmgd->assoc_data->timeout = jiffies;
ifmgd->assoc_data->timeout_started = true;
run_again(sdata, ifmgd->assoc_data->timeout);
+ kfree(elems.nontx_profile);
return;
}
@@ -4215,7 +4218,7 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
ieee80211_report_disconnect(sdata, deauth_buf,
sizeof(deauth_buf), true,
WLAN_REASON_DEAUTH_LEAVING);
- return;
+ goto free;
}
if (sta && elems.opmode_notif)
@@ -4230,6 +4233,8 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
elems.cisco_dtpc_elem);
ieee80211_bss_info_change_notify(sdata, changed);
+free:
+ kfree(elems.nontx_profile);
}
void ieee80211_sta_rx_queued_ext(struct ieee80211_sub_if_data *sdata,
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 1e7614abd947..c033ac60c41f 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -1976,10 +1976,11 @@ ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx)
if (mmie_keyidx < NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS ||
mmie_keyidx >= NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS +
- NUM_DEFAULT_BEACON_KEYS) {
- cfg80211_rx_unprot_mlme_mgmt(rx->sdata->dev,
- skb->data,
- skb->len);
+ NUM_DEFAULT_BEACON_KEYS) {
+ if (rx->sdata->dev)
+ cfg80211_rx_unprot_mlme_mgmt(rx->sdata->dev,
+ skb->data,
+ skb->len);
return RX_DROP_MONITOR; /* unexpected BIP keyidx */
}
@@ -2127,7 +2128,8 @@ ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx)
/* either the frame has been decrypted or will be dropped */
status->flag |= RX_FLAG_DECRYPTED;
- if (unlikely(ieee80211_is_beacon(fc) && result == RX_DROP_UNUSABLE))
+ if (unlikely(ieee80211_is_beacon(fc) && result == RX_DROP_UNUSABLE &&
+ rx->sdata->dev))
cfg80211_rx_unprot_mlme_mgmt(rx->sdata->dev,
skb->data, skb->len);
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c
index 6b50cb5e0e3c..ad088324a6d3 100644
--- a/net/mac80211/scan.c
+++ b/net/mac80211/scan.c
@@ -227,6 +227,8 @@ ieee80211_bss_info_update(struct ieee80211_local *local,
rx_status, beacon);
}
+ kfree(elems.nontx_profile);
+
return bss;
}
diff --git a/net/mac80211/util.c b/net/mac80211/util.c
index a1f129292ad8..7fa6efa8b83c 100644
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
@@ -1124,10 +1124,6 @@ _ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
} else
elem_parse_failed = true;
break;
- case WLAN_EID_CHALLENGE:
- elems->challenge = pos;
- elems->challenge_len = elen;
- break;
case WLAN_EID_VENDOR_SPECIFIC:
if (elen >= 4 && pos[0] == 0x00 && pos[1] == 0x50 &&
pos[2] == 0xf2) {
@@ -1409,6 +1405,8 @@ static size_t ieee802_11_find_bssid_profile(const u8 *start, size_t len,
for_each_element_id(elem, WLAN_EID_MULTIPLE_BSSID, start, len) {
if (elem->datalen < 2)
continue;
+ if (elem->data[0] < 1 || elem->data[0] > 8)
+ continue;
for_each_element(sub, elem->data + 1, elem->datalen - 1) {
u8 new_bssid[ETH_ALEN];
@@ -1485,6 +1483,11 @@ u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE,
nontransmitted_profile,
nontransmitted_profile_len);
+ if (!nontransmitted_profile_len) {
+ nontransmitted_profile_len = 0;
+ kfree(nontransmitted_profile);
+ nontransmitted_profile = NULL;
+ }
}
crc = _ieee802_11_parse_elems_crc(start, len, action, elems, filter,
@@ -1514,7 +1517,7 @@ u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
offsetofend(struct ieee80211_bssid_index, dtim_count))
elems->dtim_count = elems->bssid_index->dtim_count;
- kfree(nontransmitted_profile);
+ elems->nontx_profile = nontransmitted_profile;
return crc;
}
diff --git a/net/wireless/scan.c b/net/wireless/scan.c
index fd614a5a00b4..45f0ec0398af 100644
--- a/net/wireless/scan.c
+++ b/net/wireless/scan.c
@@ -143,18 +143,12 @@ static inline void bss_ref_get(struct cfg80211_registered_device *rdev,
lockdep_assert_held(&rdev->bss_lock);
bss->refcount++;
- if (bss->pub.hidden_beacon_bss) {
- bss = container_of(bss->pub.hidden_beacon_bss,
- struct cfg80211_internal_bss,
- pub);
- bss->refcount++;
- }
- if (bss->pub.transmitted_bss) {
- bss = container_of(bss->pub.transmitted_bss,
- struct cfg80211_internal_bss,
- pub);
- bss->refcount++;
- }
+
+ if (bss->pub.hidden_beacon_bss)
+ bss_from_pub(bss->pub.hidden_beacon_bss)->refcount++;
+
+ if (bss->pub.transmitted_bss)
+ bss_from_pub(bss->pub.transmitted_bss)->refcount++;
}
static inline void bss_ref_put(struct cfg80211_registered_device *rdev,
@@ -304,7 +298,8 @@ static size_t cfg80211_gen_new_ie(const u8 *ie, size_t ielen,
tmp_old = cfg80211_find_ie(WLAN_EID_SSID, ie, ielen);
tmp_old = (tmp_old) ? tmp_old + tmp_old[1] + 2 : ie;
- while (tmp_old + tmp_old[1] + 2 - ie <= ielen) {
+ while (tmp_old + 2 - ie <= ielen &&
+ tmp_old + tmp_old[1] + 2 - ie <= ielen) {
if (tmp_old[0] == 0) {
tmp_old++;
continue;
@@ -364,7 +359,8 @@ static size_t cfg80211_gen_new_ie(const u8 *ie, size_t ielen,
* copied to new ie, skip ssid, capability, bssid-index ie
*/
tmp_new = sub_copy;
- while (tmp_new + tmp_new[1] + 2 - sub_copy <= subie_len) {
+ while (tmp_new + 2 - sub_copy <= subie_len &&
+ tmp_new + tmp_new[1] + 2 - sub_copy <= subie_len) {
if (!(tmp_new[0] == WLAN_EID_NON_TX_BSSID_CAP ||
tmp_new[0] == WLAN_EID_SSID)) {
memcpy(pos, tmp_new, tmp_new[1] + 2);
@@ -429,6 +425,15 @@ cfg80211_add_nontrans_list(struct cfg80211_bss *trans_bss,
rcu_read_unlock();
+ /*
+ * This is a bit weird - it's not on the list, but already on another
+ * one! The only way that could happen is if there's some BSSID/SSID
+ * shared by multiple APs in their multi-BSSID profiles, potentially
+ * with hidden SSID mixed in ... ignore it.
+ */
+ if (!list_empty(&nontrans_bss->nontrans_list))
+ return -EINVAL;
+
/* add to the list */
list_add_tail(&nontrans_bss->nontrans_list, &trans_bss->nontrans_list);
return 0;
@@ -1590,6 +1595,23 @@ struct cfg80211_non_tx_bss {
u8 bssid_index;
};
+static void cfg80211_update_hidden_bsses(struct cfg80211_internal_bss *known,
+ const struct cfg80211_bss_ies *new_ies,
+ const struct cfg80211_bss_ies *old_ies)
+{
+ struct cfg80211_internal_bss *bss;
+
+ /* Assign beacon IEs to all sub entries */
+ list_for_each_entry(bss, &known->hidden_list, hidden_list) {
+ const struct cfg80211_bss_ies *ies;
+
+ ies = rcu_access_pointer(bss->pub.beacon_ies);
+ WARN_ON(ies != old_ies);
+
+ rcu_assign_pointer(bss->pub.beacon_ies, new_ies);
+ }
+}
+
static bool
cfg80211_update_known_bss(struct cfg80211_registered_device *rdev,
struct cfg80211_internal_bss *known,
@@ -1613,7 +1635,6 @@ cfg80211_update_known_bss(struct cfg80211_registered_device *rdev,
kfree_rcu((struct cfg80211_bss_ies *)old, rcu_head);
} else if (rcu_access_pointer(new->pub.beacon_ies)) {
const struct cfg80211_bss_ies *old;
- struct cfg80211_internal_bss *bss;
if (known->pub.hidden_beacon_bss &&
!list_empty(&known->hidden_list)) {
@@ -1641,16 +1662,7 @@ cfg80211_update_known_bss(struct cfg80211_registered_device *rdev,
if (old == rcu_access_pointer(known->pub.ies))
rcu_assign_pointer(known->pub.ies, new->pub.beacon_ies);
- /* Assign beacon IEs to all sub entries */
- list_for_each_entry(bss, &known->hidden_list, hidden_list) {
- const struct cfg80211_bss_ies *ies;
-
- ies = rcu_access_pointer(bss->pub.beacon_ies);
- WARN_ON(ies != old);
-
- rcu_assign_pointer(bss->pub.beacon_ies,
- new->pub.beacon_ies);
- }
+ cfg80211_update_hidden_bsses(known, new->pub.beacon_ies, old);
if (old)
kfree_rcu((struct cfg80211_bss_ies *)old, rcu_head);
@@ -1727,6 +1739,8 @@ cfg80211_bss_update(struct cfg80211_registered_device *rdev,
new->refcount = 1;
INIT_LIST_HEAD(&new->hidden_list);
INIT_LIST_HEAD(&new->pub.nontrans_list);
+ /* we'll set this later if it was non-NULL */
+ new->pub.transmitted_bss = NULL;
if (rcu_access_pointer(tmp->pub.proberesp_ies)) {
hidden = rb_find_bss(rdev, tmp, BSS_CMP_HIDE_ZLEN);
@@ -1963,9 +1977,14 @@ cfg80211_inform_single_bss_data(struct wiphy *wiphy,
*/
if (cfg80211_add_nontrans_list(non_tx_data->tx_bss,
&res->pub)) {
- if (__cfg80211_unlink_bss(rdev, res))
+ if (__cfg80211_unlink_bss(rdev, res)) {
rdev->bss_generation++;
+ res = NULL;
+ }
}
+
+ if (!res)
+ return NULL;
}
trace_cfg80211_return_bss(&res->pub);
@@ -2084,6 +2103,8 @@ static void cfg80211_parse_mbssid_data(struct wiphy *wiphy,
for_each_element_id(elem, WLAN_EID_MULTIPLE_BSSID, ie, ielen) {
if (elem->datalen < 4)
continue;
+ if (elem->data[0] < 1 || (int)elem->data[0] > 8)
+ continue;
for_each_element(sub, elem->data + 1, elem->datalen - 1) {
u8 profile_len;
@@ -2219,7 +2240,7 @@ cfg80211_update_notlisted_nontrans(struct wiphy *wiphy,
size_t new_ie_len;
struct cfg80211_bss_ies *new_ies;
const struct cfg80211_bss_ies *old;
- u8 cpy_len;
+ size_t cpy_len;
lockdep_assert_held(&wiphy_to_rdev(wiphy)->bss_lock);
@@ -2286,6 +2307,8 @@ cfg80211_update_notlisted_nontrans(struct wiphy *wiphy,
} else {
old = rcu_access_pointer(nontrans_bss->beacon_ies);
rcu_assign_pointer(nontrans_bss->beacon_ies, new_ies);
+ cfg80211_update_hidden_bsses(bss_from_pub(nontrans_bss),
+ new_ies, old);
rcu_assign_pointer(nontrans_bss->ies, new_ies);
if (old)
kfree_rcu((struct cfg80211_bss_ies *)old, rcu_head);