diff --git a/GPATH b/GPATH new file mode 100644 index 0000000..964c2c9 Binary files /dev/null and b/GPATH differ diff --git a/GRTAGS b/GRTAGS new file mode 100644 index 0000000..60a3aad Binary files /dev/null and b/GRTAGS differ diff --git a/GTAGS b/GTAGS new file mode 100644 index 0000000..8100427 Binary files /dev/null and b/GTAGS differ diff --git a/cscope.in.out b/cscope.in.out new file mode 100644 index 0000000..766ff16 Binary files /dev/null and b/cscope.in.out differ diff --git a/cscope.out b/cscope.out new file mode 100644 index 0000000..8174101 --- /dev/null +++ b/cscope.out @@ -0,0 +1,26899 @@ +cscope 15 /source/lmkd -q 0000001439 0000157467 + @Android.bp + +1 + gckage + { + +2 + gu_ib_lins +: ["Android-Apache-2.0"], + +5 + gog_cfig_modu_ty + { + +7 + g_ty +: "cc_defaults", + +8 + gig_mea +: "lmkd", + +9 + g_vbs +: ["use_hooks"], + +10 + gts +: [ + +15 +mkd_hooks_cc_deus + { + +18 +g_cfig_vbs +: { + +19 +u_hooks +: { + +20 +cags +: [ + +23 + gic_libs +: [ + +29 + gc_deus + { + +31 + ggs +: [ + +35 +c_by + { + +42 +shed_libs +: [ + +49 +ic_libs +: [ + +52 +hd_libs +: [ + +54 +lol_ude_ds +: ["include"], + +55 + ggs +: [ + +60 +_rc +: ["lmkd.rc"], + +61 + gus +: [ + +64 +loggs +: ["event.logtags"], + +65 : +ue +, + +68 + gc_libry_ic + { + +71 + gl_ude_ds +: ["include"], + +72 + ggs +: [ + +76 +deus +: ["stats_defaults"], + +77 + ged_libs +: [ + +80 +hd_libs +: [ + +85 +c_libry_ic + { + +88 + gvy_avaab +: +ue +, + +89 + ged_libs +: [ + +92 +expt_ude_ds +: ["include"], + +93 + ggs +: [ + + @include/liblmkd_utils.h + +17 #ide +_LIBLMKD_UTILS_H_ + + +18  + #_LIBLMKD_UTILS_H_ + + + ) + +20  + ~ + +21  + ~ + +23  + ~ + +25 +__BEGIN_DECLS + + +32  +lmkd_c +(); + +40  +lmkd_gi_oc +( +sock +,  +lmk_orio + * +ms +); + +48  +lmkd_gi_ocs +( +sock +,  +lmk_ocs_io +* +ms +, cڡ  +oc_cou +); + +56  +lmkd_uegi_oc +( +sock +,  +lmk_oemove + * +ms +); + +58 + eupde_s_su + { + +59 + mUPDATE_PROPS_SUCCESS +, + +60 + mUPDATE_PROPS_FAIL +, + +61 + mUPDATE_PROPS_SEND_ERR +, + +62 + mUPDATE_PROPS_RECV_ERR +, + +63 + mUPDATE_PROPS_FORMAT_ERR +, + +70 +upde_s_su + +lmkd_upde_s +( +sock +); + +80  +_memcg +( +uid_t + +uid +, +pid_t + +pid +); + +82 + ebo_comed_nifiti_su + { + +83 + mBOOT_COMPLETED_NOTIF_SUCCESS +, + +84 + mBOOT_COMPLETED_NOTIF_FAILS +, + +85 + mBOOT_COMPLETED_NOTIF_ALREADY_HANDLED +, + +86 + mBOOT_COMPLETED_NOTIF_SEND_ERR +, + +87 + mBOOT_COMPLETED_NOTIF_RECV_ERR +, + +88 + mBOOT_COMPLETED_NOTIF_FORMAT_ERR +, + +94 +bo_comed_nifiti_su + +lmkd_nify_bo_comed +( +sock +); + +96 + eg_kl_cou_r_su + { + +97 + mGET_KILL_COUNT_SEND_ERR + = -1, + +98 + mGET_KILL_COUNT_RECV_ERR + = -2, + +99 + mGET_KILL_COUNT_FORMAT_ERR + = -3, + +107  +lmkd_g_kl_cou +( +sock +,  +lmk_gklt +* +ms +); + +109 + g__END_DECLS + + + @include/lmkd.h + +17 #ide +_LMKD_H_ + + +18  + #_LMKD_H_ + + + ) + +20  + ~ + +21  + ~ + +22  + ~ + +24 +__BEGIN_DECLS + + +29 + elmk_cmd + { + +30 + mLMK_TARGET + = 0, + +31 + mLMK_PROCPRIO +, + +32 + mLMK_PROCREMOVE +, + +33 + mLMK_PROCPURGE +, + +34 + mLMK_GETKILLCNT +, + +35 + mLMK_SUBSCRIBE +, + +36 + mLMK_PROCKILL +, + +37 + mLMK_UPDATE_PROPS +, + +38 + mLMK_STAT_KILL_OCCURRED +, + +39 + mLMK_START_MONITORING +, + +40 + mLMK_BOOT_COMPLETED +, + +41 + mLMK_PROCS_PRIO +, + +47  + #MAX_TARGETS + 6 + + ) + +54  + #CTRL_PACKET_MAX_SIZE + ((* ( +MAX_TARGETS + * 2 + 1)) + + ) + +57  + tLMKD_CTRL_PACKET +[ +CTRL_PACKET_MAX_SIZE + / ()]; + +60  +le + +lmk_cmd + + $lmkd_ck_g_cmd +( +LMKD_CTRL_PACKET + +ck +) { + +61  ( +lmk_cmd +) + `ohl +( +ck +[0]); + +62 + } +} + +65  + slmk_rg + { + +66  + mm +; + +67  + moom_adj_sce +; + +74  +le +  + $lmkd_ck_g_rg +( +LMKD_CTRL_PACKET + +ck +,  +rg_idx +, + +75  +lmk_rg +* +rg +) { + +76 +rg +-> +m + = + `ohl +( +ck +[ +rg_idx + * 2 + 1]); + +77 +rg +-> +oom_adj_sce + = + `ohl +( +ck +[ +rg_idx + * 2 + 2]); + +78 + } +} + +84  +le + +size_t + + $lmkd_ck_t_rg +( +LMKD_CTRL_PACKET + +ck +,  +lmk_rg +* +rgs +, + +85 +size_t + +rg_t +) { + +86  +idx + = 0; + +87 +ck +[ +idx +++] = + `htl +( +LMK_TARGET +); + +88  +rg_t +) { + +89 +ck +[ +idx +++] = + `htl +( +rgs +-> +m +); + +90 +ck +[ +idx +++] = + `htl +( +rgs +-> +oom_adj_sce +); + +91 +rgs +++; + +92 +rg_t +--; + +94  +idx + * (); + +95 + } +} + +98 + eoc_ty + { + +99 + mPROC_TYPE_FIRST +, + +100 + mPROC_TYPE_APP + = +PROC_TYPE_FIRST +, + +101 + mPROC_TYPE_SERVICE +, + +102 + mPROC_TYPE_COUNT +, + +106  + slmk_orio + { + +107 +pid_t + + mpid +; + +108 +uid_t + + muid +; + +109  + moomadj +; + +110 +oc_ty + + my +; + +112  + #LMK_PROCPRIO_FIELD_COUNT + 4 + + ) + +113  + #LMK_PROCPRIO_SIZE + ( +LMK_PROCPRIO_FIELD_COUNT + * ()) + + ) + +119  +le +  + $lmkd_ck_g_orio +( +LMKD_CTRL_PACKET + +ck +,  +fld_cou +, + +120  +lmk_orio +* +ms +) { + +121 +ms +-> +pid + = ( +pid_t +) + `ohl +( +ck +[1]); + +122 +ms +-> +uid + = ( +uid_t +) + `ohl +( +ck +[2]); + +123 +ms +-> +oomadj + = + `ohl +( +ck +[3]); + +125 +ms +-> +y + = +fld_cou + > 3 ? ( +oc_ty +) + `ohl +( +ck +[4]: +PROC_TYPE_APP +; + +126 + } +} + +132  +le + +size_t + + $lmkd_ck_t_orio +( +LMKD_CTRL_PACKET + +ck +,  +lmk_orio +* +ms +) { + +133 +ck +[0] = + `htl +( +LMK_PROCPRIO +); + +134 +ck +[1] = + `htl +( +ms +-> +pid +); + +135 +ck +[2] = + `htl +( +ms +-> +uid +); + +136 +ck +[3] = + `htl +( +ms +-> +oomadj +); + +137 +ck +[4] = + `htl +(() +ms +-> +y +); + +139 + } +} + +142  + slmk_oemove + { + +143 +pid_t + + mpid +; + +150  +le +  + $lmkd_ck_g_oemove +( +LMKD_CTRL_PACKET + +ck +, + +151  +lmk_oemove +* +ms +) { + +152 +ms +-> +pid + = ( +pid_t +) + `ohl +( +ck +[1]); + +153 + } +} + +159  +le + +size_t + + $lmkd_ck_t_oemove +( +LMKD_CTRL_PACKET + +ck +, + +160  +lmk_oemove +* +ms +) { + +161 +ck +[0] = + `htl +( +LMK_PROCREMOVE +); + +162 +ck +[1] = + `htl +( +ms +-> +pid +); + +164 + } +} + +170  +le + +size_t + + $lmkd_ck_t_ourge +( +LMKD_CTRL_PACKET + +ck +) { + +171 +ck +[0] = + `htl +( +LMK_PROCPURGE +); + +173 + } +} + +176  + slmk_gklt + { + +177  + mm_oomadj +; + +178  + mmax_oomadj +; + +185  +le +  + $lmkd_ck_g_gklt +( +LMKD_CTRL_PACKET + +ck +, + +186  +lmk_gklt +* +ms +) { + +187 +ms +-> +m_oomadj + = + `ohl +( +ck +[1]); + +188 +ms +-> +max_oomadj + = + `ohl +( +ck +[2]); + +189 + } +} + +195  +le + +size_t + + $lmkd_ck_t_gklt +( +LMKD_CTRL_PACKET + +ck +, + +196  +lmk_gklt +* +ms +) { + +197 +ck +[0] = + `htl +( +LMK_GETKILLCNT +); + +198 +ck +[1] = + `htl +( +ms +-> +m_oomadj +); + +199 +ck +[2] = + `htl +( +ms +-> +max_oomadj +); + +201 + } +} + +207  +le + +size_t + + $lmkd_ck_t_gklt_ +( +LMKD_CTRL_PACKET + +ck +,  +kl_t +) { + +208 +ck +[0] = + `htl +( +LMK_GETKILLCNT +); + +209 +ck +[1] = + `htl +( +kl_t +); + +211 + } +} + +214 + easync_evt_ty + { + +215 + mLMK_ASYNC_EVENT_FIRST +, + +216 + mLMK_ASYNC_EVENT_KILL + = +LMK_ASYNC_EVENT_FIRST +, + +217 + mLMK_ASYNC_EVENT_STAT +, + +218 + mLMK_ASYNC_EVENT_COUNT +, + +222  + slmk_subsibe + { + +223 +async_evt_ty + + mevt_ty +; + +230  +le +  + $lmkd_ck_g_subsibe +( +LMKD_CTRL_PACKET + +ck +,  +lmk_subsibe +* +ms +) { + +231 +ms +-> +evt_ty + = ( +async_evt_ty +) + `ohl +( +ck +[1]); + +232 + } +} + +238  +le + +size_t + + $lmkd_ck_t_subsibe +( +LMKD_CTRL_PACKET + +ck +, +async_evt_ty + +evt_ty +) { + +239 +ck +[0] = + `htl +( +LMK_SUBSCRIBE +); + +240 +ck +[1] = + `htl +(() +evt_ty +); + +242 + } +} + +248  +le + +size_t + + $lmkd_ck_t_ockls +( +LMKD_CTRL_PACKET + +ck +, +pid_t + +pid +, +uid_t + +uid +, + +249  +rss_kb +) { + +250 +ck +[0] = + `htl +( +LMK_PROCKILL +); + +251 +ck +[1] = + `htl +( +pid +); + +252 +ck +[2] = + `htl +( +uid +); + +253 +ck +[3] = + `htl +( +rss_kb +); + +256 + } +} + +262  +le + +size_t + + $lmkd_ck_t_upde_s +( +LMKD_CTRL_PACKET + +ck +) { + +263 +ck +[0] = + `htl +( +LMK_UPDATE_PROPS +); + +265 + } +} + +271  +le + +size_t + + $lmkd_ck_t_mڙܚg +( +LMKD_CTRL_PACKET + +ck +) { + +272 +ck +[0] = + `htl +( +LMK_START_MONITORING +); + +274 + } +} + +280  +le + +size_t + + $lmkd_ck_t_upde_s_ +( +LMKD_CTRL_PACKET + +ck +,  +su +) { + +281 +ck +[0] = + `htl +( +LMK_UPDATE_PROPS +); + +282 +ck +[1] = + `htl +( +su +); + +284 + } +} + +287  + slmk_upde_s_y + { + +288  + msu +; + +295  +le +  + $lmkd_ck_g_upde_s_ +( +LMKD_CTRL_PACKET + +ck +, + +296  +lmk_upde_s_y +* +ms +) { + +297 +ms +-> +su + = + `ohl +( +ck +[1]); + +298 + } +} + +304  +le + +size_t + + $lmkd_ck_t_bo_comed_nif +( +LMKD_CTRL_PACKET + +ck +) { + +305 +ck +[0] = + `htl +( +LMK_BOOT_COMPLETED +); + +307 + } +} + +313  +le + +size_t + + $lmkd_ck_t_bo_comed_nif_ +( +LMKD_CTRL_PACKET + +ck +,  +su +) { + +314 +ck +[0] = + `htl +( +LMK_BOOT_COMPLETED +); + +315 +ck +[1] = + `htl +( +su +); + +317 + } +} + +320  + slmk_bo_comed_nif_y + { + +321  + msu +; + +328  +le +  + $lmkd_ck_g_bo_comed_nif_ +( + +329 +LMKD_CTRL_PACKET + +ck +,  +lmk_bo_comed_nif_y +* +ms +) { + +330 +ms +-> +su + = + `ohl +( +ck +[1]); + +331 + } +} + +333  + #PROCS_PRIO_MAX_RECORD_COUNT + ( +CTRL_PACKET_MAX_SIZE + / +LMK_PROCPRIO_SIZE +) + + ) + +335  + slmk_ocs_io + { + +336  +lmk_orio + + mocs +[ +PROCS_PRIO_MAX_RECORD_COUNT +]; + +343  +le +  + $lmkd_ck_g_ocs_io +( +LMKD_CTRL_PACKET + +ck +,  +lmk_ocs_io +* +ms +, + +344 cڡ  +fld_cou +) { + +345 i( +fld_cou + < +LMK_PROCPRIO_FIELD_COUNT + || (field_count % LMK_PROCPRIO_FIELD_COUNT) != 0) + +347 cڡ  +ocs_cou + = ( +fld_cou + / +LMK_PROCPRIO_FIELD_COUNT +); + +350  +ckIdx + = 1; + +351  +ocs_idx + = 0;rocs_idx < +ocs_cou +;rocs_idx++) { + +352 +ms +-> +ocs +[ +ocs_idx +]. +pid + = ( +pid_t +) + `ohl +( +ck +[ +ckIdx +++]); + +353 +ms +-> +ocs +[ +ocs_idx +]. +uid + = ( +uid_t +) + `ohl +( +ck +[ +ckIdx +++]); + +354 +ms +-> +ocs +[ +ocs_idx +]. +oomadj + = + `ohl +( +ck +[ +ckIdx +++]); + +355 +ms +-> +ocs +[ +ocs_idx +]. +y + = ( +oc_ty +) + `ohl +( +ck +[ +ckIdx +++]); + +358  +ocs_cou +; + +359 + } +} + +365  +le + +size_t + + $lmkd_ck_t_ocs_io +( +LMKD_CTRL_PACKET + +ck +, + +366  +lmk_ocs_io +* +ms +, + +367 cڡ  +ocs_cou +) { + +368 +ck +[0] = + `htl +( +LMK_PROCS_PRIO +); + +369  +ckIdx + = 1; + +371  +i + = 0; i < +ocs_cou +; i++) { + +372 +ck +[ +ckIdx +++] = + `htl +( +ms +-> +ocs +[ +i +]. +pid +); + +373 +ck +[ +ckIdx +++] = + `htl +( +ms +-> +ocs +[ +i +]. +uid +); + +374 +ck +[ +ckIdx +++] = + `htl +( +ms +-> +ocs +[ +i +]. +oomadj +); + +375 +ck +[ +ckIdx +++] = + `htl +(() +ms +-> +ocs +[ +i +]. +y +); + +378  +ckIdx + * (); + +379 + } +} + +381 + g__END_DECLS + + + @include/lmkd_hooks.h + +24 #ide +_LMKD_HOOKS_H_ + + +25  + #_LMKD_HOOKS_H_ + + + ) + +27  + ~ + +29 + g__BEGIN_DECLS + + +31 #ifde +LMKD_USE_HOOKS + + +39 +bo + +lmkd_upde_s_hook +(); + +44 +bo + +lmkd__hook +(); + +51  +lmkd__memy_befe_kl_hook +( +oc +* +o +,  +oc_size_ges +, + +52  +oc_oom_sce +,  +kl_as +); + +57  +lmkd_no_kl_ndides_hook +(); + +61  +le + +bo + + $lmkd_upde_s_hook +({  +ue +; + } +} + +62  +le + +bo + + $lmkd__hook +({  +ue +; + } +} + +63  +le +  + $lmkd__memy_befe_kl_hook +( +oc +*, , , + +66 + } +} + +67  +le +  + $lmkd_no_kl_ndides_hook +({ + } +} + +71 + g__END_DECLS + + + @liblmkd_utils.cpp + +17  + ~ + +18  + ~ + +19  + ~ + +20  + ~ + +21  + ~ + +22  + ~ + +23  + ~ + +25  + ~ + +26  + ~ + +27  + ~ + +29  + $lmkd_c +() { + +30  + `sock_lol_ +("lmkd", + +31 +ANDROID_SOCKET_NAMESPACE_RESERVED +, + +32 +SOCK_SEQPACKET + | +SOCK_CLOEXEC +); + +33 + } +} + +35  + $lmkd_gi_oc +( +sock +,  +lmk_orio + * +ms +) { + +36 +LMKD_CTRL_PACKET + +ck +; + +37 +size_t + +size +; + +38  +t +; + +40 +size + = + `lmkd_ck_t_orio +( +ck +, +ms +); + +41 +t + = + `TEMP_FAILURE_RETRY +( + `wre +( +sock +, +ck +, +size +)); + +43  ( +t + < 0) ? -1 : 0; + +44 + } +} + +46  + $lmkd_gi_ocs +( +sock +,  +lmk_ocs_io +* +ms +, cڡ  +oc_cou +) { + +47 +LMKD_CTRL_PACKET + +ck +; + +48 +size_t + +size +; + +49  +t +; + +51 +size + = + `lmkd_ck_t_ocs_io +( +ck +, +ms +, +oc_cou +); + +52 +t + = + `TEMP_FAILURE_RETRY +( + `wre +( +sock +, +ck +, +size +)); + +54  ( +t + < 0) ? -1 : 0; + +55 + } +} + +57  + $lmkd_uegi_oc +( +sock +,  +lmk_oemove + * +ms +) { + +58 +LMKD_CTRL_PACKET + +ck +; + +59 +size_t + +size +; + +60  +t +; + +62 +size + = + `lmkd_ck_t_oemove +( +ck +, +ms +); + +63 +t + = + `TEMP_FAILURE_RETRY +( + `wre +( +sock +, +ck +, +size +)); + +65  ( +t + < 0) ? -1 : 0; + +66 + } +} + +68 +upde_s_su + + $lmkd_upde_s +( +sock +) { + +69 +LMKD_CTRL_PACKET + +ck +; + +70  +size +; + +72 +size + = + `lmkd_ck_t_upde_s +( +ck +); + +73 i( + `TEMP_FAILURE_RETRY +( + `wre +( +sock +, +ck +, +size +)) < 0) { + +74  +UPDATE_PROPS_SEND_ERR +; + +77 +size + = + `TEMP_FAILURE_RETRY +( + `ad +( +sock +, +ck +, +CTRL_PACKET_MAX_SIZE +)); + +78 i( +size + < 0) { + +79  +UPDATE_PROPS_RECV_ERR +; + +82 i( +size + !2 * (|| + `lmkd_ck_g_cmd +( +ck +! +LMK_UPDATE_PROPS +) { + +83  +UPDATE_PROPS_FORMAT_ERR +; + +86  +lmk_upde_s_y + +ms +; + +87 + `lmkd_ck_g_upde_s_ +( +ck +, & +ms +); + +89  +ms +. +su + =0 ? +UPDATE_PROPS_SUCCESS + : +UPDATE_PROPS_FAIL +; + +90 + } +} + +92 +bo_comed_nifiti_su + + $lmkd_nify_bo_comed +( +sock +) { + +93 +LMKD_CTRL_PACKET + +ck +; + +94  +size +; + +96 +size + = + `lmkd_ck_t_bo_comed_nif +( +ck +); + +97 i( + `TEMP_FAILURE_RETRY +( + `wre +( +sock +, +ck +, +size +)) < 0) { + +98  +BOOT_COMPLETED_NOTIF_SEND_ERR +; + +101 +size + = + `TEMP_FAILURE_RETRY +( + `ad +( +sock +, +ck +, +CTRL_PACKET_MAX_SIZE +)); + +102 i( +size + < 0) { + +103  +BOOT_COMPLETED_NOTIF_RECV_ERR +; + +106 i( +size + !2 * (|| + `lmkd_ck_g_cmd +( +ck +! +LMK_BOOT_COMPLETED +) { + +107  +BOOT_COMPLETED_NOTIF_FORMAT_ERR +; + +110  +lmk_bo_comed_nif_y + +ms +; + +111 + `lmkd_ck_g_bo_comed_nif_ +( +ck +, & +ms +); + +113 +bo_comed_nifiti_su + +s +; + +114  +ms +. +su +) { + +116 +s + = +BOOT_COMPLETED_NOTIF_FAILS +; + +119 +s + = +BOOT_COMPLETED_NOTIF_SUCCESS +; + +122 +s + = +BOOT_COMPLETED_NOTIF_ALREADY_HANDLED +; + +126 +s + = +BOOT_COMPLETED_NOTIF_FAILS +; + +129  +s +; + +130 + } +} + +132  + $lmkd_g_kl_cou +( +sock +,  +lmk_gklt +* +ms +) { + +133 +LMKD_CTRL_PACKET + +ck +; + +134  +size +; + +136 +size + = + `lmkd_ck_t_gklt +( +ck +, +ms +); + +137 i( + `TEMP_FAILURE_RETRY +( + `wre +( +sock +, +ck +, +size +)) < 0) { + +138  () +GET_KILL_COUNT_SEND_ERR +; + +141 +size + = + `TEMP_FAILURE_RETRY +( + `ad +( +sock +, +ck +, +CTRL_PACKET_MAX_SIZE +)); + +142 i( +size + < 0) { + +143  () +GET_KILL_COUNT_RECV_ERR +; + +146 i( +size + !2 * (|| + `lmkd_ck_g_cmd +( +ck +! +LMK_GETKILLCNT +) { + +147  () +GET_KILL_COUNT_FORMAT_ERR +; + +150  +ck +[1]; + +151 + } +} + +153  + $_memcg +( +uid_t + +uid +, +pid_t + +pid +) { + +154  + `ProssGroup +( +uid +, +pid +, +ue +) == 0 ? 0 : -1; + +155 + } +} + + @libpsi/Android.bp + +1 + gckage + { + +2 + gu_ib_lins +: ["Android-Apache-2.0"], + +5 + gc_libry_hds + { + +7 + g_ude_ds +: ["include"], + +8 + g_avaab +: +ue +, + +11 + gc_libry + { + +14 + g_avaab +: +ue +, + +15 + ged_libs +: [ + +17 +hd_libs +: [ + +20 +expt_hd_lib_hds +: [ + +22 +cags +: [ + + @libpsi/include/psi/psi.h + +17 #ide +__ANDROID_PSI_H__ + + +18  + #__ANDROID_PSI_H__ + + + ) + +20  + ~ + +21  + ~ + +23 +__BEGIN_DECLS + + +25 + epsi_sour + { + mPSI_MEMORY +, + mPSI_IO +, + mPSI_CPU +, + mPSI_RESOURCE_COUNT + }; + +27 + epsi_l_ty + { + +28 + mPSI_SOME +, + +29 + mPSI_FULL +, + +30 + mPSI_TYPE_COUNT + + +33  + spsi_s + { + +34  + mavg10 +; + +35  + mavg60 +; + +36  + mavg300 +; + +37  + mtٮ +; + +40  + spsi_da + { + +41  +psi_s + + mmem_s +[ +PSI_TYPE_COUNT +]; + +42  +psi_s + + mio_s +[ +PSI_TYPE_COUNT +]; + +43  +psi_s + + mu_s +[ +PSI_TYPE_COUNT +]; + +46 cڡ * + gpsi_sour_fe +[ +PSI_RESOURCE_COUNT +] = { + +60  +_psi_mڙ +( +psi_l_ty + +l_ty +,  +thshd_us +,  +wdow_us +, + +61 +psi_sour + +sour + = +PSI_MEMORY +); + +69  +gi_psi_mڙ +( +lfd +,  +fd +, * +da +); + +75  +uegi_psi_mڙ +( +lfd +,  +fd +); + +85  +deroy_psi_mڙ +( +fd +); + +92  +r_psi_le +(* +le +, +psi_l_ty + +l_ty +,  +psi_s + +s +[]); + +94 + g__END_DECLS + + + @libpsi/psi.cpp + +17  + #LOG_TAG + "libpsi" + + ) + +19  + ~ + +20  + ~ + +21  + ~ + +22  + ~ + +23  + ~ + +24  + ~ + +26  + ~ + +27  + ~ + +28  + ~ + +29  + ~"psi/psi.h +" + +31 cڡ * + gl_ty_me +[] = { + +36  + $_psi_mڙ +( +psi_l_ty + +l_ty +,  +thshd_us +,  +wdow_us +, + +37 +psi_sour + +sour +) { + +38 i( +sour + < +PSI_MEMORY + ||esour > +PSI_RESOURCE_COUNT +) { + +39 + `ALOGE +("Invidssoury: %d", +sour +); + +40 +o + = +EINVAL +; + +43  +fd +; + +44  +s +; + +45  +buf +[256]; + +47 +fd + = + `TEMP_FAILURE_RETRY +( + `ݒ +( +psi_sour_fe +[ +sour +], +O_WRONLY + | +O_CLOEXEC +)); + +48 i( +fd + < 0) { + +49 + `ALOGE +("Nkpsmڙ su܈Ӽno=%d)", +o +); + +53  +l_ty +) { + +54 ( +PSI_SOME +): + +55 ( +PSI_FULL +): + +56 +s + = + `tf +( +buf +, (buf), "%s %d %d", + +57 +l_ty_me +[ +l_ty +], +thshd_us +, +wdow_us +); + +60 + `ALOGE +("Invidsty: %d", +l_ty +); + +61 +o + = +EINVAL +; + +62  +r +; + +65 i( +s + >( +ssize_t +)( +buf +)) { + +66 + `ALOGE +("%lovow f܅sty '%s'", +psi_sour_fe +[ +sour +], + +67 +l_ty_me +[ +l_ty +]); + +68 +o + = +EINVAL +; + +69  +r +; + +72 +s + = + `TEMP_FAILURE_RETRY +( + `wre +( +fd +, +buf +, + ` +(buf) + 1)); + +73 i( +s + < 0) { + +74 + `ALOGE +("%wred f܅sty '%s';no=%d", +psi_sour_fe +[ +sour +], + +75 +l_ty_me +[ +l_ty +], +o +); + +76  +r +; + +79  +fd +; + +81 +r +: + +82 + `o +( +fd +); + +84 + } +} + +86  + $gi_psi_mڙ +( +lfd +,  +fd +, * +da +) { + +87  +s +; + +88  +l_evt + +ev +; + +90 +ev +. +evts + = +EPOLLPRI +; + +91 +ev +. +da +. +r + = data; + +92 +s + = + `l_l +( +lfd +, +EPOLL_CTL_ADD +, +fd +, & +ev +); + +93 i( +s + < 0) { + +94 + `ALOGE +("l_f܅smڙ faed;no=%d", +o +); + +96  +s +; + +97 + } +} + +99  + $uegi_psi_mڙ +( +lfd +,  +fd +) { + +100  + `l_l +( +lfd +, +EPOLL_CTL_DEL +, +fd +, +NULL +); + +101 + } +} + +103  + $deroy_psi_mڙ +( +fd +) { + +104 i( +fd + >= 0) { + +105 + `o +( +fd +); + +107 + } +} + +109  + $r_psi_le +(* +le +, +psi_l_ty + +l_ty +,  +psi_s + +s +[]) { + +110  +ty_me +[5]; + +111  +psi_s + * + + = & +s +[ +l_ty +]; + +113 i(! +le + || + `ssnf +(line, "%4svg10=%fvg60=%fvg300=%fotal=%lu", + +114 +ty_me +, & + +-> +avg10 +, &-> +avg60 +, &-> +avg300 +, &-> +tٮ +) != 5) { + +117 i( + `rcmp +( +ty_me +, +l_ty_me +[ +l_ty +])) { + +121 + } +} + + @lmkd.cpp + +17  + #LOG_TAG + "lowmemykr" + + ) + +19  + ~ + +20  + ~ + +21  + ~ + +22  + ~ + +23  + ~ + +24  + ~ + +25  + ~ + +26  + ~ + +27  + ~ + +28  + ~ + +29  + ~ + +30  + ~ + +31  + ~ + +32  + ~ + +33  + ~ + +34  + ~ + +35  + ~ + +37  + ~ + +38  + ~ + +39  + ~ + +40  + ~ + +41  + ~ + +43  + ~ + +44  + ~ + +45  + ~ + +46  + ~ + +47  + ~ + +48  + ~ + +49  + ~ + +50  + ~ + +51  + ~ + +52  + ~ + +53  + ~ + +54  + ~ + +55  + ~ + +56  + ~ + +57  + ~ + +59  + ~".h +" + +60  + ~"og.h +" + +61  + ~"wchdog.h +" + +67 #ifde +LMKD_TRACE_KILLS + + +69  + #ATRACE_TAG + +ATRACE_TAG_ALWAYS + + + ) + +70  + ~ + +72  +le +  + $a_kl_t +(cڡ * +desc +) { + +73 + `ATRACE_BEGIN +( +desc +); + +74 + } +} + +76  +le +  + $a_kl_d +() { + +77 + `ATRACE_END +(); + +78 + } +} + +82  +le +  + $a_kl_t +(cڡ *{ + } +} + +83  +le +  + $a_kl_d +({ + } +} + +87 #ide +__unud + + +88  + #__unud + + `__ibu__ +(( +__unud__ +)) + + ) + +91  + #ZONEINFO_PATH + "/oc/zefo" + + ) + +92  + #MEMINFO_PATH + "/oc/memfo" + + ) + +93  + #VMSTAT_PATH + "/oc/vm" + + ) + +94  + #PROC_STATUS_TGID_FIELD + "Tgid:" + + ) + +95  + #PROC_STATUS_RSS_FIELD + "VmRSS:" + + ) + +96  + #PROC_STATUS_SWAP_FIELD + "VmSw:" + + ) + +97  + #NODE_STATS_MARKER + "-nods" + + ) + +99  + #PERCEPTIBLE_APP_ADJ + 200 + + ) + +100  + #PREVIOUS_APP_ADJ + 700 + + ) + +103  + #KILLINFO_LOG_TAG + 10195355 + + ) + +106  + #INKERNEL_MINFREE_PATH + "/sys/modu/lowmemykr/ms/m" + + ) + +107  + #INKERNEL_ADJ_PATH + "/sys/modu/lowmemykr/ms/adj" + + ) + +109  + #EIGHT_MEGA + (1 << 23) + + ) + +111  + #TARGET_UPDATE_MIN_INTERVAL_MS + 1000 + + ) + +112  + #THRASHING_RESET_INTERVAL_MS + 1000 + + ) + +114  + #NS_PER_MS + ( +NS_PER_SEC + / +MS_PER_SEC +) + + ) + +115  + #US_PER_MS + ( +US_PER_SEC + / +MS_PER_SEC +) + + ) + +118  + #SYSTEM_ADJ + (-900) + + ) + +120  + #STRINGIFY +( +x + + `STRINGIFY_INTERNAL +(x) + + ) + +121  + #STRINGIFY_INTERNAL +( +x +#x + + ) + +123  + #PROCFS_PATH_MAX + 64 + + ) + +131  + #GET_LMK_PROPERTY +( +ty +, +me +, +def +) \ + +132 +ݔty_g_ +## + `ty +("rsi.devi_cfig.lmkd_tive." +me +, \ + +133 +ݔty_g_ +## + `ty +("ro.lmk." +me +, +def +)) + + ) + +141  + #PSI_WINDOW_SIZE_MS + 1000 + + ) + +143  + #PSI_POLL_PERIOD_SHORT_MS + 10 + + ) + +145  + #PSI_POLL_PERIOD_LONG_MS + 100 + + ) + +147  + #FAIL_REPORT_RLIMIT_MS + 1000 + + ) + +153  + #DEF_LOW_SWAP + 10 + + ) + +155  + #DEF_THRASHING_LOWRAM + 30 + + ) + +156  + #DEF_THRASHING + 100 + + ) + +158  + #DEF_THRASHING_DECAY_LOWRAM + 50 + + ) + +159  + #DEF_THRASHING_DECAY + 10 + + ) + +161  + #DEF_PARTIAL_STALL_LOWRAM + 200 + + ) + +162  + #DEF_PARTIAL_STALL + 70 + + ) + +164  + #DEF_COMPLETE_STALL + 700 + + ) + +166  + #DEF_DIRECT_RECL_THRESH_MS + 0 + + ) + +168  + #DEF_SWAP_COMP_RATIO + 1 + + ) + +170  + #DEF_LOWMEM_MIN_SCORE + ( +PREVIOUS_APP_ADJ + + 1) + + ) + +172  + #LMKD_REINIT_PROP + "lmkd." + + ) + +174  + #WATCHDOG_TIMEOUT_SEC + 2 + + ) + +177  +bo + + gu_kl_r + = +ue +; + +178  +bo + + ghas_kl_modu +; + +181 + evmessu_v + { + +182 + mVMPRESS_LEVEL_LOW + = 0, + +183 + mVMPRESS_LEVEL_MEDIUM +, + +184 + mVMPRESS_LEVEL_CRITICAL +, + +185 + mVMPRESS_LEVEL_COUNT + + +188 cڡ * + gv_me +[] = { + +195 +t64_t + + mm___ges +; + +196 +t64_t + + mmax___ges +; + +197 } + glow_essu_mem + = { -1, -1 }; + +199  + spsi_thshd + { + +200 +psi_l_ty + + ml_ty +; + +201  + mthshd_ms +; + +205  + gd +:: +unique_r +< +droid +:: +bpf +:: +memevts +:: +MemEvtLi +> +memevt_li +( +nuαr +); + +206  +timeec + + gde_aim_t_tm +; + +207  +timeec + + gkswd_t_tm +; + +209  + gv_oomadj +[ +VMPRESS_LEVEL_COUNT +]; + +210  + gmvfd +[ +VMPRESS_LEVEL_COUNT +] = { -1, -1, -1 }; + +211  +bo + + gpidfd_su܋d +; + +212  + gϡ_kl_pid__fd + = -1; + +213  +timeec + + gϡ_kl_tm +; + +214 +vmessu_v + + gev_v + = +VMPRESS_LEVEL_LOW +; + +215  +bo + + gmڙs_lized +; + +216  +bo + + gbo_comed_hdd + = +l +; + +217  +bo + + gmem_evt_upde_zefo_su܋d +; + +220  +bo + + gdebug_oss_klg +; + +221  +bo + + gab_essu_upgde +; + +222  +t64_t + + gupgde_essu +; + +223  +t64_t + + gdowngde_essu +; + +224  +bo + + glow_m_devi +; + +225  +bo + + gkl_hv_sk +; + +226  + gkl_timeout_ms +; + +227  + gessu_a_kl_m_sce +; + +228  +bo + + gu_m_vs +; + +229  +bo + + gr_p_memcg +; + +230  + gsw__low_rage +; + +231  + gpsi_l_l_ms +; + +232  + gpsi_come_l_ms +; + +233  + gthshg_lim_p +; + +234  + gthshg_lim_dey_p +; + +235  + gthshg_il_p +; + +236  + gsw_ut_max +; + +237  +t64_t + + gfeche_m_kb +; + +238  +t64_t + + gl_lim_il +; + +239  +bo + + gu_psi_mڙs + = +l +; + +240  + gkpl_fd +; + +241  +bo + + gday_mڙs_u_bo +; + +242  + gde_aim_thshd_ms +; + +243  + gsw_comessi_tio +; + +244  + glowmem_m_oom_sce +; + +245  +psi_thshd + + gpsi_thshds +[ +VMPRESS_LEVEL_COUNT +] = { + +246 { +PSI_SOME +, 70 }, + +247 { +PSI_SOME +, 100 }, + +248 { +PSI_FULL +, 70 }, + +251  +ut64_t + + gmp_evt_cou +; + +253  +droid_log_cڋxt + + gx +; + +254  +Rr + + g +; + +255  + g_comm_fd +[2]; + +257 + eplg_upde + { + +258 + mPOLLING_DO_NOT_CHANGE +, + +259 + mPOLLING_START +, + +260 + mPOLLING_PAUSE +, + +261 + mPOLLING_RESUME +, + +270  + splg_ms + { + +271  +evt_hdr_fo +* + mpl_hdr +; + +272  +evt_hdr_fo +* + mud_hdr +; + +273  +timeec + + mpl_t_tm +; + +274  +timeec + + mϡ_pl_tm +; + +275  + mplg_rv_ms +; + +276 +plg_upde + + mupde +; + +280  + sevt_hdr_fo + { + +281  + mda +; + +282 (* + mhdr +)( + mda +, +ut32_t + + mevts +,  +plg_ms + * + mpl_ms +); + +286  + ssock_evt_hdr_fo + { + +287  + msock +; + +288 +pid_t + + mpid +; + +289 +ut32_t + + masync_evt_mask +; + +290  +evt_hdr_fo + + mhdr_fo +; + +294  + #MAX_DATA_CONN + 3 + + ) + +297  +sock_evt_hdr_fo + + g_sock +; + +298  +sock_evt_hdr_fo + + gda_sock +[ +MAX_DATA_CONN +]; + +301  +evt_hdr_fo + + gvmessu_hfo +[ +VMPRESS_LEVEL_COUNT +]; + +308  + #MAX_EPOLL_EVENTS + (1 + +MAX_DATA_CONN + + +VMPRESS_LEVEL_COUNT + + 1 + 1 + 1 + 1) + + ) + +309  + glfd +; + +310  + gmaxevts +; + +313  + #OOM_SCORE_ADJ_MIN + (-1000) + + ) + +314  + #OOM_SCORE_ADJ_MAX + 1000 + + ) + +316  + gd +:: +y +<, + gMAX_TARGETS +> + glowmem_adj +; + +317  + gd +:: +y +<, + gMAX_TARGETS +> + glowmem_m +; + +318  + glowmem_rgs_size +; + +322 + ezefo_ze_fld + { + +323 + mZI_ZONE_NR_FREE_PAGES + = 0, + +324 + mZI_ZONE_MIN +, + +325 + mZI_ZONE_LOW +, + +326 + mZI_ZONE_HIGH +, + +327 + mZI_ZONE_PRESENT +, + +328 + mZI_ZONE_NR_FREE_CMA +, + +329 + mZI_ZONE_FIELD_COUNT + + +332 cڡ * cڡ + gzefo_ze_fld_mes +[ +ZI_ZONE_FIELD_COUNT +] = { + +342 + ezefo_ze_ec_fld + { + +343 + mZI_ZONE_SPEC_PROTECTION + = 0, + +344 + mZI_ZONE_SPEC_PAGESETS +, + +345 + mZI_ZONE_SPEC_FIELD_COUNT +, + +348 cڡ * cڡ + gzefo_ze_ec_fld_mes +[ +ZI_ZONE_SPEC_FIELD_COUNT +] = { + +354  + #MAX_NR_ZONES + 6 + + ) + +356  + uzefo_ze_flds + { + +358 +t64_t + + m__ges +; + +359 +t64_t + + mm +; + +360 +t64_t + + mlow +; + +361 +t64_t + + mhigh +; + +362 +t64_t + + me +; + +363 +t64_t + + m__cma +; + +364 } + mfld +; + +365 +t64_t + + mr +[ +ZI_ZONE_FIELD_COUNT +]; + +368  + szefo_ze + { + +369  +zefo_ze_flds + + mflds +; + +370 +t64_t + + mei +[ +MAX_NR_ZONES +]; + +371 +t64_t + + mmax_ei +; + +375 + ezefo_node_fld + { + +376 + mZI_NODE_NR_INACTIVE_FILE + = 0, + +377 + mZI_NODE_NR_ACTIVE_FILE +, + +378 + mZI_NODE_FIELD_COUNT + + +381 cڡ * cڡ + gzefo_node_fld_mes +[ +ZI_NODE_FIELD_COUNT +] = { + +386  + uzefo_node_flds + { + +388 +t64_t + + m_aive_fe +; + +389 +t64_t + + m_aive_fe +; + +390 } + mfld +; + +391 +t64_t + + mr +[ +ZI_NODE_FIELD_COUNT +]; + +394  + szefo_node + { + +395  + mid +; + +396  + mze_cou +; + +397  +zefo_ze + + mzes +[ +MAX_NR_ZONES +]; + +398  +zefo_node_flds + + mflds +; + +402  + #MAX_NR_NODES + 2 + + ) + +404  + szefo + { + +405  + mnode_cou +; + +406  +zefo_node + + mnodes +[ +MAX_NR_NODES +]; + +407 +t64_t + + mtٮrve_ges +; + +408 +t64_t + + mtٮ_aive_fe +; + +409 +t64_t + + mtٮ_aive_fe +; + +413 + ememfo_fld + { + +414 + mMI_NR_FREE_PAGES + = 0, + +415 + mMI_CACHED +, + +416 + mMI_SWAP_CACHED +, + +417 + mMI_BUFFERS +, + +418 + mMI_SHMEM +, + +419 + mMI_UNEVICTABLE +, + +420 + mMI_TOTAL_SWAP +, + +421 + mMI_FREE_SWAP +, + +422 + mMI_ACTIVE_ANON +, + +423 + mMI_INACTIVE_ANON +, + +424 + mMI_ACTIVE_FILE +, + +425 + mMI_INACTIVE_FILE +, + +426 + mMI_SRECLAIMABLE +, + +427 + mMI_SUNRECLAIM +, + +428 + mMI_KERNEL_STACK +, + +429 + mMI_PAGE_TABLES +, + +430 + mMI_ION_HELP +, + +431 + mMI_ION_HELP_POOL +, + +432 + mMI_CMA_FREE +, + +433 + mMI_FIELD_COUNT + + +436 cڡ * cڡ + gmemfo_fld_mes +[ +MI_FIELD_COUNT +] = { + +458  + umemfo + { + +460 +t64_t + + m__ges +; + +461 +t64_t + + mched +; + +462 +t64_t + + msw_ched +; + +463 +t64_t + + mbufrs +; + +464 +t64_t + + mshmem +; + +465 +t64_t + + muviab +; + +466 +t64_t + + mtٮ_sw +; + +467 +t64_t + + m_sw +; + +468 +t64_t + + maive_ +; + +469 +t64_t + + maive_ +; + +470 +t64_t + + maive_fe +; + +471 +t64_t + + maive_fe +; + +472 +t64_t + + meaimab +; + +473 +t64_t + + msueaimab +; + +474 +t64_t + + mkl_ack +; + +475 +t64_t + + mge_bs +; + +476 +t64_t + + mi_hp +; + +477 +t64_t + + mi_hp_po +; + +478 +t64_t + + mcma_ +; + +480 +t64_t + + m_fe_ges +; + +481 +t64_t + + mtٮ_gpu_kb +; + +482 +t64_t + + msy_avaab +; + +483 } + mfld +; + +484 +t64_t + + mr +[ +MI_FIELD_COUNT +]; + +488 + evm_fld + { + +489 + mVS_FREE_PAGES +, + +490 + mVS_INACTIVE_FILE +, + +491 + mVS_ACTIVE_FILE +, + +492 + mVS_WORKINGSET_REFAULT +, + +493 + mVS_WORKINGSET_REFAULT_FILE +, + +494 + mVS_PGSCAN_KSWAPD +, + +495 + mVS_PGSCAN_DIRECT +, + +496 + mVS_PGSCAN_DIRECT_THROTTLE +, + +497 + mVS_PGREFILL +, + +498 + mVS_FIELD_COUNT + + +501 cڡ * cڡ + gvm_fld_mes +[ +VS_FIELD_COUNT +] = { + +513  + uvm + { + +515 +t64_t + + m__ges +; + +516 +t64_t + + m_aive_fe +; + +517 +t64_t + + m_aive_fe +; + +518 +t64_t + + mwkgt_u +; + +519 +t64_t + + mwkgt_u_fe +; + +520 +t64_t + + mpgsn_kswd +; + +521 +t64_t + + mpgsn_de +; + +522 +t64_t + + mpgsn_de_thrَe +; + +523 +t64_t + + mpgfl +; + +524 } + mfld +; + +525 +t64_t + + mr +[ +VS_FIELD_COUNT +]; + +528 + efld_mch_su + { + +529 + mNO_MATCH +, + +530 + mPARSE_FAIL +, + +531 + mPARSE_SUCCESS + + +534  + sadj_li + { + +535  +adj_li + * + mxt +; + +536  +adj_li + * + mev +; + +539  + soc + { + +540  +adj_li + + ma +; + +541  + mpid +; + +542  + mpidfd +; + +543 +uid_t + + muid +; + +544  + moomadj +; + +545 +pid_t + + mg_pid +; + +546 +bo + + mvid +; + +547  +oc + * + mpidhash_xt +; + +550  + sad_da + { + +551 cڡ * cڡ + mfame +; + +552  + mfd +; + +555  + #PIDHASH_SZ + 1024 + + ) + +556  +oc + * + gpidhash +[ +PIDHASH_SZ +]; + +557  + #pid_hash +( +x +((((x>> 8^ (x)& ( +PIDHASH_SZ + - 1)) + + ) + +559  + #ADJTOSLOT +( +adj +(dj+ - +OOM_SCORE_ADJ_MIN +) + + ) + +560  + #ADJTOSLOT_COUNT + ( + `ADJTOSLOT +( +OOM_SCORE_ADJ_MAX ++ 1) + + ) + +563  + gd +:: +shed_mux + +adj_li_lock +; + +566  +adj_li + + godj_li +[ +ADJTOSLOT_COUNT +]; + +568  + #MAX_DISTINCT_OOM_ADJ + 32 + + ) + +569  + #KILLCNT_INVALID_IDX + 0xFF + + ) + +575  +ut8_t + + gklt_idx +[ +ADJTOSLOT_COUNT +]; + +576  +ut16_t + + gklt +[ +MAX_DISTINCT_OOM_ADJ +]; + +577  + gklt__idx + = 0; + +578  +ut32_t + + gklt_tٮ + = 0; + +580  + ggesize +; + +581  + gge_k +; + +583  +bo + +upde_s +(); + +584  +bo + +_mڙs +(); + +585  +deroy_mڙs +(); + +586  +bo + +_memevt_li_mڙܚg +(); + +588  + $amp +( +low +,  +high +,  +vue +) { + +589  +d +:: + `max +(d:: + `m +( +vue +, +high +), +low +); + +590 + } +} + +592  +bo + + $r_t64 +(cڡ * +r +, +t64_t +* +t +) { + +593 * +dr +; + +594  +v + = + `l +( +r +, & +dr +, 10); + +595 i( +r + = +dr + || +v + > +INT64_MAX +) { + +596  +l +; + +598 * +t + = ( +t64_t +) +v +; + +599  +ue +; + +600 + } +} + +602  + $fd_fld +(cڡ * +me +, cڡ * cڡ +fld_mes +[],  +fld_cou +) { + +603  +i + = 0; i < +fld_cou +; i++) { + +604 i(! + `rcmp +( +me +, +fld_mes +[ +i +])) { + +605  +i +; + +609 + } +} + +611  +fld_mch_su + + $mch_fld +(cڡ * + +, cڡ * + +, + +612 cڡ * cڡ +fld_mes +[], + +613  +fld_cou +, +t64_t +* +fld +, + +614 * +fld_idx +) { + +615  +i + = + `fd_fld +( + +, +fld_mes +, +fld_cou +); + +616 i( +i + < 0) { + +617  +NO_MATCH +; + +619 * +fld_idx + = +i +; + +620  + `r_t64 +( + +, +fld +? +PARSE_SUCCESS + : +PARSE_FAIL +; + +621 + } +} + +627  +ssize_t + + $ad_l +( +fd +, * +buf +, +size_t + +max_n +) + +629 +ssize_t + +t + = 0; + +630 +off_t + +offt + = 0; + +632  +max_n + > 0) { + +633 +ssize_t + +r + = + `TEMP_FAILURE_RETRY +( + `d +( +fd +, +buf +, +max_n +, +offt +)); + +634 i( +r + == 0) { + +637 i( +r + == -1) { + +640 +t + + +r +; + +641 +buf + + +r +; + +642 +offt + + +r +; + +643 +max_n + - +r +; + +646  +t +; + +647 + } +} + +656 * + $ad_fe +( +ad_da + * +da +) { + +658  +ssize_t + +buf_size + = +gesize +; + +659 * +w_buf +, * +buf + = +NULL +; + +660 +ssize_t + +size +; + +662 i( +da +-> +fd + == -1) { + +664 i(! +buf + && (bu +ic_ +<*>( + `mloc +( +buf_size +))= +nuαr +) { + +665  +NULL +; + +668 +da +-> +fd + = + `TEMP_FAILURE_RETRY +( + `ݒ +(da-> +fame +, +O_RDONLY + | +O_CLOEXEC +)); + +669 i( +da +-> +fd + < 0) { + +670 + `ALOGE +("%ݒ: %s", +da +-> +fame +, + ` +( +o +)); + +671  +NULL +; + +675  +ue +) { + +676 +size + = + `ad_l +( +da +-> +fd +, +buf +, +buf_size + - 1); + +677 i( +size + < 0) { + +678 + `ALOGE +("%ad: %s", +da +-> +fame +, + ` +( +o +)); + +679 + `o +( +da +-> +fd +); + +680 +da +-> +fd + = -1; + +681  +NULL +; + +683 i( +size + < +buf_size + - 1) { + +690 i(( +w_buf + = +ic_ +<*>( + `loc +( +buf +, +buf_size + * 2))= +nuαr +) { + +691 +o + = +ENOMEM +; + +692  +NULL +; + +694 +buf + = +w_buf +; + +695 +buf_size + *= 2; + +697 +buf +[ +size +] = 0; + +699  +buf +; + +700 + } +} + +702  +bo + + $aim_cd +( +oc +* +o +, +pid_t + +pid +) { + +703 i( +o +-> +g_pid + = +pid +) { + +705  +ue +; + +707 i( +o +-> +g_pid + == 0) { + +709 +o +-> +g_pid + = +pid +; + +710  +ue +; + +713  +l +; + +714 + } +} + +716  + $move_aims +( +pid_t + +pid +) { + +717  +i +; + +719  +i + = 0; i < +PIDHASH_SZ +; i++) { + +720  +oc +* +o + = +pidhash +[ +i +]; + +721  +o +) { + +722 i( +o +-> +g_pid + = +pid +) { + +723 +o +-> +g_pid + = 0; + +725 +o + =ro-> +pidhash_xt +; + +728 + } +} + +730  + $_da_o +( +dsock_idx +) { + +731  +l_evt + +ev +; + +733 + `ALOGI +("closingmkd data connection"); + +734 i( + `l_l +( +lfd +, +EPOLL_CTL_DEL +, +da_sock +[ +dsock_idx +]. +sock +, & +ev +) == -1) { + +736 + `ALOGW +("l_f dci sock faed;no=%d", +o +); + +738 +maxevts +--; + +740 + `o +( +da_sock +[ +dsock_idx +]. +sock +); + +741 +da_sock +[ +dsock_idx +]. +sock + = -1; + +744 + `move_aims +( +da_sock +[ +dsock_idx +]. +pid +); + +745 + } +} + +747  +ssize_t + + $_da_ad +( +dsock_idx +, * +buf +, +size_t + +bufsz +,  +ued +* +nd_ed +) { + +748  +iovec + +iov + = { +buf +, +bufsz +}; + +749  +cڌ +[ + `CMSG_SPACE +(( +ued +))]; + +750  +msghdr + +hdr + = { + +751 +NULL +, 0, & +iov +, 1, +cڌ +, (control), 0, + +753 +ssize_t + +t +; + +754 +t + = + `TEMP_FAILURE_RETRY +( + `cvmsg +( +da_sock +[ +dsock_idx +]. +sock +, & +hdr +, 0)); + +755 i( +t + == -1) { + +756 + `ALOGE +("cڌ dsockd faed; %s", + ` +( +o +)); + +759 i( +t + == 0) { + +760 + `ALOGE +("Got EOF on control data socket"); + +764  +ued +* +ed + = +NULL +; + +765  +cmsghdr +* +cmsg + = + `CMSG_FIRSTHDR +(& +hdr +); + +766  +cmsg + ! +NULL +) { + +767 i( +cmsg +-> +cmsg_v + = +SOL_SOCKET + && cmsg-> +cmsg_ty + = +SCM_CREDENTIALS +) { + +768 +ed + = ( +ued +*) + `CMSG_DATA +( +cmsg +); + +771 +cmsg + = + `CMSG_NXTHDR +(& +hdr +, cmsg); + +774 i( +ed + = +NULL +) { + +775 + `ALOGE +("Failedoetrieve sender credentials"); + +777 + `_da_o +( +dsock_idx +); + +781 + `memy +( +nd_ed +, +ed +, ( +ued +)); + +784 +da_sock +[ +dsock_idx +]. +pid + = +ed +->pid; + +786  +t +; + +787 + } +} + +789  + $_da_wre +( +dsock_idx +, * +buf +, +size_t + +bufsz +) { + +790  +t + = 0; + +792 +t + = + `TEMP_FAILURE_RETRY +( + `wre +( +da_sock +[ +dsock_idx +]. +sock +, +buf +, +bufsz +)); + +794 i( +t + == -1) { + +795 + `ALOGE +("cڌ dsock wred;no=%d", +o +); + +796 } i( +t + == 0) { + +797 + `ALOGE +("Got EOF on control data socket"); + +798 +t + = -1; + +801  +t +; + +802 + } +} + +808  + $_da_wre_lmk_kl_occued +( +pid_t + +pid +, +uid_t + +uid +, +t64_t + +rss_kb +) { + +809 +LMKD_CTRL_PACKET + +ck +; + +810 +size_t + +n + = + `lmkd_ck_t_ockls +( +ck +, +pid +, +uid +, +ic_ +<>( +rss_kb +)); + +812  +i + = 0; i < +MAX_DATA_CONN +; i++) { + +813 i( +da_sock +[ +i +]. +sock + >0 && da_sock[i]. +async_evt_mask + & 1 << +LMK_ASYNC_EVENT_KILL +) { + +814 + `_da_wre +( +i +, (*) +ck +, +n +); + +817 + } +} + +822  + $s_wre_lmk_kl_occued +( +kl_ + * +kl_ +, + +823  +memy_ + * +mem_ +) { + +824 +LMK_KILL_OCCURRED_PACKET + +ck +; + +825 cڡ +size_t + +n + = + `lmkd_ck_t_kl_occued +( +ck +, +kl_ +, +mem_ +); + +826 i( +n + == 0) { + +830  +i + = 0; i < +MAX_DATA_CONN +; i++) { + +831 i( +da_sock +[ +i +]. +sock + >0 && da_sock[i]. +async_evt_mask + & 1 << +LMK_ASYNC_EVENT_STAT +) { + +832 + `_da_wre +( +i +, +ck +, +n +); + +836 + } +} + +838  + $s_wre_lmk_kl_occued_pid +( +pid +,  +kl_ + * +kl_ +, + +839  +memy_ + * +mem_ +) { + +840 +kl_ +-> +skme + = + `s_g_sk_me +( +pid +); + +841 i( +kl_ +-> +skme + ! +NULL +) { + +842 + `s_wre_lmk_kl_occued +( +kl_ +, +mem_ +); + +844 + } +} + +846  + $pl_kl +( +pl_fd +) { + +847 i( +pl_fd + == -1) { + +853  +rd_buf +[256]; + +854  +bys_ad + = + `TEMP_FAILURE_RETRY +( + `d +( +pl_fd +, (*) +rd_buf +, (rd_buf) - 1, 0)); + +855 i( +bys_ad + <= 0) ; + +856 +rd_buf +[ +bys_ad +] = '\0'; + +858 +t64_t + +pid +; + +859 +t64_t + +uid +; + +860 +t64_t + +group_ad_pid +; + +861 +t64_t + +rss__ges +; + +862  +memy_ + +mem_ + = {}; + +863 +t16_t + +oom_sce_adj +; + +864 +t16_t + +m_sce_adj +; + +865 +t64_t + +ime +; + +866 * +skme + = 0; + +867 +t64_t + +rss_kb +; + +869  +flds_ad + = + +870 + `ssnf +( +rd_buf +, + +871 "%" +SCNd64 + " %" SCNd64 " %" SCNd64 " %" SCNd64 " %" SCNd64 " %" SCNd64 + +872 " %" +SCNd16 + " %" SCNd16 " %" +SCNd64 + "\n%m[^\n]", + +873 & +pid +, & +uid +, & +group_ad_pid +, & +mem_ +. +pgu +, &mem_. +pgmaju +, + +874 & +rss__ges +, & +oom_sce_adj +, & +m_sce_adj +, & +ime +, & +skme +); + +877 i( +flds_ad + =10 && +group_ad_pid + = +pid +) { + +878 +mem_ +. +rss__bys + = +rss__ges + * +gesize +; + +879 +rss_kb + = +mem_ +. +rss__bys + >> 10; + +880 + `_da_wre_lmk_kl_occued +(( +pid_t +) +pid +, ( +uid_t +) +uid +, +rss_kb +); + +881 +mem_ +. +oss_t_time_ns + = +ime + * ( +NS_PER_SEC + / + `syscf +( +_SC_CLK_TCK +)); + +883  +kl_ + +kl_ + = { + +884 . +uid + = +ic_ +< +t32_t +>(uid), + +885 . +kl_as + = +NONE +, + +886 . +oom_sce + = +oom_sce_adj +, + +887 . +m_oom_sce + = +m_sce_adj +, + +888 . +_mem_kb + = 0, + +889 . +_sw_kb + = 0, + +891 + `s_wre_lmk_kl_occued_pid +( +pid +, & +kl_ +, & +mem_ +); + +894 + ` +( +skme +); + +896 + } +} + +898  +bo + + $_pl_kl +() { + +899 +kpl_fd + = + `TEMP_FAILURE_RETRY +( + `ݒ +("/oc/lowmemykr", +O_RDONLY + | +O_NONBLOCK + | +O_CLOEXEC +)); + +901 i( +kpl_fd + < 0) { + +902 + `ALOGE +("klmkvfcould bݒed;no=%d", +o +); + +903  +l +; + +906  +ue +; + +907 + } +} + +909  +oc + * + $pid_lookup +( +pid +) { + +910  +oc + * +o +; + +912  +o + = +pidhash +[ + `pid_hash +( +pid +)];rocp &&rocp->pid !=id; + +913 +o + =ro-> +pidhash_xt +) + +916  +o +; + +917 + } +} + +919  + $adj_ +( +adj_li + * +hd +, adj_li * +w_emt +) + +921  +adj_li + * +xt + = +hd +->next; + +922 +w_emt +-> +ev + = +hd +; + +923 +w_emt +-> +xt + =ext; + +924 +xt +-> +ev + = +w_emt +; + +925 +hd +-> +xt + = +w_emt +; + +926 + } +} + +928  + $adj_move +( +adj_li + * +d +) + +930  +adj_li + * +ev + = +d +->prev; + +931  +adj_li + * +xt + = +d +->next; + +932 +xt +-> +ev + =rev; + +933 +ev +-> +xt + =ext; + +934 + } +} + +936  +adj_li + * + $adj_ +( +adj_li + * +hd +) { + +937  +adj_li + * +a + = +hd +-> +ev +; + +939  +a + = +hd + ? +NULL + :sl; + +940 + } +} + +943  + $oc_ +( +oc + * +o +) { + +944  +adj + = + `ADJTOSLOT +( +o +-> +oomadj +); + +945 +d +:: +sced_lock + + `lock +( +adj_li_lock +); + +947 + `adj_ +(& +odj_li +[ +adj +], & +o +-> +a +); + +948 + } +} + +951  + $oc_un +( +oc + * +o +) { + +952 +d +:: +sced_lock + + `lock +( +adj_li_lock +); + +954 + `adj_move +(& +o +-> +a +); + +955 + } +} + +957  + $oc_ +( +oc + * +o +) { + +958  +hv + = + `pid_hash +( +o +-> +pid +); + +960 +o +-> +pidhash_xt + = +pidhash +[ +hv +]; + +961 +pidhash +[ +hv +] = +o +; + +962 + `oc_ +( +o +); + +963 + } +} + +966  + $pid_move +( +pid +) { + +967  +hv + = + `pid_hash +( +pid +); + +968  +oc + * +o +; + +969  +oc + * +evp +; + +971  +o + = +pidhash +[ +hv +], +evp + = +NULL +;ro &&ro-> +pid + !=id; + +972 +o + =ro-> +pidhash_xt +) + +973 +evp + = +o +; + +975 i(! +o +) + +978 i(! +evp +) + +979 +pidhash +[ +hv +] = +o +-> +pidhash_xt +; + +981 +evp +-> +pidhash_xt + = +o +->pidhash_next; + +983 + `oc_un +( +o +); + +988 i( +o +-> +pidfd + >0 &&ro->pidfd ! +ϡ_kl_pid__fd +) { + +989 + `o +( +o +-> +pidfd +); + +991 + ` +( +o +); + +993 + } +} + +995  + $pid_vide +( +pid +) { + +996 +d +:: +shed_lock + + `lock +( +adj_li_lock +); + +997  +oc + * +o + = + `pid_lookup +( +pid +); + +999 i( +o +) { + +1000 +o +-> +vid + = +l +; + +1002 + } +} + +1008  +bo + + $wreferg +(cڡ * +th +, cڡ * +s +, + +1009 +bo + +r_if_missg +) { + +1010  +fd + = + `ݒ +( +th +, +O_WRONLY + | +O_CLOEXEC +); + +1011 +ssize_t + +n + = + ` +( +s +); + +1012 +ssize_t + +t +; + +1014 i( +fd + < 0) { + +1015 i( +r_if_missg +) { + +1016 + `ALOGE +("E ong %s;no=%d", +th +, +o +); + +1018  +l +; + +1021 +t + = + `TEMP_FAILURE_RETRY +( + `wre +( +fd +, +s +, +n +)); + +1022 i( +t + < 0) { + +1023 + `ALOGE +("E wrg %s;no=%d", +th +, +o +); + +1024 } i( +t + < +n +) { + +1025 + `ALOGE +("Sh܈wr %s;gth=%zd", +th +, +t +); + +1028 + `o +( +fd +); + +1029  +ue +; + +1030 + } +} + +1032  +le +  + $g_time_diff_ms +( +timeec + * +om +, + +1033  +timeec + * +to +) { + +1034  ( +to +-> +tv_c + - +om +->tv_c* () +MS_PER_SEC + + + +1035 ( +to +-> +tv_nc + - +om +->tv_nc/ () +NS_PER_MS +; + +1036 + } +} + +1039  +bo + + $ad_oc_us +( +pid +, * +buf +, +size_t + +buf_sz +) { + +1040  +th +[ +PROCFS_PATH_MAX +]; + +1041  +fd +; + +1042 +ssize_t + +size +; + +1044 + `tf +( +th +, +PROCFS_PATH_MAX +, "/oc/%d/us", +pid +); + +1045 +fd + = + `ݒ +( +th +, +O_RDONLY + | +O_CLOEXEC +); + +1046 i( +fd + < 0) { + +1047  +l +; + +1050 +size + = + `ad_l +( +fd +, +buf +, +buf_sz + - 1); + +1051 + `o +( +fd +); + +1052 i( +size + <= 0) { + +1053  +l +; + +1055 +buf +[ +size +] = 0; + +1056  +ue +; + +1057 + } +} + +1060  +bo + + $r_us_g +(* +buf +, cڡ * +g +, +t64_t + * +out +) { + +1061 * +pos + = +buf +; + +1062  +ue +) { + +1063 +pos + = + `rr +os, +g +); + +1065 i( +pos + = +NULL + ||o= +buf + ||os[-1] == '\n') { + +1068 +pos +++; + +1071 i( +pos + = +NULL +) { + +1072  +l +; + +1075 +pos + + + ` +( +g +); + +1076 * +pos + == ' ') ++pos; + +1077  + `r_t64 +( +pos +, +out +); + +1078 + } +} + +1080  + $oc_g_size +( +pid +) { + +1081  +th +[ +PROCFS_PATH_MAX +]; + +1082  +le +[ +LINE_MAX +]; + +1083  +fd +; + +1084  +rss + = 0; + +1085  +tٮ +; + +1086 +ssize_t + +t +; + +1089 + `tf +( +th +, +PROCFS_PATH_MAX +, "/oc/%d/m", +pid +); + +1090 +fd + = + `ݒ +( +th +, +O_RDONLY + | +O_CLOEXEC +); + +1091 i( +fd + == -1) + +1094 +t + = + `ad_l +( +fd +, +le +, (line) - 1); + +1095 i( +t + < 0) { + +1096 + `o +( +fd +); + +1099 +le +[ +t +] = '\0'; + +1101 + `ssnf +( +le +, "%d %d ", & +tٮ +, & +rss +); + +1102 + `o +( +fd +); + +1103  +rss +; + +1104 + } +} + +1106 * + $oc_g_me +( +pid +, * +buf +, +size_t + +buf_size +) { + +1107  +th +[ +PROCFS_PATH_MAX +]; + +1108  +fd +; + +1109 * + +; + +1110 +ssize_t + +t +; + +1113 + `tf +( +th +, +PROCFS_PATH_MAX +, "/oc/%d/cmdle", +pid +); + +1114 +fd + = + `ݒ +( +th +, +O_RDONLY + | +O_CLOEXEC +); + +1115 i( +fd + == -1) { + +1116  +NULL +; + +1118 +t + = + `ad_l +( +fd +, +buf +, +buf_size + - 1); + +1119 + `o +( +fd +); + +1120 i( +t + <= 0) { + +1121  +NULL +; + +1123 +buf +[ +t +] = '\0'; + +1125 + + = + `rchr +( +buf +, ' '); + +1126 i( + +) { + +1127 * + + = '\0'; + +1130  +buf +; + +1131 + } +} + +1133  + $gi_oom_adj_oc +(cڡ  +lmk_orio +& +oc +,  +ued +* +ed +) { + +1134  +v +[20]; + +1135  +so_lim_mu +; + +1136 +bo + +is_syem_rv +; + +1137  +sswd + * +pwdc +; + +1138  +oc +* +o +; + +1139  +oom_adj_sce + = +oc +. +oomadj +; + +1142 i( +oc +. +y + = +PROC_TYPE_APP + && +r_p_memcg +) { + +1143 i( +oc +. +oomadj + >= 900) { + +1144 +so_lim_mu + = 0; + +1145 } i( +oc +. +oomadj + >= 800) { + +1146 +so_lim_mu + = 0; + +1147 } i( +oc +. +oomadj + >= 700) { + +1148 +so_lim_mu + = 0; + +1149 } i( +oc +. +oomadj + >= 600) { + +1151 +oom_adj_sce + = 200; + +1152 +so_lim_mu + = 1; + +1153 } i( +oc +. +oomadj + >= 500) { + +1154 +so_lim_mu + = 0; + +1155 } i( +oc +. +oomadj + >= 400) { + +1156 +so_lim_mu + = 0; + +1157 } i( +oc +. +oomadj + >= 300) { + +1158 +so_lim_mu + = 1; + +1159 } i( +oc +. +oomadj + >= 200) { + +1160 +so_lim_mu + = 8; + +1161 } i( +oc +. +oomadj + >= 100) { + +1162 +so_lim_mu + = 10; + +1163 } i( +oc +. +oomadj + >= 0) { + +1164 +so_lim_mu + = 20; + +1168 +so_lim_mu + = 64; + +1171 +d +:: +rg + +so_lim_th +; + +1172 i(! + `CgroupGAribuPhFTask +("MemSoLim", +oc +. +pid +, & +so_lim_th +)) { + +1173 + `ALOGE +("Querying MemSoftLimitath failed"); + +1177 + `tf +( +v +, (v), "%d", +so_lim_mu + * +EIGHT_MEGA +); + +1183 +is_syem_rv + = ( +oom_adj_sce + = +SYSTEM_ADJ + && ( +pwdc + = + `gpwm +("syem")! +NULL + && + +1184 +oc +. +uid + = +pwdc +-> +pw_uid +); + +1185 + `wreferg +( +so_lim_th +. + `c_r +(), +v +, ! +is_syem_rv +); + +1188 +o + = + `pid_lookup +( +oc +. +pid +); + +1189 i(! +o +) { + +1190  +pidfd + = -1; + +1192 i( +pidfd_su܋d +) { + +1193 +pidfd + = + `TEMP_FAILURE_RETRY +( + `pidfd_ݒ +( +oc +. +pid +, 0)); + +1194 i( +pidfd + < 0) { + +1195 + `ALOGE +("pidfd_ݒ f܅id %d faed;no=%d", +oc +. +pid +, +o +); + +1200 +o + = +ic_ +< +oc +*>( + `oc +(1, (proc))); + +1201 i(! +o +) { + +1206 +o +-> +pid + = +oc +.pid; + +1207 +o +-> +pidfd + =idfd; + +1208 +o +-> +uid + = +oc +.uid; + +1209 +o +-> +g_pid + = +ed +-> +pid +; + +1210 +o +-> +oomadj + = +oom_adj_sce +; + +1211 +o +-> +vid + = +ue +; + +1212 + `oc_ +( +o +); + +1214 i(! + `aim_cd +( +o +, +ed +-> +pid +)) { + +1215  +buf +[ +LINE_MAX +]; + +1216 * +skme + = + `oc_g_me +( +ed +-> +pid +, +buf +, (buf)); + +1218 + `ALOGE +("%s (%d, %d)ttemptso modifyrocessegistered bynother client", + +1219 +skme + ?askm: "Aros", +ed +-> +uid +, cd-> +pid +); + +1222 + `oc_un +( +o +); + +1223 +o +-> +oomadj + = +oom_adj_sce +; + +1224 + `oc_ +( +o +); + +1226 + } +} + +1228  + $y_oc_io +(cڡ  +lmk_orio +& +ms +,  +ued +* +ed +) { + +1229  +th +[ +PROCFS_PATH_MAX +]; + +1230  +v +[20]; + +1231 +t64_t + +tgid +; + +1232  +buf +[ +gesize +]; + +1234 i( +ms +. +oomadj + < +OOM_SCORE_ADJ_MIN + ||ams.oomadj > +OOM_SCORE_ADJ_MAX +) { + +1235 + `ALOGE +("Invid PROCPRIO oomadjrgum%d", +ms +. +oomadj +); + +1239 i( +ms +. +y + < +PROC_TYPE_FIRST + ||ams.y > +PROC_TYPE_COUNT +) { + +1240 + `ALOGE +("Invid PROCPRIOrostyrgum%d", +ms +. +y +); + +1245 i( + `ad_oc_us +( +ms +. +pid +, +buf +, (buf))) { + +1246 i( + `r_us_g +( +buf +, +PROC_STATUS_TGID_FIELD +, & +tgid +&&gid ! +ms +. +pid +) { + +1247 + `ALOGE +("Attemptoegisteraskhat isothread groupeader " + +1248 "id %d,gid %" +PRId64 + ")", + +1249 +ms +. +pid +, +tgid +); + +1257 + `tf +( +th +, թh), "/oc/%d/oom_sce_adj", +ms +. +pid +); + +1258 + `tf +( +v +, (v), "%d", +ms +. +oomadj +); + +1259 i(! + `wreferg +( +th +, +v +, +l +)) { + +1260 + `ALOGW +("Faedݒ %s;no=%d:ros%d mighhavbkd", +th +, +o +, + +1261 +ms +. +pid +); + +1266 i( +u_kl_r +) { + +1267 + `s_e_skme +( +ms +. +pid +, + `oc_g_me +լams.pid, +th +, (path))); + +1271 + `gi_oom_adj_oc +( +ms +, +ed +); + +1272 + } +} + +1274  + $cmd_orio +( +LMKD_CTRL_PACKET + +ck +,  +fld_cou +,  +ued +* +ed +) { + +1275  +lmk_orio + +oc_io +; + +1277 + `lmkd_ck_g_orio +( +ck +, +fld_cou +, & +oc_io +); + +1278 + `y_oc_io +( +oc_io +, +ed +); + +1279 + } +} + +1281  + $cmd_oemove +( +LMKD_CTRL_PACKET + +ck +,  +ued + * +ed +) { + +1282  +lmk_oemove + +ms +; + +1283  +oc + * +o +; + +1285 + `lmkd_ck_g_oemove +( +ck +, & +ms +); + +1287 i( +u_kl_r +) { + +1294 + `pl_kl +( +kpl_fd +); + +1296 + `s_move_skme +( +ms +. +pid +); + +1300 +o + = + `pid_lookup +( +ms +. +pid +); + +1301 i(! +o +) { + +1305 i(! + `aim_cd +( +o +, +ed +-> +pid +)) { + +1306  +buf +[ +LINE_MAX +]; + +1307 * +skme + = + `oc_g_me +( +ed +-> +pid +, +buf +, (buf)); + +1309 + `ALOGE +("%s (%d, %d)ttemptso unregisterrocessegistered bynother client", + +1310 +skme + ?askm: "Aros", +ed +-> +uid +, cd-> +pid +); + +1318 + `pid_move +( +ms +. +pid +); + +1319 + } +} + +1321  + $cmd_ourge +( +ued + * +ed +) { + +1322  +i +; + +1323  +oc + * +o +; + +1324  +oc + * +xt +; + +1326 i( +u_kl_r +) { + +1327 + `s_purge_skmes +(); + +1331  +i + = 0; i < +PIDHASH_SZ +; i++) { + +1332 +o + = +pidhash +[ +i +]; + +1333  +o +) { + +1334 +xt + = +o +-> +pidhash_xt +; + +1336 i( + `aim_cd +( +o +, +ed +-> +pid +)) { + +1337 + `pid_move +( +o +-> +pid +); + +1339 +o + = +xt +; + +1342 + } +} + +1344  + $cmd_subsibe +( +dsock_idx +, +LMKD_CTRL_PACKET + +ck +) { + +1345  +lmk_subsibe + +ms +; + +1347 + `lmkd_ck_g_subsibe +( +ck +, & +ms +); + +1348 +da_sock +[ +dsock_idx +]. +async_evt_mask + |1 << +ms +. +evt_ty +; + +1349 + } +} + +1351  + $c_klt +( +oomadj +) { + +1352  + + = + `ADJTOSLOT +( +oomadj +); + +1353 +ut8_t + +idx + = +klt_idx +[ + +]; + +1355 i( +idx + = +KILLCNT_INVALID_IDX +) { + +1357 i( +klt__idx + < +MAX_DISTINCT_OOM_ADJ +) { + +1358 +klt_idx +[ + +] = +klt__idx +; + +1359 +klt +[ +klt__idx +] = 1; + +1360 +klt__idx +++; + +1362 + `ALOGW +("Number of distinct oomadjevelsxceeds %d", + +1363 +MAX_DISTINCT_OOM_ADJ +); + +1370 +klt +[ +idx +]++; + +1373 +klt_tٮ +++; + +1374 + } +} + +1376  + $g_klt +( +m_oomadj +,  +max_oomadj +) { + +1377  + +; + +1378  +cou + = 0; + +1380 i( +m_oomadj + > +max_oomadj +) + +1384 i( +m_oomadj + > +OOM_SCORE_ADJ_MAX +) + +1385  +klt_tٮ +; + +1387  +m_oomadj + < +max_oomadj + && + +1388 ( + + = + `ADJTOSLOT +( +m_oomadj +)< +ADJTOSLOT_COUNT +) { + +1389 +ut8_t + +idx + = +klt_idx +[ + +]; + +1390 i( +idx + ! +KILLCNT_INVALID_IDX +) { + +1391 +cou + + +klt +[ +idx +]; + +1393 +m_oomadj +++; + +1396  +cou +; + +1397 + } +} + +1399  + $cmd_gklt +( +LMKD_CTRL_PACKET + +ck +) { + +1400  +lmk_gklt + +ms +; + +1402 i( +u_kl_r +) { + +1407 + `lmkd_ck_g_gklt +( +ck +, & +ms +); + +1409  + `g_klt +( +ms +. +m_oomadj +,ams. +max_oomadj +); + +1410 + } +} + +1412  + $cmd_rg +( +gs +, +LMKD_CTRL_PACKET + +ck +) { + +1413  +i +; + +1414  +lmk_rg + +rg +; + +1415  +m_r +[ +PROPERTY_VALUE_MAX +]; + +1416 * +pr + = +m_r +; + +1417 * +nd + = +m_r + + (minfree_str); + +1418  +timeec + +ϡ_q_tm +; + +1419  +timeec + +cu_tm +; + +1421 i( +gs + < 1 ||rg> () +lowmem_adj +. + `size +()) { + +1429 i( + `ock_gtime +( +CLOCK_MONOTONIC_COARSE +, & +cu_tm +) != 0) { + +1430 + `ALOGE +("Failedo get currentime"); + +1434 i( + `g_time_diff_ms +(& +ϡ_q_tm +, & +cu_tm +) < + +1435 +TARGET_UPDATE_MIN_INTERVAL_MS +) { + +1436 + `ALOGE +("Ignoring frequent updatedomkdimits"); + +1440 +ϡ_q_tm + = +cu_tm +; + +1442  +i + = 0; i < +gs +; i++) { + +1443 + `lmkd_ck_g_rg +( +ck +, +i +, & +rg +); + +1444 +lowmem_m +[ +i +] = +rg +. +m +; + +1445 +lowmem_adj +[ +i +] = +rg +. +oom_adj_sce +; + +1447 +pr + + + `tf +աr, +nd + -r, "%d:%d,", +rg +. +m +, + +1448 +rg +. +oom_adj_sce +); + +1449 i( +pr + > +nd +) { + +1451 +pr + = +nd +; + +1456 +lowmem_rgs_size + = +gs +; + +1459 +pr +[-1] = '\0'; + +1460 + `ݔty_t +("sys.lmk.m_vs", +m_r +); + +1462 i( +has_kl_modu +) { + +1463  +m䓡r +[128]; + +1464  +krior +[128]; + +1466 +m䓡r +[0] = '\0'; + +1467 +krior +[0] = '\0'; + +1469  +i + = 0; i < +lowmem_rgs_size +; i++) { + +1470  +v +[40]; + +1472 i( +i +) { + +1473 + `t +( +m䓡r +, ",", (minfreestr)); + +1474 + `t +( +krior +, ",", (killpriostr)); + +1477 + `tf +( +v +, (v), "%d", +u_kl_r + ? +lowmem_m +[ +i +] : 0); + +1478 + `t +( +m䓡r +, +v +, (minfreestr)); + +1479 + `tf +( +v +, (v), "%d", +u_kl_r + ? +lowmem_adj +[ +i +] : 0); + +1480 + `t +( +krior +, +v +, (killpriostr)); + +1483 + `wreferg +( +INKERNEL_MINFREE_PATH +, +m䓡r +, +ue +); + +1484 + `wreferg +( +INKERNEL_ADJ_PATH +, +krior +, +ue +); + +1486 + } +} + +1488  + $cmd_ocs_io +( +LMKD_CTRL_PACKET + +ck +, cڡ  +fld_cou +,  +ued +* +ed +) { + +1489  +lmk_ocs_io + +ms +; + +1491 cڡ  +ocs_cou + = + `lmkd_ck_g_ocs_io +( +ck +, & +ms +, +fld_cou +); + +1492 i( +ocs_cou + < 0) { + +1493 + `ALOGE +("LMK_PROCS_PRIOeceived invalidacket format"); + +1497  +i + = 0; i < +ocs_cou +; i++) { + +1498 + `y_oc_io +( +ms +. +ocs +[ +i +], +ed +); + +1500 + } +} + +1502  + $_commd_hdr +( +dsock_idx +) { + +1503 +LMKD_CTRL_PACKET + +ck +; + +1504  +ued + +ed +; + +1505  +n +; + +1506 +lmk_cmd + +cmd +; + +1507  +rgs +; + +1508  +rgs +; + +1509  +kl_t +; + +1510  +su +; + +1512 +n + = + `_da_ad +( +dsock_idx +, (*) +ck +, +CTRL_PACKET_MAX_SIZE +, & +ed +); + +1513 i( +n + <= 0) + +1516 i( +n + < ()()) { + +1517 + `ALOGE +("Wrg cڌ sockdgth=%d", +n +); + +1521 +cmd + = + `lmkd_ck_g_cmd +( +ck +); + +1522 +rgs + = +n + / () - 1; + +1523 i( +rgs + < 0) + +1524  +wrgn +; + +1526  +cmd +) { + +1527  +LMK_TARGET +: + +1528 +rgs + = +rgs + / 2; + +1529 i( +rgs + & 0x1 || +rgs + > () +lowmem_adj +. + `size +()) { + +1530  +wrgn +; + +1532 + `cmd_rg +( +rgs +, +ck +); + +1534  +LMK_PROCPRIO +: + +1536 i( +rgs + < 3 ||args > 4) + +1537  +wrgn +; + +1538 + `cmd_orio +( +ck +, +rgs +, & +ed +); + +1540  +LMK_PROCREMOVE +: + +1541 i( +rgs + != 1) + +1542  +wrgn +; + +1543 + `cmd_oemove +( +ck +, & +ed +); + +1545  +LMK_PROCPURGE +: + +1546 i( +rgs + != 0) + +1547  +wrgn +; + +1548 + `cmd_ourge +(& +ed +); + +1550  +LMK_GETKILLCNT +: + +1551 i( +rgs + != 2) + +1552  +wrgn +; + +1553 +kl_t + = + `cmd_gklt +( +ck +); + +1554 +n + = + `lmkd_ck_t_gklt_ +( +ck +, +kl_t +); + +1555 i( + `_da_wre +( +dsock_idx +, (*) +ck +, +n +) !=en) + +1558  +LMK_SUBSCRIBE +: + +1559 i( +rgs + != 1) + +1560  +wrgn +; + +1561 + `cmd_subsibe +( +dsock_idx +, +ck +); + +1563  +LMK_PROCKILL +: + +1565 + `ALOGE +("Reived uxed commd cod%d", +cmd +); + +1567  +LMK_UPDATE_PROPS +: + +1568 i( +rgs + != 0) + +1569  +wrgn +; + +1570 +su + = -1; + +1571 i( + `upde_s +()) { + +1572 i(! +u_kl_r + && +mڙs_lized +) { + +1574 + `deroy_mڙs +(); + +1575 i( + `_mڙs +()) { + +1576 +su + = 0; + +1579 +su + = 0; + +1582 i( +de_aim_thshd_ms + > 0 && ! +memevt_li +) { + +1583 + `ALOGW +("Kernel support for direct_reclaim_threshold_ms isot found"); + +1584 +de_aim_thshd_ms + = 0; + +1588 +n + = + `lmkd_ck_t_upde_s_ +( +ck +, +su +); + +1589 i( + `_da_wre +( +dsock_idx +, (*) +ck +, +n +) !=en) { + +1590 + `ALOGE +("Failedoeport operationesults"); + +1592 i(! +su +) { + +1593 + `ALOGI +("Propertieseinitilized"); + +1596 + `ALOGE +("New configuration isot supported. Exiting..."); + +1597 + `ex +(1); + +1600  +LMK_START_MONITORING +: + +1601 i( +rgs + != 0) + +1602  +wrgn +; + +1604 i( +mڙs_lized +) + +1606 i(! + `ݔty_g_bo +("sys.bo_comed", +l +)) { + +1607 + `ALOGE +("LMK_START_MONITORING cannot be handled before boot completed"); + +1611 i(! + `_mڙs +()) { + +1613 + `ALOGE +("Failureo initialize monitoring. Exiting..."); + +1614 + `ex +(1); + +1616 + `ALOGI +("Initialized monitorsfter boot completed."); + +1618  +LMK_BOOT_COMPLETED +: + +1619 i( +rgs + !0 +wrgn +; + +1621 i( +bo_comed_hdd +) { + +1623 +su + = 1; + +1624 } i(! + `ݔty_g_bo +("sys.bo_comed", +l +)) { + +1625 + `ALOGE +("LMK_BOOT_COMPLETED cannot be handled before boot completed"); + +1626 +su + = -1; + +1632 i( + `_memevt_li_mڙܚg +()) { + +1633 + `ALOGI +("Using memevents for directeclaimnd kswapd detection"); + +1635 + `ALOGI +("Using vmstats for directeclaimnd kswapd detection"); + +1636 i( +de_aim_thshd_ms + > 0) { + +1637 + `ALOGW +("Kernel support for direct_reclaim_threshold_ms isot found"); + +1638 +de_aim_thshd_ms + = 0; + +1641 +su + = 0; + +1642 +bo_comed_hdd + = +ue +; + +1645 +n + = + `lmkd_ck_t_bo_comed_nif_ +( +ck +, +su +); + +1646 i( + `_da_wre +( +dsock_idx +, (*) +ck +, +n +) !=en) { + +1647 + `ALOGE +("Failedoeport boot-completed operationesults"); + +1650  +LMK_PROCS_PRIO +: + +1651 + `cmd_ocs_io +( +ck +, +rgs +, & +ed +); + +1654 + `ALOGE +("Reived unknowcommd cod%d", +cmd +); + +1660 +wrgn +: + +1661 + `ALOGE +("Wrg cڌ sockdgth cmd=%d=%d", +cmd +, +n +); + +1662 + } +} + +1664  + $_da_hdr +( +da +, +ut32_t + +evts +, + +1665  +plg_ms + * +pl_ms + +__unud +) { + +1666 i( +evts + & +EPOLLIN +) { + +1667 + `_commd_hdr +( +da +); + +1669 + } +} + +1671  + $g__dsock +() { + +1672  +i + = 0; i < +MAX_DATA_CONN +; i++) { + +1673 i( +da_sock +[ +i +]. +sock + < 0) { + +1674  +i +; + +1678 + } +} + +1680  + $_c_hdr +( +da + +__unud +, +ut32_t + +evts + __unused, + +1681  +plg_ms + * +pl_ms + +__unud +) { + +1682  +l_evt + +ev +; + +1683  +_dscock_idx + = + `g__dsock +(); + +1685 i( +_dscock_idx + < 0) { + +1693  +i + = 0; i < +MAX_DATA_CONN +; i++) { + +1694 + `_da_o +( +i +); + +1696 +_dscock_idx + = 0; + +1699 +da_sock +[ +_dscock_idx +]. +sock + = + `ac +( +_sock +.sock, +NULL +, NULL); + +1700 i( +da_sock +[ +_dscock_idx +]. +sock + < 0) { + +1701 + `ALOGE +("lmkd cڌ sockc faed;no=%d", +o +); + +1705 + `ALOGI +("lmkd data connectionstablished"); + +1707 +da_sock +[ +_dscock_idx +]. +hdr_fo +. +da + = free_dscock_idx; + +1708 +da_sock +[ +_dscock_idx +]. +hdr_fo +. +hdr + = +_da_hdr +; + +1709 +da_sock +[ +_dscock_idx +]. +async_evt_mask + = 0; + +1710 +ev +. +evts + = +EPOLLIN +; + +1711 +ev +. +da +. +r + = (*)&( +da_sock +[ +_dscock_idx +]. +hdr_fo +); + +1712 i( + `l_l +( +lfd +, +EPOLL_CTL_ADD +, +da_sock +[ +_dscock_idx +]. +sock +, & +ev +) == -1) { + +1713 + `ALOGE +("l_f dci sock faed;no=%d", +o +); + +1714 + `_da_o +( +_dscock_idx +); + +1717 +maxevts +++; + +1718 + } +} + +1736  + $zefo_r_ei +(* +buf +,  +zefo_ze + * +ze +) { + +1737  +ze_idx +; + +1738 +t64_t + +max + = 0; + +1739 * +ve_r +; + +1741  +buf + = + `ok_r +(buf, "(), ", & +ve_r +), +ze_idx + = 0; + +1742 +buf + && +ze_idx + < +MAX_NR_ZONES +; + +1743 +buf + = + `ok_r +( +NULL +, "), ", & +ve_r +), +ze_idx +++) { + +1744  +zev + = + `l +( +buf +, &buf, 0); + +1745 i( +zev + > +max +) { + +1746 +max + = ( +zev + > +INT64_MAX +) ? INT64_MAX : zoneval; + +1748 +ze +-> +ei +[ +ze_idx +] = +zev +; + +1750 +ze +-> +max_ei + = +max +; + +1751 + } +} + +1753  + $zefo_r_ze +(** +buf +,  +zefo_ze + * +ze +) { + +1754 * +le + = + `ok_r +( +NULL +, "\n", +buf +);ine; + +1755 +le + = + `ok_r +( +NULL +, "\n", +buf +)) { + +1756 * + +; + +1757 * + +; + +1758 * +ve_r +; + +1759 +t64_t + +v +; + +1760  +fld_idx +; + +1761 +fld_mch_su + +mch_s +; + +1763 + + = + `ok_r +( +le +, " ", & +ve_r +); + +1764 i(! + +) { + +1765  +l +; + +1768 +fld_idx + = + `fd_fld +( + +, +zefo_ze_ec_fld_mes +, +ZI_ZONE_SPEC_FIELD_COUNT +); + +1769 i( +fld_idx + >= 0) { + +1771 i( +fld_idx + = +ZI_ZONE_SPEC_PAGESETS +) { + +1773  +ue +; + +1777 + + = + `ok_r +( +NULL +, ")", & +ve_r +); + +1778 i( + +) { + +1779 + `zefo_r_ei +( + +, +ze +); + +1784 + + = + `ok_r +( +NULL +, " ", & +ve_r +); + +1785 i(! + +) { + +1789 +mch_s + = + `mch_fld +( + +, + +, +zefo_ze_fld_mes +, +ZI_ZONE_FIELD_COUNT +, + +1790 & +v +, & +fld_idx +); + +1791 i( +mch_s + = +PARSE_FAIL +) { + +1792  +l +; + +1794 i( +mch_s + = +PARSE_SUCCESS +) { + +1795 +ze +-> +flds +. +r +[ +fld_idx +] = +v +; + +1797 i( +fld_idx + = +ZI_ZONE_PRESENT + && +v + == 0) { + +1799  +ue +; + +1802  +l +; + +1803 + } +} + +1805  + $zefo_r_node +(** +buf +,  +zefo_node + * +node +) { + +1806  +flds_to_mch + = +ZI_NODE_FIELD_COUNT +; + +1808 * +le + = + `ok_r +( +NULL +, "\n", +buf +);ine; + +1809 +le + = + `ok_r +( +NULL +, "\n", +buf +)) { + +1810 * + +; + +1811 * + +; + +1812 * +ve_r +; + +1813 +t64_t + +v +; + +1814  +fld_idx +; + +1815 +fld_mch_su + +mch_s +; + +1817 + + = + `ok_r +( +le +, " ", & +ve_r +); + +1818 i(! + +) { + +1819  +l +; + +1822 + + = + `ok_r +( +NULL +, " ", & +ve_r +); + +1823 i(! + +) { + +1824  +l +; + +1827 +mch_s + = + `mch_fld +( + +, + +, +zefo_node_fld_mes +, +ZI_NODE_FIELD_COUNT +, + +1828 & +v +, & +fld_idx +); + +1829 i( +mch_s + = +PARSE_FAIL +) { + +1830  +l +; + +1832 i( +mch_s + = +PARSE_SUCCESS +) { + +1833 +node +-> +flds +. +r +[ +fld_idx +] = +v +; + +1834 +flds_to_mch +--; + +1835 i(! +flds_to_mch +) { + +1836  +ue +; + +1840  +l +; + +1841 + } +} + +1843  + $zefo_r +( +zefo + * +zi +) { + +1844  +ad_da + +fe_da + = { + +1845 . +fame + = +ZONEINFO_PATH +, + +1846 . +fd + = -1, + +1848 * +buf +; + +1849 * +ve_r +; + +1850 * +le +; + +1851  +ze_me +[ +LINE_MAX + + 1]; + +1852  +zefo_node + * +node + = +NULL +; + +1853  +node_idx + = 0; + +1854  +ze_idx + = 0; + +1856 + `memt +( +zi +, 0, ( +zefo +)); + +1858 i(( +buf + = + `ad_fe +(& +fe_da +)= +NULL +) { + +1862  +le + = + `ok_r +( +buf +, "\n", & +ve_r +);ine; + +1863 +le + = + `ok_r +( +NULL +, "\n", & +ve_r +)) { + +1864  +node_id +; + +1865 i( + `ssnf +( +le +, "Nod%d, zڐ%" + `STRINGIFY +( +LINE_MAX +"s", & +node_id +, +ze_me +) == 2) { + +1866 i(! +node + ||ode-> +id + ! +node_id +) { + +1867 +le + = + `ok_r +( +NULL +, "\n", & +ve_r +); + +1868 i( + `cmp +( +le +, +NODE_STATS_MARKER +, + ` +(NODE_STATS_MARKER)) != 0) { + +1877 i( +node +) { + +1878 +node +-> +ze_cou + = +ze_idx + + 1; + +1879 +node_idx +++; + +1880 i( +node_idx + = +MAX_NR_NODES +) { + +1882 + `ALOGE +("%r", +fe_da +. +fame +); + +1886 +node + = & +zi +-> +nodes +[ +node_idx +]; + +1887 +node +-> +id + = +node_id +; + +1888 +ze_idx + = 0; + +1889 i(! + `zefo_r_node +(& +ve_r +, +node +)) { + +1890 + `ALOGE +("%r", +fe_da +. +fame +); + +1895 +ze_idx +++; + +1897 i(! + `zefo_r_ze +(& +ve_r +, & +node +-> +zes +[ +ze_idx +])) { + +1898 + `ALOGE +("%r", +fe_da +. +fame +); + +1903 i(! +node +) { + +1904 + `ALOGE +("%r", +fe_da +. +fame +); + +1907 +node +-> +ze_cou + = +ze_idx + + 1; + +1908 +zi +-> +node_cou + = +node_idx + + 1; + +1911  +node_idx + = 0;ode_idx < +zi +-> +node_cou +;ode_idx++) { + +1912 +node + = & +zi +-> +nodes +[ +node_idx +]; + +1913  +ze_idx + = 0; ze_idx < +node +-> +ze_cou +; zone_idx++) { + +1914  +zefo_ze + * +ze + = & +zi +-> +nodes +[ +node_idx +]. +zes +[ +ze_idx +]; + +1915 +zi +-> +tٮrve_ges + + +ze +-> +max_ei + + ze-> +flds +. +fld +. +high +; + +1917 +zi +-> +tٮ_aive_fe + + +node +-> +flds +. +fld +. +_aive_fe +; + +1918 +zi +-> +tٮ_aive_fe + + +node +-> +flds +. +fld +. +_aive_fe +; + +1921 + } +} + +1924  +bo + + $memfo_r_le +(* +le +,  +memfo + * +mi +) { + +1925 * + + = +le +; + +1926 * + +; + +1927 * +ve_r +; + +1928 +t64_t + +v +; + +1929  +fld_idx +; + +1930 +fld_mch_su + +mch_s +; + +1932 + + = + `ok_r +( +le +, " ", & +ve_r +); + +1933 i(! + +) { + +1934  +l +; + +1937 + + = + `ok_r +( +NULL +, " ", & +ve_r +); + +1938 i(! + +) { + +1939  +l +; + +1942 +mch_s + = + `mch_fld +( + +, + +, +memfo_fld_mes +, +MI_FIELD_COUNT +, + +1943 & +v +, & +fld_idx +); + +1944 i( +mch_s + = +PARSE_SUCCESS +) { + +1945 +mi +-> +r +[ +fld_idx +] = +v + / +ge_k +; + +1947  ( +mch_s + ! +PARSE_FAIL +); + +1948 + } +} + +1950  +t64_t + + $ad_gpu_tٮ_kb +() { + +1951  +droid +:: +ba +:: +unique_fd + + `fd +( + +1952 +droid +:: +bpf +:: + `mRrveRO +("/sys/fs/bpf/map_gpuMem_gpu_mem_total_map")); + +1953  +cڡex + +ut64_t + +kBpfKeyGpuTٮUge + = 0; + +1954 +ut64_t + +vue +; + +1956 i(! +fd +. + `ok +()) { + +1960  +droid +:: +bpf +:: + `fdMEry +( +fd +, & +kBpfKeyGpuTٮUge +, & +vue +) + +1962 : ( +t32_t +)( +vue + / 1024); + +1963 + } +} + +1965  + $memfo_r +( +memfo + * +mi +) { + +1966  +ad_da + +fe_da + = { + +1967 . +fame + = +MEMINFO_PATH +, + +1968 . +fd + = -1, + +1970 * +buf +; + +1971 * +ve_r +; + +1972 * +le +; + +1974 + `memt +( +mi +, 0, ( +memfo +)); + +1976 i(( +buf + = + `ad_fe +(& +fe_da +)= +NULL +) { + +1980  +le + = + `ok_r +( +buf +, "\n", & +ve_r +);ine; + +1981 +le + = + `ok_r +( +NULL +, "\n", & +ve_r +)) { + +1982 i(! + `memfo_r_le +( +le +, +mi +)) { + +1983 + `ALOGE +("%r", +fe_da +. +fame +); + +1987 +mi +-> +fld +. +_fe_ges + = mi->fld. +ched + + mi->fld. +sw_ched + + + +1988 +mi +-> +fld +. +bufrs +; + +1989 +mi +-> +fld +. +tٮ_gpu_kb + = + `ad_gpu_tٮ_kb +(); + +1990 +mi +-> +fld +. +sy_avaab + = mi->fld. +__ges + + mi->fld. +aive_fe +; + +1993 + } +} + +2001  +le + +t64_t + + $g__sw +( +memfo + * +mi +) { + +2002 i( +sw_comessi_tio +) + +2003  +d +:: + `m +( +mi +-> +fld +. +_sw +, mi->fld. +sy_avaab + * +sw_comessi_tio +); + +2004  +mi +-> +fld +. +_sw +; + +2005 + } +} + +2008  +bo + + $vm_r_le +(* +le +,  +vm + * +vs +) { + +2009 * + +; + +2010 * + +; + +2011 * +ve_r +; + +2012 +t64_t + +v +; + +2013  +fld_idx +; + +2014 +fld_mch_su + +mch_s +; + +2016 + + = + `ok_r +( +le +, " ", & +ve_r +); + +2017 i(! + +) { + +2018  +l +; + +2021 + + = + `ok_r +( +NULL +, " ", & +ve_r +); + +2022 i(! + +) { + +2023  +l +; + +2026 +mch_s + = + `mch_fld +( + +, + +, +vm_fld_mes +, +VS_FIELD_COUNT +, + +2027 & +v +, & +fld_idx +); + +2028 i( +mch_s + = +PARSE_SUCCESS +) { + +2029 +vs +-> +r +[ +fld_idx +] = +v +; + +2031  ( +mch_s + ! +PARSE_FAIL +); + +2032 + } +} + +2034  + $vm_r +( +vm + * +vs +) { + +2035  +ad_da + +fe_da + = { + +2036 . +fame + = +VMSTAT_PATH +, + +2037 . +fd + = -1, + +2039 * +buf +; + +2040 * +ve_r +; + +2041 * +le +; + +2043 + `memt +( +vs +, 0, ( +vm +)); + +2045 i(( +buf + = + `ad_fe +(& +fe_da +)= +NULL +) { + +2049  +le + = + `ok_r +( +buf +, "\n", & +ve_r +);ine; + +2050 +le + = + `ok_r +( +NULL +, "\n", & +ve_r +)) { + +2051 i(! + `vm_r_le +( +le +, +vs +)) { + +2052 + `ALOGE +("%r", +fe_da +. +fame +); + +2058 + } +} + +2060  + $psi_r +( +ad_da + * +fe_da +,  +psi_s + +s +[], +bo + +fu +) { + +2061 * +buf +; + +2062 * +ve_r +; + +2063 * +le +; + +2065 i(( +buf + = + `ad_fe +( +fe_da +)= +NULL +) { + +2069 +le + = + `ok_r +( +buf +, "\n", & +ve_r +); + +2070 i( + `r_psi_le +( +le +, +PSI_SOME +, +s +)) { + +2073 i( +fu +) { + +2074 +le + = + `ok_r +( +NULL +, "\n", & +ve_r +); + +2075 i( + `r_psi_le +( +le +, +PSI_FULL +, +s +)) { + +2081 + } +} + +2083  + $psi_r_mem +( +psi_da + *psi_data) { + +2084  +ad_da + +fe_da + = { + +2085 . +fame + = +psi_sour_fe +[ +PSI_MEMORY +], + +2086 . +fd + = -1, + +2088  + `psi_r +(& +fe_da +, +psi_da +-> +mem_s +, +ue +); + +2089 + } +} + +2091  + $psi_r_io +( +psi_da + *psi_data) { + +2092  +ad_da + +fe_da + = { + +2093 . +fame + = +psi_sour_fe +[ +PSI_IO +], + +2094 . +fd + = -1, + +2096  + `psi_r +(& +fe_da +, +psi_da +-> +io_s +, +ue +); + +2097 + } +} + +2099  + $psi_r_u +( +psi_da + *psi_data) { + +2100  +ad_da + +fe_da + = { + +2101 . +fame + = +psi_sour_fe +[ +PSI_CPU +], + +2102 . +fd + = -1, + +2104  + `psi_r +(& +fe_da +, +psi_da +-> +u_s +, +l +); + +2105 + } +} + +2107 + ewakeup_as + { + +2108 + mEvt +, + +2109 + mPlg + + +2112  + swakeup_fo + { + +2113  +timeec + + mwakeup_tm +; + +2114  +timeec + + mev_wakeup_tm +; + +2115  +timeec + + mϡ_evt_tm +; + +2116  + mwakeups_s_evt +; + +2117  + mskd_wakeups +; + +2129  + $cd_wakeup_time +( +timeec + * +tm +, +wakeup_as + +as +, + +2130  +wakeup_fo + * +wi +) { + +2131 +wi +-> +ev_wakeup_tm + = wi-> +wakeup_tm +; + +2132 +wi +-> +wakeup_tm + = * +tm +; + +2133 i( +as + = +Evt +) { + +2134 +wi +-> +ϡ_evt_tm + = * +tm +; + +2135 +wi +-> +wakeups_s_evt + = 0; + +2136 +wi +-> +skd_wakeups + = 0; + +2138 +wi +-> +wakeups_s_evt +++; + +2140 + } +} + +2142  + skl_fo + { + +2143 +kl_ass + + mkl_as +; + +2144 cڡ * + mkl_desc +; + +2145  + mthshg +; + +2146  + mmax_thshg +; + +2149  + $klfo_log +( +oc +* +o +,  +m_oom_sce +,  +rss_kb +, + +2150  +sw_kb +,  +kl_fo + * +ki +,  +memfo + * +mi +, + +2151  +wakeup_fo + * +wi +,  +timeec + * +tm +,  +psi_da + * +pd +) { + +2153 + `droid_log_wre_t32 +( +x +, +o +-> +pid +); + +2154 + `droid_log_wre_t32 +( +x +, +o +-> +uid +); + +2155 + `droid_log_wre_t32 +( +x +, +o +-> +oomadj +); + +2156 + `droid_log_wre_t32 +( +x +, +m_oom_sce +); + +2157 + `droid_log_wre_t32 +( +x +, +d +:: + `m +( +rss_kb +, () +INT32_MAX +)); + +2158 + `droid_log_wre_t32 +( +x +, +ki + ? ki-> +kl_as + : +NONE +); + +2161  +fld_idx + = 0; fld_idx < +MI_FIELD_COUNT +; field_idx++) { + +2162 + `droid_log_wre_t32 +( +x +, + +2163 +mi + ? +d +:: + `m +(mi-> +r +[ +fld_idx +] * +ge_k +, ( +t64_t +) +INT32_MAX +) : 0); + +2167 i( +wi +) { + +2168 + `droid_log_wre_t32 +( +x +, ( +t32_t +) + `g_time_diff_ms +(& +wi +-> +ϡ_evt_tm +, +tm +)); + +2169 + `droid_log_wre_t32 +( +x +, ( +t32_t +) + `g_time_diff_ms +(& +wi +-> +ev_wakeup_tm +, +tm +)); + +2170 + `droid_log_wre_t32 +( +x +, +wi +-> +wakeups_s_evt +); + +2171 + `droid_log_wre_t32 +( +x +, +wi +-> +skd_wakeups +); + +2173 + `droid_log_wre_t32 +( +x +, 0); + +2174 + `droid_log_wre_t32 +( +x +, 0); + +2175 + `droid_log_wre_t32 +( +x +, 0); + +2176 + `droid_log_wre_t32 +( +x +, 0); + +2179 + `droid_log_wre_t32 +( +x +, +d +:: + `m +( +sw_kb +, () +INT32_MAX +)); + +2180 + `droid_log_wre_t32 +( +x +, +mi + ? ( +t32_t +)mi-> +fld +. +tٮ_gpu_kb + : 0); + +2181 i( +ki +) { + +2182 + `droid_log_wre_t32 +( +x +, +ki +-> +thshg +); + +2183 + `droid_log_wre_t32 +( +x +, +ki +-> +max_thshg +); + +2185 + `droid_log_wre_t32 +( +x +, 0); + +2186 + `droid_log_wre_t32 +( +x +, 0); + +2189 i( +pd +) { + +2190 + `droid_log_wre_t32 +( +x +, +pd +-> +mem_s +[ +PSI_SOME +]. +avg10 +); + +2191 + `droid_log_wre_t32 +( +x +, +pd +-> +mem_s +[ +PSI_FULL +]. +avg10 +); + +2192 + `droid_log_wre_t32 +( +x +, +pd +-> +io_s +[ +PSI_SOME +]. +avg10 +); + +2193 + `droid_log_wre_t32 +( +x +, +pd +-> +io_s +[ +PSI_FULL +]. +avg10 +); + +2194 + `droid_log_wre_t32 +( +x +, +pd +-> +u_s +[ +PSI_SOME +]. +avg10 +); + +2196  +i + = 0; i < 5; i++) { + +2197 + `droid_log_wre_t32 +( +x +, 0); + +2201 + `droid_log_wre_li +( +x +, +LOG_ID_EVENTS +); + +2202 + `droid_log_t +( +x +); + +2203 + } +} + +2207  +oc + * + $oc_adj_hd +( +oomadj +) { + +2208  ( +oc + *)& +odj_li +[ + `ADJTOSLOT +( +oomadj +)]; + +2209 + } +} + +2212  +oc + * + $oc_adj_ +( +oomadj +) { + +2213  ( +oc + *) + `adj_ +(& +odj_li +[ + `ADJTOSLOT +( +oomadj +)]); + +2214 + } +} + +2217  +oc + * + $oc_adj_ev +( +oomadj +,  +pid +) { + +2218  +adj_li + * +hd + = & +odj_li +[ + `ADJTOSLOT +( +oomadj +)]; + +2219  +adj_li + * +cu + = + `adj_ +(& +odj_li +[ + `ADJTOSLOT +( +oomadj +)]); + +2221  +cu + ! +hd +) { + +2222 i((( +oc + *) +cu +)-> +pid + ==id) { + +2223  ( +oc + *) +cu +-> +ev +; + +2225 +cu + = cu-> +ev +; + +2228  +NULL +; + +2229 + } +} + +2232  +oc + * + $oc_g_hv +( +oomadj +) { + +2233  +adj_li + * +hd + = & +odj_li +[ + `ADJTOSLOT +( +oomadj +)]; + +2234  +adj_li + * +cu + = +hd +-> +xt +; + +2235  +oc + * +maxo + = +NULL +; + +2236  +maxsize + = 0; + +2237 i(( +cu + ! +hd +&& (cu-> +xt + == head)) { + +2239  ( +oc + *) +cu +; + +2241  +cu + ! +hd +) { + +2242  +pid + = (( +oc + *) +cu +)->pid; + +2243  +sksize + = + `oc_g_size +( +pid +); + +2244 i( +sksize + < 0) { + +2245  +adj_li + * +xt + = +cu +->next; + +2246 + `pid_move +( +pid +); + +2247 +cu + = +xt +; + +2249 i( +sksize + > +maxsize +) { + +2250 +maxsize + = +sksize +; + +2251 +maxo + = ( +oc + *) +cu +; + +2253 +cu + = cu-> +xt +; + +2256  +maxo +; + +2257 + } +} + +2259  +bo + + $fd_viim +( +oom_sce +,  +ev_pid +,  +oc + & +rg_oc +) { + +2260  +oc + * +o +; + +2261 +d +:: +shed_lock + + `lock +( +adj_li_lock +); + +2263 i(! +ev_pid +) { + +2264 +o + = + `oc_adj_ +( +oom_sce +); + +2266 +o + = + `oc_adj_ev +( +oom_sce +, +ev_pid +); + +2267 i(! +o +) { + +2269 +o + = + `oc_adj_ +( +oom_sce +); + +2274 i(! +o + ||ro = + `oc_adj_hd +( +oom_sce +)) { + +2275  +l +; + +2279 +rg_oc + = * +o +; + +2281  +ue +; + +2282 + } +} + +2284  + $wchdog_back +() { + +2285  +ev_pid + = 0; + +2287 + `ALOGW +("lmkd watchdogimed out!"); + +2288  +oom_sce + = +OOM_SCORE_ADJ_MAX +; oom_score >= 0;) { + +2289  +oc + +rg +; + +2291 i(! + `fd_viim +( +oom_sce +, +ev_pid +, +rg +)) { + +2292 +oom_sce +--; + +2293 +ev_pid + = 0; + +2297 i( +rg +. +vid + && + +. + `kl +({g. +pidfd +,g. +pid +,g. +uid + }, +ue +) == 0) { + +2298 + `ALOGW +("lmkd wchdog kdros%d, oom_sce_adj %d", +rg +. +pid +, +oom_sce +); + +2299 + `klfo_log +(& +rg +, 0, 0, 0, +NULL +, NULL, NULL, NULL, NULL); + +2301 + `pid_vide +( +rg +. +pid +); + +2304 +ev_pid + = +rg +. +pid +; + +2306 + } +} + +2308  +Wchdog + +wchdog +( +WATCHDOG_TIMEOUT_SEC +, +wchdog_back +); + +2310  +bo + + $is_kl_ndg +() { + +2311  +buf +[24]; + +2313 i( +ϡ_kl_pid__fd + < 0) { + +2314  +l +; + +2317 i( +pidfd_su܋d +) { + +2318  +ue +; + +2322 + `tf +( +buf +, (buf), "/oc/%d/", +ϡ_kl_pid__fd +); + +2323 i( + `acss +( +buf +, +F_OK +) == 0) { + +2324  +ue +; + +2327  +l +; + +2328 + } +} + +2330  +bo + + $is_wag_f_kl +() { + +2331  +pidfd_su܋d + && +ϡ_kl_pid__fd + >= 0; + +2332 + } +} + +2334  + $_wa_f_oc_kl +( +bo + +fished +) { + +2335  +l_evt + +ev +; + +2337 i( +ϡ_kl_pid__fd + < 0) { + +2341 i( +debug_oss_klg +) { + +2342  +timeec + +cu_tm +; + +2344 i( + `ock_gtime +( +CLOCK_MONOTONIC_COARSE +, & +cu_tm +) != 0) { + +2349 + `ALOGE +("Failedo get currentime"); + +2352 i( +fished +) { + +2353 + `ALOGI +("Process got killed in %ldms", + +2354 + `g_time_diff_ms +(& +ϡ_kl_tm +, & +cu_tm +)); + +2356 + `ALOGI +("Stop waiting forrocess killfter %ldms", + +2357 + `g_time_diff_ms +(& +ϡ_kl_tm +, & +cu_tm +)); + +2361 i( +pidfd_su܋d +) { + +2363 i( + `l_l +( +lfd +, +EPOLL_CTL_DEL +, +ϡ_kl_pid__fd +, & +ev +)) { + +2365 + `ALOGE +("l_f܆a kdrosed;no=%d", +o +); + +2367 +maxevts +--; + +2368 + `o +( +ϡ_kl_pid__fd +); + +2371 +ϡ_kl_pid__fd + = -1; + +2372 + } +} + +2374  + $kl_de_hdr +( +da + +__unud +, +ut32_t + +evts + __unused, + +2375  +plg_ms + * +pl_ms +) { + +2376 + `_wa_f_oc_kl +( +ue +); + +2377 +pl_ms +-> +upde + = +POLLING_RESUME +; + +2378 + } +} + +2380  + $kl__hdr +( +da + +__unud +, +ut32_t + +evts + __unused, + +2381  +plg_ms + * +pl_ms +) { + +2382  +pid +; + +2386 i( + `TEMP_FAILURE_RETRY +( + `ad +( +_comm_fd +[0], & +pid +, (pid))) != (pid)) { + +2387 + `ALOGE +("thad communitiڄd faed: %s", + ` +( +o +)); + +2389 + `_wa_f_oc_kl +( +l +); + +2390 +pl_ms +-> +upde + = +POLLING_RESUME +; + +2391 + } +} + +2393  + $t_wa_f_oc_kl +( +pid__fd +) { + +2394  +evt_hdr_fo + +kl_de_hfo + = { 0, +kl_de_hdr + }; + +2395  +l_evt + +ev +; + +2397 i( +ϡ_kl_pid__fd + >= 0) { + +2399 + `ALOGE +("Attempto wait for kill whilenother wait is inrogress"); + +2400 + `_wa_f_oc_kl +( +l +); + +2403 +ϡ_kl_pid__fd + = +pid__fd +; + +2405 i(! +pidfd_su܋d +) { + +2410 +ev +. +evts + = +EPOLLIN +; + +2411 +ev +. +da +. +r + = (*)& +kl_de_hfo +; + +2412 i( + `l_l +( +lfd +, +EPOLL_CTL_ADD +, +ϡ_kl_pid__fd +, & +ev +) != 0) { + +2413 + `ALOGE +("l_f܆a ked;no=%d", +o +); + +2414 + `o +( +ϡ_kl_pid__fd +); + +2415 +ϡ_kl_pid__fd + = -1; + +2418 +maxevts +++; + +2419 + } +} + +2422  + $kl_e_oss +( +oc +* +o +,  +m_oom_sce +,  +kl_fo + * +ki +, + +2423  +memfo + * +mi +,  +wakeup_fo + * +wi +,  +timeec + * +tm +, + +2424  +psi_da + * +pd +) { + +2425  +pid + = +o +->pid; + +2426  +pidfd + = +o +->pidfd; + +2427 +uid_t + +uid + = +o +->uid; + +2428 * +skme +; + +2429  +kl_su +; + +2430  +su + = -1; + +2431  +memy_ + * +mem_ +; + +2432  +kl_ + +kl_ +; + +2433 +t64_t + +tgid +; + +2434 +t64_t + +rss_kb +; + +2435 +t64_t + +sw_kb +; + +2436  +buf +[ +gesize +]; + +2437  +desc +[ +LINE_MAX +]; + +2439 i(! +o +-> +vid + || ! + `ad_oc_us +( +pid +, +buf +, (buf))) { + +2440  +out +; + +2442 i(! + `r_us_g +( +buf +, +PROC_STATUS_TGID_FIELD +, & +tgid +)) { + +2443 + `ALOGE +("Ubˁطrgid from /oc/%d/us", +pid +); + +2444  +out +; + +2446 i( +tgid + ! +pid +) { + +2447 + `ALOGE +("Possib˅ideu deed (pid %d,gid %" +PRId64 + ")!", +pid +, +tgid +); + +2448  +out +; + +2451 i(! + `r_us_g +( +buf +, +PROC_STATUS_RSS_FIELD +, & +rss_kb +)) { + +2452  +out +; + +2454 i(! + `r_us_g +( +buf +, +PROC_STATUS_SWAP_FIELD +, & +sw_kb +)) { + +2455  +out +; + +2458 +skme + = + `oc_g_me +( +pid +, +buf +, (buf)); + +2460 i(! +skme +) { + +2461  +out +; + +2464 +mem_ + = + `s_ad_memy_ +( +r_p_memcg +, +pid +, +uid +, +rss_kb + * 1024, +sw_kb + * 1024); + +2466 + `tf +( +desc +, (desc), "lmk,%d,%d,%d,%d,%d", +pid +, +ki + ? ()ki-> +kl_as + : -1, + +2467 +o +-> +oomadj +, +m_oom_sce +, +ki + ? ki-> +max_thshg + : -1); + +2469 +su + = + `lmkd__memy_befe_kl_hook +( +o +, +rss_kb + / +ge_k +,ro-> +oomadj +, + +2470 +ki + ? ()ki-> +kl_as + : -1); + +2471 i( +su + > 0) { + +2476 + `ALOGI +("Skpg kl; %ld kB fedlwhe.", +su + * +ge_k +); + +2477  +su +; + +2480 + `a_kl_t +( +desc +); + +2482 + `t_wa_f_oc_kl +( +pidfd + < 0 ? +pid + :idfd); + +2483 +kl_su + = + +. + `kl +({ +pidfd +, +pid +, +uid + }, +l +); + +2485 + `a_kl_d +(); + +2487 i( +kl_su +) { + +2488 + `_wa_f_oc_kl +( +l +); + +2489 + `ALOGE +("kl(%d):no=%d", +pid +, +o +); + +2491  +out +; + +2494 +ϡ_kl_tm + = * +tm +; + +2496 + `c_klt +( +o +-> +oomadj +); + +2498 i( +ki +) { + +2499 +kl_ +. +kl_as + = +ki +->kill_reason; + +2500 +kl_ +. +thshg + = +ki +->thrashing; + +2501 +kl_ +. +max_thshg + = +ki +->max_thrashing; + +2502 + `ALOGI +("K'%s' (%d), uid %d, oom_sce_adj %d %" +PRId64 + "kBss, %" PRId64 + +2503 "kB sw;s: %s", +skme +, +pid +, +uid +, +o +-> +oomadj +, +rss_kb +, +sw_kb +, + +2504 +ki +-> +kl_desc +); + +2506 +kl_ +. +kl_as + = +NONE +; + +2507 +kl_ +. +thshg + = 0; + +2508 +kl_ +. +max_thshg + = 0; + +2509 + `ALOGI +("K'%s' (%d), uid %d, oom_sce_adj %d %" +PRId64 + "kBss, %" PRId64 + +2510 "kb sw", +skme +, +pid +, +uid +, +o +-> +oomadj +, +rss_kb +, +sw_kb +); + +2512 + `klfo_log +( +o +, +m_oom_sce +, +rss_kb +, +sw_kb +, +ki +, +mi +, +wi +, +tm +, +pd +); + +2514 +kl_ +. +uid + = +ic_ +< +t32_t +>(uid); + +2515 +kl_ +. +skme + =askname; + +2516 +kl_ +. +oom_sce + = +o +-> +oomadj +; + +2517 +kl_ +. +m_oom_sce + = min_oom_score; + +2518 +kl_ +. +_mem_kb + = +mi +-> +fld +. +__ges + * +ge_k +; + +2519 +kl_ +. +_sw_kb + = + `g__sw +( +mi +* +ge_k +; + +2520 + `s_wre_lmk_kl_occued +(& +kl_ +, +mem_ +); + +2522 + `_da_wre_lmk_kl_occued +(( +pid_t +) +pid +, +uid +, +rss_kb +); + +2524 +su + = +rss_kb + / +ge_k +; + +2526 +out +: + +2531 + `pid_move +( +pid +); + +2532  +su +; + +2533 + } +} + +2539  + $fd_d_kl_oss +( +m_sce_adj +,  +kl_fo + * +ki +,  +memfo + * +mi +, + +2540  +wakeup_fo + * +wi +,  +timeec + * +tm +, + +2541  +psi_da + * +pd +) { + +2542  +i +; + +2543  +kd_size + = 0; + +2544 +bo + +choo_hv_sk + = +kl_hv_sk +; + +2546  +i + = +OOM_SCORE_ADJ_MAX +; i > +m_sce_adj +; i--) { + +2547  +oc + * +o +; + +2549 i(! +choo_hv_sk + && +i + < +PERCEPTIBLE_APP_ADJ +) { + +2554 +choo_hv_sk + = +ue +; + +2557  +ue +) { + +2558 +o + = +choo_hv_sk + ? + +2559 + `oc_g_hv +( +i +: + `oc_adj_ +(i); + +2561 i(! +o +) + +2564 +kd_size + = + `kl_e_oss +( +o +, +m_sce_adj +, +ki +, +mi +, +wi +, +tm +, +pd +); + +2565 i( +kd_size + >= 0) { + +2569 i( +kd_size +) { + +2574  +kd_size +; + +2575 + } +} + +2577  +t64_t + + $g_memy_uge +( +ad_da + * +fe_da +) { + +2578 +t64_t + +mem_uge +; + +2579 * +buf +; + +2581 i(( +buf + = + `ad_fe +( +fe_da +)= +NULL +) { + +2585 i(! + `r_t64 +( +buf +, & +mem_uge +)) { + +2586 + `ALOGE +("%r", +fe_da +-> +fame +); + +2589 i( +mem_uge + == 0) { + +2590 + `ALOGE +("No memory!"); + +2593  +mem_uge +; + +2594 + } +} + +2596  + $cd_low_essu_vs +( +memfo + * +mi +) { + +2597 i( +low_essu_mem +. +m___ges + == -1 || + +2598 +low_essu_mem +. +m___ges + > +mi +-> +fld +. +__ges +) { + +2599 i( +debug_oss_klg +) { + +2600 + `ALOGI +("Lowssu m memy updom %" +PRId64 + "o %" PRId64, + +2601 +low_essu_mem +. +m___ges +, +mi +-> +fld +. +__ges +); + +2603 +low_essu_mem +. +m___ges + = +mi +-> +fld +. +__ges +; + +2611 i( +low_essu_mem +. +max___ges + == -1 || + +2612 ( +low_essu_mem +. +max___ges + < +mi +-> +fld +. +__ges + && + +2613 +mi +-> +fld +. +__ges + - +low_essu_mem +. +max___ges + < + +2614 +low_essu_mem +. +max___ges + * 0.1)) { + +2615 i( +debug_oss_klg +) { + +2616 + `ALOGI +("Lowssu max memy updom %" +PRId64 + "o %" PRId64, + +2617 +low_essu_mem +. +max___ges +, +mi +-> +fld +. +__ges +); + +2619 +low_essu_mem +. +max___ges + = +mi +-> +fld +. +__ges +; + +2621 + } +} + +2623 +vmessu_v + + $upgde_v +( +vmessu_v + +v +) { + +2624  ( +vmessu_v +)(( +v + < +VMPRESS_LEVEL_CRITICAL +) ? + +2625 +v + + 1 :evel); + +2626 + } +} + +2628 +vmessu_v + + $downgde_v +( +vmessu_v + +v +) { + +2629  ( +vmessu_v +)(( +v + > +VMPRESS_LEVEL_LOW +) ? + +2630 +v + - 1 :evel); + +2631 + } +} + +2633 + eze_wmk + { + +2634 + mWMARK_MIN + = 0, + +2635 + mWMARK_LOW +, + +2636 + mWMARK_HIGH +, + +2637 + mWMARK_NONE + + +2640  + sze_wmks + { + +2641  + mhigh_wmk +; + +2642  + mlow_wmk +; + +2643  + mm_wmk +; + +2646  +ze_wmks + + gwmks +; + +2651  +ze_wmk + + $g_lowe_wmk +( +memfo + * +mi +, + +2652  +ze_wmks + * +wmks +) + +2654 +t64_t + +__ges + = +mi +-> +fld +.__ge- mi->fld. +cma_ +; + +2656 i( +__ges + < +wmks +-> +m_wmk +) { + +2657  +WMARK_MIN +; + +2659 i( +__ges + < +wmks +-> +low_wmk +) { + +2660  +WMARK_LOW +; + +2662 i( +__ges + < +wmks +-> +high_wmk +) { + +2663  +WMARK_HIGH +; + +2665  +WMARK_NONE +; + +2666 + } +} + +2668  + $lc_ze_wmks +( +zefo + * +zi +,  +ze_wmks + * +wmks +) { + +2669 + `memt +( +wmks +, 0, ( +ze_wmks +)); + +2671  +node_idx + = 0;ode_idx < +zi +-> +node_cou +;ode_idx++) { + +2672  +zefo_node + * +node + = & +zi +-> +nodes +[ +node_idx +]; + +2673  +ze_idx + = 0; ze_idx < +node +-> +ze_cou +; zone_idx++) { + +2674  +zefo_ze + * +ze + = & +node +-> +zes +[ +ze_idx +]; + +2676 i(! +ze +-> +flds +. +fld +. +e +) { + +2680 +wmks +-> +high_wmk + + +ze +-> +max_ei + + ze-> +flds +. +fld +. +high +; + +2681 +wmks +-> +low_wmk + + +ze +-> +max_ei + + ze-> +flds +. +fld +. +low +; + +2682 +wmks +-> +m_wmk + + +ze +-> +max_ei + + ze-> +flds +. +fld +. +m +; + +2685 + } +} + +2687  + $upde_zefo_wmks +( +zefo + * +zi +) { + +2688 i( + `zefo_r +( +zi +) < 0) { + +2689 + `ALOGE +("Failedoarse zoneinfo!"); + +2692 + `lc_ze_wmks +( +zi +, & +wmks +); + +2694 + } +} + +2696  + $lc_sw_utizi +( +memfo + * +mi +) { + +2697 +t64_t + +sw_ud + = +mi +-> +fld +. +tٮ_sw + - + `g__sw +(mi); + +2698 +t64_t + +tٮ_swb + = +mi +-> +fld +. +aive_ + + mi->fld. +aive_ + + + +2699 +mi +-> +fld +. +shmem + + +sw_ud +; + +2700  +tٮ_swb + > 0 ? ( +sw_ud + * 100) /otal_swappable : 0; + +2701 + } +} + +2703 + eevt_sour + { + +2704 + mPSI +, + +2705 + mVENDOR +, + +2708  + upsi_evt_da + { + +2709 +vmessu_v + + mv +; + +2710 +mem_evt_t + + mvd_evt +; + +2713  + $__mp_evt_psi +( +evt_sour + +sour +,  +psi_evt_da + +da +, + +2714 +ut32_t + +evts +,  +plg_ms + * +pl_ms +) { + +2715 + eaim_e + { + +2716 +NO_RECLAIM + = 0, + +2717 +KSWAPD_RECLAIM +, + +2718 +DIRECT_RECLAIM +, + +2720  +t64_t + +_ws_u +; + +2721  +t64_t + +ev_wkgt_u +; + +2722  +t64_t + +ba_fe_u +; + +2723  +t64_t + +_pgsn_kswd +; + +2724  +t64_t + +_pgsn_de +; + +2725  +t64_t + +_pgfl +; + +2726  +bo + +klg +; + +2727  +thshg_lim + = +thshg_lim_p +; + +2728  +timeec + +wmk_upde_tm +; + +2729  +wakeup_fo + +wi +; + +2730  +timeec + +thshg_t_tm +; + +2731  +t64_t + +ev_thsh_growth + = 0; + +2732  +bo + +check_feche + = +l +; + +2733  +max_thshg + = 0; + +2735  +memfo + +mi +; + +2736  +vm + +vs +; + +2737  +psi_da +si_data; + +2738  +timeec + +cu_tm +; + +2739 +t64_t + +thshg + = 0; + +2740 +bo + +sw_is_low + = +l +; + +2741 +vmessu_v + +v + = ( +sour + = +PSI +? +da +.level: ( vmpressure_level)0; + +2742 +kl_ass + +kl_as + = +NONE +; + +2743 +bo + +cye_a_kl + = +l +; + +2744 +aim_e + +aim + = +NO_RECLAIM +; + +2745 +ze_wmk + +wmk + = +WMARK_NONE +; + +2746  +kl_desc +[ +LINE_MAX +]; + +2747 +bo + +cut_thshg_lim + = +l +; + +2748  +m_sce_adj + = 0; + +2749  +sw_ut + = 0; + +2750 +t64_t + +sw_low_thshd +; + +2751  +s_thshg_t_ms +; + +2752 +t64_t + +wkgt_u_fe +; + +2753 +bo + +il_l + = +l +; + +2754 +bo + +_de_aim +; + +2755  +de_aim_duti_ms +; + +2756 +bo + +_kswd_aim +; + +2758 +mp_evt_cou +++; + +2759 i( +debug_oss_klg +) { + +2760 i( +sour + = +PSI +) + +2761 + `ALOGI +("%memyssuv#%" +PRIu64 + " isriggered", + +2762 +v_me +[ +v +], +mp_evt_cou +); + +2764 + `ALOGI +("vd kev#%" +PRIu64 + " iigged", +mp_evt_cou +); + +2767 i( + `ock_gtime +( +CLOCK_MONOTONIC_COARSE +, & +cu_tm +) != 0) { + +2768 + `ALOGE +("Failedo get currentime"); + +2772 i( +sour + = +PSI +) { + +2773 i( +evts + > 0 ) { + +2775 i( +v + < +ev_v +) { + +2776 i( +debug_oss_klg +) + +2777 + `ALOGI +("Ignoring %sressurevent; occurredoo soon.", + +2778 +v_me +[ +v +]); + +2781 +ev_v + = +v +; + +2784 +ev_v + = +VMPRESS_LEVEL_LOW +; + +2787 + `cd_wakeup_time +(& +cu_tm +, +evts + ? +Evt + : +Plg +, & +wi +); + +2790 +bo + +kl_ndg + = + `is_kl_ndg +(); + +2791 i( +kl_ndg + && ( +kl_timeout_ms + == 0 || + +2792 + `g_time_diff_ms +(& +ϡ_kl_tm +, & +cu_tm +< +ic_ +<>( +kl_timeout_ms +))) { + +2794 +wi +. +skd_wakeups +++; + +2795  +no_kl +; + +2801 + `_wa_f_oc_kl +(! +kl_ndg +); + +2803 i( + `vm_r +(& +vs +) < 0) { + +2804 + `ALOGE +("Failedoarse vmstat!"); + +2808 +wkgt_u_fe + = +vs +. +fld +. +wkgt_u + ? : vs.field.workingset_refault_file; + +2810 i( + `memfo_r +(& +mi +) < 0) { + +2811 + `ALOGE +("Failedoarse meminfo!"); + +2816 i( +klg +) { + +2817 +klg + = +l +; + +2818 +cye_a_kl + = +ue +; + +2820 +ba_fe_u + = +vs +. +fld +. +_aive_fe + + vs.fld. +_aive_fe +; + +2821 +_ws_u + = +wkgt_u_fe +; + +2822 +thshg_t_tm + = +cu_tm +; + +2823 +ev_thsh_growth + = 0; + +2827 i( +sw__low_rage +) { + +2828 +sw_low_thshd + = +mi +. +fld +. +tٮ_sw + * +sw__low_rage + / 100; + +2829 +sw_is_low + = + `g__sw +(& +mi +< +sw_low_thshd +; + +2831 +sw_low_thshd + = 0; + +2834 i( +memevt_li +) { + +2835 +_de_aim + = + +2836 +de_aim_t_tm +. +tv_c + !0 || de_aim_t_tm. +tv_nc + != 0; + +2837 +_kswd_aim + = +kswd_t_tm +. +tv_c + !0 || kswd_t_tm. +tv_nc + != 0; + +2839 +_de_aim + = +vs +. +fld +. +pgsn_de + ! +_pgsn_de +; + +2840 +_kswd_aim + = ( +vs +. +fld +. +pgsn_kswd + ! +_pgsn_kswd +) || + +2841 ( +vs +. +fld +. +pgfl + ! +_pgfl +); + +2845 i( +_de_aim +) { + +2846 +_pgsn_de + = +vs +. +fld +. +pgsn_de +; + +2847 +_pgsn_kswd + = +vs +. +fld +. +pgsn_kswd +; + +2848 +_pgfl + = +vs +. +fld +. +pgfl +; + +2849 +de_aim_duti_ms + = + `g_time_diff_ms +(& +de_aim_t_tm +, & +cu_tm +); + +2850 +aim + = +DIRECT_RECLAIM +; + +2851 } i( +_kswd_aim +) { + +2852 +_pgsn_kswd + = +vs +. +fld +. +pgsn_kswd +; + +2853 +_pgfl + = +vs +. +fld +. +pgfl +; + +2854 +aim + = +KSWAPD_RECLAIM +; + +2855 } i(( +wkgt_u_fe + = +ev_wkgt_u +) && + +2856 ( +sour + = +PSI +)) { + +2861  +no_kl +; + +2864 +ev_wkgt_u + = +wkgt_u_fe +; + +2877 +s_thshg_t_ms + = + `g_time_diff_ms +(& +thshg_t_tm +, & +cu_tm +); + +2878 i( +s_thshg_t_ms + > +THRASHING_RESET_INTERVAL_MS +) { + +2879  +wdows_sd +; + +2881 +ev_thsh_growth + = ( +wkgt_u_fe + - +_ws_u +) * 100 + +2882 / ( +ba_fe_u + + 1); + +2883 +wdows_sd + = ( +s_thshg_t_ms + / +THRASHING_RESET_INTERVAL_MS +); + +2889 i( +wdows_sd + > 1 || +ev_thsh_growth + < +thshg_lim +) { + +2890 +ev_thsh_growth + >> +wdows_sd +; + +2894 +ba_fe_u + = +vs +. +fld +. +_aive_fe + + vs.fld. +_aive_fe +; + +2895 +_ws_u + = +wkgt_u_fe +; + +2896 +thshg_t_tm + = +cu_tm +; + +2897 +thshg_lim + = +thshg_lim_p +; + +2900 +thshg + = ( +wkgt_u_fe + - +_ws_u +* 100 / ( +ba_fe_u + + 1); + +2903 +thshg + + +ev_thsh_growth +; + +2904 i( +max_thshg + < +thshg +) { + +2905 +max_thshg + = +thshg +; + +2908 +upde_wmks +: + +2915 i( +wmks +. +high_wmk + =0 || (! +mem_evt_upde_zefo_su܋d + && + +2916 + `g_time_diff_ms +(& +wmk_upde_tm +, & +cu_tm +) > 60000)) { + +2917  +zefo + +zi +; + +2919 i( + `upde_zefo_wmks +(& +zi +) < 0) { + +2922 +wmk_upde_tm + = +cu_tm +; + +2926 +wmk + = + `g_lowe_wmk +(& +mi +, & +wmks +); + +2928 i(! + `psi_r_mem +(& +psi_da +)) { + +2929 +il_l + = +psi_da +. +mem_s +[ +PSI_FULL +]. +avg10 + > () +l_lim_il +; + +2935 i( +sour + = +VENDOR +) { + +2936  +vd_kl_as + = +da +. +vd_evt +. +evt_da +. +vd_kl +. +as +; + +2937  +vd_kl_m_oom_sce_adj + = + +2938 +da +. +vd_evt +. +evt_da +. +vd_kl +. +m_oom_sce_adj +; + +2939 i( +vd_kl_as + < 0 || + +2940 +vd_kl_as + > +VENDOR_KILL_REASON_END + || + +2941 +vd_kl_m_oom_sce_adj + < 0) { + +2942 + `ALOGE +("Invalid vendor killeason %d, min_oom_score_adj %d", + +2943 +vd_kl_as +, +vd_kl_m_oom_sce_adj +); + +2947 +kl_as + = ( +kl_ass +)( +vd_kl_as + + +VENDOR_KILL_REASON_BASE +); + +2948 +m_sce_adj + = +vd_kl_m_oom_sce_adj +; + +2949 + `tf +( +kl_desc +, (kill_desc), + +2950 "vd kwhhas %d, m_sce_adj %d", +kl_as +, +m_sce_adj +); + +2951 } i( +cye_a_kl + && +wmk + < +WMARK_LOW +) { + +2957 +m_sce_adj + = +essu_a_kl_m_sce +; + +2958 +kl_as + = +PRESSURE_AFTER_KILL +; + +2959 + `y +( +kl_desc +, "min watermark is breachedvenfter kill", (kill_desc)); + +2960 +kl_desc +[(kill_desc) - 1] = '\0'; + +2961 } i( +v + = +VMPRESS_LEVEL_CRITICAL + && +evts + != 0) { + +2967 +kl_as + = +NOT_RESPONDING +; + +2968 + `y +( +kl_desc +, "device isotesponding", (kill_desc)); + +2969 +kl_desc +[(kill_desc) - 1] = '\0'; + +2970 } i( +sw_is_low + && +thshg + > +thshg_lim_p +) { + +2972 +kl_as + = +LOW_SWAP_AND_THRASHING +; + +2973 + `tf +( +kl_desc +, (kl_desc), "devi ilow osw (%" +PRId64 + + +2974 "kB < %" +PRId64 + "kB)ndhrashing (%" PRId64 "%%)", + +2975 + `g__sw +(& +mi +* +ge_k +, +sw_low_thshd + *age_k, +thshg +); + +2977 i( +wmk + > +WMARK_MIN + && +thshg + < +thshg_il_p +) { + +2978 +m_sce_adj + = +PERCEPTIBLE_APP_ADJ + + 1; + +2980 +check_feche + = +ue +; + +2981 } i( +sw_is_low + && +wmk + < +WMARK_HIGH +) { + +2983 +kl_as + = +LOW_MEM_AND_SWAP +; + +2984 + `tf +( +kl_desc +, (kill_desc), "%s watermark is breachednd swap isow (%" + +2985 +PRId64 + "kB < %" PRId64 "kB)", +wmk + < +WMARK_LOW + ? "min" : "low", + +2986 + `g__sw +(& +mi +* +ge_k +, +sw_low_thshd + *age_k); + +2988 i( +wmk + > +WMARK_MIN + && +thshg + < +thshg_il_p +) { + +2989 +m_sce_adj + = +PERCEPTIBLE_APP_ADJ + + 1; + +2991 } i( +wmk + < +WMARK_HIGH + && +sw_ut_max + < 100 && + +2992 ( +sw_ut + = + `lc_sw_utizi +(& +mi +)> +sw_ut_max +) { + +2997 +kl_as + = +LOW_MEM_AND_SWAP_UTIL +; + +2998 + `tf +( +kl_desc +, (kill_desc), "%s watermark is breachednd swap utilization" + +2999 " ihigh (%d%% > %d%%)", +wmk + < +WMARK_LOW + ? "min" : "low", + +3000 +sw_ut +, +sw_ut_max +); + +3001 } i( +wmk + < +WMARK_HIGH + && +thshg + > +thshg_lim +) { + +3003 +kl_as + = +LOW_MEM_AND_THRASHING +; + +3004 + `tf +( +kl_desc +, (kill_desc), "%s watermark is breachedndhrashing (%" + +3005 +PRId64 + "%%)", +wmk + < +WMARK_LOW + ? "m" : "low", +thshg +); + +3006 +cut_thshg_lim + = +ue +; + +3008 i( +thshg + < +thshg_il_p +) { + +3009 +m_sce_adj + = +PERCEPTIBLE_APP_ADJ + + 1; + +3011 +check_feche + = +ue +; + +3012 } i( +aim + = +DIRECT_RECLAIM + && +thshg + > +thshg_lim +) { + +3014 +kl_as + = +DIRECT_RECL_AND_THRASHING +; + +3015 + `tf +( +kl_desc +, (kill_desc), "device is in directeclaimndhrashing (%" + +3016 +PRId64 + "%%)", +thshg +); + +3017 +cut_thshg_lim + = +ue +; + +3019 i( +thshg + < +thshg_il_p +) { + +3020 +m_sce_adj + = +PERCEPTIBLE_APP_ADJ + + 1; + +3022 +check_feche + = +ue +; + +3023 } i( +aim + = +DIRECT_RECLAIM + && +de_aim_thshd_ms + > 0 && + +3024 +de_aim_duti_ms + > +de_aim_thshd_ms +) { + +3025 +kl_as + = +DIRECT_RECL_STUCK +; + +3026 + `tf +( +kl_desc +, (kill_desc), "device is stuck in directeclaim (%ldms > %dms)", + +3027 +de_aim_duti_ms +, +de_aim_thshd_ms +); + +3028 } i( +check_feche +) { + +3029 +t64_t + +fe_u_kb + = ( +vs +. +fld +. +_aive_fe + + vs.fld. +_aive_fe +* +ge_k +; + +3031 i( +fe_u_kb + < +feche_m_kb +) { + +3033 +kl_as + = +LOW_FILECACHE_AFTER_THRASHING +; + +3034 + `tf +( +kl_desc +, (kill_desc), + +3035 "fechilow (%" +PRId64 + "kB < %" PRId64 "kB)fterhrashing", + +3036 +fe_u_kb +, +feche_m_kb +); + +3037 +m_sce_adj + = +PERCEPTIBLE_APP_ADJ + + 1; + +3040 +check_feche + = +l +; + +3045 i( +kl_as + = +NONE + && +wmk + < +WMARK_HIGH +) { + +3046 +kl_as + = +LOW_MEM +; + +3047 + `tf +( +kl_desc +, (kill_desc), "%s watermark is breached", + +3048 +wmk + < +WMARK_LOW + ? "min" : "low"); + +3049 +m_sce_adj + = +lowmem_m_oom_sce +; + +3053 i( +kl_as + ! +NONE +) { + +3054  +kl_fo + +ki + = { + +3055 . +kl_as + = kill_reason, + +3056 . +kl_desc + = kill_desc, + +3057 . +thshg + = ()thrashing, + +3058 . +max_thshg + = max_thrashing, + +3060  +bo + +f_kl + = +ue +; + +3063 i( +f_kl +) { + +3064 +f_kl + = +l +; + +3065 +wmks +. +high_wmk + = 0; + +3066  +upde_wmks +; + +3070 i( +il_l +) { + +3071 +m_sce_adj + = 0; + +3073 + `psi_r_io +(& +psi_da +); + +3074 + `psi_r_u +(& +psi_da +); + +3075  +ges_d + = + `fd_d_kl_oss +( +m_sce_adj +, & +ki +, & +mi +, & +wi +, & +cu_tm +, & +psi_da +); + +3076 i( +ges_d + > 0) { + +3077 +klg + = +ue +; + +3078 +max_thshg + = 0; + +3079 i( +cut_thshg_lim +) { + +3084 +thshg_lim + = (thshg_lim * (100 - +thshg_lim_dey_p +)) / 100; + +3089 +no_kl +: + +3091 i( + `is_wag_f_kl +()) { + +3093 +pl_ms +-> +upde + = +POLLING_PAUSE +; + +3103 i( +evts + || +klg + || +aim + = +DIRECT_RECLAIM +) { + +3104 +pl_ms +-> +upde + = +POLLING_START +; + +3108 i( +sw_is_low + || +klg +) { + +3110 +pl_ms +-> +plg_rv_ms + = +PSI_POLL_PERIOD_SHORT_MS +; + +3113 +pl_ms +-> +plg_rv_ms + = +PSI_POLL_PERIOD_LONG_MS +; + +3115 + } +} + +3117  + $mp_evt_psi +( +da +, +ut32_t + +evts +,  +plg_ms + * +pl_ms +) { + +3118  +psi_evt_da + +evt_da + = {. +v + = ( +vmessu_v +) +da +}; + +3119 + `__mp_evt_psi +( +PSI +, +evt_da +, +evts +, +pl_ms +); + +3120 + } +} + +3122  + gd +:: +rg + + $GCgroupAribuPh +(cڡ * + +) { + +3123 +d +:: +rg + +th +; + +3124 i(! + `CgroupGAribuPh +( + +, & +th +)) { + +3125 + `ALOGE +("Unknowcgrouibu %s", + +); + +3127  +th +; + +3128 + } +} + +3132  + $mp_evt_comm +( +da +, +ut32_t + +evts +,  +plg_ms + * +pl_ms +) { + +3133  +evcou +; + +3134 +t64_t + +mem_uge +, +memsw_uge +; + +3135 +t64_t + +mem_essu +; + +3136  +memfo + +mi +; + +3137  +zefo + +zi +; + +3138  +timeec + +cu_tm +; + +3139  +kl_sk_cou + = 0; + +3140 +vmessu_v + +v + = ( vmessu_v) +da +; + +3141  +h_ + = 0, +h_fe + = 0; + +3142  +m_sce_adj +; + +3143  +m + = 0; + +3144 cڡ +d +:: +rg + +mem_uge_th + = + `GCgroupAribuPh +("MemUsage"); + +3145  +ad_da + +mem_uge_fe_da + = { + +3146 . +fame + = +mem_uge_th +. + `c_r +(), + +3147 . +fd + = -1, + +3149 cڡ +d +:: +rg + +memsw_uge_th + = + `GCgroupAribuPh +("MemAndSwapUsage"); + +3150  +ad_da + +memsw_uge_fe_da + = { + +3151 . +fame + = +memsw_uge_th +. + `c_r +(), + +3152 . +fd + = -1, + +3154  +wakeup_fo + +wi +; + +3156 +mp_evt_cou +++; + +3157 i( +debug_oss_klg +) { + +3158 + `ALOGI +("%memyssuv#%" +PRIu64 + " isriggered", + +3159 +v_me +[ +v +], +mp_evt_cou +); + +3162 i(! +u_psi_mڙs +) { + +3168  +lvl + = +VMPRESS_LEVEL_LOW +;v< +VMPRESS_LEVEL_COUNT +;vl++) { + +3169 i( +mvfd +[ +lvl +] != -1 && + +3170 + `TEMP_FAILURE_RETRY +( + `ad +( +mvfd +[ +lvl +], + +3171 & +evcou +, (evcount))) > 0 && + +3172 +evcou + > 0 && +lvl + > +v +) { + +3173 +v + = +ic_ +< +vmessu_v +>( +lvl +); + +3179 i( +u_psi_mڙs + && +evts +) { + +3181 i(! +pl_ms +-> +pl_hdr + || +da + >oll_params->poll_handler->data) { + +3182 +pl_ms +-> +plg_rv_ms + = +PSI_POLL_PERIOD_SHORT_MS +; + +3183 +pl_ms +-> +upde + = +POLLING_START +; + +3187 i( + `ock_gtime +( +CLOCK_MONOTONIC_COARSE +, & +cu_tm +) != 0) { + +3188 + `ALOGE +("Failedo get currentime"); + +3192 + `cd_wakeup_time +(& +cu_tm +, +evts + ? +Evt + : +Plg +, & +wi +); + +3194 i( +kl_timeout_ms + && + +3195 + `g_time_diff_ms +(& +ϡ_kl_tm +, & +cu_tm +< +ic_ +<>( +kl_timeout_ms +)) { + +3200 i( + `is_kl_ndg +()) { + +3201 +kl_sk_cou +++; + +3202 +wi +. +skd_wakeups +++; + +3209 + `_wa_f_oc_kl +( +ue +); + +3215 + `_wa_f_oc_kl +( +l +); + +3218 i( +kl_sk_cou + > 0) { + +3219 + `ALOGI +("%lu memoryressurevents were skippedfter kill!", + +3220 +kl_sk_cou +); + +3221 +kl_sk_cou + = 0; + +3224 i( + `memfo_r +(& +mi +< 0 || + `zefo_r +(& +zi +) < 0) { + +3225 + `ALOGE +("Failedo get free memory!"); + +3229 i( +u_m_vs +) { + +3230  +i +; + +3232 +h_ + = +mi +. +fld +. +__ges + - +zi +. +tٮrve_ges +; + +3233 i( +mi +. +fld +. +_fe_ges + > (mi.fld. +shmem + + mi.fld. +uviab + + mi.fld. +sw_ched +)) { + +3234 +h_fe + = ( +mi +. +fld +. +_fe_ges + - mi.fld. +shmem + - + +3235 +mi +. +fld +. +uviab + - mi.fld. +sw_ched +); + +3237 +h_fe + = 0; + +3240 +m_sce_adj + = +OOM_SCORE_ADJ_MAX + + 1; + +3241  +i + = 0; i < +lowmem_rgs_size +; i++) { + +3242 +m + = +lowmem_m +[ +i +]; + +3243 i( +h_ + < +m + && +h_fe + < minfree) { + +3244 +m_sce_adj + = +lowmem_adj +[ +i +]; + +3249 i( +m_sce_adj + = +OOM_SCORE_ADJ_MAX + + 1) { + +3250 i( +debug_oss_klg + && +lowmem_rgs_size +) { + +3251 + `ALOGI +("Ignore %s memoryressurevent " + +3253 +v_me +[ +v +], +h_ + * +ge_k +, +h_fe + *age_k, + +3254 () +lowmem_m +[ +lowmem_rgs_size + - 1] * +ge_k +); + +3259  +do_kl +; + +3262 i( +v + = +VMPRESS_LEVEL_LOW +) { + +3263 + `cd_low_essu_vs +(& +mi +); + +3266 i( +v_oomadj +[ +v +] > +OOM_SCORE_ADJ_MAX +) { + +3271 i(( +mem_uge + = + `g_memy_uge +(& +mem_uge_fe_da +)) < 0) { + +3272  +do_kl +; + +3274 i(( +memsw_uge + = + `g_memy_uge +(& +memsw_uge_fe_da +)) < 0) { + +3275  +do_kl +; + +3279 +mem_essu + = ( +mem_uge + * 100/ +memsw_uge +; + +3281 i( +ab_essu_upgde + && +v + ! +VMPRESS_LEVEL_CRITICAL +) { + +3283 i( +mem_essu + < +upgde_essu +) { + +3284 +v + = + `upgde_v +(level); + +3285 i( +debug_oss_klg +) { + +3286 + `ALOGI +("Evupgded%s", +v_me +[ +v +]); + +3293 i( + `g__sw +(& +mi +) >= + +3294 +mi +. +fld +. +tٮ_sw + * +sw__low_rage + / 100) { + +3297 i( +mem_essu + > +downgde_essu +) { + +3298 i( +debug_oss_klg +) { + +3299 + `ALOGI +("Ignܐ%memyssu", +v_me +[ +v +]); + +3302 } i( +v + = +VMPRESS_LEVEL_CRITICAL + && +mem_essu + > +upgde_essu +) { + +3303 i( +debug_oss_klg +) { + +3304 + `ALOGI +("Downgrade critical memoryressure"); + +3307 +v + = + `downgde_v +(level); + +3311 +do_kl +: + +3312 i( +low_m_devi +) { + +3314 i( + `fd_d_kl_oss +( +u_m_vs + ? +m_sce_adj + : +v_oomadj +[ +v +], + +3315 +NULL +, & +mi +, & +wi +, & +cu_tm +, NULL) == 0) { + +3316 i( +debug_oss_klg +) { + +3317 + `ALOGI +("Nothingo kill"); + +3321  +ges_d +; + +3322  +timeec + +ϡ_pt_tm +; + +3323  +pt_sk_cou + = 0; + +3325 i(! +u_m_vs +) { + +3327 i( +mi +. +fld +. +__ges + > +low_essu_mem +. +max___ges +) { + +3328 i( +debug_oss_klg +) { + +3329 + `ALOGI +("Ignoringressure since more memory is " + +3330 "avaab (%" +PRId64 + ")han watermark (%" PRId64 ")", + +3331 +mi +. +fld +. +__ges +, +low_essu_mem +. +max___ges +); + +3335 +m_sce_adj + = +v_oomadj +[ +v +]; + +3338 +ges_d + = + `fd_d_kl_oss +( +m_sce_adj +, +NULL +, & +mi +, & +wi +, & +cu_tm +, NULL); + +3340 i( +ges_d + =0 && +m_sce_adj + == 0) { + +3341 + `lmkd_no_kl_ndides_hook +(); + +3344 i( +ges_d + == 0) { + +3346 i( + `g_time_diff_ms +(& +ϡ_pt_tm +, & +cu_tm +< +FAIL_REPORT_RLIMIT_MS +) { + +3347 +pt_sk_cou +++; + +3353 i( +u_m_vs +) { + +3354 + `ALOGI +("Reaimed %ldkB, cache(%ldkBd fe(%" +PRId64 + "kB)-reserved(%" PRId64 "kB) " + +3356 +ges_d + * +ge_k +, + +3357 +h_fe + * +ge_k +, +mi +. +fld +. +__ges + *age_k, + +3358 +zi +. +tٮrve_ges + * +ge_k +, + +3359 +m + * +ge_k +, +m_sce_adj +); + +3361 + `ALOGI +("Reaimed %ldkBoom_sce_adj %d", +ges_d + * +ge_k +, +m_sce_adj +); + +3364 i( +pt_sk_cou + > 0) { + +3365 + `ALOGI +("Susd %lu faed kȻpts", +pt_sk_cou +); + +3366 +pt_sk_cou + = 0; + +3369 +ϡ_pt_tm + = +cu_tm +; + +3371 i( + `is_wag_f_kl +()) { + +3373 +pl_ms +-> +upde + = +POLLING_PAUSE +; + +3375 + } +} + +3377  +bo + + $_mp_psi +( +vmessu_v + +v +, +bo + +u_w_gy +) { + +3378  +fd +; + +3381 i(! +psi_thshds +[ +v +]. +thshd_ms +) { + +3382  +ue +; + +3385 +fd + = + `_psi_mڙ +( +psi_thshds +[ +v +]. +l_ty +, + +3386 +psi_thshds +[ +v +]. +thshd_ms + * +US_PER_MS +, + +3387 +PSI_WINDOW_SIZE_MS + * +US_PER_MS +); + +3389 i( +fd + < 0) { + +3390  +l +; + +3393 +vmessu_hfo +[ +v +]. +hdr + = +u_w_gy + ? +mp_evt_psi + : +mp_evt_comm +; + +3394 +vmessu_hfo +[ +v +]. +da + =evel; + +3395 i( + `gi_psi_mڙ +( +lfd +, +fd +, & +vmessu_hfo +[ +v +]) < 0) { + +3396 + `deroy_psi_mڙ +( +fd +); + +3397  +l +; + +3399 +maxevts +++; + +3400 +mvfd +[ +v +] = +fd +; + +3402  +ue +; + +3403 + } +} + +3405  + $deroy_mp_psi +( +vmessu_v + +v +) { + +3406  +fd + = +mvfd +[ +v +]; + +3408 i( +fd + < 0) { + +3412 i( + `uegi_psi_mڙ +( +lfd +, +fd +) < 0) { + +3413 + `ALOGE +("Failedo unregistersi monitor for %s memoryressure;rrno=%d", + +3414 +v_me +[ +v +], +o +); + +3416 +maxevts +--; + +3417 + `deroy_psi_mڙ +( +fd +); + +3418 +mvfd +[ +v +] = -1; + +3419 + } +} + +3421 as + cMemcgVsi + { + +3422 + mkNFound +, + +3423 + mkV1 +, + +3424 + mkV2 +, + +3427  +MemcgVsi + + $__memcg_vsi +() { + +3428 +d +:: +rg + +cgroupv2_th +, +memcg_th +; + +3430 i(! + `CgroupGCڌrPh +("memy", & +memcg_th +)) { + +3431  +MemcgVsi +:: +kNFound +; + +3433  + `CgroupGCڌrPh +( +CGROUPV2_HIERARCHY_NAME +, & +cgroupv2_th +) && + +3434 +cgroupv2_th + = +memcg_th + + +3435 ? +MemcgVsi +:: +kV2 + + +3436 : +MemcgVsi +:: +kV1 +; + +3437 + } +} + +3439  +MemcgVsi + + $memcg_vsi +() { + +3440  +MemcgVsi + +vsi + = + `__memcg_vsi +(); + +3442  +vsi +; + +3443 + } +} + +3445  + $memevt_li_nifiti +( +da + +__unud +, +ut32_t + +evts + __unused, + +3446  +plg_ms +* +pl_ms +) { + +3447  +timeec + +cu_tm +; + +3448 +d +:: +ve +< +mem_evt_t +> +mem_evts +; + +3450 i( + `ock_gtime +( +CLOCK_MONOTONIC_COARSE +, & +cu_tm +) != 0) { + +3451 +de_aim_t_tm +. +tv_c + = 0; + +3452 +de_aim_t_tm +. +tv_nc + = 0; + +3453 + `ALOGE +("Failedo get currentime for memeventistenerotification."); + +3457 i(! +memevt_li +-> + `gMemEvts +( +mem_evts +)) { + +3458 +de_aim_t_tm +. +tv_c + = 0; + +3459 +de_aim_t_tm +. +tv_nc + = 0; + +3460 + `ALOGE +("Failed fetching memoryistenervents."); + +3464 cڡ +mem_evt_t +& +mem_evt + : +mem_evts +) { + +3465  +mem_evt +. +ty +) { + +3467  +MEM_EVENT_DIRECT_RECLAIM_BEGIN +: + +3468 +de_aim_t_tm + = +cu_tm +; + +3470  +MEM_EVENT_DIRECT_RECLAIM_END +: + +3471 +de_aim_t_tm +. +tv_c + = 0; + +3472 +de_aim_t_tm +. +tv_nc + = 0; + +3476  +MEM_EVENT_KSWAPD_WAKE +: + +3477 +kswd_t_tm + = +cu_tm +; + +3479  +MEM_EVENT_KSWAPD_SLEEP +: + +3480 +kswd_t_tm +. +tv_c + = 0; + +3481 +kswd_t_tm +. +tv_nc + = 0; + +3483  +MEM_EVENT_VENDOR_LMK_KILL +: { + +3484  +psi_evt_da + +evt_da + = {. +vd_evt + = +mem_evt +}; + +3485 + `__mp_evt_psi +( +VENDOR +, +evt_da +, 0, +pl_ms +); + +3488  +MEM_EVENT_UPDATE_ZONEINFO +: { + +3489  +zefo + +zi +; + +3490 + `upde_zefo_wmks +(& +zi +); + +3495 + } +} + +3497  +bo + + $_memevt_li_mڙܚg +() { + +3498  +evt_hdr_fo + +de_aim_pl_hfo + = {0, + +3499 +memevt_li_nifiti +}; + +3501 i( +memevt_li + +ue +; + +3504 +droid +:: +bpf +:: + `waFProgsLded +(); + +3505 +memevt_li + = +d +:: +make_unique +< +droid +:: +bpf +:: +memevts +:: +MemEvtLi +>( + +3506 +droid +:: +bpf +:: +memevts +:: +MemEvtCl +:: +LMKD +); + +3508 i(! +memevt_li +-> + `ok +()) { + +3509 + `ALOGE +("Failedo initialize memeventsistener"); + +3510 +memevt_li +. + `t +(); + +3511  +l +; + +3514 i(! +memevt_li +-> + `giEvt +( +MEM_EVENT_DIRECT_RECLAIM_BEGIN +) || + +3515 ! +memevt_li +-> + `giEvt +( +MEM_EVENT_DIRECT_RECLAIM_END +)) { + +3516 + `ALOGE +("Failedoegister directeclaim memevents"); + +3517 +memevt_li +. + `t +(); + +3518  +l +; + +3520 i(! +memevt_li +-> + `giEvt +( +MEM_EVENT_KSWAPD_WAKE +) || + +3521 ! +memevt_li +-> + `giEvt +( +MEM_EVENT_KSWAPD_SLEEP +)) { + +3522 + `ALOGE +("Failedoegister kswapd memevents"); + +3523 +memevt_li +. + `t +(); + +3524  +l +; + +3527 i(! +memevt_li +-> + `giEvt +( +MEM_EVENT_VENDOR_LMK_KILL +)) { + +3528 + `ALOGI +("Failedoegisterndroid_vendor_kill memevents"); + +3531 i(! +memevt_li +-> + `giEvt +( +MEM_EVENT_UPDATE_ZONEINFO +)) { + +3532 +mem_evt_upde_zefo_su܋d + = +l +; + +3533 + `ALOGI +("update_zoneinfo memeventsreot supported"); + +3535 +mem_evt_upde_zefo_su܋d + = +ue +; + +3538  +memevt_li_fd + = +memevt_li +-> + `gRgBufrFd +(); + +3539 i( +memevt_li_fd + < 0) { + +3540 +memevt_li +. + `t +(); + +3541 + `ALOGE +("Invid memevt_li fd: %d", +memevt_li_fd +); + +3542  +l +; + +3545  +l_evt + +ev +; + +3546 +ev +. +evts + = +EPOLLIN +; + +3547 +ev +. +da +. +r + = (*)& +de_aim_pl_hfo +; + +3548 i( + `l_l +( +lfd +, +EPOLL_CTL_ADD +, +memevt_li_fd +, & +ev +) < 0) { + +3549 + `ALOGE +("Faedegig memevt_li fd: %d;no=%d", +memevt_li_fd +, +o +); + +3550 +memevt_li +. + `t +(); + +3551  +l +; + +3554 +de_aim_t_tm +. +tv_c + = 0; + +3555 +de_aim_t_tm +. +tv_nc + = 0; + +3557 +maxevts +++; + +3558  +ue +; + +3559 + } +} + +3561  +bo + + $_psi_mڙs +() { + +3569 +bo + +u_w_gy + = + +3570 + `GET_LMK_PROPERTY +( +bo +, "u_w_gy", +low_m_devi + || ! +u_m_vs +); + +3571 i(! +u_w_gy + && + `memcg_vsi +(! +MemcgVsi +:: +kV1 +) { + +3572 + `ALOGE +("Old kill strategy can only be used with v1 cgroup hierarchy"); + +3573  +l +; + +3576 i( +u_w_gy +) { + +3578 +psi_thshds +[ +VMPRESS_LEVEL_LOW +]. +thshd_ms + = 0; + +3579 +psi_thshds +[ +VMPRESS_LEVEL_MEDIUM +]. +thshd_ms + = +psi_l_l_ms +; + +3580 +psi_thshds +[ +VMPRESS_LEVEL_CRITICAL +]. +thshd_ms + = +psi_come_l_ms +; + +3583 i(! + `_mp_psi +( +VMPRESS_LEVEL_LOW +, +u_w_gy +)) { + +3584  +l +; + +3586 i(! + `_mp_psi +( +VMPRESS_LEVEL_MEDIUM +, +u_w_gy +)) { + +3587 + `deroy_mp_psi +( +VMPRESS_LEVEL_LOW +); + +3588  +l +; + +3590 i(! + `_mp_psi +( +VMPRESS_LEVEL_CRITICAL +, +u_w_gy +)) { + +3591 + `deroy_mp_psi +( +VMPRESS_LEVEL_MEDIUM +); + +3592 + `deroy_mp_psi +( +VMPRESS_LEVEL_LOW +); + +3593  +l +; + +3595  +ue +; + +3596 + } +} + +3598  +bo + + $_mp_comm +( +vmessu_v + +v +) { + +3601 i( + `memcg_vsi +(! +MemcgVsi +:: +kV1 +) { + +3602 + `ALOGE +("%s: glob mڙܚg ilyvaab f܁hv1 cgrouhrchy", +__func__ +); + +3603  +l +; + +3606  +mpfd +; + +3607  +evfd +; + +3608  +evlfd +; + +3609  +buf +[256]; + +3610  +l_evt + +ev +; + +3611  +t +; + +3612  +v_idx + = () +v +; + +3613 cڡ * +vr + = +v_me +[ +v_idx +]; + +3616 +mpfd + = + `ݒ +( + `GCgroupAribuPh +("MemPssuLev"). + `c_r +(), +O_RDONLY + | +O_CLOEXEC +); + +3617 i( +mpfd + < 0) { + +3618 + `ALOGI +("Nkmemy.essu_v su܈Ӽno=%d)", +o +); + +3619  +r_ݒ_mpfd +; + +3622 +evlfd + = + `ݒ +( + `GCgroupAribuPh +("MemCgroupEvtCڌ"). + `c_r +(), +O_WRONLY + | +O_CLOEXEC +); + +3623 i( +evlfd + < 0) { + +3624 + `ALOGI +("Nkmemy cgrouevcڌ (o=%d)", +o +); + +3625  +r_ݒ_evlfd +; + +3628 +evfd + = + `evtfd +(0, +EFD_NONBLOCK + | +EFD_CLOEXEC +); + +3629 i( +evfd + < 0) { + +3630 + `ALOGE +("evtfd faed f܆ev %s;no=%d", +vr +, +o +); + +3631  +r_evtfd +; + +3634 +t + = + `tf +( +buf +, (buf), "%d %d %s", +evfd +, +mpfd +, +vr +); + +3635 i( +t + >( +ssize_t +)( +buf +)) { + +3636 + `ALOGE +("cgroup.evt_cڌކovow f܆ev %s", +vr +); + +3637  +r +; + +3640 +t + = + `TEMP_FAILURE_RETRY +( + `wre +( +evlfd +, +buf +, + ` +(buf) + 1)); + +3641 i( +t + == -1) { + +3642 + `ALOGE +("cgroup.event_control write failed forevel %s;rrno=%d", + +3643 +vr +, +o +); + +3644  +r +; + +3647 +ev +. +evts + = +EPOLLIN +; + +3649 +vmessu_hfo +[ +v_idx +]. +da + =evel_idx; + +3650 +vmessu_hfo +[ +v_idx +]. +hdr + = +mp_evt_comm +; + +3651 +ev +. +da +. +r + = (*)& +vmessu_hfo +[ +v_idx +]; + +3652 +t + = + `l_l +( +lfd +, +EPOLL_CTL_ADD +, +evfd +, & +ev +); + +3653 i( +t + == -1) { + +3654 + `ALOGE +("l_f܆ev %ed;no=%d", +vr +, +o +); + +3655  +r +; + +3657 +maxevts +++; + +3658 +mvfd +[ +v +] = +evfd +; + +3659 + `o +( +evlfd +); + +3660  +ue +; + +3662 +r +: + +3663 + `o +( +evfd +); + +3664 +r_evtfd +: + +3665 + `o +( +evlfd +); + +3666 +r_ݒ_evlfd +: + +3667 + `o +( +mpfd +); + +3668 +r_ݒ_mpfd +: + +3669  +l +; + +3670 + } +} + +3672  + $deroy_mp_comm +( +vmessu_v + +v +) { + +3673  +l_evt + +ev +; + +3674  +fd + = +mvfd +[ +v +]; + +3676 i( +fd + < 0) { + +3680 i( + `l_l +( +lfd +, +EPOLL_CTL_DEL +, +fd +, & +ev +)) { + +3682 + `ALOGE +("l_f܆ev %ed;no=%d", +v_me +[ +v +], +o +); + +3684 +maxevts +--; + +3685 + `o +( +fd +); + +3686 +mvfd +[ +v +] = -1; + +3687 + } +} + +3689  + $kl_evt_hdr +( +da + +__unud +, +ut32_t + +evts + __unused, + +3690  +plg_ms + * +pl_ms + +__unud +) { + +3691 + `pl_kl +( +kpl_fd +); + +3692 + } +} + +3694  +bo + + $_mڙs +() { + +3695 + `ALOGI +("Wakeucou iom %" +PRIu64 + "0", +mp_evt_cou +); + +3696 +mp_evt_cou + = 0; + +3698 +u_psi_mڙs + = + `GET_LMK_PROPERTY +( +bo +, "u_psi", +ue +) && + +3699 + `_psi_mڙs +(); + +3701 i(! +u_psi_mڙs + && + +3702 (! + `_mp_comm +( +VMPRESS_LEVEL_LOW +) || + +3703 ! + `_mp_comm +( +VMPRESS_LEVEL_MEDIUM +) || + +3704 ! + `_mp_comm +( +VMPRESS_LEVEL_CRITICAL +))) { + +3705 + `ALOGE +("Kernel doesot support memoryressurevents or in-kernelow memory killer"); + +3706  +l +; + +3708 i( +u_psi_mڙs +) { + +3709 + `ALOGI +("Usingsi monitors for memoryressure detection"); + +3711 + `ALOGI +("Using vmpressure for memoryressure detection"); + +3714 +mڙs_lized + = +ue +; + +3715  +ue +; + +3716 + } +} + +3718  + $deroy_mڙs +() { + +3719 i( +u_psi_mڙs +) { + +3720 + `deroy_mp_psi +( +VMPRESS_LEVEL_CRITICAL +); + +3721 + `deroy_mp_psi +( +VMPRESS_LEVEL_MEDIUM +); + +3722 + `deroy_mp_psi +( +VMPRESS_LEVEL_LOW +); + +3724 + `deroy_mp_comm +( +VMPRESS_LEVEL_CRITICAL +); + +3725 + `deroy_mp_comm +( +VMPRESS_LEVEL_MEDIUM +); + +3726 + `deroy_mp_comm +( +VMPRESS_LEVEL_LOW +); + +3728 + } +} + +3730  + $dr__comm +() { + +3731 + `o +( +_comm_fd +[0]); + +3732 + `o +( +_comm_fd +[1]); + +3733 + } +} + +3735  +bo + + $tup__comm +() { + +3736 i( + `pe +( +_comm_fd +)) { + +3737 + `ALOGE +("ped: %s", + ` +( +o +)); + +3738  +l +; + +3742  +ags + = + `f +( +_comm_fd +[0], +F_GETFL +); + +3743 i( + `f +( +_comm_fd +[0], +F_SETFL +, +ags + | +O_NONBLOCK +)) { + +3744 + `ALOGE +("f faed: %s", + ` +( +o +)); + +3745 + `dr__comm +(); + +3746  +l +; + +3749  +ue +; + +3750 + } +} + +3752  +bo + + $_ +() { + +3753 i(! + +. + `is_g_su܋d +()) { + +3754 + `ALOGI +("Processeaping isot supported"); + +3755  +l +; + +3758 i(! + `tup__comm +()) { + +3759 + `ALOGE +("Failedo createhread communication channel"); + +3760  +l +; + +3764  +l_evt + +ev +; + +3765  +evt_hdr_fo + +kl_ed_hfo + = { 0, +kl__hdr + }; + +3766 +ev +. +evts + = +EPOLLIN +; + +3767 +ev +. +da +. +r + = (*)& +kl_ed_hfo +; + +3768 i( + `l_l +( +lfd +, +EPOLL_CTL_ADD +, +_comm_fd +[0], & +ev +)) { + +3769 + `ALOGE +("l_ed: %s", + ` +( +o +)); + +3770 + `dr__comm +(); + +3771  +l +; + +3774 i(! + +. + ` +( +_comm_fd +[1])) { + +3775 + `ALOGE +("Failedo initializeeaper object"); + +3776 i( + `l_l +( +lfd +, +EPOLL_CTL_DEL +, +_comm_fd +[0], & +ev +)) { + +3777 + `ALOGE +("l_ed: %s", + ` +( +o +)); + +3779 + `dr__comm +(); + +3780  +l +; + +3782 +maxevts +++; + +3784  +ue +; + +3785 + } +} + +3787  + $ +() { + +3788  +evt_hdr_fo + +kl_pl_hfo + = { 0, +kl_evt_hdr + }; + +3789  +ad_da + +fe_da + = { + +3790 . +fame + = +ZONEINFO_PATH +, + +3791 . +fd + = -1, + +3793  +l_evt + +ev +; + +3794  +pidfd +; + +3795  +i +; + +3796  +t +; + +3799 +gesize + = + `ggesize +(); + +3800 +ge_k + = +gesize + / 1024; + +3802 +lfd + = + `l_ +( +MAX_EPOLL_EVENTS +); + +3803 i( +lfd + == -1) { + +3804 + `ALOGE +("l_ faed (o=%d)", +o +); + +3809  +i + = 0; i < +MAX_DATA_CONN +; i++) { + +3810 +da_sock +[ +i +]. +sock + = -1; + +3813 +_sock +. +sock + = + `droid_g_cڌ_sock +("lmkd"); + +3814 i( +_sock +. +sock + < 0) { + +3815 + `ALOGE +("getmkd control socket failed"); + +3819 +t + = + `li +( +_sock +. +sock +, +MAX_DATA_CONN +); + +3820 i( +t + < 0) { + +3821 + `ALOGE +("lmkd cڌ socki faed (o=%d)", +o +); + +3825 +ev +. +evts + = +EPOLLIN +; + +3826 +_sock +. +hdr_fo +. +hdr + = +_c_hdr +; + +3827 +ev +. +da +. +r + = (*)&( +_sock +. +hdr_fo +); + +3828 i( + `l_l +( +lfd +, +EPOLL_CTL_ADD +, +_sock +. +sock +, & +ev +) == -1) { + +3829 + `ALOGE +("l_f܆mkd cڌ sock faed (o=%d)", +o +); + +3832 +maxevts +++; + +3834 +has_kl_modu + = ! + `acss +( +INKERNEL_MINFREE_PATH +, +W_OK +); + +3835 +u_kl_r + = +has_kl_modu +; + +3837 i( +u_kl_r +) { + +3838 + `ALOGI +("Using in-kernelow memory killer interface"); + +3839 i( + `_pl_kl +()) { + +3840 +ev +. +evts + = +EPOLLIN +; + +3841 +ev +. +da +. +r + = (*)& +kl_pl_hfo +; + +3842 i( + `l_l +( +lfd +, +EPOLL_CTL_ADD +, +kpl_fd +, & +ev +) != 0) { + +3843 + `ALOGE +("l_f܆mkvted (o=%d)", +o +); + +3844 + `o +( +kpl_fd +); + +3845 +kpl_fd + = -1; + +3847 +maxevts +++; + +3849 + `ݔty_t +("sys.lmk.reportkills", "1"); + +3856 i(! +day_mڙs_u_bo + || + `ݔty_g_bo +("sys.bo_comed", +l +)) { + +3857 i(! + `_mڙs +()) { + +3862 + `ݔty_t +("sys.lmk.reportkills", "1"); + +3865  +i + = 0; i < + `ADJTOSLOT +( +OOM_SCORE_ADJ_MAX +); i++) { + +3866 +odj_li +[ +i +]. +xt + = &procadjslot_list[i]; + +3867 +odj_li +[ +i +]. +ev + = &procadjslot_list[i]; + +3870 + `memt +( +klt_idx +, +KILLCNT_INVALID_IDX +, (killcnt_idx)); + +3876 i( + `ad_fe +(& +fe_da += +NULL +) { + +3877 + `ALOGE +("Faedػad %s: %s", +fe_da +. +fame +, + ` +( +o +)); + +3881 +pidfd + = + `TEMP_FAILURE_RETRY +( + `pidfd_ݒ +( + `gpid +(), 0)); + +3882 i( +pidfd + < 0) { + +3883 +pidfd_su܋d + = ( +o + ! +ENOSYS +); + +3885 +pidfd_su܋d + = +ue +; + +3886 + `o +( +pidfd +); + +3888 + `ALOGI +("Prosplg i%s", +pidfd_su܋d + ? "supported" : "not supported" ); + +3890 i(! + `lmkd__hook +()) { + +3891 + `ALOGE +("Failedo initialize LMKD hooks."); + +3896 + } +} + +3898  +bo + + $plg_ud +( +plg_ms + * +pl_ms +) { + +3899  +pl_ms +-> +ud_hdr + ! +NULL +; + +3900 + } +} + +3902  + $sume_plg +( +plg_ms + * +pl_ms +,  +timeec + +cu_tm +) { + +3903 +pl_ms +-> +pl_t_tm + = +cu_tm +; + +3904 +pl_ms +-> +pl_hdr + =l_ms-> +ud_hdr +; + +3905 +pl_ms +-> +plg_rv_ms + = +PSI_POLL_PERIOD_SHORT_MS +; + +3906 +pl_ms +-> +ud_hdr + = +NULL +; + +3907 + } +} + +3909  + $_hdr +( +evt_hdr_fo +* +hdr_fo +, + +3910  +plg_ms + * +pl_ms +, +ut32_t + +evts +) { + +3911  +timeec + +cu_tm +; + +3913 +wchdog +. + `t +(); + +3914 +pl_ms +-> +upde + = +POLLING_DO_NOT_CHANGE +; + +3915 +hdr_fo +-> + `hdr +(hdr_fo-> +da +, +evts +, +pl_ms +); + +3916 + `ock_gtime +( +CLOCK_MONOTONIC_COARSE +, & +cu_tm +); + +3917 i( +pl_ms +-> +pl_hdr + = +hdr_fo +) { + +3918 +pl_ms +-> +ϡ_pl_tm + = +cu_tm +; + +3921  +pl_ms +-> +upde +) { + +3922  +POLLING_START +: + +3928 +pl_ms +-> +pl_t_tm + = +cu_tm +; + +3929 +pl_ms +-> +pl_hdr + = +hdr_fo +; + +3930 +pl_ms +-> +ϡ_pl_tm + = +cu_tm +; + +3932  +POLLING_PAUSE +: + +3933 +pl_ms +-> +ud_hdr + = +hdr_fo +; + +3934 +pl_ms +-> +pl_hdr + = +NULL +; + +3936  +POLLING_RESUME +: + +3937 + `sume_plg +( +pl_ms +, +cu_tm +); + +3939  +POLLING_DO_NOT_CHANGE +: + +3940 i( +pl_ms +-> +pl_hdr + && + +3941 + `g_time_diff_ms +(& +pl_ms +-> +pl_t_tm +, & +cu_tm +> +PSI_WINDOW_SIZE_MS +) { + +3943 +pl_ms +-> +pl_hdr + = +NULL +; + +3947 +wchdog +. + ` +(); + +3948 + } +} + +3950  + $malo +() { + +3951  +evt_hdr_fo +* +hdr_fo +; + +3952  +plg_ms + +pl_ms +; + +3953  +timeec + +cu_tm +; + +3954  +l_evt + * +evt +; + +3955  +day + = -1; + +3957 +pl_ms +. +pl_hdr + = +NULL +; + +3958 +pl_ms +. +ud_hdr + = +NULL +; + +3961  +l_evt + +evts +[ +MAX_EPOLL_EVENTS +]; + +3962  +vts +; + +3963  +i +; + +3965 i( +pl_ms +. +pl_hdr +) { + +3966 +bo + +pl_now +; + +3968 + `ock_gtime +( +CLOCK_MONOTONIC_COARSE +, & +cu_tm +); + +3969 i( +pl_ms +. +upde + = +POLLING_RESUME +) { + +3971 +pl_now + = +ue +; + +3972 +vts + = 0; + +3975 +day + = + `g_time_diff_ms +(& +pl_ms +. +ϡ_pl_tm +, & +cu_tm +); + +3976 +day + = (day < +pl_ms +. +plg_rv_ms +) ? + +3977 +pl_ms +. +plg_rv_ms + - +day + :oll_params.polling_interval_ms; + +3980 +vts + = + `l_wa +( +lfd +, +evts +, +maxevts +, +day +); + +3983 + `ock_gtime +( +CLOCK_MONOTONIC_COARSE +, & +cu_tm +); + +3984 +pl_now + = ( + `g_time_diff_ms +(& +pl_ms +. +ϡ_pl_tm +, & +cu_tm +) >= + +3985 +pl_ms +. +plg_rv_ms +); + +3987 i( +pl_now +) { + +3988 + `_hdr +( +pl_ms +. +pl_hdr +, &poll_params, 0); + +3991 i( +kl_timeout_ms + && + `is_wag_f_kl +()) { + +3992 + `ock_gtime +( +CLOCK_MONOTONIC_COARSE +, & +cu_tm +); + +3993 +day + = +kl_timeout_ms + - + `g_time_diff_ms +(& +ϡ_kl_tm +, & +cu_tm +); + +3995 +vts + = ( +day + > 0? + `l_wa +( +lfd +, +evts +, +maxevts +, delay) : 0; + +3996 i( +vts + == 0) { + +3998 + `_wa_f_oc_kl +( +l +); + +3999 i( + `plg_ud +(& +pl_ms +)) { + +4000 + `ock_gtime +( +CLOCK_MONOTONIC_COARSE +, & +cu_tm +); + +4001 +pl_ms +. +upde + = +POLLING_RESUME +; + +4002 + `sume_plg +(& +pl_ms +, +cu_tm +); + +4007 +vts + = + `l_wa +( +lfd +, +evts +, +maxevts +, -1); + +4011 i( +vts + == -1) { + +4012 i( +o + = +EINTR +) + +4014 + `ALOGE +("l_wa faed (o=%d)", +o +); + +4025  +i + = 0, +evt + = & +evts +[0]; i < +vts +; ++i,vt++) { + +4026 i(( +evt +-> +evts + & +EPOLLHUP +&&vt-> +da +. +r +) { + +4027 +hdr_fo + = ( +evt_hdr_fo +*) +evt +-> +da +. +r +; + +4028 i( +hdr_fo +-> +hdr + = +kl_de_hdr +) { + +4029 + `_hdr +( +hdr_fo +, & +pl_ms +, +evt +-> +evts +); + +4031 + `ALOGI +("lmkd data connection dropped"); + +4032 +wchdog +. + `t +(); + +4033 + `_da_o +( +hdr_fo +-> +da +); + +4034 +wchdog +. + ` +(); + +4040  +i + = 0, +evt + = & +evts +[0]; i < +vts +; ++i,vt++) { + +4041 i( +evt +-> +evts + & +EPOLLERR +) { + +4042 + `ALOGD +("EPOLLERR oev#%d", +i +); + +4044 i( +evt +-> +evts + & +EPOLLHUP +) { + +4048 i( +evt +-> +da +. +r +) { + +4049 +hdr_fo + = ( +evt_hdr_fo +*) +evt +-> +da +. +r +; + +4050 + `_hdr +( +hdr_fo +, & +pl_ms +, +evt +-> +evts +); + +4054 + } +} + +4056  + $issue_ +() { + +4057  +sock +; + +4059 +sock + = + `lmkd_c +(); + +4060 i( +sock + < 0) { + +4061 + `ALOGE +("edclmkd: %s", + ` +( +o +)); + +4065 +upde_s_su + +s + = + `lmkd_upde_s +( +sock +); + +4066  +s +) { + +4067  +UPDATE_PROPS_SUCCESS +: + +4068 + `ALOGI +("lmkd updatedroperties successfully"); + +4070  +UPDATE_PROPS_SEND_ERR +: + +4071 + `ALOGE +("edأndmkdeque: %s", + ` +( +o +)); + +4073  +UPDATE_PROPS_RECV_ERR +: + +4074 + `ALOGE +("edػivlmkdly: %s", + ` +( +o +)); + +4076  +UPDATE_PROPS_FORMAT_ERR +: + +4077 + `ALOGE +("lmkdeply is invalid"); + +4079  +UPDATE_PROPS_FAIL +: + +4080 + `ALOGE +("lmkd failedo update itsroperties"); + +4084 + `o +( +sock +); + +4085  +s + = +UPDATE_PROPS_SUCCESS + ? 0 : -1; + +4086 + } +} + +4088  + $_bo_comed +() { + +4089  +sock +; + +4091 +sock + = + `lmkd_c +(); + +4092 i( +sock + < 0) { + +4093 + `ALOGE +("edclmkd: %s", + ` +( +o +)); + +4097 +bo_comed_nifiti_su + +s + = + `lmkd_nify_bo_comed +( +sock +); + +4099  +s +) { + +4100  +BOOT_COMPLETED_NOTIF_SUCCESS +: + +4102  +BOOT_COMPLETED_NOTIF_ALREADY_HANDLED +: + +4103 + `ALOGW +("lmkdlready handled boot-completed operations"); + +4105  +BOOT_COMPLETED_NOTIF_SEND_ERR +: + +4106 + `ALOGE +("failedo sendmkdequest: %m"); + +4108  +BOOT_COMPLETED_NOTIF_RECV_ERR +: + +4109 + `ALOGE +("failedoeceiveequest: %m"); + +4111  +BOOT_COMPLETED_NOTIF_FORMAT_ERR +: + +4112 + `ALOGE +("lmkdeply is invalid"); + +4114  +BOOT_COMPLETED_NOTIF_FAILS +: + +4115 + `ALOGE +("lmkd failedoeceive boot-completedotification"); + +4119 + `o +( +sock +); + +4120  +s + = +BOOT_COMPLETED_NOTIF_SUCCESS + ? 0 : -1; + +4121 + } +} + +4123  +bo + + $upde_s +() { + +4125 +v_oomadj +[ +VMPRESS_LEVEL_LOW +] = + +4126 + `GET_LMK_PROPERTY +( +t32 +, "low", +OOM_SCORE_ADJ_MAX + + 1); + +4127 +v_oomadj +[ +VMPRESS_LEVEL_MEDIUM +] = + +4128 + `GET_LMK_PROPERTY +( +t32 +, "medium", 800); + +4129 +v_oomadj +[ +VMPRESS_LEVEL_CRITICAL +] = + +4130 + `GET_LMK_PROPERTY +( +t32 +, "critical", 0); + +4131 +debug_oss_klg + = + `GET_LMK_PROPERTY +( +bo +, "debug", +l +); + +4134 +ab_essu_upgde + = + +4135 + `GET_LMK_PROPERTY +( +bo +, "il_upgde", +l +); + +4136 +upgde_essu + = + +4137 ( +t64_t +) + `GET_LMK_PROPERTY +( +t32 +, "upgrade_pressure", 100); + +4138 +downgde_essu + = + +4139 ( +t64_t +) + `GET_LMK_PROPERTY +( +t32 +, "downgrade_pressure", 100); + +4140 +kl_hv_sk + = + +4141 + `GET_LMK_PROPERTY +( +bo +, "kl_hv_sk", +l +); + +4142 +low_m_devi + = + `ݔty_g_bo +("ro.cfig.low_m", +l +); + +4143 +kl_timeout_ms + = + +4144 () + `GET_LMK_PROPERTY +( +t32 +, "kill_timeout_ms", 100); + +4145 +essu_a_kl_m_sce + = + +4146 () + `GET_LMK_PROPERTY +( +t32 +, "pressure_after_kill_min_score", 0); + +4147 +u_m_vs + = + +4148 + `GET_LMK_PROPERTY +( +bo +, "u_m_vs", +l +); + +4149 +r_p_memcg + = + +4150 + `ݔty_g_bo +("ro.cfig.r_p_memcg", +low_m_devi +); + +4151 +sw__low_rage + = + `amp +(0, 100, + `GET_LMK_PROPERTY +( +t32 +, "swap_free_low_percentage", + +4152 +DEF_LOW_SWAP +)); + +4153 +psi_l_l_ms + = + `GET_LMK_PROPERTY +( +t32 +, "psi_partial_stall_ms", + +4154 +low_m_devi + ? +DEF_PARTIAL_STALL_LOWRAM + : +DEF_PARTIAL_STALL +); + +4155 +psi_come_l_ms + = + `GET_LMK_PROPERTY +( +t32 +, "psi_complete_stall_ms", + +4156 +DEF_COMPLETE_STALL +); + +4157 +thshg_lim_p + = + +4158 +d +:: + `max +(0, + `GET_LMK_PROPERTY +( +t32 +, "thrashing_limit", + +4159 +low_m_devi + ? +DEF_THRASHING_LOWRAM + : +DEF_THRASHING +)); + +4160 +thshg_lim_dey_p + = + `amp +(0, 100, + `GET_LMK_PROPERTY +( +t32 +, "thrashing_limit_decay", + +4161 +low_m_devi + ? +DEF_THRASHING_DECAY_LOWRAM + : +DEF_THRASHING_DECAY +)); + +4162 +thshg_il_p + = +d +:: + `max +( + +4163 0, + `GET_LMK_PROPERTY +( +t32 +, "thshg_lim_il", +thshg_lim_p + * 3)); + +4164 +sw_ut_max + = + `amp +(0, 100, + `GET_LMK_PROPERTY +( +t32 +, "swap_util_max", 100)); + +4165 +feche_m_kb + = + `GET_LMK_PROPERTY +( +t64 +, "filecache_min_kb", 0); + +4166 +l_lim_il + = + `GET_LMK_PROPERTY +( +t64 +, "stall_limit_critical", 100); + +4167 +day_mڙs_u_bo + = + `GET_LMK_PROPERTY +( +bo +, "day_mڙs_u_bo", +l +); + +4168 +de_aim_thshd_ms + = + +4169 + `GET_LMK_PROPERTY +( +t64 +, "de_aim_thshd_ms", +DEF_DIRECT_RECL_THRESH_MS +); + +4170 +sw_comessi_tio + = + +4171 + `GET_LMK_PROPERTY +( +t64 +, "sw_comessi_tio", +DEF_SWAP_COMP_RATIO +); + +4172 +lowmem_m_oom_sce + = + +4173 +d +:: + `max +( +PERCEPTIBLE_APP_ADJ + + 1, + +4174 + `GET_LMK_PROPERTY +( +t32 +, "lowmem_m_oom_sce", +DEF_LOWMEM_MIN_SCORE +)); + +4176 + +. + `ab_debug +( +debug_oss_klg +); + +4179 i(! + `lmkd_upde_s_hook +()) { + +4180 + `ALOGE +("Failedo update LMKD hookrops."); + +4181  +l +; + +4184  +ue +; + +4185 + } +} + +4187  + $ma +( +gc +, ** +gv +) { + +4188 i(( +gc + > 1&& +gv +[1]) { + +4189 i(! + `rcmp +( +gv +[1], "--reinit")) { + +4190 i( + `ݔty_t +( +LMKD_REINIT_PROP +, "")) { + +4191 + `ALOGE +("Faedػ" +LMKD_REINIT_PROP + "roperty"); + +4193  + `issue_ +(); + +4194 } i(! + `rcmp +( +gv +[1], "--boot_completed")) { + +4195  + `_bo_comed +(); + +4199 i(! + `upde_s +()) { + +4200 + `ALOGE +("Failedo initializerops,xiting."); + +4204 +x + = + `_droid_logg +( +KILLINFO_LOG_TAG +); + +4206 i(! + ` +()) { + +4207 i(! +u_kl_r +) { + +4220 i( + `mlockl +( +MCL_CURRENT + | +MCL_FUTURE + | +MCL_ONFAULT +&& ( +o + ! +EINVAL +)) { + +4221 + `ALOGW +("mlocked %s", + ` +( +o +)); + +4225  +sched_m + +m + = { + +4226 . +sched_iܙy + = 1, + +4228 i( + `sched_tschedur +(0, +SCHED_FIFO +, & +m +)) { + +4229 + `ALOGW +("SCHED_FIFO faed %s", + ` +( +o +)); + +4233 i( + `_ +()) { + +4234 + `ALOGI +("Processeaper initialized with %dhreads inheool", + +4235 + +. + `thad_t +()); + +4238 i(! +wchdog +. + ` +()) { + +4239 + `ALOGE +("Failedo initializehe watchdog"); + +4242 + `malo +(); + +4245 + `droid_log_deroy +(& +x +); + +4247 + `ALOGI +("exiting"); + +4249 + } +} + + @reaper.cpp + +17  + #LOG_TAG + "lowmemykr" + + ) + +19  + ~ + +20  + ~ + +21  + ~ + +22  + ~ + +23  + ~ + +24  + ~ + +25  + ~ + +26  + ~ + +27  + ~ + +28  + ~ + +29  + ~ + +30  + ~ + +31  + ~ + +32  + ~ + +34  + ~ + +35  + ~ + +37  + ~".h +" + +39  + #NS_PER_MS + ( +NS_PER_SEC + / +MS_PER_SEC +) + + ) + +40  + #THREAD_POOL_SIZE + 2 + + ) + +42 #ide +__NR_oss_ma + + +43  + #__NR_oss_ma + 448 + + ) + +46  + $oss_ma +( +pidfd +,  +ags +) { + +47  + `sys +( +__NR_oss_ma +, +pidfd +, +ags +); + +48 + } +} + +50  +le +  + $g_time_diff_ms +( +timeec + * +om +, + +51  +timeec + * +to +) { + +52  ( +to +-> +tv_c + - +om +->tv_c* () +MS_PER_SEC + + + +53 ( +to +-> +tv_nc + - +om +->tv_nc/ () +NS_PER_MS +; + +54 + } +} + +56  +t_oss_group_d_io +( +uid_t + +uid +,  +pid +, cڡ +d +:: +ve +& +ofes +, + +57  +io +) { + +58 +DIR +* + gd +; + +59  + goc_th +[ +PATH_MAX +]; + +60  +dt +* + gde +; + +62 i(! +SProssProfesCached +( +uid +, +pid +, +ofes +)) { + +63 +ALOGW +("Faedأskrofef܁hos(%dbeg kd", +pid +); + +66 +tf +( +oc_th +, roc_th), "/oc/%d/sk", +pid +); + +67 i(!( + gd + = +ݒd +( +oc_th +))) { + +68 +ALOGW +("Faedݒ %s;no=%d:rospid(%dmighhavdd", +oc_th +, +o +, + +69 +pid +); + +73 ( + gde + = +add +( +d +))) { + +74  +t_pid +; + +76 i( + gde +-> + gd_me +[0] == '.') ; + +77 + gt_pid + = +oi +( +de +-> +d_me +); + +79 i(! + gt_pid +) { + +80 +ALOGW +("Faedg_pid f '%s' opid(%d)", +de +-> +d_me +, +pid +); + +84 i( +riܙy +( +PRIO_PROCESS +, +t_pid +, +io +&& + go + ! +ESRCH +) { + +85 +ALOGW +("Ubˁؿiriܙy oklg_pid (%d):no=%d", +t_pid +, +o +); + +88 +od +( +d +); + +91 * + $_ma +(* +m +) { + +92 +Rr + * + + = +ic_ +( +m +); + +93  +timeec + +t_tm +, +d_tm +; + +94  +Rr +:: +rg_oc + +rg +; + +95 +pid_t + +tid + = + `gtid +(); + +98 i(! + `STaskProfes +( +tid +, {"CPUSET_SP_FOREGROUND"}, +ue +)) { + +99 + `ALOGE +("Failedossign cpusetoheeaperhread"); + +102 i( + `riܙy +( +PRIO_PROCESS +, +tid +, +ANDROID_PRIORITY_HIGHEST +)) { + +103 + `ALOGW +("Ubˁؿiriܙy othhad (%d):no=%d", +tid +, +o +); + +107 +rg + = + +-> + `dequeue_que +(); + +109 i( + +-> + `debug_abd +()) { + +110 + `ock_gtime +( +CLOCK_MONOTONIC_COARSE +, & +t_tm +); + +113 i( + `pidfd_nd_sigl +( +rg +. +pidfd +, +SIGKILL +, +NULL +, 0)) { + +115 + +-> + `nify_kl_u +( +rg +. +pid +); + +116  +de +; + +119 + `t_oss_group_d_io +( +rg +. +uid +,g. +pid +, + +121 +ANDROID_PRIORITY_NORMAL +); + +123 i( + `oss_ma +( +rg +. +pidfd +, 0)) { + +124 + `ALOGE +("oss_ma %d faed: %s", +rg +. +pid +, + ` +( +o +)); + +125  +de +; + +127 i( + +-> + `debug_abd +()) { + +128 + `ock_gtime +( +CLOCK_MONOTONIC_COARSE +, & +d_tm +); + +129 + `ALOGI +("Pros%d waed i%ldms", +rg +. +pid +, + +130 + `g_time_diff_ms +(& +t_tm +, & +d_tm +)); + +133 +de +: + +134 + `o +( +rg +. +pidfd +); + +135 + +-> + `que_come +(); + +138  +NULL +; + +139 + } +} + +141 +bo + + gRr +:: + $is_g_su܋d +() { + +143 +UNKNOWN +, + +144 +SUPPORTED +, + +145 +UNSUPPORTED + + +146 } +_sut + = +UNKNOWN +; + +148 i( +_sut + = +UNKNOWN +) { + +149 i( + `oss_ma +(-1, 0&& +o + = +ENOSYS +) { + +150 +_sut + = +UNSUPPORTED +; + +152 +_sut + = +SUPPORTED +; + +155  +_sut + = +SUPPORTED +; + +156 + } +} + +158 +bo + + gRr +:: + $ +( +comm_fd +) { + +159  +me +[16]; + +160  +sched_m + +m + = { + +161 . +sched_iܙy + = 0, + +164 i( +thad_t_ + > 0) { + +166  +l +; + +169 +thad_po_ + = +w + +had_t +[ +THREAD_POOL_SIZE +]; + +170  +i + = 0; i < +THREAD_POOL_SIZE +; i++) { + +171 i( + `had_ +(& +thad_po_ +[ +thad_t_ +], +NULL +, +_ma +, +this +)) { + +172 + `ALOGE +("had_ faed: %s", + ` +( +o +)); + +176 i( + `had_tschedm +( +thad_po_ +[ +thad_t_ +], +SCHED_OTHER +, & +m +)) { + +177 + `ALOGW +("SCHED_FIFO faed %s", + ` +( +o +)); + +179 + `tf +( +me +, ame), "lmkd_%d", +thad_t_ +); + +180 i( + `had_ame_ +( +thad_po_ +[ +thad_t_ +], +me +)) { + +181 + `ALOGW +("had_ame_ faed: %s", + ` +( +o +)); + +183 +thad_t_ +++; + +186 i(! +thad_t_ +) { + +187 +de +[] +thad_po_ +; + +188  +l +; + +191 +queue_ +. + `rve +( +thad_t_ +); + +192 +comm_fd_ + = +comm_fd +; + +193  +ue +; + +194 + } +} + +196 +bo + + gRr +:: + $async_kl +(cڡ  +rg_oc +& +rg +) { + +197 i( +rg +. +pidfd + == -1) { + +198  +l +; + +201 i(! +thad_t_ +) { + +202  +l +; + +205 +mux_ +. + `lock +(); + +206 i( +aive_ques_ + > +thad_t_ +) { + +207 +mux_ +. + `uock +(); + +208  +l +; + +210 +aive_ques_ +++; + +214 +queue_ +. + `push_back +({ + `dup +( +rg +. +pidfd +),g. +pid +,g. +uid + }); + +216 +cd_ +. + `nify_e +(); + +217 +mux_ +. + `uock +(); + +219  +ue +; + +220 + } +} + +222  + gRr +:: + $kl +(cڡ  +rg_oc +& +rg +, +bo + +synchrous +) { + +224 i( +rg +. +pidfd + < 0) { + +225  :: + `kl +( +rg +. +pid +, +SIGKILL +); + +228 i(! +synchrous + && + `async_kl +( +rg +)) { + +233  +su + = + `pidfd_nd_sigl +( +rg +. +pidfd +, +SIGKILL +, +NULL +, 0); + +234 i( +su +) { + +235  +su +; + +239 + } +} + +241 + gRr +:: +rg_oc + +Rr +:: + $dequeue_que +() { + +242  +rg_oc + +rg +; + +243 +d +:: +unique_lock + + `lock +( +mux_ +); + +245  +queue_ +. + `emy +()) { + +246 +cd_ +. + `wa +( +lock +); + +248 +rg + = +queue_ +. + `back +(); + +249 +queue_ +. + `p_back +(); + +251  +rg +; + +252 + } +} + +254  + gRr +:: + $que_come +() { + +255 +d +:: +sced_lock + + `lock +( +mux_ +); + +256 +aive_ques_ +--; + +257 + } +} + +259  + gRr +:: + $nify_kl_u +( +pid +) { + +260 +d +:: +sced_lock + + `lock +( +mux_ +); + +262 + `ALOGE +("Faedkȴos%d", +pid +); + +263 i( + `TEMP_FAILURE_RETRY +( + `wre +( +comm_fd_ +, & +pid +, (pid))) != (pid)) { + +264 + `ALOGE +("thad communiti wred: %s", + ` +( +o +)); + +266 + } +} + + @reaper.h + +17 #agm + + + +19  + ~ + +20  + ~ + +21  + ~ + +23 as + cRr + { + +24 + mpublic +: + +25  + srg_oc + { + +26  +pidfd +; + +27  + mpid +; + +28 +uid_t + + muid +; + +30 + give +: + +32 +d +:: +mux + +mux_ +; + +33 + gd +:: +cdi_vb + +cd_ +; + +35 + gd +:: +ve +< +rg_oc +> +queue_ +; + +36  + gaive_ques_ +; + +38  + gcomm_fd_ +; + +39  + gthad_t_ +; + +40 +had_t +* + gthad_po_ +; + +41 +bo + + gdebug_abd_ +; + +43 +bo + +async_kl +(cڡ  +rg_oc +& +rg +); + +44 + gpublic +: + +45 + $Rr +(: + `aive_ques_ +(0), + `thad_t_ +(0), + $debug_abd_ +( +l +{ + } +} + +47  +bo + +is_g_su܋d +(); + +49 +bo + + +( +comm_fd +); + +50  + $thad_t +(cڡ {  +thad_t_ +; + } +} + +51  + $ab_debug +( +bo + +ab +{ +debug_abd_ + =b; + } +} + +52 +bo + + $debug_abd +(cڡ {  +debug_abd_ +; + } +} + +55  +kl +(cڡ  +rg_oc +& +rg +, +bo + +synchrous +); + +57 +rg_oc + +dequeue_que +(); + +58  +que_come +(); + +59  +nify_kl_u +( +pid +); + + @statslog.cpp + +17  + ~ + +18  + ~ + +19  + ~ + +20  + ~ + +21  + ~ + +22  + ~ + +23  + ~ + +24  + ~ + +25  + ~ + +26  + ~ + +27  + ~ + +28  + ~ + +29  + ~ + +30  + ~ + +31  + ~ + +33  + ~ + +35  + ~ + +36  + ~ + +38 #ifde +LMKD_LOG_STATS + + +40  + #STRINGIFY +( +x + + `STRINGIFY_INTERNAL +(x) + + ) + +41  + #STRINGIFY_INTERNAL +( +x +#x + + ) + +46  + #BUILD_BUG_ON +( +cd +(()([1 - 2 * !!(cd)])) + + ) + +48  +bo + + gab_s_log + = +ݔty_g_bo +("ro.lmk.log_s", +ue +); + +50  + soc + { + +51  + mpid +; + +52  + mskme +[ +MAX_TASKNAME_LEN +]; + +53  +oc +* + mpidhash_xt +; + +56  + #PIDHASH_SZ + 1024 + + ) + +57  +oc +** + gpidhash + = +NULL +; + +58  + #pid_hash +( +x +((((x>> 8^ (x)& ( +PIDHASH_SZ + - 1)) + + ) + +60  +oc +* + $pid_lookup +( +pid +) { + +61  +oc +* +o +; + +63 i(! +pidhash + +NULL +; + +65  +o + = +pidhash +[ + `pid_hash +( +pid +)];ro &&ro->pid !pid;ro =ro-> +pidhash_xt +) + +68  +o +; + +69 + } +} + +71  + $memy__r_le +(cڡ * +le +,  +memy_ +* +mem_ +) { + +72  +key +[ +MAX_TASKNAME_LEN + + 1]; + +73 +t64_t + +vue +; + +75 + `ssnf +( +le +, "%" + `STRINGIFY +( +MAX_TASKNAME_LEN +" %" +SCNd64 + "", +key +, & +vue +); + +77 i( + `rcmp +( +key +, "total_") < 0) { + +81 i(! + `rcmp +( +key +, "total_pgfault")) + +82 +mem_ +-> +pgu + = +vue +; + +83 i(! + `rcmp +( +key +, "total_pgmajfault")) + +84 +mem_ +-> +pgmaju + = +vue +; + +85 i(! + `rcmp +( +key +, "total_rss")) + +86 +mem_ +-> +rss__bys + = +vue +; + +87 i(! + `rcmp +( +key +, "total_cache")) + +88 +mem_ +-> +che__bys + = +vue +; + +89 i(! + `rcmp +( +key +, "total_swap")) + +90 +mem_ +-> +sw__bys + = +vue +; + +91 + } +} + +93  + $memy__om_cgroup +( +memy_ +* +mem_ +,  +pid +, +uid_t + +uid + +__unud +) { + +94 +d +:: +rg + +th +; + +95 i(! + `CgroupGAribuPhFTask +("MemSts", +pid +, & +th +)) { + +96 + `ALOGE +("Querying MemStatsath failed"); + +100 +FILE +* + + = + `fݒ +( +th +. + `c_r +(), "r"); + +102 i( + + = +NULL +) { + +106  +buf +[ +LINE_MAX +]; + +107  + `fgs +( +buf +, +LINE_MAX +, + +! +NULL +) { + +108 + `memy__r_le +( +buf +, +mem_ +); + +110 + `fo +( + +); + +113 + } +} + +115  + $memy__om_ocfs +( +memy_ +* +mem_ +,  +pid +) { + +116  +th +[ +PATH_MAX +]; + +117  +bufr +[ +PROC_STAT_BUFFER_SIZE +]; + +118  +fd +, +t +; + +120 + `tf +( +th +, թh), +PROC_STAT_FILE_PATH +, +pid +); + +121 i(( +fd + = + `ݒ +( +th +, +O_RDONLY + | +O_CLOEXEC +)) < 0) { + +125 +t + = + `ad +( +fd +, +bufr +, (buffer)); + +126 i( +t + < 0) { + +127 + `o +( +fd +); + +130 + `o +( +fd +); + +135 +t64_t + +pgu + = 0, +pgmaju + = 0, +ime + = 0; + +136 i( + `ssnf +( +bufr +, + +137 "%*u %*%*%*d %*d %*d %*d %*d %*d %" +SCNd64 + " %*d " + +138 "%" +SCNd64 + " %*d %*u %*u %*d %*d %*d %*d %*d %*d " + +139 "%" +SCNd64 + "", + +140 & +pgu +, & +pgmaju +, & +ime +) != 3) { + +143 +mem_ +-> +pgu + =gfault; + +144 +mem_ +-> +pgmaju + =gmajfault; + +145 +mem_ +-> +oss_t_time_ns + = +ime + * ( +NS_PER_SEC + / + `syscf +( +_SC_CLK_TCK +)); + +148 + } +} + +150  +memy_ + * + $s_ad_memy_ +( +bo + +r_p_memcg +,  +pid +, +uid_t + +uid +, + +151 +t64_t + +rss_bys +, i64_ +sw_bys +) { + +152  +memy_ + +mem_ + = {}; + +153 i(! +ab_s_log +) { + +154  +NULL +; + +157 i( +r_p_memcg +) { + +158 i( + `memy__om_cgroup +(& +mem_ +, +pid +, +uid +) == 0) { + +159  & +mem_ +; + +162 i( + `memy__om_ocfs +(& +mem_ +, +pid +) == 0) { + +163 +mem_ +. +rss__bys + = +rss_bys +; + +164 +mem_ +. +sw__bys + = +sw_bys +; + +165  & +mem_ +; + +168  +NULL +; + +169 + } +} + +171  + $oc_ +( +oc +* +o +) { + +172 i(! +pidhash +) { + +173 +pidhash + = +ic_ +< +oc +**>( + `oc +( +PIDHASH_SZ +, (*pidhash))); + +176  +hv + = + `pid_hash +( +o +-> +pid +); + +177 +o +-> +pidhash_xt + = +pidhash +[ +hv +]; + +178 +pidhash +[ +hv +] = +o +; + +179 + } +} + +181  + $s_move_skme +( +pid +) { + +182 i(! +ab_s_log + || ! +pidhash +) { + +186  +hv + = + `pid_hash +( +pid +); + +187  +oc +* +o +; + +188  +oc +* +evp +; + +190  +o + = +pidhash +[ +hv +], +evp + = +NULL +;ro &&ro-> +pid + !=id; + +191 +o + =ro-> +pidhash_xt +) + +192 +evp + = +o +; + +194 i(! +o +) + +197 i(! +evp +) + +198 +pidhash +[ +hv +] = +o +-> +pidhash_xt +; + +200 +evp +-> +pidhash_xt + = +o +->pidhash_next; + +202 + ` +( +o +); + +203 + } +} + +205  + $s_e_skme +( +pid +, cڡ * +skme +) { + +206 i(! +ab_s_log + || ! +skme +) { + +210  +oc +* +o + = + `pid_lookup +( +pid +); + +211 i( +o + ! +NULL +) { + +212 i( + `rcmp +( +o +-> +skme +,askname) == 0) { + +215 + `s_move_skme +( +pid +); + +217 +o + = +ic_ +< +oc +*>( + `mloc +((proc))); + +218 +o +-> +pid + =id; + +219 + `y +( +o +-> +skme +,askme, +MAX_TASKNAME_LEN + - 1); + +220 +o +-> +skme +[ +MAX_TASKNAME_LEN + - 1] = '\0'; + +221 + `oc_ +( +o +); + +222 + } +} + +224  + $s_purge_skmes +() { + +225 i(! +ab_s_log + || ! +pidhash +) { + +229  +oc +* +o +; + +230  +oc +* +xt +; + +231  +i +; + +232  +i + = 0; i < +PIDHASH_SZ +; i++) { + +233 +o + = +pidhash +[ +i +]; + +234  +o +) { + +235 +xt + = +o +-> +pidhash_xt +; + +236 + ` +( +o +); + +237 +o + = +xt +; + +240 + `memt +( +pidhash +, 0, +PIDHASH_SZ + * (*pidhash)); + +241 + } +} + +243 cڡ * + $s_g_sk_me +( +pid +) { + +244  +oc +*ro + `pid_lookup +( +pid +); + +245  +oc + ?roc-> +skme + : +NULL +; + +246 + } +} + +252  +le + +size_t + + $ck_t32 +( +LMK_KILL_OCCURRED_PACKET + +ck +, + +253 +size_t + +dex +, + +254 +t32_t + +vue +) { + +255 +t32_t +* +t_bufr + = (t32_t*)( +ck + + +dex +); + +257 * +t_bufr + = + `htl +( +vue +); + +259  +dex + + ( +t32_t +); + +260 + } +} + +266  +le + +size_t + + $ck_t64 +( +LMK_KILL_OCCURRED_PACKET + +ck +, + +267 +size_t + +dex +, + +268 +t64_t + +vue +) { + +269 +t64_t +* +t64_bufr + = (t64_t*)( +ck + + +dex +); + +271 * +t64_bufr + = + `htq +( +vue +); + +273  +dex + + ( +t64_t +); + +274 + } +} + +284  +le + +size_t + + $ck_rg +( +LMK_KILL_OCCURRED_PACKET + +ck +, + +285 +size_t + +dex +, + +286 cڡ * +vue +) { + +287 cڡ +size_t + +n_oc_me + = + `MIN +( + ` +( +vue +), +MAX_TASKNAME_LEN + - 1); + +288 +t16_t +* +sht_bufr + = (t16_t*)( +ck + + +dex +); + +289 * +sht_bufr + = + `hts +(( +t16_t +) +n_oc_me +); + +291 * +by_bufr + = (*)( +sht_bufr + + 1); + +292 + `y +( +by_bufr +, +vue +, +MAX_TASKNAME_LEN + - 1); + +293 +by_bufr +[ +MAX_TASKNAME_LEN + - 1] = '\0'; + +295  +dex + + ( +t16_t ++ +n_oc_me + + 1; + +296 + } +} + +298 +size_t + + $lmkd_ck_t_kl_occued +( +LMK_KILL_OCCURRED_PACKET + +ck +, + +299  +kl_ + *kill_stat, + +300  +memy_ + * +mem_ +) { + +301 + `BUILD_BUG_ON +(( +LMK_KILL_OCCURRED_PACKET +> +LMKD_REPLY_MAX_SIZE +); + +303 i(! +ab_s_log +) { + +307 +t32_t + +dex + = 0; + +308 +dex + = + `ck_t32 +( +ck +, index, +LMK_STAT_KILL_OCCURRED +); + +310 i( +mem_ +) { + +311 +dex + = + `ck_t64 +( +ck +, index, +mem_ +-> +pgu +); + +312 +dex + = + `ck_t64 +( +ck +, index, +mem_ +-> +pgmaju +); + +313 +dex + = + `ck_t64 +( +ck +, index, +mem_ +-> +rss__bys +); + +314 +dex + = + `ck_t64 +( +ck +, index, +mem_ +-> +che__bys +); + +315 +dex + = + `ck_t64 +( +ck +, index, +mem_ +-> +sw__bys +); + +316 +dex + = + `ck_t64 +( +ck +, index, +mem_ +-> +oss_t_time_ns +); + +318 +dex + = + `ck_t64 +( +ck +, index, -1); + +319 +dex + = + `ck_t64 +( +ck +, index, -1); + +320 +dex + = + `ck_t64 +( +ck +, index, -1); + +321 +dex + = + `ck_t64 +( +ck +, index, -1); + +322 +dex + = + `ck_t64 +( +ck +, index, -1); + +323 +dex + = + `ck_t64 +( +ck +, index, -1); + +326 +dex + = + `ck_t32 +( +ck +, index, +kl_ +-> +uid +); + +327 +dex + = + `ck_t32 +( +ck +, index, +kl_ +-> +oom_sce +); + +328 +dex + = + `ck_t32 +( +ck +, index, +kl_ +-> +m_oom_sce +); + +329 +dex + = + `ck_t32 +( +ck +, index, () +kl_ +-> +_mem_kb +); + +330 +dex + = + `ck_t32 +( +ck +, index, () +kl_ +-> +_sw_kb +); + +331 +dex + = + `ck_t32 +( +ck +, index, () +kl_ +-> +kl_as +); + +332 +dex + = + `ck_t32 +( +ck +, index, +kl_ +-> +thshg +); + +333 +dex + = + `ck_t32 +( +ck +, index, +kl_ +-> +max_thshg +); + +335 +dex + = + `ck_rg +( +ck +, index, +kl_ +-> +skme +); + +336  +dex +; + +337 + } +} + + @statslog.h + +17 #ide +_STATSLOG_H_ + + +18  + #_STATSLOG_H_ + + + ) + +20  + ~ + +22  + ~ + +23  + ~ + +24  + ~ + +25  + ~ + +26  + ~ + +28  + ~ + +29  + ~ + +31 + g__BEGIN_DECLS + + +33  + #MAX_TASKNAME_LEN + 128 + + ) + +45  + #LMKD_REPLY_MAX_SIZE + 222 + + ) + +48  + smemy_ + { + +49 +t64_t + + mpgu +; + +50 +t64_t + + mpgmaju +; + +51 +t64_t + + mrss__bys +; + +52 +t64_t + + mche__bys +; + +53 +t64_t + + msw__bys +; + +54 +t64_t + + moss_t_time_ns +; + +58 + ekl_ass + { + +59 + mNONE + = -1, + +60 + mPRESSURE_AFTER_KILL + = 0, + +61 + mNOT_RESPONDING +, + +62 + mLOW_SWAP_AND_THRASHING +, + +63 + mLOW_MEM_AND_SWAP +, + +64 + mLOW_MEM_AND_THRASHING +, + +65 + mDIRECT_RECL_AND_THRASHING +, + +66 + mLOW_MEM_AND_SWAP_UTIL +, + +67 + mLOW_FILECACHE_AFTER_THRASHING +, + +68 + mLOW_MEM +, + +69 + mDIRECT_RECL_STUCK +, + +71 + mVENDOR_KILL_REASON_BASE + = 1000, + +72 + mVENDOR_KILL_REASON_END + = +VENDOR_KILL_REASON_BASE + + +NUM_VENDOR_LMK_KILL_REASON + - 1, + +73 + mKILL_REASON_COUNT + + +77  + skl_ + { + +78 +t32_t + + muid +; + +79 cڡ * + mskme +; + +80 +kl_ass + + mkl_as +; + +81 +t32_t + + moom_sce +; + +82 +t32_t + + mm_oom_sce +; + +83 +t64_t + + m_mem_kb +; + +84 +t64_t + + m_sw_kb +; + +85 +t32_t + + mthshg +; + +86 +t32_t + + mmax_thshg +; + +90  + tLMK_KILL_OCCURRED_PACKET +[ +LMKD_REPLY_MAX_SIZE +]; + +92 #ifde +LMKD_LOG_STATS + + +94  + #PROC_STAT_FILE_PATH + "/oc/%d/" + + ) + +95  + #PROC_STAT_BUFFER_SIZE + 1024 + + ) + +96  + #BYTES_IN_KILOBYTE + 1024 + + ) + +102 +size_t + +lmkd_ck_t_kl_occued +( +LMK_KILL_OCCURRED_PACKET + +ck +, + +103  +kl_ + * +kl_ +, + +104  +memy_ + * +mem_ +); + +109  +memy_ + * +s_ad_memy_ +( +bo + +r_p_memcg +,  +pid +, +uid_t + +uid +, + +110 +t64_t + +rss_bys +, i64_ +sw_bys +); + +115  +s_e_skme +( +pid +, cڡ * +skme +); + +120  +s_purge_skmes +(); + +125  +s_move_skme +( +pid +); + +127 cڡ * +s_g_sk_me +( +pid +); + +131  +le + +size_t + + +132 + $lmkd_ck_t_kl_occued +( +LMK_KILL_OCCURRED_PACKET + +ck + +__unud +, + +133  +kl_ + * +kl_ + +__unud +, + +134  +memy_ + * +mem_ + +__unud +) { + +135  - +EINVAL +; + +136 + } +} + +138  +le +  +memy_ + * + $s_ad_memy_ +( +bo + +r_p_memcg + +__unud +, + +139  +pid + +__unud +, +uid_t + +uid + __unused, + +140 +t64_t + +rss_bys + +__unud +, i64_ +sw_bys + __unused) { + +141  +NULL +; + +142 + } +} + +144  +le +  + $s_e_skme +( +pid + +__unud +, cڡ * +skme + __unud{ + } +} + +146  +le +  + $s_purge_skmes +({ + } +} + +148  +le +  + $s_move_skme +( +pid + +__unud +{ + } +} + +150  +le + cڡ * + $s_g_sk_me +( +pid + +__unud +{  +NULL +; + } +} + +154 + g__END_DECLS + + + @tests/Android.bp + +15 + gackage + { + +16 + gu_am +: "trendy_team_android_kernel", + +17 + gu_ib_lins +: ["Android-Apache-2.0"], + +20 + gc_ + { + +23 + ged_libs +: [ + +28 +ic_libs +: [ + +30 +rg +: { + +31 +droid +: { + +32 +cs +: ["lmkd_test.cpp"], + +34 + gcags +: [ + +38 +compe_muɞib +: "first", + +41 +c_ + { + +43 +_sues +: ["device-tests"], + +44 + ge_ro +: +ue +, + +46 + ged_libs +: [ + +51 +ic_libs +: [ + +53 +rg +: { + +54 +droid +: { + +55 +cs +: ["lmkd_tests.cpp"], + +57 + gcags +: [ + +61 +compe_muɞib +: "first", + + @tests/lmkd_test.cpp + +17  + ~ + +18  + ~ + +19  + ~ + +20  + ~ + +21  + ~ + +22  + ~ + +23  + ~ + +25  + ~ + +26  + ~ + +27  + ~ + +28  + ~ + +29  + ~ + +30  + ~ + +31  + ~ + +32  + ~ + +33  + ~ + +34  + ~ + +35  + ~ + +37 +usg + +mea + + gdroid +:: +ba +; + +39  + #INKERNEL_MINFREE_PATH + "/sys/modu/lowmemykr/ms/m" + + ) + +40  + #LMKDTEST_RESPAWN_FLAG + "LMKDTEST_RESPAWN" + + ) + +42  + #LMKD_LOGCAT_MARKER + "lowmemykr" + + ) + +43  + #LMKD_KILL_MARKER_TEMPLATE + +LMKD_LOGCAT_MARKER + ": K'%s'" + + ) + +44  + #OOM_MARKER + "Ouomemy" + + ) + +45  + #OOM_KILL_MARKER + "Kdross" + + ) + +46  + #MIN_LOG_SIZE + 100 + + ) + +48  + #ONE_MB + (1 << 20) + + ) + +51  + #OOM_ADJ_MAX + 1000 + + ) + +52  + #OOM_ADJ_MIN + 0 + + ) + +53  + #OOM_ADJ_STEP + 100 + + ) + +54  + #STEP_COUNT + (( +OOM_ADJ_MAX + - +OOM_ADJ_MIN +/ +OOM_ADJ_STEP + + 1) + + ) + +56  + #ALLOC_STEP + ( +ONE_MB +) + + ) + +57  + #ALLOC_DELAY + 1000 + + ) + +60 + gd +:: +rg + + $adCommd +(cڡ +d +:: +rg +& +commd +) { + +61 +FILE +* + + = + `pݒ +( +commd +. + `c_r +(), "r"); + +62 +d +:: +rg + +cڋ +; + +63 + `RdFdToSg +( + `fo +( + +), & +cڋ +); + +64 + `po +( + +); + +65  +cڋ +; + +66 + } +} + +68 + gd +:: +rg + + $adLogt +(cڡ +d +:: +rg +& +mk +) { + +69 +d +:: +rg + +cڋ + = + `adCommd +("logcat -d -bll"); + +70 +size_t + +pos + = +cڋ +. + `fd +( +mk +); + +71 i( +pos + = +d +:: +rg +:: +os +)  ""; + +72 +cڋ +. + `a +(0, +pos +); + +73  +cڋ +; + +74 + } +} + +76 +bo + + $wreFe +(cڡ +d +:: +rg +& +fe +, const std::string& string) { + +77 i( + `guid +(= +ic_ +<>( +AID_ROOT +)) { + +78  + `WreSgToFe +( +rg +, +fe +); + +80  +rg + = + `adCommd +( + +81 "ech-'" + +rg + + "' | suoف " + +fe + + " 2>&1"); + +82 + } +} + +84 +bo + + $wreKmsg +(cڡ +d +:: +rg +& +mk +) { + +85  + `wreFe +("/dev/kmsg", +mk +); + +86 + } +} + +88 + gd +:: +rg + + $gTextAround +(cڡ +d +:: +rg +& +xt +, +size_t + +pos +, + +89 +size_t + +les_befe +, size_ +les_a +) { + +90 +size_t + +t_pos + = +pos +; + +94  +les_befe + > 0 && + +95 ( +t_pos + = +xt +. + `rfd +('\n', s_pos)! +d +:: +rg +:: +os +) { + +96 +les_befe +--; + +99 +t_pos + = +xt +. + `rfd +('\n', start_pos); + +100 +t_pos + = (t_po= +d +:: +rg +:: +os +) ? 0 : start_pos + 1; + +104  +les_a + > 0 && + +105 ( +pos + = +xt +. + `fd +('\n',os)! +d +:: +rg +:: +os +) { + +106 +pos +++; + +107 +les_a +--; + +109  +xt +. + `subr +( +t_pos +, ( +pos + = +d +:: +rg +:: +os +) ? + +110 +d +:: +rg +:: +os + : +pos + - +t_pos +); + +111 + } +} + +113 +bo + + $gTaskName +( +d +:: +rg + & +me +) { + +114 +d +:: +rg + +cmdle +; + +116 i(! + `RdFeToSg +("/oc/lf/cmdle", & +cmdle +)) { + +117 + `GTEST_LOG_ +( +INFO +) << "Failedoead /proc/self/cmdline"; + +118  +l +; + +121 +me + = +cmdle +. + `c_r +(); + +122  +ue +; + +123 + } +} + +126  + #STATE_INIT + 0 + + ) + +127  + #STATE_CHILD_READY + 1 + + ) + +128  + #STATE_PARENT_READY + 2 + + ) + +130  + se_sync + { + +131 +had_mux_t + + mmux +; + +132 +had_cd_t + + mcdi +; + +133  + me +; + +136  +e_sync + * + $_e_sync_obj +() { + +137  +e_sync + * +ssync +; + +139 +ssync + = ( +e_sync +*) + `mm +( +NULL +, (state_sync), + +140 +PROT_READ + | +PROT_WRITE +, +MAP_ANONYMOUS + | +MAP_SHARED +, -1, 0); + +141 i( +ssync + = +MAP_FAILED +) { + +142  +NULL +; + +145 +had_mux_t + +m +; + +146 + `had_mux_ +(& +m +); + +147 + `had_mux_shed +(& +m +, +PTHREAD_PROCESS_SHARED +); + +148 + `had_mux_ +(& +ssync +-> +mux +, & +m +); + +150 +had_cd_t + +r +; + +151 + `had_cd_ +(& +r +); + +152 + `had_cd_shed +(& +r +, +PTHREAD_PROCESS_SHARED +); + +153 + `had_cd_ +(& +ssync +-> +cdi +, & +r +); + +155 +ssync +-> +e + = +STATE_INIT +; + +156  +ssync +; + +157 + } +} + +159  + $deroy_e_sync_obj +( +e_sync + * +ssync +) { + +160 + `had_cd_deroy +(& +ssync +-> +cdi +); + +161 + `had_mux_deroy +(& +ssync +-> +mux +); + +162 + `munm +( +ssync +, ( +e_sync +)); + +163 + } +} + +165  + $sigl_e +( +e_sync + * +ssync +,  +e +) { + +166 + `had_mux_lock +(& +ssync +-> +mux +); + +167 +ssync +-> +e + = state; + +168 + `had_cd_sigl +(& +ssync +-> +cdi +); + +169 + `had_mux_uock +(& +ssync +-> +mux +); + +170 + } +} + +172  + $wa_f_e +( +e_sync + * +ssync +,  +e +) { + +173 + `had_mux_lock +(& +ssync +-> +mux +); + +174  +ssync +-> +e + != state) { + +175 + `had_cd_wa +(& +ssync +-> +cdi +, &ssync-> +mux +); + +177 + `had_mux_uock +(& +ssync +-> +mux +); + +178 + } +} + +181  + sshed_da + { + +182 +size_t + + mlod +; + +183 +bo + + mfished +; + +184 +size_t + + mtٮ_size +; + +185 +size_t + + m_size +; + +186 +size_t + + m_day +; + +187  + moomadj +; + +190 vީ* + ggr +; + +191  + $add_essu +( +shed_da + * +da +) { + +192 vީ* +r +; + +193 +size_t + +lod_size + = 0; + +195 +da +-> +fished + = +l +; + +196  +lod_size + < +da +-> +tٮ_size +) { + +197 +r + = + `mm +( +NULL +, +da +-> +_size +, +PROT_READ + | +PROT_WRITE +, + +198 +MAP_ANONYMOUS + | +MAP_PRIVATE +, 0, 0); + +199 i( +r + ! +MAP_FAILED +) { + +201 +gr + = +r +; + +203 + `memt +((*) +r +, ()( +lod_size + + 1), +da +-> +_size +); + +204 +lod_size + + +da +-> +_size +; + +205 +da +-> +lod + = +lod_size +; + +207 + `up +( +da +-> +_day +); + +209 +da +-> +fished + = ( +lod_size + >da-> +tٮ_size +); + +210 + } +} + +213  + $runMemSessTe +() { + +214  +shed_da + * +da +; + +215  +e_sync + * +ssync +; + +216  +sock +; + +217 +pid_t + +pid +; + +218 +uid_t + +uid + = + `guid +(); + +221 i(! + `acss +( +INKERNEL_MINFREE_PATH +, +W_OK +)) { + +222 + `GTEST_LOG_ +( +INFO +) << "Mustot have kernelowmemorykiller driver," + +227 + `ASSERT_FALSE +(( +sock + = + `lmkd_c +()) < 0) + +228 << "Faedclmkdross,=" << + ` +( +o +); + +231 +da + = ( +shed_da +*) + `mm +( +NULL +, (shared_data), + +232 +PROT_READ + | +PROT_WRITE +, +MAP_ANONYMOUS + | +MAP_SHARED +, -1, 0); + +233 + `ASSERT_FALSE +( +da + = +MAP_FAILED +) << "Memoryllocation failure"; + +234 +da +-> +tٮ_size + = ( +size_t +)-1; + +235 +da +-> +_size + = +ALLOC_STEP +; + +236 +da +-> +_day + = +ALLOC_DELAY +; + +239 + `ASSERT_FALSE +(( +ssync + = + `_e_sync_obj +()= +NULL +) + +243 +da +-> +oomadj + = +OOM_ADJ_MAX +; + +244  +da +-> +oomadj + > +OOM_ADJ_MIN +) { + +245 + `ASSERT_FALSE +(( +pid + = + `fk +()) < 0) + +246 << "Faedإawchdross,=" << + ` +( +o +); + +247 i( +pid + != 0) { + +249  +lmk_orio + +ms +; + +251 + `wa_f_e +( +ssync +, +STATE_CHILD_READY +); + +252 +ms +. +pid + =id; + +253 +ms +. +uid + = uid; + +254 +ms +. +oomadj + = +da +->oomadj; + +255 +ms +. +y + = +PROC_TYPE_APP +; + +256 + `ASSERT_FALSE +( + `lmkd_gi_oc +( +sock +, & +ms +) < 0) + +257 << "Faedcommuni whmkd,=" << + ` +( +o +); + +259 + `sigl_e +( +ssync +, +STATE_PARENT_READY +); + +260 + `wapid +( +pid +, +NULL +, 0); + +261 i( +da +-> +fished +) { + +262 + `GTEST_LOG_ +( +INFO +<< "Chd [pid=" << +pid + << "]llocated " + +263 << +da +-> +lod + / +ONE_MB + << "MB"; + +265 + `GTEST_LOG_ +( +INFO +<< "Chd [pid=" << +pid + << "]llocated " + +266 << +da +-> +lod + / +ONE_MB + + +269 +da +-> +oomadj + - +OOM_ADJ_STEP +; + +272 +pid + = + `gpid +(); + +273 + `GTEST_LOG_ +( +INFO +<< "Chd [pid=" << +pid + + +275 << +da +-> +oomadj +; + +276 +da +-> +lod + = 0; + +277 +da +-> +fished + = +l +; + +278 i( + `ݔty_g_bo +("ro.cfig.low_m", +l +)) { + +279 + `ASSERT_FALSE +( + `_memcg +( +uid +, +pid +) != 0) + +280 << "Chd [pid=" << +pid + << "] failedo create cgroup"; + +282 + `sigl_e +( +ssync +, +STATE_CHILD_READY +); + +283 + `wa_f_e +( +ssync +, +STATE_PARENT_READY +); + +284 + `add_essu +( +da +); + +286 + `FAIL +(<< "Chd [pid=" << +pid + << "] wasot killed"; + +290 + `deroy_e_sync_obj +( +ssync +); + +291 + `munm +( +da +, ( +shed_da +)); + +292 + `o +( +sock +); + +293 + } +} + +295 + $TEST +( +lmkd +, +check_f_oom +) { + +298 i(! + `__droid_log_is_debuggab +()) { + +299 + `GTEST_LOG_ +( +INFO +) << "Must be userdebug build,erminatingest"; + +304 i( + `gv +( +LMKDTEST_RESPAWN_FLAG +! +NULL +) { + +305 + `runMemSessTe +(); + +311 +d +:: +rg + +mk + = + `SgPrtf +( + +312 "LMKDe s %lu\n", +ic_ +<>( + `time +( +nuαr +))); + +313 + `ASSERT_TRUE +( + `wreKmsg +( +mk +)); + +316 +d +:: +rg + +sk_me +; + +317 + `ASSERT_TRUE +( + `gTaskName +( +sk_me +)); + +319 +d +:: +rg + +_ouut +; + +320 i( + `guid +(! +ic_ +<>( +AID_ROOT +)) { + +322 +d +:: +rg + +commd + = + `SgPrtf +( + +323 "%srusuo %2>&1", +LMKDTEST_RESPAWN_FLAG +, + +324 +sk_me +. + `c_r +()); + +325 +d +:: +rg + +_ouut + = + `adCommd +( +commd +); + +326 + `GTEST_LOG_ +( +INFO +<< +_ouut +; + +329 + `runMemSessTe +(); + +334 +d +:: +rg + +logt_out + = + `adLogt +( +mk +); + +337 +d +:: +rgam + +kl_logs +; + +338  +h_cou + = 0; + +339 +size_t + +pos + = 0; + +340 +mk + = + `SgPrtf +( +LMKD_KILL_MARKER_TEMPLATE +, +sk_me +. + `c_r +()); + +342  +ue +) { + +343 i(( +pos + = +logt_out +. + `fd +( +mk +,os)! +d +:: +rg +:: +os +) { + +344 +kl_logs + << + `gTextAround +( +logt_out +, +pos +, 0, 1); + +345 +pos + + +mk +. + `ngth +(); + +346 +h_cou +++; + +351 + `GTEST_LOG_ +( +INFO +<< "====Logged kls====" << +d +:: +dl + + +352 << +kl_logs +. + `r +(); + +353 + `EXPECT_TRUE +( +h_cou + = +STEP_COUNT +) << "Number of kills " << hit_count + +355 << +STEP_COUNT +; + +358 +pos + = +logt_out +. + `fd +( +OOM_MARKER +); + +359 +bo + +oom_deed + = ( +pos + ! +d +:: +rg +:: +os +); + +360 +bo + +oom_kl_deed + = ( +oom_deed + && + +361 +logt_out +. + `fd +( +OOM_KILL_MARKER +, +pos +! +d +:: +rg +:: +os +); + +363 + `EXPECT_FALSE +( +oom_kl_deed +) << "OOM kill is detected!"; + +364 i( +oom_deed + || +oom_kl_deed +) { + +366 +pos + = 0; + +367 ( +pos + = +logt_out +. + `fd +( +OOM_MARKER +,os)! +d +:: +rg +:: +os +) { + +368 + `GTEST_LOG_ +( +INFO +<< "====Logound OOM====" << +d +:: +dl + + +369 << + `gTextAround +( +logt_out +, +pos +, + +370 +MIN_LOG_SIZE + / 2, MIN_LOG_SIZE / 2); + +371 +pos + + + ` +( +OOM_MARKER +); + +376 + `GTEST_LOG_ +( +INFO +<< "====Comlogouut====" << +d +:: +dl + + +377 << +logt_out +; + +378 + } +} + + @tests/lmkd_tests.cpp + +16  + ~ + +17  + ~ + +18  + ~ + +19  + ~ + +21  + ~ + +22  + ~ + +23  + ~ + +24  + ~ + +25  + ~ + +26  + ~ + +27  + ~ + +28  + ~ + +29  + ~ + +31 +usg + +mea + + gdroid +:: +ba +; + +33  + #INKERNEL_MINFREE_PATH + "/sys/modu/lowmemykr/ms/m" + + ) + +35  + #LMKD_LOGCAT_MARKER + "lowmemykr" + + ) + +36  + #LMKD_KILL_TEMPLATE + "K\'[^']*\' \\\(%d\\)" + + ) + +37  + #LMKD_REAP_TEMPLATE + "Pros%d waed" + + ) + +38  + #LMKD_REAP_FAIL_TEMPLATE + "oss_ma %d faed" + + ) + +40  + #LMKD_KILL_LINE_START + +LMKD_LOGCAT_MARKER + ": Kl" + + ) + +41  + #LMKD_KILLED_LINE_START + +LMKD_LOGCAT_MARKER + ": Prosg kd" + + ) + +42  + #LMKD_REAP_LINE_START + +LMKD_LOGCAT_MARKER + ": Pross" + + ) + +43  + #LMKD_REAP_TIME_TEMPLATE + +LMKD_LOGCAT_MARKER + ": Pros%d waed i%ldms" + + ) + +44  + #LMKD_REAP_MRELESE_ERR_MARKER + ":ross_ma" + + ) + +45  + #LMKD_REAP_NO_PROCESS_TEMPLATE + ":ross_ma %d faed: Nsuchross" + + ) + +47  + #ONE_MB + (1 << 20) + + ) + +50  + #OOM_ADJ_MAX + 1000 + + ) + +51  + #ALLOC_STEP + (5 * +ONE_MB +) + + ) + +52  + #ALLOC_DELAY + 200 + + ) + +55 vީ* + ggr +; + +57 as + cLmkdTe + : +public + :: +g +:: +Te + { + +58 +public +: + +59 +vtu +  + $SUp +() { + +61 i( + `guid +(! +ic_ +<>( +AID_ROOT +)) { + +62 + `GTEST_SKIP +() << "Must beoot, skippingest"; + +65 i(! + `__droid_log_is_debuggab +()) { + +66 + `GTEST_SKIP +() << "Must be userdebug build, skippingest"; + +69 i(! + `acss +( +INKERNEL_MINFREE_PATH +, +W_OK +)) { + +70 + `GTEST_SKIP +() << "Mustot have kernelowmemorykiller driver," + +75 i(! + `ݔty_g_bo +("ro.lmk.debug", +ue +)) { + +76 + `GTEST_SKIP +() << "Can'tun witho.lmk.debugroperty seto 'false', skippingest"; + +80 + `ASSERT_FALSE +(( +sock + = + `lmkd_c +()) < 0) + +81 << "Faedclmkdross,=" << + ` +( +o +); + +84 i(! + `ݔty_g_bo +("ro.lmk.debug", +l +)) { + +85 + `EXPECT_EQ +( + `ݔty_t +("ro.lmk.debug", "true"), 0); + +86 + `EXPECT_EQ +( + `lmkd_upde_s +( +sock +), +UPDATE_PROPS_SUCCESS +) + +90 +uid + = + `guid +(); + +93 +vtu +  + $TrDown +() { + +95 + `o +( +sock +); + +96 + } +} + +98  + $SupChd +( +pid_t + +pid +,  +oomadj +) { + +99  +lmk_orio + +ms +; + +101 +ms +. +pid + =id; + +102 +ms +. +uid + = uid; + +103 +ms +. +oomadj + = oomadj; + +104 +ms +. +y + = +PROC_TYPE_APP +; + +105 + `ASSERT_FALSE +( + `lmkd_gi_oc +( +sock +, & +ms +) < 0) + +106 << "Faedcommuni whmkd,=" << + ` +( +o +); + +107 + `GTEST_LOG_ +( +INFO +<< "Tgros" << +pid + << "aunched"; + +108 i( + `ݔty_g_bo +("ro.cfig.low_m", +l +)) { + +109 + `ASSERT_FALSE +( + `_memcg +( +uid +, +pid +) != 0) + +110 << "Tgros" << +pid + << " failedo create cgroup"; + +112 + } +} + +114  + $SdProcsPrioReque +( +lmk_ocs_io + +ocs_io_que +,  +ocs_cou +) { + +115 + `ASSERT_FALSE +( + `lmkd_gi_ocs +( +sock +, & +ocs_io_que +, +ocs_cou +) < 0) + +116 << "Faedcommuni whmkd,=" << + ` +( +o +); + +117 + } +} + +119  + $SdGKlCouReque +( +lmk_gklt +* +g_kl_t_que +) { + +120 + `ASSERT_GE +( + `lmkd_g_kl_cou +( +sock +, +g_kl_t_que +), 0) + +122 + } +} + +124  + gd +:: +rg + + $ExecCommd +(cڡ +d +:: +rg +& +commd +) { + +125 +FILE +* + + = + `pݒ +( +commd +. + `c_r +(), "r"); + +126 +d +:: +rg + +cڋ +; + +127 + `RdFdToSg +( + `fo +( + +), & +cڋ +); + +128 + `po +( + +); + +129  +cڋ +; + +130 + } +} + +132  + gd +:: +rg + + $RdLogt +(cڡ +d +:: +rg +& +g +, cڡ std::rg& +gex +) { + +133 +d +:: +rg + +cmd + = "logcat -d -bll"; + +134 i(! +g +. + `emy +()) { + +135 +cmd + +" -\"" + +g + + "\""; + +137 i(! +gex +. + `emy +()) { + +138 +cmd + +" -\"" + +gex + + "\""; + +140  + `ExecCommd +( +cmd +); + +141 + } +} + +143  +size_t + + $CsumeMemy +( +size_t + +tٮ_size +, size_ +_size +, size_ +_day +) { + +144 vީ* +r +; + +145 +size_t + +lod_size + = 0; + +147  +lod_size + < +tٮ_size +) { + +148 +r + = + `mm +( +NULL +, +_size +, +PROT_READ + | +PROT_WRITE +, +MAP_ANONYMOUS + | +MAP_PRIVATE +, 0, 0); + +149 i( +r + ! +MAP_FAILED +) { + +151 +gr + = +r +; + +153 + `memt +((*) +r +, ()( +lod_size + + 1), +_size +); + +154 +lod_size + + +_size +; + +156 + `up +( +_day +); + +158  +lod_size +; + +159 + } +} + +161  +bo + + $PProcSize +(cڡ +d +:: +rg +& +le +, & +rss +, & +sw +) { + +162 +size_t + +pos + = +le +. + `fd +("to free"); + +163 i( +pos + = +d +:: +rg +:: +os +) { + +164  +l +; + +166  + `ssnf +( +le +. + `c_r +(+ +pos +, "t %ldkBss, %ldkB sw", & +rss +, & +sw +) == 2; + +167 + } +} + +169  +bo + + $PRpTime +(cڡ +d +:: +rg +& +le +, +pid_t + +pid +, & +_time +) { + +170  +_pid +; + +171  + `ssnf +( +le +. + `c_r +(), +LMKD_REAP_TIME_TEMPLATE +, & +_pid +, & +_time +) == 2 && + +172 +_pid + = +pid +; + +173 + } +} + +175  +bo + + $PRpNoPross +(cڡ +d +:: +rg +& +le +, +pid_t + +pid +) { + +176  +_pid +; + +177  + `ssnf +( +le +. + `c_r +(), +LMKD_REAP_NO_PROCESS_TEMPLATE +, & +_pid +) == 1 && + +178 +_pid + = +pid +; + +179 + } +} + +181 +uid_t + + $gLmkdTeUid +(cڡ {  +uid +; + } +} + +183 + give +: + +184  +sock +; + +185 +uid_t + + guid +; + +188 + $TEST_F +( +LmkdTe +, +TgRpg +) { + +190 i( + `sys +( +__NR_oss_ma +, -1, 0&& +o + = +ENOSYS +) { + +191 + `GTEST_SKIP +() << "Must supportrocess_mrelease syscall, skippingest"; + +195 +pid_t + +pid + = + `fk +(); + +196 + `ASSERT_FALSE +( +pid + < 0<< "Faedإawchdross,=" << + ` +( +o +); + +197 i( +pid + != 0) { + +199 + `wapid +( +pid +, +NULL +, 0); + +202 + `SupChd +( + `gpid +(), +OOM_ADJ_MAX +); + +204 + `CsumeMemy +(( +size_t +)-1, +ALLOC_STEP +, +ALLOC_DELAY +); + +206 + `FAIL +(<< "Tgros" << +pid + << " wasot killed"; + +210 + `up +(200000); + +212 +d +:: +rg + +gex + = + `SgPrtf +("((" +LMKD_KILL_TEMPLATE + ")|(" +LMKD_REAP_TEMPLATE + + +213 ")|(" +LMKD_REAP_FAIL_TEMPLATE + "))", + +214 +pid +,id,id); + +215 +d +:: +rg + +logt_out + = + `RdLogt +( +LMKD_LOGCAT_MARKER + ":I", +gex +); + +218 +size_t + +le_t + = +logt_out +. + `fd +( +LMKD_KILL_LINE_START +); + +219 + `ASSERT_TRUE +( +le_t + ! +d +:: +rg +:: +os +) << "Killeport isot found"; + +220 +size_t + +le_d + = +logt_out +. + `fd +('\n', +le_t +); + +221 +d +:: +rg + +le + = +logt_out +. + `subr +( + +222 +le_t +, +le_d + = +d +:: +rg +:: +os + ? std::string::npos :ine_end -ine_start); + +223  +rss +, +sw +; + +224 + `ASSERT_TRUE +( + `PProcSize +( +le +, +rss +, +sw +)) << "Killeport format is invalid"; + +226 +le_t + = 0; + +227 +y +: + +229 +le_t + = +logt_out +. + `fd +( +LMKD_REAP_LINE_START +,ine_start); + +230 i( +le_t + = +d +:: +rg +:: +os +) { + +232 +le_t + = +logt_out +. + `fd +( +LMKD_REAP_MRELESE_ERR_MARKER +); + +234 + `ASSERT_TRUE +( +le_t + ! +d +:: +rg +:: +os +) << "Reapingimeeport isot found"; + +236 +le_d + = +logt_out +. + `fd +('\n', +le_t +); + +237 +le + = +logt_out +. + `subr +( +le_t +, +le_d + = +d +:: +rg +:: +os + ? std::string::npos + +238 : +le_d + - +le_t +); + +239 + `ASSERT_TRUE +( + `PRpNoPross +( +le +, +pid +)) << "Failedoeaphearget " <= 0) + +255 i( +_time + > 0) { + +256  +aim_d + = (() +rss + + +sw +/ +_time +; + +257 + `GTEST_LOG_ +( +INFO +<< "Reaim sed " << +aim_d + << "kB/m(" << +rss + << "kBss + " + +258 << +sw + << "kB sw/ " << +_time + << "ms"; + +260 + } +} + +266 + $TEST_F +( +LmkdTe +, +bch_ocs_oom_sce_adj +) { + +267  + sChdProssInfo + { + +268 +pid_t + +pid +; + +269  +ig_oom_sce +; + +270  +q_w_oom_sce +; + +273  +ChdProssInfo + +chdn_fo +[ +PROCS_PRIO_MAX_RECORD_COUNT +]; + +275  +i + = 0; i < +PROCS_PRIO_MAX_RECORD_COUNT +; i++) { + +276 +chdn_fo +[ +i +]. +pid + = + `fk +(); + +277 i( +chdn_fo +[ +i +]. +pid + < 0) { + +278 cڡut +chd + : +chdn_fo +) + +279 i( +chd +. +pid + >0 + `kl +(chd.pid, +SIGKILL +); + +280 + `FAIL +(<< "Faed fkgros iti=" << +i +; + +281 } i( +chdn_fo +[ +i +]. +pid + == 0) { + +286  +ue +) { + +287 + `p +(20); + +292  +lmk_ocs_io + +ocs_io_que +; + +293 cڡ +uid_t + +_uid + = + `gLmkdTeUid +(); + +295  +i + = 0; i < +PROCS_PRIO_MAX_RECORD_COUNT +; i++) { + +296 i( +chdn_fo +[ +i +]. +pid + < 0) ; + +298 cڡ +d +:: +rg + +oss_oom_th + = + +299 "oc/" + +d +:: + `to_rg +( +chdn_fo +[ +i +]. +pid +) + "/oom_score_adj"; + +300 +d +:: +rg + +cu_oom_sce +; + +301 i(! + `RdFeToSg +( +oss_oom_th +, & +cu_oom_sce +|| cu_oom_sce. + `emy +()) { + +302 cڡut +chd + : +chdn_fo +) + +303 i( +chd +. +pid + >0 + `kl +(chd.pid, +SIGKILL +); + +304 + `FAIL +() << "Failedeading original oom score for childrocess: " + +305 << +chdn_fo +[ +i +]. +pid +; + +308 +chdn_fo +[ +i +]. +ig_oom_sce + = + `oi +( +cu_oom_sce +. + `c_r +()); + +309 +chdn_fo +[ +i +]. +q_w_oom_sce + = + +310 (() +chdn_fo +[ +i +]. +ig_oom_sce + != i) ? i : (i + 10); + +311 +ocs_io_que +. +ocs +[ +i +] = {. +pid + = +chdn_fo +[i].pid, + +312 . +uid + = +_uid +, + +313 . +oomadj + = +chdn_fo +[ +i +]. +q_w_oom_sce +, + +314 . +y + = +oc_ty +:: +PROC_TYPE_APP +}; + +322 + `SdProcsPrioReque +( +ocs_io_que +, +PROCS_PRIO_MAX_RECORD_COUNT +); + +323  +lmk_gklt + +kl_t_q + = {. +m_oomadj + = -1000, . +max_oomadj + = 1000}; + +324 + `SdGKlCouReque +(& +kl_t_q +); + +326 aut +chd_fo + : +chdn_fo +) { + +327 i( +chd_fo +. +pid + < 0) ; + +328 cڡ +d +:: +rg + +oss_oom_th + = + +329 "oc/" + +d +:: + `to_rg +( +chd_fo +. +pid +) + "/oom_score_adj"; + +330 +d +:: +rg + +cu_oom_sce +; + +331 i(! + `RdFeToSg +( +oss_oom_th +, & +cu_oom_sce +|| cu_oom_sce. + `emy +()) { + +332 cڡut +chd + : +chdn_fo +) + +333 i( +chd +. +pid + >0 + `kl +(chd.pid, +SIGKILL +); + +334 + `FAIL +(<< "Faeddgew oom scܐf chdross: " << +chd_fo +. +pid +; + +336 + `kl +( +chd_fo +. +pid +, +SIGKILL +); + +338 cڡ  +au_w_oom_sce + = + `oi +( +cu_oom_sce +. + `c_r +()); + +339 + `ASSERT_EQ +( +chd_fo +. +q_w_oom_sce +, +au_w_oom_sce +) + +340 << "Chd whid=" << +chd_fo +. +pid + << " didn't update its OOM score"; + +342 + } +} + +344  + $ma +( +gc +, ** +gv +) { + +345 :: +g +:: + `InGoogTe +(& +gc +, +gv +); + +346 + `InLoggg +( +gv +, +StdrLogg +); + +347  + `RUN_ALL_TESTS +(); + +348 + } +} + + @watchdog.cpp + +17  + #LOG_TAG + "lowmemykr" + + ) + +19  + ~ + +20  + ~ + +21  + ~ + +23  + ~ + +25  + ~"wchdog.h +" + +27 * + $wchdog_ma +(* +m +) { + +28 +Wchdog + * +wchdog + = +ic_ +( +m +); + +29 +sigt_t + +sigt +; + +30  +signum +; + +33 i(! + `STaskProfes +( + `gtid +(), {"CPUSET_SP_FOREGROUND"}, +ue +)) { + +34 + `ALOGE +("Failedossign cpusetohe watchdoghread"); + +37 i(! +wchdog +-> + `_tim +( +sigt +)) { + +38 + `ALOGE +("Watchdogimer creation failed!"); + +39  +NULL +; + +42  +ue +) { + +43 i( + `sigwa +(& +sigt +, & +signum +) == -1) { + +44 + `ALOGE +("sigwa faed: %s", + ` +( +o +)); + +47 +wchdog +-> + `be +(); + +50  +NULL +; + +51 + } +} + +53 +bo + + gWchdog +:: + $ +() { + +54 +had_t + +thad +; + +56 i( + `had_ +(& +thad +, +NULL +, +wchdog_ma +, +this +)) { + +57 + `ALOGE +("had_ faed: %s", + ` +( +o +)); + +58  +l +; + +60 i( + `had_ame_ +( +thad +, "lmkd_watchdog")) { + +61 + `ALOGW +("had_ame_ faed: %s", + ` +( +o +)); + +64  +ue +; + +65 + } +} + +67 +bo + + gWchdog +:: + $t +() { + +69  +imec + +w_tim +; + +71 i(! +tim_d_ +) { + +72  +l +; + +75 +w_tim +. +_vue +. +tv_c + = +timeout_ +; + +76 +w_tim +. +_vue +. +tv_nc + = 0; + +77 +w_tim +. +_rv +. +tv_c + = +timeout_ +; + +78 +w_tim +. +_rv +. +tv_nc + = 0; + +80 i( + `tim_ime +( +tim_ +, 0, & +w_tim +, +NULL +)) { + +81 + `ALOGE +("tim_imed: %s", + ` +( +o +)); + +82  +l +; + +85  +ue +; + +86 + } +} + +88 +bo + + gWchdog +:: + $ +() { + +89  +imec + +w_tim + = {}; + +91 i(! +tim_d_ +) { + +92  +l +; + +95 i( + `tim_ime +( +tim_ +, 0, & +w_tim +, +NULL +)) { + +96 + `ALOGE +("tim_imed: %s", + ` +( +o +)); + +97  +l +; + +100  +ue +; + +101 + } +} + +103 +bo + + gWchdog +:: + $_tim +( +sigt_t + & +sigt +) { + +104  +sigevt + +vt +; + +106 + `sigemyt +(& +sigt +); + +107 + `sigaddt +(& +sigt +, +SIGALRM +); + +108 i( + `sigocmask +( +SIG_BLOCK +, & +sigt +, +NULL +)) { + +109 + `ALOGE +("sigocmask faed: %s", + ` +( +o +)); + +110  +l +; + +113 +vt +. +sigev_nify + = +SIGEV_THREAD_ID +; + +114 +vt +. +sigev_nify_thad_id + = + `gtid +(); + +115 +vt +. +sigev_signo + = +SIGALRM +; + +116 i( + `tim_ +( +CLOCK_MONOTONIC +, & +vt +, & +tim_ +)) { + +117 + `ALOGE +("tim_ faed: %s", + ` +( +o +)); + +118  +l +; + +121 +tim_d_ + = +ue +; + +122  +ue +; + +123 + } +} + + @watchdog.h + +17 #agm + + + +19  + ~ + +20  + ~ + +21  + ~ + +23 as + cWchdog + { + +24 + mive +: + +25  +timeout_ +; + +26 +tim_t + + mtim_ +; + +27 + md +:: +omic +< +bo +> +tim_d_ +; + +28 (* + mback_ +)(); + +29 + mpublic +: + +30 + $Wchdog +( +timeout +, (* +back +)()) : + +31 + `timeout_ +( +timeout +), + `tim_d_ +( +l +), + $back_ +( +back +) {} + +33 +bo + + ` +(); + +34 +bo + + `t +(); + +35 +bo + + ` +(); + +37 +bo + + `_tim +( +sigt_t + & +sigt +); + +38  + $be +(cڡ { i( +back_ + + `back_ +(); + } +} + + @ +1 +. +0 +18 +282 +Android.bp +include/liblmkd_utils.h +include/lmkd.h +include/lmkd_hooks.h +liblmkd_utils.cpp +libpsi/Android.bp +libpsi/include/psi/psi.h +libpsi/psi.cpp +lmkd.cpp +reaper.cpp +reaper.h +statslog.cpp +statslog.h +tests/Android.bp +tests/lmkd_test.cpp +tests/lmkd_tests.cpp +watchdog.cpp +watchdog.h diff --git a/cscope.po.out b/cscope.po.out new file mode 100644 index 0000000..412c104 Binary files /dev/null and b/cscope.po.out differ