From b5fcf5507a6cb9d1b0437997d814684daf954eec Mon Sep 17 00:00:00 2001 From: Wenchao Hao Date: Tue, 30 Dec 2025 19:42:43 +0800 Subject: [PATCH] update Signed-off-by: Wenchao Hao --- GPATH | Bin 0 -> 16384 bytes GRTAGS | Bin 0 -> 114688 bytes GTAGS | Bin 0 -> 57344 bytes cscope.in.out | Bin 0 -> 106496 bytes cscope.out | 26899 ++++++++++++++++++++++++++++++++++++++++++++++++ cscope.po.out | Bin 0 -> 217176 bytes 6 files changed, 26899 insertions(+) create mode 100644 GPATH create mode 100644 GRTAGS create mode 100644 GTAGS create mode 100644 cscope.in.out create mode 100644 cscope.out create mode 100644 cscope.po.out diff --git a/GPATH b/GPATH new file mode 100644 index 0000000000000000000000000000000000000000..964c2c9f2e8abb08cb432c40faccfa6852b42f25 GIT binary patch literal 16384 zcmeI3yG|QX5Qa|@QzRiF7jp4lU8X=wc1;XOG?u)IP=c|*xk-_Xu^nu&V9UECO-ddh z1!c+15i@r0Vq;tX3p_?cg+h#8cV=x{+T&*zVq*)KNfC(@GCcp%k025#WOn?b6 zf&YTQmBf@+;rX)|NfC(fB%)+z$AI?U@ zsrqm0FZ_4HD^Y9?^So!mSu7v6hy7mL*&T?!5Vs&agIY>}M9{F;P1L+4kb{H$w$mC6 zWQ^8H1R*7nUxfT&r#a{hoo*^W4thnIkLwH1gZwaRMq$w3!wNZY`2YMxXA6e`}b&q~}UUM`dap?>*1GQnMu`fZwL8TxGb<;sTd9JFcE z=n*x?L~xf$!@hG=SAx12JDoYk)w(IcEy*}>bkScyZ+8&(vIjChS$8@C>R|iS|1Pah zev^HmmpTf8nwmlN7>h2rPipt59{s0MHs4hJt!?Um2Q;wO8KdO}8VJkRl zcNTF^xE#0>bJBB6C%NEM%#rh;PitHLtJ=%Wa>Z$V*vrn77F}sjtjF^bF8Y(+zhMh1 zZ$N0g4}2*h2pN5Wf44=>0&NK6lXs4yUZA{#8s=Q8u1by0AMN+48MV4?cpd5Z$rq|N zrGVY2C%wmLH}!^N6~T0AnS6*g8Xqm;?^0atDWeo=9S!F|`^0MM9O!PtoNSLw w7Pv>|$onAK4=<>0zrP>SMTvU0S2Du|9X&+%K>>a*yoR@7eX}YO&jncRACd%MVE_OC literal 0 HcmV?d00001 diff --git a/GRTAGS b/GRTAGS new file mode 100644 index 0000000000000000000000000000000000000000..60a3aadc66444037e0c3cb6dac97da25be40de33 GIT binary patch literal 114688 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 q$|RG-bYw&Dgc@&*XG!djwtHy+s`}sm0rY+V literal 0 HcmV?d00001 diff --git a/GTAGS b/GTAGS new file mode 100644 index 0000000000000000000000000000000000000000..810042743dfbb452a1ca1837b214aa794872c0cc GIT binary patch literal 57344 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 YDgHzHBjaP7(e)<1>2m+?y@BNaSFjYTIsgCw literal 0 HcmV?d00001 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 + g·ckage + { + +2 + guÉ_­¶iÿbË_liûn£s +: ["Android-Apache-2.0"], + +5 + goÚg_cÚfig_moduË_ty³ + { + +7 + gË_ty³ +: "cc_defaults", + +8 + gig_Çme¥aû +: "lmkd", + +9 + g_v¬ŸbËs +: ["use_hooks"], + +10 + g”t›s +: [ + +15 +mkd_hooks_cc_deçuÉs + { + +18 +g_cÚfig_v¬ŸbËs +: { + +19 +u£_hooks +: { + +20 +cæags +: [ + +23 + g¡©ic_libs +: [ + +29 + gc_deçuÉs + { + +31 + ggs +: [ + +35 +c_bš¬y + { + +42 +sh¬ed_libs +: [ + +49 +¡©ic_libs +: [ + +52 +h—d”_libs +: [ + +54 +loÿl_šþude_dœs +: ["include"], + +55 + ggs +: [ + +60 +š™_rc +: ["lmkd.rc"], + +61 + guÉs +: [ + +64 +loggs +: ["event.logtags"], + +65 : +Œue +, + +68 + gc_lib¿ry_¡©ic + { + +71 + gl_šþude_dœs +: ["include"], + +72 + ggs +: [ + +76 +deçuÉs +: ["stats_defaults"], + +77 + ged_libs +: [ + +80 +h—d”_libs +: [ + +85 +c_lib¿ry_¡©ic + { + +88 + gv”y_avažabË +: +Œue +, + +89 + ged_libs +: [ + +92 +expÜt_šþude_dœs +: ["include"], + +93 + gÏgs +: [ + + @include/liblmkd_utils.h + +17 #iâdeà +_LIBLMKD_UTILS_H_ + + +18  + #_LIBLMKD_UTILS_H_ + + + ) + +20  + ~ + +21  + ~ + +23  + ~ + +25 +__BEGIN_DECLS + + +32  +lmkd_cÚÃù +(); + +40  +lmkd_»gi¡”_´oc +( +sock +,  +lmk_´oýrio + * +·¿ms +); + +48  +lmkd_»gi¡”_´ocs +( +sock +,  +lmk_´ocs_´io +* +·¿ms +, cÚ¡  +´oc_couÁ +); + +56  +lmkd_uÄegi¡”_´oc +( +sock +,  +lmk_´oüemove + * +·¿ms +); + +58 + eupd©e_´Ý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 +upd©e_´Ýs_»suÉ + +lmkd_upd©e_´Ýs +( +sock +); + +80  +ü—‹_memcg +( +uid_t + +uid +, +pid_t + +pid +); + +82 + eboÙ_com¶‘ed_nÙifiÿtiÚ_»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Ù_com¶‘ed_nÙifiÿtiÚ_»suÉ + +lmkd_nÙify_boÙ_com¶‘ed +( +sock +); + +96 + eg‘_kžl_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‘_kžl_couÁ +( +sock +,  +lmk_g‘kžlút +* +·¿ms +); + +109 + g__END_DECLS + + + @include/lmkd.h + +17 #iâdeà +_LMKD_H_ + + +18  + #_LMKD_H_ + + + ) + +20  + ~<¬·/š‘.h +> + +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  +šlše + +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_scÜe +; + +74  +šlše +  + $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_scÜe + = + `Áohl +( +·ck‘ +[ +rg‘_idx + * 2 + 2]); + +78 + } +} + +84  +šlše + +size_t + + $lmkd_·ck_£t_rg‘ +( +LMKD_CTRL_PACKET + +·ck‘ +,  +lmk_rg‘ +* +rg‘s +, + +85 +size_t + +rg‘_út +) { + +86  +idx + = 0; + +87 +·ck‘ +[ +idx +++] = + `htÚl +( +LMK_TARGET +); + +88  +rg‘_út +) { + +89 +·ck‘ +[ +idx +++] = + `htÚl +( +rg‘s +-> +mšä“ +); + +90 +·ck‘ +[ +idx +++] = + `htÚl +( +rg‘s +-> +oom_adj_scÜe +); + +91 +rg‘s +++; + +92 +rg‘_út +--; + +94  +idx + * (); + +95 + } +} + +98 + e´oc_ty³ + { + +99 + mPROC_TYPE_FIRST +, + +100 + mPROC_TYPE_APP + = +PROC_TYPE_FIRST +, + +101 + mPROC_TYPE_SERVICE +, + +102 + mPROC_TYPE_COUNT +, + +106  + slmk_´oýrio + { + +107 +pid_t + + mpid +; + +108 +uid_t + + muid +; + +109  + moomadj +; + +110 +´oc_ty³ + + m±y³ +; + +112  + #LMK_PROCPRIO_FIELD_COUNT + 4 + + ) + +113  + #LMK_PROCPRIO_SIZE + ( +LMK_PROCPRIO_FIELD_COUNT + * ()) + + ) + +119  +šlše +  + $lmkd_·ck_g‘_´oýrio +( +LMKD_CTRL_PACKET + +·ck‘ +,  +f›ld_couÁ +, + +120  +lmk_´oýrio +* +·¿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³ + = +f›ld_couÁ + > 3 ? ( +´oc_ty³ +) + `Áohl +( +·ck‘ +[4]è: +PROC_TYPE_APP +; + +126 + } +} + +132  +šlše + +size_t + + $lmkd_·ck_£t_´oýrio +( +LMKD_CTRL_PACKET + +·ck‘ +,  +lmk_´oýrio +* +·¿ms +) { + +133 +·ck‘ +[0] = + `htÚl +( +LMK_PROCPRIO +); + +134 +·ck‘ +[1] = + `htÚl +( +·¿ms +-> +pid +); + +135 +·ck‘ +[2] = + `htÚl +( +·¿ms +-> +uid +); + +136 +·ck‘ +[3] = + `htÚl +( +·¿ms +-> +oomadj +); + +137 +·ck‘ +[4] = + `htÚl +(() +·¿ms +-> +±y³ +); + +139 + } +} + +142  + slmk_´oüemove + { + +143 +pid_t + + mpid +; + +150  +šlše +  + $lmkd_·ck_g‘_´oüemove +( +LMKD_CTRL_PACKET + +·ck‘ +, + +151  +lmk_´oüemove +* +·¿ms +) { + +152 +·¿ms +-> +pid + = ( +pid_t +) + `Áohl +( +·ck‘ +[1]); + +153 + } +} + +159  +šlše + +size_t + + $lmkd_·ck_£t_´oüemove +( +LMKD_CTRL_PACKET + +·ck‘ +, + +160  +lmk_´oüemove +* +·¿ms +) { + +161 +·ck‘ +[0] = + `htÚl +( +LMK_PROCREMOVE +); + +162 +·ck‘ +[1] = + `htÚl +( +·¿ms +-> +pid +); + +164 + } +} + +170  +šlše + +size_t + + $lmkd_·ck_£t_´oýurge +( +LMKD_CTRL_PACKET + +·ck‘ +) { + +171 +·ck‘ +[0] = + `htÚl +( +LMK_PROCPURGE +); + +173 + } +} + +176  + slmk_g‘kžlút + { + +177  + mmš_oomadj +; + +178  + mmax_oomadj +; + +185  +šlše +  + $lmkd_·ck_g‘_g‘kžlút +( +LMKD_CTRL_PACKET + +·ck‘ +, + +186  +lmk_g‘kžlút +* +·¿ms +) { + +187 +·¿ms +-> +mš_oomadj + = + `Áohl +( +·ck‘ +[1]); + +188 +·¿ms +-> +max_oomadj + = + `Áohl +( +·ck‘ +[2]); + +189 + } +} + +195  +šlše + +size_t + + $lmkd_·ck_£t_g‘kžlút +( +LMKD_CTRL_PACKET + +·ck‘ +, + +196  +lmk_g‘kžlút +* +·¿ms +) { + +197 +·ck‘ +[0] = + `htÚl +( +LMK_GETKILLCNT +); + +198 +·ck‘ +[1] = + `htÚl +( +·¿ms +-> +mš_oomadj +); + +199 +·ck‘ +[2] = + `htÚl +( +·¿ms +-> +max_oomadj +); + +201 + } +} + +207  +šlše + +size_t + + $lmkd_·ck_£t_g‘kžlút_»¶ +( +LMKD_CTRL_PACKET + +·ck‘ +,  +kžl_út +) { + +208 +·ck‘ +[0] = + `htÚl +( +LMK_GETKILLCNT +); + +209 +·ck‘ +[1] = + `htÚl +( +kžl_út +); + +211 + } +} + +214 + easync_ev’t_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_subsüibe + { + +223 +async_ev’t_ty³ + + mevt_ty³ +; + +230  +šlše +  + $lmkd_·ck_g‘_subsüibe +( +LMKD_CTRL_PACKET + +·ck‘ +,  +lmk_subsüibe +* +·¿ms +) { + +231 +·¿ms +-> +evt_ty³ + = ( +async_ev’t_ty³ +) + `Áohl +( +·ck‘ +[1]); + +232 + } +} + +238  +šlše + +size_t + + $lmkd_·ck_£t_subsüibe +( +LMKD_CTRL_PACKET + +·ck‘ +, +async_ev’t_ty³ + +evt_ty³ +) { + +239 +·ck‘ +[0] = + `htÚl +( +LMK_SUBSCRIBE +); + +240 +·ck‘ +[1] = + `htÚl +(() +evt_ty³ +); + +242 + } +} + +248  +šlše + +size_t + + $lmkd_·ck_£t_´ockžls +( +LMKD_CTRL_PACKET + +·ck‘ +, +pid_t + +pid +, +uid_t + +uid +, + +249  +rss_kb +) { + +250 +·ck‘ +[0] = + `htÚl +( +LMK_PROCKILL +); + +251 +·ck‘ +[1] = + `htÚl +( +pid +); + +252 +·ck‘ +[2] = + `htÚl +( +uid +); + +253 +·ck‘ +[3] = + `htÚl +( +rss_kb +); + +256 + } +} + +262  +šlše + +size_t + + $lmkd_·ck_£t_upd©e_´Ýs +( +LMKD_CTRL_PACKET + +·ck‘ +) { + +263 +·ck‘ +[0] = + `htÚl +( +LMK_UPDATE_PROPS +); + +265 + } +} + +271  +šlše + +size_t + + $lmkd_·ck_¡¬t_mڙܚg +( +LMKD_CTRL_PACKET + +·ck‘ +) { + +272 +·ck‘ +[0] = + `htÚl +( +LMK_START_MONITORING +); + +274 + } +} + +280  +šlše + +size_t + + $lmkd_·ck_£t_upd©e_´Ýs_»¶ +( +LMKD_CTRL_PACKET + +·ck‘ +,  +»suÉ +) { + +281 +·ck‘ +[0] = + `htÚl +( +LMK_UPDATE_PROPS +); + +282 +·ck‘ +[1] = + `htÚl +( +»suÉ +); + +284 + } +} + +287  + slmk_upd©e_´Ýs_»¶y + { + +288  + m»suÉ +; + +295  +šlše +  + $lmkd_·ck_g‘_upd©e_´Ýs_»¶ +( +LMKD_CTRL_PACKET + +·ck‘ +, + +296  +lmk_upd©e_´Ýs_»¶y +* +·¿ms +) { + +297 +·¿ms +-> +»suÉ + = + `Áohl +( +·ck‘ +[1]); + +298 + } +} + +304  +šlše + +size_t + + $lmkd_·ck_£t_boÙ_com¶‘ed_nÙif +( +LMKD_CTRL_PACKET + +·ck‘ +) { + +305 +·ck‘ +[0] = + `htÚl +( +LMK_BOOT_COMPLETED +); + +307 + } +} + +313  +šlše + +size_t + + $lmkd_·ck_£t_boÙ_com¶‘ed_nÙif_»¶ +( +LMKD_CTRL_PACKET + +·ck‘ +,  +»suÉ +) { + +314 +·ck‘ +[0] = + `htÚl +( +LMK_BOOT_COMPLETED +); + +315 +·ck‘ +[1] = + `htÚl +( +»suÉ +); + +317 + } +} + +320  + slmk_boÙ_com¶‘ed_nÙif_»¶y + { + +321  + m»suÉ +; + +328  +šlše +  + $lmkd_·ck_g‘_boÙ_com¶‘ed_nÙif_»¶ +( + +329 +LMKD_CTRL_PACKET + +·ck‘ +,  +lmk_boÙ_com¶‘ed_nÙif_»¶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_´oýrio + + m´ocs +[ +PROCS_PRIO_MAX_RECORD_COUNT +]; + +343  +šlše +  + $lmkd_·ck_g‘_´ocs_´io +( +LMKD_CTRL_PACKET + +·ck‘ +,  +lmk_´ocs_´io +* +·¿ms +, + +344 cÚ¡  +f›ld_couÁ +) { + +345 ià( +f›ld_couÁ + < +LMK_PROCPRIO_FIELD_COUNT + || (field_count % LMK_PROCPRIO_FIELD_COUNT) != 0) + +347 cÚ¡  +´ocs_couÁ + = ( +f›ld_couÁ + / +LMK_PROCPRIO_FIELD_COUNT +); + +350  +·ck‘Idx + = 1; + +351  +´ocs_idx + = 0;…rocs_idx < +´ocs_couÁ +;…rocs_idx++) { + +352 +·¿ms +-> +´ocs +[ +´ocs_idx +]. +pid + = ( +pid_t +) + `Áohl +( +·ck‘ +[ +·ck‘Idx +++]); + +353 +·¿ms +-> +´ocs +[ +´ocs_idx +]. +uid + = ( +uid_t +) + `Áohl +( +·ck‘ +[ +·ck‘Idx +++]); + +354 +·¿ms +-> +´ocs +[ +´ocs_idx +]. +oomadj + = + `Áohl +( +·ck‘ +[ +·ck‘Idx +++]); + +355 +·¿ms +-> +´ocs +[ +´ocs_idx +]. +±y³ + = ( +´oc_ty³ +) + `Áohl +( +·ck‘ +[ +·ck‘Idx +++]); + +358  +´ocs_couÁ +; + +359 + } +} + +365  +šlše + +size_t + + $lmkd_·ck_£t_´ocs_´io +( +LMKD_CTRL_PACKET + +·ck‘ +, + +366  +lmk_´ocs_´io +* +·¿ms +, + +367 cÚ¡  +´ocs_couÁ +) { + +368 +·ck‘ +[0] = + `htÚl +( +LMK_PROCS_PRIO +); + +369  +·ck‘Idx + = 1; + +371  +i + = 0; i < +´ocs_couÁ +; i++) { + +372 +·ck‘ +[ +·ck‘Idx +++] = + `htÚl +( +·¿ms +-> +´ocs +[ +i +]. +pid +); + +373 +·ck‘ +[ +·ck‘Idx +++] = + `htÚl +( +·¿ms +-> +´ocs +[ +i +]. +uid +); + +374 +·ck‘ +[ +·ck‘Idx +++] = + `htÚl +( +·¿ms +-> +´ocs +[ +i +]. +oomadj +); + +375 +·ck‘ +[ +·ck‘Idx +++] = + `htÚl +(() +·¿ms +-> +´ocs +[ +i +]. +±y³ +); + +378  +·ck‘Idx + * (); + +379 + } +} + +381 + g__END_DECLS + + + @include/lmkd_hooks.h + +24 #iâdeà +_LMKD_HOOKS_H_ + + +25  + #_LMKD_HOOKS_H_ + + + ) + +27  + ~ + +29 + g__BEGIN_DECLS + + +31 #ifdeà +LMKD_USE_HOOKS + + +39 +boÞ + +lmkd_upd©e_´Ýs_hook +(); + +44 +boÞ + +lmkd_š™_hook +(); + +51  +lmkd_ä“_memÜy_befÜe_kžl_hook +( +´oc +* +´oý +,  +´oc_size_·ges +, + +52  +´oc_oom_scÜe +,  +kžl_»asÚ +); + +57  +lmkd_no_kžl_ÿndid©es_hook +(); + +61  +šlše + +boÞ + + $lmkd_upd©e_´Ýs_hook +(è{  +Œue +; + } +} + +62  +šlše + +boÞ + + $lmkd_š™_hook +(è{  +Œue +; + } +} + +63  +šlše +  + $lmkd_ä“_memÜy_befÜe_kžl_hook +( +´oc +*, , , + +66 + } +} + +67  +šlše +  + $lmkd_no_kžl_ÿndid©es_hook +(è{ + } +} + +71 + g__END_DECLS + + + @liblmkd_utils.cpp + +17  + ~<”ºo.h +> + +18  + ~ + +19  + ~ + +20  + ~ + +21  + ~ + +22  + ~<¡dio.h +> + +23  + ~ + +25  + ~ + +26  + ~ + +27  + ~<´oûssgroup/´oûssgroup.h +> + +29  + $lmkd_cÚÃù +() { + +30  + `sock‘_loÿl_þ›Á +("lmkd", + +31 +ANDROID_SOCKET_NAMESPACE_RESERVED +, + +32 +SOCK_SEQPACKET + | +SOCK_CLOEXEC +); + +33 + } +} + +35  + $lmkd_»gi¡”_´oc +( +sock +,  +lmk_´oýrio + * +·¿ms +) { + +36 +LMKD_CTRL_PACKET + +·ck‘ +; + +37 +size_t + +size +; + +38  +»t +; + +40 +size + = + `lmkd_·ck_£t_´oýrio +( +·ck‘ +, +·¿ms +); + +41 +»t + = + `TEMP_FAILURE_RETRY +( + `wr™e +( +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 +( + `wr™e +( +sock +, +·ck‘ +, +size +)); + +54  ( +»t + < 0) ? -1 : 0; + +55 + } +} + +57  + $lmkd_uÄegi¡”_´oc +( +sock +,  +lmk_´oüemove + * +·¿ms +) { + +58 +LMKD_CTRL_PACKET + +·ck‘ +; + +59 +size_t + +size +; + +60  +»t +; + +62 +size + = + `lmkd_·ck_£t_´oüemove +( +·ck‘ +, +·¿ms +); + +63 +»t + = + `TEMP_FAILURE_RETRY +( + `wr™e +( +sock +, +·ck‘ +, +size +)); + +65  ( +»t + < 0) ? -1 : 0; + +66 + } +} + +68 +upd©e_´Ýs_»suÉ + + $lmkd_upd©e_´Ýs +( +sock +) { + +69 +LMKD_CTRL_PACKET + +·ck‘ +; + +70  +size +; + +72 +size + = + `lmkd_·ck_£t_upd©e_´Ýs +( +·ck‘ +); + +73 ià( + `TEMP_FAILURE_RETRY +( + `wr™e +( +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_upd©e_´Ýs_»¶y + +·¿ms +; + +87 + `lmkd_·ck_g‘_upd©e_´Ýs_»¶ +( +·ck‘ +, & +·¿ms +); + +89  +·¿ms +. +»suÉ + =ð0 ? +UPDATE_PROPS_SUCCESS + : +UPDATE_PROPS_FAIL +; + +90 + } +} + +92 +boÙ_com¶‘ed_nÙifiÿtiÚ_»suÉ + + $lmkd_nÙify_boÙ_com¶‘ed +( +sock +) { + +93 +LMKD_CTRL_PACKET + +·ck‘ +; + +94  +size +; + +96 +size + = + `lmkd_·ck_£t_boÙ_com¶‘ed_nÙif +( +·ck‘ +); + +97 ià( + `TEMP_FAILURE_RETRY +( + `wr™e +( +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Ù_com¶‘ed_nÙif_»¶y + +·¿ms +; + +111 + `lmkd_·ck_g‘_boÙ_com¶‘ed_nÙif_»¶ +( +·ck‘ +, & +·¿ms +); + +113 +boÙ_com¶‘ed_nÙifiÿtiÚ_»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‘_kžl_couÁ +( +sock +,  +lmk_g‘kžlút +* +·¿ms +) { + +133 +LMKD_CTRL_PACKET + +·ck‘ +; + +134  +size +; + +136 +size + = + `lmkd_·ck_£t_g‘kžlút +( +·ck‘ +, +·¿ms +); + +137 ià( + `TEMP_FAILURE_RETRY +( + `wr™e +( +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  + `ü—‹ProûssGroup +( +uid +, +pid +, +Œue +) == 0 ? 0 : -1; + +155 + } +} + + @libpsi/Android.bp + +1 + g·ckage + { + +2 + guÉ_­¶iÿbË_liûn£s +: ["Android-Apache-2.0"], + +5 + gc_lib¿ry_h—d”s + { + +7 + g¹_šþude_dœs +: ["include"], + +8 + gÜ_avažabË +: +Œue +, + +11 + gc_lib¿ry + { + +14 + gÜ_avažabË +: +Œue +, + +15 + ged_libs +: [ + +17 +h—d”_libs +: [ + +20 +expÜt_h—d”_lib_h—d”s +: [ + +22 +cæags +: [ + + @libpsi/include/psi/psi.h + +17 #iâdeà +__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_d©a + { + +41  +psi_¡©s + + mmem_¡©s +[ +PSI_TYPE_COUNT +]; + +42  +psi_¡©s + + mio_¡©s +[ +PSI_TYPE_COUNT +]; + +43  +psi_¡©s + + mýu_¡©s +[ +PSI_TYPE_COUNT +]; + +46 cÚ¡ * + gpsi_»sourû_fže +[ +PSI_RESOURCE_COUNT +] = { + +60  +š™_psi_mÚ™Ü +( +psi_¡®l_ty³ + +¡®l_ty³ +,  +th»shÞd_us +,  +wšdow_us +, + +61 +psi_»sourû + +»sourû + = +PSI_MEMORY +); + +69  +»gi¡”_psi_mÚ™Ü +( +•Þlfd +,  +fd +, * +d©a +); + +75  +uÄegi¡”_psi_mÚ™Ü +( +•Þlfd +,  +fd +); + +85  +de¡roy_psi_mÚ™Ü +( +fd +); + +92  +·r£_psi_lše +(* +lše +, +psi_¡®l_ty³ + +¡®l_ty³ +,  +psi_¡©s + +¡©s +[]); + +94 + g__END_DECLS + + + @libpsi/psi.cpp + +17  + #LOG_TAG + "libpsi" + + ) + +19  + ~<”ºo.h +> + +20  + ~ + +21  + ~<¡dio.h +> + +22  + ~<¡ršg.h +> + +23  + ~ + +24  + ~ + +26  + ~ + +27  + ~ + +28  + ~<¡dio.h +> + +29  + ~"psi/psi.h +" + +31 cÚ¡ * + g¡®l_ty³_Çme +[] = { + +36  + $š™_psi_mÚ™Ü +( +psi_¡®l_ty³ + +¡®l_ty³ +,  +th»shÞd_us +,  +wšdow_us +, + +37 +psi_»sourû + +»sourû +) { + +38 ià( +»sourû + < +PSI_MEMORY + ||„esourû >ð +PSI_RESOURCE_COUNT +) { + +39 + `ALOGE +("Inv®id…s˜»sourûy³: %d", +»sourû +); + +40 +”ºo + = +EINVAL +; + +43  +fd +; + +44  +»s +; + +45  +buf +[256]; + +47 +fd + = + `TEMP_FAILURE_RETRY +( + `Ý’ +( +psi_»sourû_fže +[ +»sourû +], +O_WRONLY + | +O_CLOEXEC +)); + +48 ià( +fd + < 0) { + +49 + `ALOGE +("NØk”ÃÈps˜mÚ™Ü 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³ +], +th»shÞd_us +, +wšdow_us +); + +60 + `ALOGE +("Inv®id…s˜¡®Èty³: %d", +¡®l_ty³ +); + +61 +”ºo + = +EINVAL +; + +62  +”r +; + +65 ià( +»s + >ð( +ssize_t +)( +buf +)) { + +66 + `ALOGE +("% lšov”æow fÜ…s˜¡®Èty³ '%s'", +psi_»sourû_fže +[ +»sourû +], + +67 +¡®l_ty³_Çme +[ +¡®l_ty³ +]); + +68 +”ºo + = +EINVAL +; + +69  +”r +; + +72 +»s + = + `TEMP_FAILURE_RETRY +( + `wr™e +( +fd +, +buf +, + `¡¾’ +(buf) + 1)); + +73 ià( +»s + < 0) { + +74 + `ALOGE +("% wr™çžed fÜ…s˜¡®Èty³ '%s';ƒ¼no=%d", +psi_»sourû_fže +[ +»sourû +], + +75 +¡®l_ty³_Çme +[ +¡®l_ty³ +], +”ºo +); + +76  +”r +; + +79  +fd +; + +81 +”r +: + +82 + `þo£ +( +fd +); + +84 + } +} + +86  + $»gi¡”_psi_mÚ™Ü +( +•Þlfd +,  +fd +, * +d©a +) { + +87  +»s +; + +88  +•Þl_ev’t + +•ev +; + +90 +•ev +. +ev’ts + = +EPOLLPRI +; + +91 +•ev +. +d©a +. +±r + = data; + +92 +»s + = + `•Þl_ùl +( +•Þlfd +, +EPOLL_CTL_ADD +, +fd +, & +•ev +); + +93 ià( +»s + < 0) { + +94 + `ALOGE +("•Þl_ùÈfÜ…s˜mÚ™Ü fažed;ƒ¼no=%d", +”ºo +); + +96  +»s +; + +97 + } +} + +99  + $uÄegi¡”_psi_mÚ™Ü +( +•Þlfd +,  +fd +) { + +100  + `•Þl_ùl +( +•Þlfd +, +EPOLL_CTL_DEL +, +fd +, +NULL +); + +101 + } +} + +103  + $de¡roy_psi_mÚ™Ü +( +fd +) { + +104 ià( +fd + >= 0) { + +105 + `þo£ +( +fd +); + +107 + } +} + +109  + $·r£_psi_lše +(* +lše +, +psi_¡®l_ty³ + +¡®l_ty³ +,  +psi_¡©s + +¡©s +[]) { + +110  +ty³_Çme +[5]; + +111  +psi_¡©s + * +¡© + = & +¡©s +[ +¡®l_ty³ +]; + +113 ià(! +lše + || + `ssÿnf +(line, "%4s‡vg10=%f‡vg60=%f‡vg300=%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 + "lowmemÜykžËr" + + ) + +19  + ~<”ºo.h +> + +20  + ~<š‰y³s.h +> + +21  + ~ + +22  + ~ + +23  + ~<¡dboÞ.h +> + +24  + ~<¡dlib.h +> + +25  + ~<¡ršg.h +> + +26  + ~ + +27  + ~ + +28  + ~ + +29  + ~ + +30  + ~ + +31  + ~ + +32  + ~ + +33  + ~ + +34  + ~ + +35  + ~ + +37  + ~<®gÜ™hm +> + +38  + ~<¬¿y +> + +39  + ~ + +40  + ~ + +41  + ~ + +43  + ~ + +44  + ~<ªdroid-ba£/unique_fd.h +> + +45  + ~ + +46  + ~ + +47  + ~ + +48  + ~ + +49  + ~ + +50  + ~ + +51  + ~ + +52  + ~ + +53  + ~ + +54  + ~ + +55  + ~<´iv©e/ªdroid_fžesy¡em_cÚfig.h +> + +56  + ~<´oûssgroup/´oûssgroup.h +> + +57  + ~ + +59  + ~"»­”.h +" + +60  + ~"¡©¦og.h +" + +61  + ~"w©chdog.h +" + +67 #ifdeà +LMKD_TRACE_KILLS + + +69  + #ATRACE_TAG + +ATRACE_TAG_ALWAYS + + + ) + +70  + ~ + +72  +šlše +  + $Œaû_kžl_¡¬t +(cÚ¡ * +desc +) { + +73 + `ATRACE_BEGIN +( +desc +); + +74 + } +} + +76  +šlše +  + $Œaû_kžl_’d +() { + +77 + `ATRACE_END +(); + +78 + } +} + +82  +šlše +  + $Œaû_kžl_¡¬t +(cÚ¡ *è{ + } +} + +83  +šlše +  + $Œaû_kžl_’d +(è{ + } +} + +87 #iâdeà +__unu£d + + +88  + #__unu£d + + `__©Œibu‹__ +(( +__unu£d__ +)) + + ) + +91  + #ZONEINFO_PATH + "/´oc/zÚešfo" + + ) + +92  + #MEMINFO_PATH + "/´oc/memšfo" + + ) + +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 + "…”-nod¡©s" + + ) + +99  + #PERCEPTIBLE_APP_ADJ + 200 + + ) + +100  + #PREVIOUS_APP_ADJ + 700 + + ) + +103  + #KILLINFO_LOG_TAG + 10195355 + + ) + +106  + #INKERNEL_MINFREE_PATH + "/sys/moduË/lowmemÜykžËr/·¿m‘”s/mšä“" + + ) + +107  + #INKERNEL_ADJ_PATH + "/sys/moduË/lowmemÜykžËr/·¿m‘”s/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û_cÚfig.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£_šk”Ãl_š‹rçû + = +Œue +; + +178  +boÞ + + ghas_šk”Ãl_moduË +; + +181 + evm´essu»_Ëv– + { + +182 + mVMPRESS_LEVEL_LOW + = 0, + +183 + mVMPRESS_LEVEL_MEDIUM +, + +184 + mVMPRESS_LEVEL_CRITICAL +, + +185 + mVMPRESS_LEVEL_COUNT + + +188 cÚ¡ * + gËv–_Çme +[] = { + +195 +št64_t + + mmš_Ä_ä“_·ges +; + +196 +št64_t + + mmax_Ä_ä“_·ges +; + +197 } + glow_´essu»_mem + = { -1, -1 }; + +199  + spsi_th»shÞd + { + +200 +psi_¡®l_ty³ + + m¡®l_ty³ +; + +201  + mth»shÞd_ms +; + +205  + g¡d +:: +unique_±r +< +ªdroid +:: +bpf +:: +memev’ts +:: +MemEv’tLi¡’” +> +memev’t_li¡’” +( +nuαr +); + +206  +time¥ec + + gdœeù_»þaim_¡¬t_tm +; + +207  +time¥ec + + gksw­d_¡¬t_tm +; + +209  + gËv–_oomadj +[ +VMPRESS_LEVEL_COUNT +]; + +210  + gm³vfd +[ +VMPRESS_LEVEL_COUNT +] = { -1, -1, -1 }; + +211  +boÞ + + gpidfd_suµÜ‹d +; + +212  + gÏ¡_kžl_pid_Ü_fd + = -1; + +213  +time¥ec + + gÏ¡_kžl_tm +; + +214 +vm´essu»_Ëv– + + g´ev_Ëv– + = +VMPRESS_LEVEL_LOW +; + +215  +boÞ + + gmÚ™Üs_š™Ÿlized +; + +216  +boÞ + + gboÙ_com¶‘ed_hªdËd + = +çl£ +; + +217  +boÞ + + gmem_ev’t_upd©e_zÚešfo_suµÜ‹d +; + +220  +boÞ + + gdebug_´oûss_kžlšg +; + +221  +boÞ + + g’abË_´essu»_upg¿de +; + +222  +št64_t + + gupg¿de_´essu» +; + +223  +št64_t + + gdowng¿de_´essu» +; + +224  +boÞ + + glow_¿m_deviû +; + +225  +boÞ + + gkžl_h—v›¡_sk +; + +226  + gkžl_timeout_ms +; + +227  + g´essu»_aá”_kžl_mš_scÜe +; + +228  +boÞ + + gu£_mšä“_Ëv–s +; + +229  +boÞ + + g³r_­p_memcg +; + +230  + gsw­_ä“_low_³rûÁage +; + +231  + gpsi_·¹Ÿl_¡®l_ms +; + +232  + gpsi_com¶‘e_¡®l_ms +; + +233  + gth¿shšg_lim™_pù +; + +234  + gth¿shšg_lim™_deÿy_pù +; + +235  + gth¿shšg_ü™iÿl_pù +; + +236  + gsw­_utž_max +; + +237  +št64_t + + gfžeÿche_mš_kb +; + +238  +št64_t + + g¡®l_lim™_ü™iÿl +; + +239  +boÞ + + gu£_psi_mÚ™Üs + = +çl£ +; + +240  + gkpÞl_fd +; + +241  +boÞ + + gd–ay_mÚ™Üs_uÁž_boÙ +; + +242  + gdœeù_»þaim_th»shÞd_ms +; + +243  + gsw­_com´essiÚ_¿tio +; + +244  + glowmem_mš_oom_scÜe +; + +245  +psi_th»shÞd + + gpsi_th»shÞds +[ +VMPRESS_LEVEL_COUNT +] = { + +246 { +PSI_SOME +, 70 }, + +247 { +PSI_SOME +, 100 }, + +248 { +PSI_FULL +, 70 }, + +251  +ušt64_t + + gmp_ev’t_couÁ +; + +253  +ªdroid_log_cÚ‹xt + + gùx +; + +254  +R—³r + + g»­” +; + +255  + g»­”_comm_fd +[2]; + +257 + epÞlšg_upd©e + { + +258 + mPOLLING_DO_NOT_CHANGE +, + +259 + mPOLLING_START +, + +260 + mPOLLING_PAUSE +, + +261 + mPOLLING_RESUME +, + +270  + spÞlšg_·¿ms + { + +271  +ev’t_hªdËr_šfo +* + mpÞl_hªdËr +; + +272  +ev’t_hªdËr_šfo +* + m·u£d_hªdËr +; + +273  +time¥ec + + mpÞl_¡¬t_tm +; + +274  +time¥ec + + mÏ¡_pÞl_tm +; + +275  + mpÞlšg_š‹rv®_ms +; + +276 +pÞlšg_upd©e + + mupd©e +; + +280  + sev’t_hªdËr_šfo + { + +281  + md©a +; + +282 (* + mhªdËr +)( + md©a +, +ušt32_t + + mev’ts +,  +pÞlšg_·¿ms + * + mpÞl_·¿ms +); + +286  + ssock_ev’t_hªdËr_šfo + { + +287  + msock +; + +288 +pid_t + + mpid +; + +289 +ušt32_t + + masync_ev’t_mask +; + +290  +ev’t_hªdËr_šfo + + mhªdËr_šfo +; + +294  + #MAX_DATA_CONN + 3 + + ) + +297  +sock_ev’t_hªdËr_šfo + + gù¾_sock +; + +298  +sock_ev’t_hªdËr_šfo + + gd©a_sock +[ +MAX_DATA_CONN +]; + +301  +ev’t_hªdËr_šfo + + gvm´essu»_hšfo +[ +VMPRESS_LEVEL_COUNT +]; + +308  + #MAX_EPOLL_EVENTS + (1 + +MAX_DATA_CONN + + +VMPRESS_LEVEL_COUNT + + 1 + 1 + 1 + 1) + + ) + +309  + g•Þlfd +; + +310  + gmaxev’ts +; + +313  + #OOM_SCORE_ADJ_MIN + (-1000) + + ) + +314  + #OOM_SCORE_ADJ_MAX + 1000 + + ) + +316  + g¡d +:: +¬¿y +<, + gMAX_TARGETS +> + glowmem_adj +; + +317  + g¡d +:: +¬¿y +<, + gMAX_TARGETS +> + glowmem_mšä“ +; + +318  + glowmem_rg‘s_size +; + +322 + ezÚešfo_zÚe_f›ld + { + +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Ú¡ + gzÚešfo_zÚe_f›ld_Çmes +[ +ZI_ZONE_FIELD_COUNT +] = { + +342 + ezÚešfo_zÚe_¥ec_f›ld + { + +343 + mZI_ZONE_SPEC_PROTECTION + = 0, + +344 + mZI_ZONE_SPEC_PAGESETS +, + +345 + mZI_ZONE_SPEC_FIELD_COUNT +, + +348 cÚ¡ * cÚ¡ + gzÚešfo_zÚe_¥ec_f›ld_Çmes +[ +ZI_ZONE_SPEC_FIELD_COUNT +] = { + +354  + #MAX_NR_ZONES + 6 + + ) + +356  + uzÚešfo_zÚe_f›lds + { + +358 +št64_t + + mÄ_ä“_·ges +; + +359 +št64_t + + mmš +; + +360 +št64_t + + mlow +; + +361 +št64_t + + mhigh +; + +362 +št64_t + + m´e£Á +; + +363 +št64_t + + mÄ_ä“_cma +; + +364 } + mf›ld +; + +365 +št64_t + + m¬r +[ +ZI_ZONE_FIELD_COUNT +]; + +368  + szÚešfo_zÚe + { + +369  +zÚešfo_zÚe_f›lds + + mf›lds +; + +370 +št64_t + + m´ÙeùiÚ +[ +MAX_NR_ZONES +]; + +371 +št64_t + + mmax_´ÙeùiÚ +; + +375 + ezÚešfo_node_f›ld + { + +376 + mZI_NODE_NR_INACTIVE_FILE + = 0, + +377 + mZI_NODE_NR_ACTIVE_FILE +, + +378 + mZI_NODE_FIELD_COUNT + + +381 cÚ¡ * cÚ¡ + gzÚešfo_node_f›ld_Çmes +[ +ZI_NODE_FIELD_COUNT +] = { + +386  + uzÚešfo_node_f›lds + { + +388 +št64_t + + mÄ_šaùive_fže +; + +389 +št64_t + + mÄ_aùive_fže +; + +390 } + mf›ld +; + +391 +št64_t + + m¬r +[ +ZI_NODE_FIELD_COUNT +]; + +394  + szÚešfo_node + { + +395  + mid +; + +396  + mzÚe_couÁ +; + +397  +zÚešfo_zÚe + + mzÚes +[ +MAX_NR_ZONES +]; + +398  +zÚešfo_node_f›lds + + mf›lds +; + +402  + #MAX_NR_NODES + 2 + + ) + +404  + szÚešfo + { + +405  + mnode_couÁ +; + +406  +zÚešfo_node + + mnodes +[ +MAX_NR_NODES +]; + +407 +št64_t + + mtÙ®»£rve_·ges +; + +408 +št64_t + + mtÙ®_šaùive_fže +; + +409 +št64_t + + mtÙ®_aùive_fže +; + +413 + ememšfo_f›ld + { + +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Ú¡ + gmemšfo_f›ld_Çmes +[ +MI_FIELD_COUNT +] = { + +458  + umemšfo + { + +460 +št64_t + + mÄ_ä“_·ges +; + +461 +št64_t + + mÿched +; + +462 +št64_t + + msw­_ÿched +; + +463 +št64_t + + mbufãrs +; + +464 +št64_t + + mshmem +; + +465 +št64_t + + muÃviùabË +; + +466 +št64_t + + mtÙ®_sw­ +; + +467 +št64_t + + mä“_sw­ +; + +468 +št64_t + + maùive_ªÚ +; + +469 +št64_t + + mšaùive_ªÚ +; + +470 +št64_t + + maùive_fže +; + +471 +št64_t + + mšaùive_fže +; + +472 +št64_t + + m¤eþaimabË +; + +473 +št64_t + + msuÄeþaimabË +; + +474 +št64_t + + mk”Ãl_¡ack +; + +475 +št64_t + + m·ge_bËs +; + +476 +št64_t + + miÚ_h—p +; + +477 +št64_t + + miÚ_h—p_poÞ +; + +478 +št64_t + + mcma_ä“ +; + +480 +št64_t + + mÄ_fže_·ges +; + +481 +št64_t + + mtÙ®_gpu_kb +; + +482 +št64_t + + m—sy_avažabË +; + +483 } + mf›ld +; + +484 +št64_t + + m¬r +[ +MI_FIELD_COUNT +]; + +488 + evm¡©_f›ld + { + +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¡©_f›ld_Çmes +[ +VS_FIELD_COUNT +] = { + +513  + uvm¡© + { + +515 +št64_t + + mÄ_ä“_·ges +; + +516 +št64_t + + mÄ_šaùive_fže +; + +517 +št64_t + + mÄ_aùive_fže +; + +518 +št64_t + + mwÜkšg£t_»çuÉ +; + +519 +št64_t + + mwÜkšg£t_»çuÉ_fže +; + +520 +št64_t + + mpgsÿn_ksw­d +; + +521 +št64_t + + mpgsÿn_dœeù +; + +522 +št64_t + + mpgsÿn_dœeù_thrÙŽe +; + +523 +št64_t + + mpg»fžl +; + +524 } + mf›ld +; + +525 +št64_t + + m¬r +[ +VS_FIELD_COUNT +]; + +528 + ef›ld_m©ch_»suÉ + { + +529 + mNO_MATCH +, + +530 + mPARSE_FAIL +, + +531 + mPARSE_SUCCESS + + +534  + sadj¦Ù_li¡ + { + +535  +adj¦Ù_li¡ + * + mÃxt +; + +536  +adj¦Ù_li¡ + * + m´ev +; + +539  + s´oc + { + +540  +adj¦Ù_li¡ + + ma¦ +; + +541  + mpid +; + +542  + mpidfd +; + +543 +uid_t + + muid +; + +544  + moomadj +; + +545 +pid_t + + m»g_pid +; + +546 +boÞ + + mv®id +; + +547  +´oc + * + mpidhash_Ãxt +; + +550  + s»»ad_d©a + { + +551 cÚ¡ * cÚ¡ + mfž’ame +; + +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  + g¡d +:: +sh¬ed_mu‹x + +adj¦Ù_li¡_lock +; + +566  +adj¦Ù_li¡ + + g´oÿdj¦Ù_li¡ +[ +ADJTOSLOT_COUNT +]; + +568  + #MAX_DISTINCT_OOM_ADJ + 32 + + ) + +569  + #KILLCNT_INVALID_IDX + 0xFF + + ) + +575  +ušt8_t + + gkžlút_idx +[ +ADJTOSLOT_COUNT +]; + +576  +ušt16_t + + gkžlút +[ +MAX_DISTINCT_OOM_ADJ +]; + +577  + gkžlút_ä“_idx + = 0; + +578  +ušt32_t + + gkžlút_tÙ® + = 0; + +580  + g·gesize +; + +581  + g·ge_k +; + +583  +boÞ + +upd©e_´Ýs +(); + +584  +boÞ + +š™_mÚ™Üs +(); + +585  +de¡roy_mÚ™Üs +(); + +586  +boÞ + +š™_memev’t_li¡’”_mڙܚg +(); + +588  + $þamp +( +low +,  +high +,  +v®ue +) { + +589  +¡d +:: + `max +(¡d:: + `mš +( +v®ue +, +high +), +low +); + +590 + } +} + +592  +boÞ + + $·r£_št64 +(cÚ¡ * +¡r +, +št64_t +* +»t +) { + +593 * +’d±r +; + +594  +v® + = + `¡¹Þl +( +¡r +, & +’d±r +, 10); + +595 ià( +¡r + =ð +’d±r + || +v® + > +INT64_MAX +) { + +596  +çl£ +; + +598 * +»t + = ( +št64_t +) +v® +; + +599  +Œue +; + +600 + } +} + +602  + $fšd_f›ld +(cÚ¡ * +Çme +, cÚ¡ * cÚ¡ +f›ld_Çmes +[],  +f›ld_couÁ +) { + +603  +i + = 0; i < +f›ld_couÁ +; i++) { + +604 ià(! + `¡rcmp +( +Çme +, +f›ld_Çmes +[ +i +])) { + +605  +i +; + +609 + } +} + +611  +f›ld_m©ch_»suÉ + + $m©ch_f›ld +(cÚ¡ * +ý +, cÚ¡ * +­ +, + +612 cÚ¡ * cÚ¡ +f›ld_Çmes +[], + +613  +f›ld_couÁ +, +št64_t +* +f›ld +, + +614 * +f›ld_idx +) { + +615  +i + = + `fšd_f›ld +( +ý +, +f›ld_Çmes +, +f›ld_couÁ +); + +616 ià( +i + < 0) { + +617  +NO_MATCH +; + +619 * +f›ld_idx + = +i +; + +620  + `·r£_št64 +( +­ +, +f›ld +è? +PARSE_SUCCESS + : +PARSE_FAIL +; + +621 + } +} + +627  +ssize_t + + $»ad_®l +( +fd +, * +buf +, +size_t + +max_Ën +) + +629 +ssize_t + +»t + = 0; + +630 +off_t + +off£t + = 0; + +632  +max_Ën + > 0) { + +633 +ssize_t + +r + = + `TEMP_FAILURE_RETRY +( + `´—d +( +fd +, +buf +, +max_Ën +, +off£t +)); + +634 ià( +r + == 0) { + +637 ià( +r + == -1) { + +640 +»t + +ð +r +; + +641 +buf + +ð +r +; + +642 +off£t + +ð +r +; + +643 +max_Ën + -ð +r +; + +646  +»t +; + +647 + } +} + +656 * + $»»ad_fže +( +»»ad_d©a + * +d©a +) { + +658  +ssize_t + +buf_size + = +·gesize +; + +659 * +Ãw_buf +, * +buf + = +NULL +; + +660 +ssize_t + +size +; + +662 ià( +d©a +-> +fd + == -1) { + +664 ià(! +buf + && (buàð +¡©ic_ÿ¡ +<*>( + `m®loc +( +buf_size +))è=ð +nuαr +) { + +665  +NULL +; + +668 +d©a +-> +fd + = + `TEMP_FAILURE_RETRY +( + `Ý’ +(d©a-> +fž’ame +, +O_RDONLY + | +O_CLOEXEC +)); + +669 ià( +d©a +-> +fd + < 0) { + +670 + `ALOGE +("% Ý’: %s", +d©a +-> +fž’ame +, + `¡»¼Ü +( +”ºo +)); + +671  +NULL +; + +675  +Œue +) { + +676 +size + = + `»ad_®l +( +d©a +-> +fd +, +buf +, +buf_size + - 1); + +677 ià( +size + < 0) { + +678 + `ALOGE +("% »ad: %s", +d©a +-> +fž’ame +, + `¡»¼Ü +( +”ºo +)); + +679 + `þo£ +( +d©a +-> +fd +); + +680 +d©a +-> +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_»cÜd +( +´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  + $ù¾_d©a_þo£ +( +dsock_idx +) { + +731  +•Þl_ev’t + +•ev +; + +733 + `ALOGI +("closing†mkd data connection"); + +734 ià( + `•Þl_ùl +( +•Þlfd +, +EPOLL_CTL_DEL +, +d©a_sock +[ +dsock_idx +]. +sock +, & +•ev +) == -1) { + +736 + `ALOGW +("•Þl_ùÈfÜ d©¨cÚÃùiÚ sock‘ fažed;ƒ¼no=%d", +”ºo +); + +738 +maxev’ts +--; + +740 + `þo£ +( +d©a_sock +[ +dsock_idx +]. +sock +); + +741 +d©a_sock +[ +dsock_idx +]. +sock + = -1; + +744 + `»move_þaims +( +d©a_sock +[ +dsock_idx +]. +pid +); + +745 + } +} + +747  +ssize_t + + $ù¾_d©a_»ad +( +dsock_idx +, * +buf +, +size_t + +bufsz +,  +uüed +* +£nd”_üed +) { + +748  +iovec + +iov + = { +buf +, +bufsz +}; + +749  +cÚŒÞ +[ + `CMSG_SPACE +(( +uüed +))]; + +750  +msghdr + +hdr + = { + +751 +NULL +, 0, & +iov +, 1, +cÚŒÞ +, (control), 0, + +753 +ssize_t + +»t +; + +754 +»t + = + `TEMP_FAILURE_RETRY +( + `»cvmsg +( +d©a_sock +[ +dsock_idx +]. +sock +, & +hdr +, 0)); + +755 ià( +»t + == -1) { + +756 + `ALOGE +("cÚŒÞ d©¨sock‘„—d fažed; %s", + `¡»¼Ü +( +”ºo +)); + +759 ià( +»t + == 0) { + +760 + `ALOGE +("Got EOF on control data socket"); + +764  +uüed +* +ü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 + = ( +uüed +*) + `CMSG_DATA +( +cmsg +); + +771 +cmsg + = + `CMSG_NXTHDR +(& +hdr +, cmsg); + +774 ià( +üed + =ð +NULL +) { + +775 + `ALOGE +("Failedo„etrieve sender credentials"); + +777 + `ù¾_d©a_þo£ +( +dsock_idx +); + +781 + `memýy +( +£nd”_üed +, +üed +, ( +uüed +)); + +784 +d©a_sock +[ +dsock_idx +]. +pid + = +üed +->pid; + +786  +»t +; + +787 + } +} + +789  + $ù¾_d©a_wr™e +( +dsock_idx +, * +buf +, +size_t + +bufsz +) { + +790  +»t + = 0; + +792 +»t + = + `TEMP_FAILURE_RETRY +( + `wr™e +( +d©a_sock +[ +dsock_idx +]. +sock +, +buf +, +bufsz +)); + +794 ià( +»t + == -1) { + +795 + `ALOGE +("cÚŒÞ d©¨sock‘ wr™çžed;ƒ¼no=%d", +”ºo +); + +796 } ià( +»t + == 0) { + +797 + `ALOGE +("Got EOF on control data socket"); + +798 +»t + = -1; + +801  +»t +; + +802 + } +} + +808  + $ù¾_d©a_wr™e_lmk_kžl_occu¼ed +( +pid_t + +pid +, +uid_t + +uid +, +št64_t + +rss_kb +) { + +809 +LMKD_CTRL_PACKET + +·ck‘ +; + +810 +size_t + +Ën + = + `lmkd_·ck_£t_´ockžls +( +·ck‘ +, +pid +, +uid +, +¡©ic_ÿ¡ +<>( +rss_kb +)); + +812  +i + = 0; i < +MAX_DATA_CONN +; i++) { + +813 ià( +d©a_sock +[ +i +]. +sock + >ð0 && d©a_sock[i]. +async_ev’t_mask + & 1 << +LMK_ASYNC_EVENT_KILL +) { + +814 + `ù¾_d©a_wr™e +( +i +, (*) +·ck‘ +, +Ën +); + +817 + } +} + +822  + $¡©s_wr™e_lmk_kžl_occu¼ed +( +kžl_¡© + * +kžl_¡ +, + +823  +memÜy_¡© + * +mem_¡ +) { + +824 +LMK_KILL_OCCURRED_PACKET + +·ck‘ +; + +825 cÚ¡ +size_t + +Ën + = + `lmkd_·ck_£t_kžl_occu¼ed +( +·ck‘ +, +kžl_¡ +, +mem_¡ +); + +826 ià( +Ën + == 0) { + +830  +i + = 0; i < +MAX_DATA_CONN +; i++) { + +831 ià( +d©a_sock +[ +i +]. +sock + >ð0 && d©a_sock[i]. +async_ev’t_mask + & 1 << +LMK_ASYNC_EVENT_STAT +) { + +832 + `ù¾_d©a_wr™e +( +i +, +·ck‘ +, +Ën +); + +836 + } +} + +838  + $¡©s_wr™e_lmk_kžl_occu¼ed_pid +( +pid +,  +kžl_¡© + * +kžl_¡ +, + +839  +memÜy_¡© + * +mem_¡ +) { + +840 +kžl_¡ +-> +skÇme + = + `¡©s_g‘_sk_Çme +( +pid +); + +841 ià( +kžl_¡ +-> +skÇme + !ð +NULL +) { + +842 + `¡©s_wr™e_lmk_kžl_occu¼ed +( +kžl_¡ +, +mem_¡ +); + +844 + } +} + +846  + $pÞl_k”Ãl +( +pÞl_fd +) { + +847 ià( +pÞl_fd + == -1) { + +853  +rd_buf +[256]; + +854  +by‹s_»ad + = + `TEMP_FAILURE_RETRY +( + `´—d +( +pÞl_fd +, (*) +rd_buf +, (rd_buf) - 1, 0)); + +855 ià( +by‹s_»ad + <= 0) ; + +856 +rd_buf +[ +by‹s_»ad +] = '\0'; + +858 +št64_t + +pid +; + +859 +št64_t + +uid +; + +860 +št64_t + +group_Ëad”_pid +; + +861 +št64_t + +rss_š_·ges +; + +862  +memÜy_¡© + +mem_¡ + = {}; + +863 +št16_t + +oom_scÜe_adj +; + +864 +št16_t + +mš_scÜe_adj +; + +865 +št64_t + +¡¬‰ime +; + +866 * +skÇme + = 0; + +867 +št64_t + +rss_kb +; + +869  +f›lds_»ad + = + +870 + `ssÿnf +( +rd_buf +, + +871 "%" +SCNd64 + " %" SCNd64 " %" SCNd64 " %" SCNd64 " %" SCNd64 " %" SCNd64 + +872 " %" +SCNd16 + " %" SCNd16 " %" +SCNd64 + "\n%m[^\n]", + +873 & +pid +, & +uid +, & +group_Ëad”_pid +, & +mem_¡ +. +pgçuÉ +, &mem_¡. +pgmajçuÉ +, + +874 & +rss_š_·ges +, & +oom_scÜe_adj +, & +mš_scÜe_adj +, & +¡¬‰ime +, & +skÇme +); + +877 ià( +f›lds_»ad + =ð10 && +group_Ëad”_pid + =ð +pid +) { + +878 +mem_¡ +. +rss_š_by‹s + = +rss_š_·ges + * +·gesize +; + +879 +rss_kb + = +mem_¡ +. +rss_š_by‹s + >> 10; + +880 + `ù¾_d©a_wr™e_lmk_kžl_occu¼ed +(( +pid_t +) +pid +, ( +uid_t +) +uid +, +rss_kb +); + +881 +mem_¡ +. +´oûss_¡¬t_time_ns + = +¡¬‰ime + * ( +NS_PER_SEC + / + `syscÚf +( +_SC_CLK_TCK +)); + +883  +kžl_¡© + +kžl_¡ + = { + +884 . +uid + = +¡©ic_ÿ¡ +< +št32_t +>(uid), + +885 . +kžl_»asÚ + = +NONE +, + +886 . +oom_scÜe + = +oom_scÜe_adj +, + +887 . +mš_oom_scÜe + = +mš_scÜe_adj +, + +888 . +ä“_mem_kb + = 0, + +889 . +ä“_sw­_kb + = 0, + +891 + `¡©s_wr™e_lmk_kžl_occu¼ed_pid +( +pid +, & +kžl_¡ +, & +mem_¡ +); + +894 + `ä“ +( +skÇme +); + +896 + } +} + +898  +boÞ + + $š™_pÞl_k”Ãl +() { + +899 +kpÞl_fd + = + `TEMP_FAILURE_RETRY +( + `Ý’ +("/´oc/lowmemÜykžËr", +O_RDONLY + | +O_NONBLOCK + | +O_CLOEXEC +)); + +901 ià( +kpÞl_fd + < 0) { + +902 + `ALOGE +("k”ÃÈlmkƒv’ˆfžcould‚Ù 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¡ + * +h—d +, adj¦Ù_li¡ * +Ãw_–em’t +) + +921  +adj¦Ù_li¡ + * +Ãxt + = +h—d +->next; + +922 +Ãw_–em’t +-> +´ev + = +h—d +; + +923 +Ãw_–em’t +-> +Ãxt + =‚ext; + +924 +Ãxt +-> +´ev + = +Ãw_–em’t +; + +925 +h—d +-> +Ãxt + = +Ãw_–em’t +; + +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¡ + * +h—d +) { + +937  +adj¦Ù_li¡ + * +a¦ + = +h—d +-> +´ev +; + +939  +a¦ + =ð +h—d + ? +NULL + :‡sl; + +940 + } +} + +943  + $´oc_¦Ù +( +´oc + * +´oý +) { + +944  +adj¦Ù + = + `ADJTOSLOT +( +´oý +-> +oomadj +); + +945 +¡d +:: +scÝed_lock + + `lock +( +adj¦Ù_li¡_lock +); + +947 + `adj¦Ù_𣹠+(& +´oÿdj¦Ù_li¡ +[ +adj¦Ù +], & +´oý +-> +a¦ +); + +948 + } +} + +951  + $´oc_un¦Ù +( +´oc + * +´oý +) { + +952 +¡d +:: +scÝed_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 !ð +Ï¡_kžl_pid_Ü_fd +) { + +989 + `þo£ +( +´oý +-> +pidfd +); + +991 + `ä“ +( +´oý +); + +993 + } +} + +995  + $pid_šv®id©e +( +pid +) { + +996 +¡d +:: +sh¬ed_lock + + `lock +( +adj¦Ù_li¡_lock +); + +997  +´oc + * +´oý + = + `pid_lookup +( +pid +); + +999 ià( +´oý +) { + +1000 +´oý +-> +v®id + = +çl£ +; + +1002 + } +} + +1008  +boÞ + + $wr™efže¡ršg +(cÚ¡ * +·th +, cÚ¡ * +s +, + +1009 +boÞ + +”r_if_missšg +) { + +1010  +fd + = + `Ý’ +( +·th +, +O_WRONLY + | +O_CLOEXEC +); + +1011 +ssize_t + +Ën + = + `¡¾’ +( +s +); + +1012 +ssize_t + +»t +; + +1014 ià( +fd + < 0) { + +1015 ià( +”r_if_missšg +) { + +1016 + `ALOGE +("E¼Ü o³nšg %s;ƒ¼no=%d", +·th +, +”ºo +); + +1018  +çl£ +; + +1021 +»t + = + `TEMP_FAILURE_RETRY +( + `wr™e +( +fd +, +s +, +Ën +)); + +1022 ià( +»t + < 0) { + +1023 + `ALOGE +("E¼Ü wr™šg %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  +šlše +  + $g‘_time_diff_ms +( +time¥ec + * +äom +, + +1033  +time¥ec + * +to +) { + +1034  ( +to +-> +tv_£c + - +äom +->tv_£cè* () +MS_PER_SEC + + + +1035 ( +to +-> +tv_n£c + - +äom +->tv_n£cè/ () +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 + = + `¡r¡r +Õ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  +lše +[ +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 +, +lše +, (line) - 1); + +1095 ià( +»t + < 0) { + +1096 + `þo£ +( +fd +); + +1099 +lše +[ +»t +] = '\0'; + +1101 + `ssÿnf +( +lše +, "%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/cmdlše", +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_´oýrio +& +´oc +,  +uüed +* +üed +) { + +1134  +v® +[20]; + +1135  +soá_lim™_muÉ +; + +1136 +boÞ + +is_sy¡em_£rv” +; + +1137  +·sswd + * +pwd»c +; + +1138  +´oc +* +´oý +; + +1139  +oom_adj_scÜe + = +´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_scÜe + = 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 +:: +¡ršg + +soá_lim™_·th +; + +1172 ià(! + `CgroupG‘A‰ribu‹P©hFÜTask +("MemSoáLim™", +´oc +. +pid +, & +soá_lim™_·th +)) { + +1173 + `ALOGE +("Querying MemSoftLimit…ath failed"); + +1177 + `¢´štf +( +v® +, (v®), "%d", +soá_lim™_muÉ + * +EIGHT_MEGA +); + +1183 +is_sy¡em_£rv” + = ( +oom_adj_scÜe + =ð +SYSTEM_ADJ + && ( +pwd»c + = + `g‘pwÇm +("sy¡em")è!ð +NULL + && + +1184 +´oc +. +uid + =ð +pwd»c +-> +pw_uid +); + +1185 + `wr™efže¡ršg +( +soá_lim™_·th +. + `c_¡r +(), +v® +, ! +is_sy¡em_£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 fažed;ƒ¼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_scÜe +; + +1211 +´oý +-> +v®id + = +Œue +; + +1212 + `´oc_𣹠+( +´oý +); + +1214 ià(! + `þaim_»cÜd +( +´oý +, +üed +-> +pid +)) { + +1215  +buf +[ +LINE_MAX +]; + +1216 * +skÇme + = + `´oc_g‘_Çme +( +üed +-> +pid +, +buf +, (buf)); + +1218 + `ALOGE +("%s (%d, %d)‡ttemptso modify‡…rocess„egistered by‡nother client", + +1219 +skÇme + ?askÇm: "A…roûs ", +üed +-> +uid +, c»d-> +pid +); + +1222 + `´oc_un¦Ù +( +´oý +); + +1223 +´oý +-> +oomadj + = +oom_adj_scÜe +; + +1224 + `´oc_¦Ù +( +´oý +); + +1226 + } +} + +1228  + $­¶y_´oc_´io +(cÚ¡  +lmk_´oýrio +& +·¿ms +,  +uüed +* +ü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 +("Inv®id PROCPRIO oomadj‡rgum’ˆ%d", +·¿ms +. +oomadj +); + +1239 ià( +·¿ms +. +±y³ + < +PROC_TYPE_FIRST + ||…¬ams.±y³ >ð +PROC_TYPE_COUNT +) { + +1240 + `ALOGE +("Inv®id PROCPRIO…roûs ty³‡rgum’ˆ%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 +("Attempto„egister‡askhat is‚ot‡hread group†eader " + +1248 "Ñid %d,gid %" +PRId64 + ")", + +1249 +·¿ms +. +pid +, +tgid +); + +1257 + `¢´štf +( +·th +, Õ©h), "/´oc/%d/oom_scÜe_adj", +·¿ms +. +pid +); + +1258 + `¢´štf +( +v® +, (v®), "%d", +·¿ms +. +oomadj +); + +1259 ià(! + `wr™efže¡ršg +( +·th +, +v® +, +çl£ +)) { + +1260 + `ALOGW +("FažedØÝ’ %s;ƒ¼no=%d:…roûs %d mighˆhavb“ÀkžËd", +·th +, +”ºo +, + +1261 +·¿ms +. +pid +); + +1266 ià( +u£_šk”Ãl_š‹rçû +) { + +1267 + `¡©s_¡Üe_skÇme +( +·¿ms +. +pid +, + `´oc_g‘_Çme +Õ¬ams.pid, +·th +, (path))); + +1271 + `»gi¡”_oom_adj_´oc +( +·¿ms +, +üed +); + +1272 + } +} + +1274  + $cmd_´oýrio +( +LMKD_CTRL_PACKET + +·ck‘ +,  +f›ld_couÁ +,  +uüed +* +üed +) { + +1275  +lmk_´oýrio + +´oc_´io +; + +1277 + `lmkd_·ck_g‘_´oýrio +( +·ck‘ +, +f›ld_couÁ +, & +´oc_´io +); + +1278 + `­¶y_´oc_´io +( +´oc_´io +, +üed +); + +1279 + } +} + +1281  + $cmd_´oüemove +( +LMKD_CTRL_PACKET + +·ck‘ +,  +uüed + * +üed +) { + +1282  +lmk_´oüemove + +·¿ms +; + +1283  +´oc + * +´oý +; + +1285 + `lmkd_·ck_g‘_´oüemove +( +·ck‘ +, & +·¿ms +); + +1287 ià( +u£_šk”Ãl_š‹rçû +) { + +1294 + `pÞl_k”Ãl +( +kpÞl_fd +); + +1296 + `¡©s_»move_skÇme +( +·¿ms +. +pid +); + +1300 +´oý + = + `pid_lookup +( +·¿ms +. +pid +); + +1301 ià(! +´oý +) { + +1305 ià(! + `þaim_»cÜd +( +´oý +, +üed +-> +pid +)) { + +1306  +buf +[ +LINE_MAX +]; + +1307 * +skÇme + = + `´oc_g‘_Çme +( +üed +-> +pid +, +buf +, (buf)); + +1309 + `ALOGE +("%s (%d, %d)‡ttemptso unregister‡…rocess„egistered by‡nother client", + +1310 +skÇme + ?askÇm: "A…roûs ", +üed +-> +uid +, c»d-> +pid +); + +1318 + `pid_»move +( +·¿ms +. +pid +); + +1319 + } +} + +1321  + $cmd_´oýurge +( +uüed + * +üed +) { + +1322  +i +; + +1323  +´oc + * +´oý +; + +1324  +´oc + * +Ãxt +; + +1326 ià( +u£_šk”Ãl_š‹rçû +) { + +1327 + `¡©s_purge_skÇmes +(); + +1331  +i + = 0; i < +PIDHASH_SZ +; i++) { + +1332 +´oý + = +pidhash +[ +i +]; + +1333  +´oý +) { + +1334 +Ãxt + = +´oý +-> +pidhash_Ãxt +; + +1336 ià( + `þaim_»cÜd +( +´oý +, +üed +-> +pid +)) { + +1337 + `pid_»move +( +´oý +-> +pid +); + +1339 +´oý + = +Ãxt +; + +1342 + } +} + +1344  + $cmd_subsüibe +( +dsock_idx +, +LMKD_CTRL_PACKET + +·ck‘ +) { + +1345  +lmk_subsüibe + +·¿ms +; + +1347 + `lmkd_·ck_g‘_subsüibe +( +·ck‘ +, & +·¿ms +); + +1348 +d©a_sock +[ +dsock_idx +]. +async_ev’t_mask + |ð1 << +·¿ms +. +evt_ty³ +; + +1349 + } +} + +1351  + $šc_kžlút +( +oomadj +) { + +1352  +¦Ù + = + `ADJTOSLOT +( +oomadj +); + +1353 +ušt8_t + +idx + = +kžlút_idx +[ +¦Ù +]; + +1355 ià( +idx + =ð +KILLCNT_INVALID_IDX +) { + +1357 ià( +kžlút_ä“_idx + < +MAX_DISTINCT_OOM_ADJ +) { + +1358 +kžlút_idx +[ +¦Ù +] = +kžlút_ä“_idx +; + +1359 +kžlút +[ +kžlút_ä“_idx +] = 1; + +1360 +kžlút_ä“_idx +++; + +1362 + `ALOGW +("Number of distinct oomadj†evelsƒxceeds %d", + +1363 +MAX_DISTINCT_OOM_ADJ +); + +1370 +kžlút +[ +idx +]++; + +1373 +kžlút_tÙ® +++; + +1374 + } +} + +1376  + $g‘_kžlút +( +mš_oomadj +,  +max_oomadj +) { + +1377  +¦Ù +; + +1378  +couÁ + = 0; + +1380 ià( +mš_oomadj + > +max_oomadj +) + +1384 ià( +mš_oomadj + > +OOM_SCORE_ADJ_MAX +) + +1385  +kžlút_tÙ® +; + +1387  +mš_oomadj + <ð +max_oomadj + && + +1388 ( +¦Ù + = + `ADJTOSLOT +( +mš_oomadj +)è< +ADJTOSLOT_COUNT +) { + +1389 +ušt8_t + +idx + = +kžlút_idx +[ +¦Ù +]; + +1390 ià( +idx + !ð +KILLCNT_INVALID_IDX +) { + +1391 +couÁ + +ð +kžlút +[ +idx +]; + +1393 +mš_oomadj +++; + +1396  +couÁ +; + +1397 + } +} + +1399  + $cmd_g‘kžlút +( +LMKD_CTRL_PACKET + +·ck‘ +) { + +1400  +lmk_g‘kžlút + +·¿ms +; + +1402 ià( +u£_šk”Ãl_š‹rçû +) { + +1407 + `lmkd_·ck_g‘_g‘kžlút +( +·ck‘ +, & +·¿ms +); + +1409  + `g‘_kžlút +( +·¿ms +. +mš_oomadj +,…¬ams. +max_oomadj +); + +1410 + } +} + +1412  + $cmd_rg‘ +( +Á¬g‘s +, +LMKD_CTRL_PACKET + +·ck‘ +) { + +1413  +i +; + +1414  +lmk_rg‘ + +rg‘ +; + +1415  +mšä“_¡r +[ +PROPERTY_VALUE_MAX +]; + +1416 * +p¡r + = +mšä“_¡r +; + +1417 * +³nd + = +mšä“_¡r + + (minfree_str); + +1418  +time¥ec + +Ï¡_»q_tm +; + +1419  +time¥ec + +cu¼_tm +; + +1421 ià( +Á¬g‘s + < 1 ||‚rg‘ > () +lowmem_adj +. + `size +()) { + +1429 ià( + `þock_g‘time +( +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 updatedo†mkd†imits"); + +1440 +Ï¡_»q_tm + = +cu¼_tm +; + +1442  +i + = 0; i < +Á¬g‘s +; i++) { + +1443 + `lmkd_·ck_g‘_rg‘ +( +·ck‘ +, +i +, & +rg‘ +); + +1444 +lowmem_mšä“ +[ +i +] = +rg‘ +. +mšä“ +; + +1445 +lowmem_adj +[ +i +] = +rg‘ +. +oom_adj_scÜe +; + +1447 +p¡r + +ð + `¢´štf +Õ¡r, +³nd + -…¡r, "%d:%d,", +rg‘ +. +mšä“ +, + +1448 +rg‘ +. +oom_adj_scÜe +); + +1449 ià( +p¡r + >ð +³nd +) { + +1451 +p¡r + = +³nd +; + +1456 +lowmem_rg‘s_size + = +Á¬g‘s +; + +1459 +p¡r +[-1] = '\0'; + +1460 + `´Ý”ty_£t +("sys.lmk.mšä“_Ëv–s", +mšä“_¡r +); + +1462 ià( +has_šk”Ãl_moduË +) { + +1463  +mšä“¡r +[128]; + +1464  +kžÍrio¡r +[128]; + +1466 +mšä“¡r +[0] = '\0'; + +1467 +kžÍrio¡r +[0] = '\0'; + +1469  +i + = 0; i < +lowmem_rg‘s_size +; i++) { + +1470  +v® +[40]; + +1472 ià( +i +) { + +1473 + `¡¾ÿt +( +mšä“¡r +, ",", (minfreestr)); + +1474 + `¡¾ÿt +( +kžÍrio¡r +, ",", (killpriostr)); + +1477 + `¢´štf +( +v® +, (v®), "%d", +u£_šk”Ãl_š‹rçû + ? +lowmem_mšä“ +[ +i +] : 0); + +1478 + `¡¾ÿt +( +mšä“¡r +, +v® +, (minfreestr)); + +1479 + `¢´štf +( +v® +, (v®), "%d", +u£_šk”Ãl_š‹rçû + ? +lowmem_adj +[ +i +] : 0); + +1480 + `¡¾ÿt +( +kžÍrio¡r +, +v® +, (killpriostr)); + +1483 + `wr™efže¡ršg +( +INKERNEL_MINFREE_PATH +, +mšä“¡r +, +Œue +); + +1484 + `wr™efže¡ršg +( +INKERNEL_ADJ_PATH +, +kžÍrio¡r +, +Œue +); + +1486 + } +} + +1488  + $cmd_´ocs_´io +( +LMKD_CTRL_PACKET + +·ck‘ +, cÚ¡  +f›ld_couÁ +,  +uüed +* +üed +) { + +1489  +lmk_´ocs_´io + +·¿ms +; + +1491 cÚ¡  +´ocs_couÁ + = + `lmkd_·ck_g‘_´ocs_´io +( +·ck‘ +, & +·¿ms +, +f›ld_couÁ +); + +1492 ià( +´ocs_couÁ + < 0) { + +1493 + `ALOGE +("LMK_PROCS_PRIO„eceived invalid…acket format"); + +1497  +i + = 0; i < +´ocs_couÁ +; i++) { + +1498 + `­¶y_´oc_´io +( +·¿ms +. +´ocs +[ +i +], +üed +); + +1500 + } +} + +1502  + $ù¾_commªd_hªdËr +( +dsock_idx +) { + +1503 +LMKD_CTRL_PACKET + +·ck‘ +; + +1504  +uüed + +üed +; + +1505  +Ën +; + +1506 +lmk_cmd + +cmd +; + +1507  +Çrgs +; + +1508  +rg‘s +; + +1509  +kžl_út +; + +1510  +»suÉ +; + +1512 +Ën + = + `ù¾_d©a_»ad +( +dsock_idx +, (*) +·ck‘ +, +CTRL_PACKET_MAX_SIZE +, & +üed +); + +1513 ià( +Ën + <= 0) + +1516 ià( +Ën + < ()()) { + +1517 + `ALOGE +("WrÚg cÚŒÞ sock‘„—d†’gth†’=%d", +Ën +); + +1521 +cmd + = + `lmkd_·ck_g‘_cmd +( +·ck‘ +); + +1522 +Çrgs + = +Ën + / () - 1; + +1523 ià( +Çrgs + < 0) + +1524  +wrÚgËn +; + +1526  +cmd +) { + +1527  +LMK_TARGET +: + +1528 +rg‘s + = +Çrgs + / 2; + +1529 ià( +Çrgs + & 0x1 || +rg‘s + > () +lowmem_adj +. + `size +()) { + +1530  +wrÚgËn +; + +1532 + `cmd_rg‘ +( +rg‘s +, +·ck‘ +); + +1534  +LMK_PROCPRIO +: + +1536 ià( +Çrgs + < 3 ||‚args > 4) + +1537  +wrÚgËn +; + +1538 + `cmd_´oýrio +( +·ck‘ +, +Çrgs +, & +üed +); + +1540  +LMK_PROCREMOVE +: + +1541 ià( +Çrgs + != 1) + +1542  +wrÚgËn +; + +1543 + `cmd_´oüemove +( +·ck‘ +, & +üed +); + +1545  +LMK_PROCPURGE +: + +1546 ià( +Çrgs + != 0) + +1547  +wrÚgËn +; + +1548 + `cmd_´oýurge +(& +üed +); + +1550  +LMK_GETKILLCNT +: + +1551 ià( +Çrgs + != 2) + +1552  +wrÚgËn +; + +1553 +kžl_út + = + `cmd_g‘kžlút +( +·ck‘ +); + +1554 +Ën + = + `lmkd_·ck_£t_g‘kžlút_»¶ +( +·ck‘ +, +kžl_út +); + +1555 ià( + `ù¾_d©a_wr™e +( +dsock_idx +, (*) +·ck‘ +, +Ën +) !=†en) + +1558  +LMK_SUBSCRIBE +: + +1559 ià( +Çrgs + != 1) + +1560  +wrÚgËn +; + +1561 + `cmd_subsüibe +( +dsock_idx +, +·ck‘ +); + +1563  +LMK_PROCKILL +: + +1565 + `ALOGE +("Reûived uÃx³ùed commªd cod%d", +cmd +); + +1567  +LMK_UPDATE_PROPS +: + +1568 ià( +Çrgs + != 0) + +1569  +wrÚgËn +; + +1570 +»suÉ + = -1; + +1571 ià( + `upd©e_´Ýs +()) { + +1572 ià(! +u£_šk”Ãl_š‹rçû + && +mÚ™Üs_š™Ÿlized +) { + +1574 + `de¡roy_mÚ™Üs +(); + +1575 ià( + `š™_mÚ™Üs +()) { + +1576 +»suÉ + = 0; + +1579 +»suÉ + = 0; + +1582 ià( +dœeù_»þaim_th»shÞd_ms + > 0 && ! +memev’t_li¡’” +) { + +1583 + `ALOGW +("Kernel support for direct_reclaim_threshold_ms is‚ot found"); + +1584 +dœeù_»þaim_th»shÞd_ms + = 0; + +1588 +Ën + = + `lmkd_·ck_£t_upd©e_´Ýs_»¶ +( +·ck‘ +, +»suÉ +); + +1589 ià( + `ù¾_d©a_wr™e +( +dsock_idx +, (*) +·ck‘ +, +Ën +) !=†en) { + +1590 + `ALOGE +("Failedo„eport operation„esults"); + +1592 ià(! +»suÉ +) { + +1593 + `ALOGI +("Properties„einitilized"); + +1596 + `ALOGE +("New configuration is‚ot supported. Exiting..."); + +1597 + `ex™ +(1); + +1600  +LMK_START_MONITORING +: + +1601 ià( +Çrgs + != 0) + +1602  +wrÚgËn +; + +1604 ià( +mÚ™Üs_š™Ÿlized +) + +1606 ià(! + `´Ý”ty_g‘_boÞ +("sys.boÙ_com¶‘ed", +ç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 monitors‡fter boot completed."); + +1618  +LMK_BOOT_COMPLETED +: + +1619 ià( +Çrgs + !ð0è +wrÚgËn +; + +1621 ià( +boÙ_com¶‘ed_hªdËd +) { + +1623 +»suÉ + = 1; + +1624 } ià(! + `´Ý”ty_g‘_boÞ +("sys.boÙ_com¶‘ed", +çl£ +)) { + +1625 + `ALOGE +("LMK_BOOT_COMPLETED cannot be handled before boot completed"); + +1626 +»suÉ + = -1; + +1632 ià( + `š™_memev’t_li¡’”_mڙܚg +()) { + +1633 + `ALOGI +("Using memevents for direct„eclaim‡nd kswapd detection"); + +1635 + `ALOGI +("Using vmstats for direct„eclaim‡nd kswapd detection"); + +1636 ià( +dœeù_»þaim_th»shÞd_ms + > 0) { + +1637 + `ALOGW +("Kernel support for direct_reclaim_threshold_ms is‚ot found"); + +1638 +dœeù_»þaim_th»shÞd_ms + = 0; + +1641 +»suÉ + = 0; + +1642 +boÙ_com¶‘ed_hªdËd + = +Œue +; + +1645 +Ën + = + `lmkd_·ck_£t_boÙ_com¶‘ed_nÙif_»¶ +( +·ck‘ +, +»suÉ +); + +1646 ià( + `ù¾_d©a_wr™e +( +dsock_idx +, (*) +·ck‘ +, +Ën +) !=†en) { + +1647 + `ALOGE +("Failedo„eport boot-completed operation„esults"); + +1650  +LMK_PROCS_PRIO +: + +1651 + `cmd_´ocs_´io +( +·ck‘ +, +Çrgs +, & +üed +); + +1654 + `ALOGE +("Reûived unknowÀcommªd cod%d", +cmd +); + +1660 +wrÚgËn +: + +1661 + `ALOGE +("WrÚg cÚŒÞ sock‘„—d†’gth cmd=%d†’=%d", +cmd +, +Ën +); + +1662 + } +} + +1664  + $ù¾_d©a_hªdËr +( +d©a +, +ušt32_t + +ev’ts +, + +1665  +pÞlšg_·¿ms + * +pÞl_·¿ms + +__unu£d +) { + +1666 ià( +ev’ts + & +EPOLLIN +) { + +1667 + `ù¾_commªd_hªdËr +( +d©a +); + +1669 + } +} + +1671  + $g‘_ä“_dsock +() { + +1672  +i + = 0; i < +MAX_DATA_CONN +; i++) { + +1673 ià( +d©a_sock +[ +i +]. +sock + < 0) { + +1674  +i +; + +1678 + } +} + +1680  + $ù¾_cÚÃù_hªdËr +( +d©a + +__unu£d +, +ušt32_t + +ev’ts + __unused, + +1681  +pÞlšg_·¿ms + * +pÞl_·¿ms + +__unu£d +) { + +1682  +•Þl_ev’t + +•ev +; + +1683  +ä“_dscock_idx + = + `g‘_ä“_dsock +(); + +1685 ià( +ä“_dscock_idx + < 0) { + +1693  +i + = 0; i < +MAX_DATA_CONN +; i++) { + +1694 + `ù¾_d©a_þo£ +( +i +); + +1696 +ä“_dscock_idx + = 0; + +1699 +d©a_sock +[ +ä“_dscock_idx +]. +sock + = + `acû± +( +ù¾_sock +.sock, +NULL +, NULL); + +1700 ià( +d©a_sock +[ +ä“_dscock_idx +]. +sock + < 0) { + +1701 + `ALOGE +("lmkd cÚŒÞ sock‘‡cû± fažed;ƒ¼no=%d", +”ºo +); + +1705 + `ALOGI +("lmkd data connectionƒstablished"); + +1707 +d©a_sock +[ +ä“_dscock_idx +]. +hªdËr_šfo +. +d©a + = free_dscock_idx; + +1708 +d©a_sock +[ +ä“_dscock_idx +]. +hªdËr_šfo +. +hªdËr + = +ù¾_d©a_hªdËr +; + +1709 +d©a_sock +[ +ä“_dscock_idx +]. +async_ev’t_mask + = 0; + +1710 +•ev +. +ev’ts + = +EPOLLIN +; + +1711 +•ev +. +d©a +. +±r + = (*)&( +d©a_sock +[ +ä“_dscock_idx +]. +hªdËr_šfo +); + +1712 ià( + `•Þl_ùl +( +•Þlfd +, +EPOLL_CTL_ADD +, +d©a_sock +[ +ä“_dscock_idx +]. +sock +, & +•ev +) == -1) { + +1713 + `ALOGE +("•Þl_ùÈfÜ d©¨cÚÃùiÚ sock‘ fažed;ƒ¼no=%d", +”ºo +); + +1714 + `ù¾_d©a_þo£ +( +ä“_dscock_idx +); + +1717 +maxev’ts +++; + +1718 + } +} + +1736  + $zÚešfo_·r£_´ÙeùiÚ +(* +buf +,  +zÚešfo_zÚe + * +zÚe +) { + +1737  +zÚe_idx +; + +1738 +št64_t + +max + = 0; + +1739 * +§ve_±r +; + +1741  +buf + = + `¡¹ok_r +(buf, "(), ", & +§ve_±r +), +zÚe_idx + = 0; + +1742 +buf + && +zÚe_idx + < +MAX_NR_ZONES +; + +1743 +buf + = + `¡¹ok_r +( +NULL +, "), ", & +§ve_±r +), +zÚe_idx +++) { + +1744  +zÚev® + = + `¡¹Þl +( +buf +, &buf, 0); + +1745 ià( +zÚev® + > +max +) { + +1746 +max + = ( +zÚev® + > +INT64_MAX +) ? INT64_MAX : zoneval; + +1748 +zÚe +-> +´ÙeùiÚ +[ +zÚe_idx +] = +zÚev® +; + +1750 +zÚe +-> +max_´ÙeùiÚ + = +max +; + +1751 + } +} + +1753  + $zÚešfo_·r£_zÚe +(** +buf +,  +zÚešfo_zÚe + * +zÚe +) { + +1754 * +lše + = + `¡¹ok_r +( +NULL +, "\n", +buf +);†ine; + +1755 +lše + = + `¡¹ok_r +( +NULL +, "\n", +buf +)) { + +1756 * +ý +; + +1757 * +­ +; + +1758 * +§ve_±r +; + +1759 +št64_t + +v® +; + +1760  +f›ld_idx +; + +1761 +f›ld_m©ch_»suÉ + +m©ch_»s +; + +1763 +ý + = + `¡¹ok_r +( +lše +, " ", & +§ve_±r +); + +1764 ià(! +ý +) { + +1765  +çl£ +; + +1768 +f›ld_idx + = + `fšd_f›ld +( +ý +, +zÚešfo_zÚe_¥ec_f›ld_Çmes +, +ZI_ZONE_SPEC_FIELD_COUNT +); + +1769 ià( +f›ld_idx + >= 0) { + +1771 ià( +f›ld_idx + =ð +ZI_ZONE_SPEC_PAGESETS +) { + +1773  +Œue +; + +1777 +­ + = + `¡¹ok_r +( +NULL +, ")", & +§ve_±r +); + +1778 ià( +­ +) { + +1779 + `zÚešfo_·r£_´ÙeùiÚ +( +­ +, +zÚe +); + +1784 +­ + = + `¡¹ok_r +( +NULL +, " ", & +§ve_±r +); + +1785 ià(! +­ +) { + +1789 +m©ch_»s + = + `m©ch_f›ld +( +ý +, +­ +, +zÚešfo_zÚe_f›ld_Çmes +, +ZI_ZONE_FIELD_COUNT +, + +1790 & +v® +, & +f›ld_idx +); + +1791 ià( +m©ch_»s + =ð +PARSE_FAIL +) { + +1792  +çl£ +; + +1794 ià( +m©ch_»s + =ð +PARSE_SUCCESS +) { + +1795 +zÚe +-> +f›lds +. +¬r +[ +f›ld_idx +] = +v® +; + +1797 ià( +f›ld_idx + =ð +ZI_ZONE_PRESENT + && +v® + == 0) { + +1799  +Œue +; + +1802  +çl£ +; + +1803 + } +} + +1805  + $zÚešfo_·r£_node +(** +buf +,  +zÚešfo_node + * +node +) { + +1806  +f›lds_to_m©ch + = +ZI_NODE_FIELD_COUNT +; + +1808 * +lše + = + `¡¹ok_r +( +NULL +, "\n", +buf +);†ine; + +1809 +lše + = + `¡¹ok_r +( +NULL +, "\n", +buf +)) { + +1810 * +ý +; + +1811 * +­ +; + +1812 * +§ve_±r +; + +1813 +št64_t + +v® +; + +1814  +f›ld_idx +; + +1815 +f›ld_m©ch_»suÉ + +m©ch_»s +; + +1817 +ý + = + `¡¹ok_r +( +lše +, " ", & +§ve_±r +); + +1818 ià(! +ý +) { + +1819  +çl£ +; + +1822 +­ + = + `¡¹ok_r +( +NULL +, " ", & +§ve_±r +); + +1823 ià(! +­ +) { + +1824  +çl£ +; + +1827 +m©ch_»s + = + `m©ch_f›ld +( +ý +, +­ +, +zÚešfo_node_f›ld_Çmes +, +ZI_NODE_FIELD_COUNT +, + +1828 & +v® +, & +f›ld_idx +); + +1829 ià( +m©ch_»s + =ð +PARSE_FAIL +) { + +1830  +çl£ +; + +1832 ià( +m©ch_»s + =ð +PARSE_SUCCESS +) { + +1833 +node +-> +f›lds +. +¬r +[ +f›ld_idx +] = +v® +; + +1834 +f›lds_to_m©ch +--; + +1835 ià(! +f›lds_to_m©ch +) { + +1836  +Œue +; + +1840  +çl£ +; + +1841 + } +} + +1843  + $zÚešfo_·r£ +( +zÚešfo + * +zi +) { + +1844  +»»ad_d©a + +fže_d©a + = { + +1845 . +fž’ame + = +ZONEINFO_PATH +, + +1846 . +fd + = -1, + +1848 * +buf +; + +1849 * +§ve_±r +; + +1850 * +lše +; + +1851  +zÚe_Çme +[ +LINE_MAX + + 1]; + +1852  +zÚešfo_node + * +node + = +NULL +; + +1853  +node_idx + = 0; + +1854  +zÚe_idx + = 0; + +1856 + `mem£t +( +zi +, 0, ( +zÚešfo +)); + +1858 ià(( +buf + = + `»»ad_fže +(& +fže_d©a +)è=ð +NULL +) { + +1862  +lše + = + `¡¹ok_r +( +buf +, "\n", & +§ve_±r +);†ine; + +1863 +lše + = + `¡¹ok_r +( +NULL +, "\n", & +§ve_±r +)) { + +1864  +node_id +; + +1865 ià( + `ssÿnf +( +lše +, "Nod%d, zÚ%" + `STRINGIFY +( +LINE_MAX +è"s", & +node_id +, +zÚe_Çme +) == 2) { + +1866 ià(! +node + ||‚ode-> +id + !ð +node_id +) { + +1867 +lše + = + `¡¹ok_r +( +NULL +, "\n", & +§ve_±r +); + +1868 ià( + `¡ºcmp +( +lše +, +NODE_STATS_MARKER +, + `¡¾’ +(NODE_STATS_MARKER)) != 0) { + +1877 ià( +node +) { + +1878 +node +-> +zÚe_couÁ + = +zÚe_idx + + 1; + +1879 +node_idx +++; + +1880 ià( +node_idx + =ð +MAX_NR_NODES +) { + +1882 + `ALOGE +("% ·r£ƒ¼Ü", +fže_d©a +. +fž’ame +); + +1886 +node + = & +zi +-> +nodes +[ +node_idx +]; + +1887 +node +-> +id + = +node_id +; + +1888 +zÚe_idx + = 0; + +1889 ià(! + `zÚešfo_·r£_node +(& +§ve_±r +, +node +)) { + +1890 + `ALOGE +("% ·r£ƒ¼Ü", +fže_d©a +. +fž’ame +); + +1895 +zÚe_idx +++; + +1897 ià(! + `zÚešfo_·r£_zÚe +(& +§ve_±r +, & +node +-> +zÚes +[ +zÚe_idx +])) { + +1898 + `ALOGE +("% ·r£ƒ¼Ü", +fže_d©a +. +fž’ame +); + +1903 ià(! +node +) { + +1904 + `ALOGE +("% ·r£ƒ¼Ü", +fže_d©a +. +fž’ame +); + +1907 +node +-> +zÚe_couÁ + = +zÚe_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  +zÚe_idx + = 0; zÚe_idx < +node +-> +zÚe_couÁ +; zone_idx++) { + +1914  +zÚešfo_zÚe + * +zÚe + = & +zi +-> +nodes +[ +node_idx +]. +zÚes +[ +zÚe_idx +]; + +1915 +zi +-> +tÙ®»£rve_·ges + +ð +zÚe +-> +max_´ÙeùiÚ + + zÚe-> +f›lds +. +f›ld +. +high +; + +1917 +zi +-> +tÙ®_šaùive_fže + +ð +node +-> +f›lds +. +f›ld +. +Ä_šaùive_fže +; + +1918 +zi +-> +tÙ®_aùive_fže + +ð +node +-> +f›lds +. +f›ld +. +Ä_aùive_fže +; + +1921 + } +} + +1924  +boÞ + + $memšfo_·r£_lše +(* +lše +,  +memšfo + * +mi +) { + +1925 * +ý + = +lše +; + +1926 * +­ +; + +1927 * +§ve_±r +; + +1928 +št64_t + +v® +; + +1929  +f›ld_idx +; + +1930 +f›ld_m©ch_»suÉ + +m©ch_»s +; + +1932 +ý + = + `¡¹ok_r +( +lše +, " ", & +§ve_±r +); + +1933 ià(! +ý +) { + +1934  +çl£ +; + +1937 +­ + = + `¡¹ok_r +( +NULL +, " ", & +§ve_±r +); + +1938 ià(! +­ +) { + +1939  +çl£ +; + +1942 +m©ch_»s + = + `m©ch_f›ld +( +ý +, +­ +, +memšfo_f›ld_Çmes +, +MI_FIELD_COUNT +, + +1943 & +v® +, & +f›ld_idx +); + +1944 ià( +m©ch_»s + =ð +PARSE_SUCCESS +) { + +1945 +mi +-> +¬r +[ +f›ld_idx +] = +v® + / +·ge_k +; + +1947  ( +m©ch_»s + !ð +PARSE_FAIL +); + +1948 + } +} + +1950  +št64_t + + $»ad_gpu_tÙ®_kb +() { + +1951  +ªdroid +:: +ba£ +:: +unique_fd + + `fd +( + +1952 +ªdroid +:: +bpf +:: + `m­R‘r›veRO +("/sys/fs/bpf/map_gpuMem_gpu_mem_total_map")); + +1953  +cÚ¡ex´ + +ušt64_t + +kBpfKeyGpuTÙ®U§ge + = 0; + +1954 +ušt64_t + +v®ue +; + +1956 ià(! +fd +. + `ok +()) { + +1960  +ªdroid +:: +bpf +:: + `fšdM­EÁry +( +fd +, & +kBpfKeyGpuTÙ®U§ge +, & +v®ue +) + +1962 : ( +št32_t +)( +v®ue + / 1024); + +1963 + } +} + +1965  + $memšfo_·r£ +( +memšfo + * +mi +) { + +1966  +»»ad_d©a + +fže_d©a + = { + +1967 . +fž’ame + = +MEMINFO_PATH +, + +1968 . +fd + = -1, + +1970 * +buf +; + +1971 * +§ve_±r +; + +1972 * +lše +; + +1974 + `mem£t +( +mi +, 0, ( +memšfo +)); + +1976 ià(( +buf + = + `»»ad_fže +(& +fže_d©a +)è=ð +NULL +) { + +1980  +lše + = + `¡¹ok_r +( +buf +, "\n", & +§ve_±r +);†ine; + +1981 +lše + = + `¡¹ok_r +( +NULL +, "\n", & +§ve_±r +)) { + +1982 ià(! + `memšfo_·r£_lše +( +lše +, +mi +)) { + +1983 + `ALOGE +("% ·r£ƒ¼Ü", +fže_d©a +. +fž’ame +); + +1987 +mi +-> +f›ld +. +Ä_fže_·ges + = mi->f›ld. +ÿched + + mi->f›ld. +sw­_ÿched + + + +1988 +mi +-> +f›ld +. +bufãrs +; + +1989 +mi +-> +f›ld +. +tÙ®_gpu_kb + = + `»ad_gpu_tÙ®_kb +(); + +1990 +mi +-> +f›ld +. +—sy_avažabË + = mi->f›ld. +Ä_ä“_·ges + + mi->f›ld. +šaùive_fže +; + +1993 + } +} + +2001  +šlše + +št64_t + + $g‘_ä“_sw­ +( +memšfo + * +mi +) { + +2002 ià( +sw­_com´essiÚ_¿tio +) + +2003  +¡d +:: + `mš +( +mi +-> +f›ld +. +ä“_sw­ +, mi->f›ld. +—sy_avažabË + * +sw­_com´essiÚ_¿tio +); + +2004  +mi +-> +f›ld +. +ä“_sw­ +; + +2005 + } +} + +2008  +boÞ + + $vm¡©_·r£_lše +(* +lše +,  +vm¡© + * +vs +) { + +2009 * +ý +; + +2010 * +­ +; + +2011 * +§ve_±r +; + +2012 +št64_t + +v® +; + +2013  +f›ld_idx +; + +2014 +f›ld_m©ch_»suÉ + +m©ch_»s +; + +2016 +ý + = + `¡¹ok_r +( +lše +, " ", & +§ve_±r +); + +2017 ià(! +ý +) { + +2018  +çl£ +; + +2021 +­ + = + `¡¹ok_r +( +NULL +, " ", & +§ve_±r +); + +2022 ià(! +­ +) { + +2023  +çl£ +; + +2026 +m©ch_»s + = + `m©ch_f›ld +( +ý +, +­ +, +vm¡©_f›ld_Çmes +, +VS_FIELD_COUNT +, + +2027 & +v® +, & +f›ld_idx +); + +2028 ià( +m©ch_»s + =ð +PARSE_SUCCESS +) { + +2029 +vs +-> +¬r +[ +f›ld_idx +] = +v® +; + +2031  ( +m©ch_»s + !ð +PARSE_FAIL +); + +2032 + } +} + +2034  + $vm¡©_·r£ +( +vm¡© + * +vs +) { + +2035  +»»ad_d©a + +fže_d©a + = { + +2036 . +fž’ame + = +VMSTAT_PATH +, + +2037 . +fd + = -1, + +2039 * +buf +; + +2040 * +§ve_±r +; + +2041 * +lše +; + +2043 + `mem£t +( +vs +, 0, ( +vm¡© +)); + +2045 ià(( +buf + = + `»»ad_fže +(& +fže_d©a +)è=ð +NULL +) { + +2049  +lše + = + `¡¹ok_r +( +buf +, "\n", & +§ve_±r +);†ine; + +2050 +lše + = + `¡¹ok_r +( +NULL +, "\n", & +§ve_±r +)) { + +2051 ià(! + `vm¡©_·r£_lše +( +lše +, +vs +)) { + +2052 + `ALOGE +("% ·r£ƒ¼Ü", +fže_d©a +. +fž’ame +); + +2058 + } +} + +2060  + $psi_·r£ +( +»»ad_d©a + * +fže_d©a +,  +psi_¡©s + +¡©s +[], +boÞ + +fuÎ +) { + +2061 * +buf +; + +2062 * +§ve_±r +; + +2063 * +lše +; + +2065 ià(( +buf + = + `»»ad_fže +( +fže_d©a +)è=ð +NULL +) { + +2069 +lše + = + `¡¹ok_r +( +buf +, "\n", & +§ve_±r +); + +2070 ià( + `·r£_psi_lše +( +lše +, +PSI_SOME +, +¡©s +)) { + +2073 ià( +fuÎ +) { + +2074 +lše + = + `¡¹ok_r +( +NULL +, "\n", & +§ve_±r +); + +2075 ià( + `·r£_psi_lše +( +lše +, +PSI_FULL +, +¡©s +)) { + +2081 + } +} + +2083  + $psi_·r£_mem +( +psi_d©a + *psi_data) { + +2084  +»»ad_d©a + +fže_d©a + = { + +2085 . +fž’ame + = +psi_»sourû_fže +[ +PSI_MEMORY +], + +2086 . +fd + = -1, + +2088  + `psi_·r£ +(& +fže_d©a +, +psi_d©a +-> +mem_¡©s +, +Œue +); + +2089 + } +} + +2091  + $psi_·r£_io +( +psi_d©a + *psi_data) { + +2092  +»»ad_d©a + +fže_d©a + = { + +2093 . +fž’ame + = +psi_»sourû_fže +[ +PSI_IO +], + +2094 . +fd + = -1, + +2096  + `psi_·r£ +(& +fže_d©a +, +psi_d©a +-> +io_¡©s +, +Œue +); + +2097 + } +} + +2099  + $psi_·r£_ýu +( +psi_d©a + *psi_data) { + +2100  +»»ad_d©a + +fže_d©a + = { + +2101 . +fž’ame + = +psi_»sourû_fže +[ +PSI_CPU +], + +2102 . +fd + = -1, + +2104  + `psi_·r£ +(& +fže_d©a +, +psi_d©a +-> +ýu_¡©s +, +çl£ +); + +2105 + } +} + +2107 + ewakeup_»asÚ + { + +2108 + mEv’t +, + +2109 + mPÞlšg + + +2112  + swakeup_šfo + { + +2113  +time¥ec + + mwakeup_tm +; + +2114  +time¥ec + + m´ev_wakeup_tm +; + +2115  +time¥ec + + mÏ¡_ev’t_tm +; + +2116  + mwakeups_sšû_ev’t +; + +2117  + msk³d_wakeups +; + +2129  + $»cÜd_wakeup_time +( +time¥ec + * +tm +, +wakeup_»asÚ + +»asÚ +, + +2130  +wakeup_šfo + * +wi +) { + +2131 +wi +-> +´ev_wakeup_tm + = wi-> +wakeup_tm +; + +2132 +wi +-> +wakeup_tm + = * +tm +; + +2133 ià( +»asÚ + =ð +Ev’t +) { + +2134 +wi +-> +Ï¡_ev’t_tm + = * +tm +; + +2135 +wi +-> +wakeups_sšû_ev’t + = 0; + +2136 +wi +-> +sk³d_wakeups + = 0; + +2138 +wi +-> +wakeups_sšû_ev’t +++; + +2140 + } +} + +2142  + skžl_šfo + { + +2143 +kžl_»asÚs + + mkžl_»asÚ +; + +2144 cÚ¡ * + mkžl_desc +; + +2145  + mth¿shšg +; + +2146  + mmax_th¿shšg +; + +2149  + $kžlšfo_log +( +´oc +* +´oý +,  +mš_oom_scÜe +,  +rss_kb +, + +2150  +sw­_kb +,  +kžl_šfo + * +ki +,  +memšfo + * +mi +, + +2151  +wakeup_šfo + * +wi +,  +time¥ec + * +tm +,  +psi_d©a + * +pd +) { + +2153 + `ªdroid_log_wr™e_št32 +( +ùx +, +´oý +-> +pid +); + +2154 + `ªdroid_log_wr™e_št32 +( +ùx +, +´oý +-> +uid +); + +2155 + `ªdroid_log_wr™e_št32 +( +ùx +, +´oý +-> +oomadj +); + +2156 + `ªdroid_log_wr™e_št32 +( +ùx +, +mš_oom_scÜe +); + +2157 + `ªdroid_log_wr™e_št32 +( +ùx +, +¡d +:: + `mš +( +rss_kb +, () +INT32_MAX +)); + +2158 + `ªdroid_log_wr™e_št32 +( +ùx +, +ki + ? ki-> +kžl_»asÚ + : +NONE +); + +2161  +f›ld_idx + = 0; f›ld_idx < +MI_FIELD_COUNT +; field_idx++) { + +2162 + `ªdroid_log_wr™e_št32 +( +ùx +, + +2163 +mi + ? +¡d +:: + `mš +(mi-> +¬r +[ +f›ld_idx +] * +·ge_k +, ( +št64_t +) +INT32_MAX +) : 0); + +2167 ià( +wi +) { + +2168 + `ªdroid_log_wr™e_št32 +( +ùx +, ( +št32_t +) + `g‘_time_diff_ms +(& +wi +-> +Ï¡_ev’t_tm +, +tm +)); + +2169 + `ªdroid_log_wr™e_št32 +( +ùx +, ( +št32_t +) + `g‘_time_diff_ms +(& +wi +-> +´ev_wakeup_tm +, +tm +)); + +2170 + `ªdroid_log_wr™e_št32 +( +ùx +, +wi +-> +wakeups_sšû_ev’t +); + +2171 + `ªdroid_log_wr™e_št32 +( +ùx +, +wi +-> +sk³d_wakeups +); + +2173 + `ªdroid_log_wr™e_št32 +( +ùx +, 0); + +2174 + `ªdroid_log_wr™e_št32 +( +ùx +, 0); + +2175 + `ªdroid_log_wr™e_št32 +( +ùx +, 0); + +2176 + `ªdroid_log_wr™e_št32 +( +ùx +, 0); + +2179 + `ªdroid_log_wr™e_št32 +( +ùx +, +¡d +:: + `mš +( +sw­_kb +, () +INT32_MAX +)); + +2180 + `ªdroid_log_wr™e_št32 +( +ùx +, +mi + ? ( +št32_t +)mi-> +f›ld +. +tÙ®_gpu_kb + : 0); + +2181 ià( +ki +) { + +2182 + `ªdroid_log_wr™e_št32 +( +ùx +, +ki +-> +th¿shšg +); + +2183 + `ªdroid_log_wr™e_št32 +( +ùx +, +ki +-> +max_th¿shšg +); + +2185 + `ªdroid_log_wr™e_št32 +( +ùx +, 0); + +2186 + `ªdroid_log_wr™e_št32 +( +ùx +, 0); + +2189 ià( +pd +) { + +2190 + `ªdroid_log_wr™e_æßt32 +( +ùx +, +pd +-> +mem_¡©s +[ +PSI_SOME +]. +avg10 +); + +2191 + `ªdroid_log_wr™e_æßt32 +( +ùx +, +pd +-> +mem_¡©s +[ +PSI_FULL +]. +avg10 +); + +2192 + `ªdroid_log_wr™e_æßt32 +( +ùx +, +pd +-> +io_¡©s +[ +PSI_SOME +]. +avg10 +); + +2193 + `ªdroid_log_wr™e_æßt32 +( +ùx +, +pd +-> +io_¡©s +[ +PSI_FULL +]. +avg10 +); + +2194 + `ªdroid_log_wr™e_æßt32 +( +ùx +, +pd +-> +ýu_¡©s +[ +PSI_SOME +]. +avg10 +); + +2196  +i + = 0; i < 5; i++) { + +2197 + `ªdroid_log_wr™e_æßt32 +( +ùx +, 0); + +2201 + `ªdroid_log_wr™e_li¡ +( +ùx +, +LOG_ID_EVENTS +); + +2202 + `ªdroid_log_»£t +( +ùx +); + +2203 + } +} + +2207  +´oc + * + $´oc_adj_h—d +( +oomadj +) { + +2208  ( +´oc + *)& +´oÿdj¦Ù_li¡ +[ + `ADJTOSLOT +( +oomadj +)]; + +2209 + } +} + +2212  +´oc + * + $´oc_adj_ž +( +oomadj +) { + +2213  ( +´oc + *) + `adj¦Ù_ž +(& +´oÿdj¦Ù_li¡ +[ + `ADJTOSLOT +( +oomadj +)]); + +2214 + } +} + +2217  +´oc + * + $´oc_adj_´ev +( +oomadj +,  +pid +) { + +2218  +adj¦Ù_li¡ + * +h—d + = & +´oÿdj¦Ù_li¡ +[ + `ADJTOSLOT +( +oomadj +)]; + +2219  +adj¦Ù_li¡ + * +cu¼ + = + `adj¦Ù_ž +(& +´oÿdj¦Ù_li¡ +[ + `ADJTOSLOT +( +oomadj +)]); + +2221  +cu¼ + !ð +h—d +) { + +2222 ià((( +´oc + *) +cu¼ +)-> +pid + ==…id) { + +2223  ( +´oc + *) +cu¼ +-> +´ev +; + +2225 +cu¼ + = cu¼-> +´ev +; + +2228  +NULL +; + +2229 + } +} + +2232  +´oc + * + $´oc_g‘_h—v›¡ +( +oomadj +) { + +2233  +adj¦Ù_li¡ + * +h—d + = & +´oÿdj¦Ù_li¡ +[ + `ADJTOSLOT +( +oomadj +)]; + +2234  +adj¦Ù_li¡ + * +cu¼ + = +h—d +-> +Ãxt +; + +2235  +´oc + * +max´oý + = +NULL +; + +2236  +maxsize + = 0; + +2237 ià(( +cu¼ + !ð +h—d +è&& (cu¼-> +Ãxt + == head)) { + +2239  ( +´oc + *) +cu¼ +; + +2241  +cu¼ + !ð +h—d +) { + +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 +max´oý + = ( +´oc + *) +cu¼ +; + +2253 +cu¼ + = cu¼-> +Ãxt +; + +2256  +max´oý +; + +2257 + } +} + +2259  +boÞ + + $fšd_viùim +( +oom_scÜe +,  +´ev_pid +,  +´oc + & +rg‘_´oc +) { + +2260  +´oc + * +´oý +; + +2261 +¡d +:: +sh¬ed_lock + + `lock +( +adj¦Ù_li¡_lock +); + +2263 ià(! +´ev_pid +) { + +2264 +´oý + = + `´oc_adj_ž +( +oom_scÜe +); + +2266 +´oý + = + `´oc_adj_´ev +( +oom_scÜe +, +´ev_pid +); + +2267 ià(! +´oý +) { + +2269 +´oý + = + `´oc_adj_ž +( +oom_scÜe +); + +2274 ià(! +´oý + ||…roý =ð + `´oc_adj_h—d +( +oom_scÜe +)) { + +2275  +çl£ +; + +2279 +rg‘_´oc + = * +´oý +; + +2281  +Œue +; + +2282 + } +} + +2284  + $w©chdog_ÿÎback +() { + +2285  +´ev_pid + = 0; + +2287 + `ALOGW +("lmkd watchdogimed out!"); + +2288  +oom_scÜe + = +OOM_SCORE_ADJ_MAX +; oom_score >= 0;) { + +2289  +´oc + +rg‘ +; + +2291 ià(! + `fšd_viùim +( +oom_scÜe +, +´ev_pid +, +rg‘ +)) { + +2292 +oom_scÜe +--; + +2293 +´ev_pid + = 0; + +2297 ià( +rg‘ +. +v®id + && +»­” +. + `kžl +({¬g‘. +pidfd +,¬g‘. +pid +,¬g‘. +uid + }, +Œue +) == 0) { + +2298 + `ALOGW +("lmkd w©chdog kžËd…roûs %d, oom_scÜe_adj %d", +rg‘ +. +pid +, +oom_scÜe +); + +2299 + `kžlšfo_log +(& +rg‘ +, 0, 0, 0, +NULL +, NULL, NULL, NULL, NULL); + +2301 + `pid_šv®id©e +( +rg‘ +. +pid +); + +2304 +´ev_pid + = +rg‘ +. +pid +; + +2306 + } +} + +2308  +W©chdog + +w©chdog +( +WATCHDOG_TIMEOUT_SEC +, +w©chdog_ÿÎback +); + +2310  +boÞ + + $is_kžl_³ndšg +() { + +2311  +buf +[24]; + +2313 ià( +Ï¡_kžl_pid_Ü_fd + < 0) { + +2314  +çl£ +; + +2317 ià( +pidfd_suµÜ‹d +) { + +2318  +Œue +; + +2322 + `¢´štf +( +buf +, (buf), "/´oc/%d/", +Ï¡_kžl_pid_Ü_fd +); + +2323 ià( + `acûss +( +buf +, +F_OK +) == 0) { + +2324  +Œue +; + +2327  +çl£ +; + +2328 + } +} + +2330  +boÞ + + $is_wa™šg_fÜ_kžl +() { + +2331  +pidfd_suµÜ‹d + && +Ï¡_kžl_pid_Ü_fd + >= 0; + +2332 + } +} + +2334  + $¡Ý_wa™_fÜ_´oc_kžl +( +boÞ + +fšished +) { + +2335  +•Þl_ev’t + +•ev +; + +2337 ià( +Ï¡_kžl_pid_Ü_fd + < 0) { + +2341 ià( +debug_´oûss_kžlšg +) { + +2342  +time¥ec + +cu¼_tm +; + +2344 ià( + `þock_g‘time +( +CLOCK_MONOTONIC_COARSE +, & +cu¼_tm +) != 0) { + +2349 + `ALOGE +("Failedo get currentime"); + +2352 ià( +fšished +) { + +2353 + `ALOGI +("Process got killed in %ldms", + +2354 + `g‘_time_diff_ms +(& +Ï¡_kžl_tm +, & +cu¼_tm +)); + +2356 + `ALOGI +("Stop waiting for…rocess kill‡fter %ldms", + +2357 + `g‘_time_diff_ms +(& +Ï¡_kžl_tm +, & +cu¼_tm +)); + +2361 ià( +pidfd_suµÜ‹d +) { + +2363 ià( + `•Þl_ùl +( +•Þlfd +, +EPOLL_CTL_DEL +, +Ï¡_kžl_pid_Ü_fd +, & +•ev +)) { + +2365 + `ALOGE +("•Þl_ùÈf܆a¡ kžËd…roûs çžed;ƒ¼no=%d", +”ºo +); + +2367 +maxev’ts +--; + +2368 + `þo£ +( +Ï¡_kžl_pid_Ü_fd +); + +2371 +Ï¡_kžl_pid_Ü_fd + = -1; + +2372 + } +} + +2374  + $kžl_dÚe_hªdËr +( +d©a + +__unu£d +, +ušt32_t + +ev’ts + __unused, + +2375  +pÞlšg_·¿ms + * +pÞl_·¿ms +) { + +2376 + `¡Ý_wa™_fÜ_´oc_kžl +( +Œue +); + +2377 +pÞl_·¿ms +-> +upd©e + = +POLLING_RESUME +; + +2378 + } +} + +2380  + $kžl_çž_hªdËr +( +d©a + +__unu£d +, +ušt32_t + +ev’ts + __unused, + +2381  +pÞlšg_·¿ms + * +pÞl_·¿ms +) { + +2382  +pid +; + +2386 ià( + `TEMP_FAILURE_RETRY +( + `»ad +( +»­”_comm_fd +[0], & +pid +, (pid))) != (pid)) { + +2387 + `ALOGE +("th»ad communiÿtiÚ„—d fažed: %s", + `¡»¼Ü +( +”ºo +)); + +2389 + `¡Ý_wa™_fÜ_´oc_kžl +( +çl£ +); + +2390 +pÞl_·¿ms +-> +upd©e + = +POLLING_RESUME +; + +2391 + } +} + +2393  + $¡¬t_wa™_fÜ_´oc_kžl +( +pid_Ü_fd +) { + +2394  +ev’t_hªdËr_šfo + +kžl_dÚe_hšfo + = { 0, +kžl_dÚe_hªdËr + }; + +2395  +•Þl_ev’t + +•ev +; + +2397 ià( +Ï¡_kžl_pid_Ü_fd + >= 0) { + +2399 + `ALOGE +("Attempto wait for‡ kill while‡nother wait is in…rogress"); + +2400 + `¡Ý_wa™_fÜ_´oc_kžl +( +çl£ +); + +2403 +Ï¡_kžl_pid_Ü_fd + = +pid_Ü_fd +; + +2405 ià(! +pidfd_suµÜ‹d +) { + +2410 +•ev +. +ev’ts + = +EPOLLIN +; + +2411 +•ev +. +d©a +. +±r + = (*)& +kžl_dÚe_hšfo +; + +2412 ià( + `•Þl_ùl +( +•Þlfd +, +EPOLL_CTL_ADD +, +Ï¡_kžl_pid_Ü_fd +, & +•ev +) != 0) { + +2413 + `ALOGE +("•Þl_ùÈf܆a¡ kžÈçžed;ƒ¼no=%d", +”ºo +); + +2414 + `þo£ +( +Ï¡_kžl_pid_Ü_fd +); + +2415 +Ï¡_kžl_pid_Ü_fd + = -1; + +2418 +maxev’ts +++; + +2419 + } +} + +2422  + $kžl_Úe_´oûss +( +´oc +* +´oý +,  +mš_oom_scÜe +,  +kžl_šfo + * +ki +, + +2423  +memšfo + * +mi +,  +wakeup_šfo + * +wi +,  +time¥ec + * +tm +, + +2424  +psi_d©a + * +pd +) { + +2425  +pid + = +´oý +->pid; + +2426  +pidfd + = +´oý +->pidfd; + +2427 +uid_t + +uid + = +´oý +->uid; + +2428 * +skÇme +; + +2429  +kžl_»suÉ +; + +2430  +»suÉ + = -1; + +2431  +memÜy_¡© + * +mem_¡ +; + +2432  +kžl_¡© + +kžl_¡ +; + +2433 +št64_t + +tgid +; + +2434 +št64_t + +rss_kb +; + +2435 +št64_t + +sw­_kb +; + +2436  +buf +[ +·gesize +]; + +2437  +desc +[ +LINE_MAX +]; + +2439 ià(! +´oý +-> +v®id + || ! + `»ad_´oc_¡©us +( +pid +, +buf +, (buf))) { + +2440  +out +; + +2442 ià(! + `·r£_¡©us_g +( +buf +, +PROC_STATUS_TGID_FIELD +, & +tgid +)) { + +2443 + `ALOGE +("UÇbËØ·r£gid from /´oc/%d/¡©us", +pid +); + +2444  +out +; + +2446 ià( +tgid + !ð +pid +) { + +2447 + `ALOGE +("PossibË…id„eu£ d‘eùed (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 +skÇme + = + `´oc_g‘_Çme +( +pid +, +buf +, (buf)); + +2460 ià(! +skÇme +) { + +2461  +out +; + +2464 +mem_¡ + = + `¡©s_»ad_memÜy_¡© +( +³r_­p_memcg +, +pid +, +uid +, +rss_kb + * 1024, +sw­_kb + * 1024); + +2466 + `¢´štf +( +desc +, (desc), "lmk,%d,%d,%d,%d,%d", +pid +, +ki + ? ()ki-> +kžl_»asÚ + : -1, + +2467 +´oý +-> +oomadj +, +mš_oom_scÜe +, +ki + ? ki-> +max_th¿shšg + : -1); + +2469 +»suÉ + = + `lmkd_ä“_memÜy_befÜe_kžl_hook +( +´oý +, +rss_kb + / +·ge_k +,…roý-> +oomadj +, + +2470 +ki + ? ()ki-> +kžl_»asÚ + : -1); + +2471 ià( +»suÉ + > 0) { + +2476 + `ALOGI +("Skpšg kžl; %ld kB f»edƒl£wh”e.", +»suÉ + * +·ge_k +); + +2477  +»suÉ +; + +2480 + `Œaû_kžl_¡¬t +( +desc +); + +2482 + `¡¬t_wa™_fÜ_´oc_kžl +( +pidfd + < 0 ? +pid + :…idfd); + +2483 +kžl_»suÉ + = +»­” +. + `kžl +({ +pidfd +, +pid +, +uid + }, +çl£ +); + +2485 + `Œaû_kžl_’d +(); + +2487 ià( +kžl_»suÉ +) { + +2488 + `¡Ý_wa™_fÜ_´oc_kžl +( +çl£ +); + +2489 + `ALOGE +("kžl(%d):ƒ¼no=%d", +pid +, +”ºo +); + +2491  +out +; + +2494 +Ï¡_kžl_tm + = * +tm +; + +2496 + `šc_kžlút +( +´oý +-> +oomadj +); + +2498 ià( +ki +) { + +2499 +kžl_¡ +. +kžl_»asÚ + = +ki +->kill_reason; + +2500 +kžl_¡ +. +th¿shšg + = +ki +->thrashing; + +2501 +kžl_¡ +. +max_th¿shšg + = +ki +->max_thrashing; + +2502 + `ALOGI +("KžÈ'%s' (%d), uid %d, oom_scÜe_adj %dØä“ %" +PRId64 + "kB„ss, %" PRId64 + +2503 "kB sw­;„—sÚ: %s", +skÇme +, +pid +, +uid +, +´oý +-> +oomadj +, +rss_kb +, +sw­_kb +, + +2504 +ki +-> +kžl_desc +); + +2506 +kžl_¡ +. +kžl_»asÚ + = +NONE +; + +2507 +kžl_¡ +. +th¿shšg + = 0; + +2508 +kžl_¡ +. +max_th¿shšg + = 0; + +2509 + `ALOGI +("KžÈ'%s' (%d), uid %d, oom_scÜe_adj %dØä“ %" +PRId64 + "kB„ss, %" PRId64 + +2510 "kb sw­", +skÇme +, +pid +, +uid +, +´oý +-> +oomadj +, +rss_kb +, +sw­_kb +); + +2512 + `kžlšfo_log +( +´oý +, +mš_oom_scÜe +, +rss_kb +, +sw­_kb +, +ki +, +mi +, +wi +, +tm +, +pd +); + +2514 +kžl_¡ +. +uid + = +¡©ic_ÿ¡ +< +št32_t +>(uid); + +2515 +kžl_¡ +. +skÇme + =askname; + +2516 +kžl_¡ +. +oom_scÜe + = +´oý +-> +oomadj +; + +2517 +kžl_¡ +. +mš_oom_scÜe + = min_oom_score; + +2518 +kžl_¡ +. +ä“_mem_kb + = +mi +-> +f›ld +. +Ä_ä“_·ges + * +·ge_k +; + +2519 +kžl_¡ +. +ä“_sw­_kb + = + `g‘_ä“_sw­ +( +mi +è* +·ge_k +; + +2520 + `¡©s_wr™e_lmk_kžl_occu¼ed +(& +kžl_¡ +, +mem_¡ +); + +2522 + `ù¾_d©a_wr™e_lmk_kžl_occu¼ed +(( +pid_t +) +pid +, +uid +, +rss_kb +); + +2524 +»suÉ + = +rss_kb + / +·ge_k +; + +2526 +out +: + +2531 + `pid_»move +( +pid +); + +2532  +»suÉ +; + +2533 + } +} + +2539  + $fšd_ªd_kžl_´oûss +( +mš_scÜe_adj +,  +kžl_šfo + * +ki +,  +memšfo + * +mi +, + +2540  +wakeup_šfo + * +wi +,  +time¥ec + * +tm +, + +2541  +psi_d©a + * +pd +) { + +2542  +i +; + +2543  +kžËd_size + = 0; + +2544 +boÞ + +choo£_h—v›¡_sk + = +kžl_h—v›¡_sk +; + +2546  +i + = +OOM_SCORE_ADJ_MAX +; i >ð +mš_scÜe_adj +; i--) { + +2547  +´oc + * +´oý +; + +2549 ià(! +choo£_h—v›¡_sk + && +i + <ð +PERCEPTIBLE_APP_ADJ +) { + +2554 +choo£_h—v›¡_sk + = +Œue +; + +2557  +Œue +) { + +2558 +´oý + = +choo£_h—v›¡_sk + ? + +2559 + `´oc_g‘_h—v›¡ +( +i +è: + `´oc_adj_ž +(i); + +2561 ià(! +´oý +) + +2564 +kžËd_size + = + `kžl_Úe_´oûss +( +´oý +, +mš_scÜe_adj +, +ki +, +mi +, +wi +, +tm +, +pd +); + +2565 ià( +kžËd_size + >= 0) { + +2569 ià( +kžËd_size +) { + +2574  +kžËd_size +; + +2575 + } +} + +2577  +št64_t + + $g‘_memÜy_u§ge +( +»»ad_d©a + * +fže_d©a +) { + +2578 +št64_t + +mem_u§ge +; + +2579 * +buf +; + +2581 ià(( +buf + = + `»»ad_fže +( +fže_d©a +)è=ð +NULL +) { + +2585 ià(! + `·r£_št64 +( +buf +, & +mem_u§ge +)) { + +2586 + `ALOGE +("% ·r£ƒ¼Ü", +fže_d©a +-> +fž’ame +); + +2589 ià( +mem_u§ge + == 0) { + +2590 + `ALOGE +("No memory!"); + +2593  +mem_u§ge +; + +2594 + } +} + +2596  + $»cÜd_low_´essu»_Ëv–s +( +memšfo + * +mi +) { + +2597 ià( +low_´essu»_mem +. +mš_Ä_ä“_·ges + == -1 || + +2598 +low_´essu»_mem +. +mš_Ä_ä“_·ges + > +mi +-> +f›ld +. +Ä_ä“_·ges +) { + +2599 ià( +debug_´oûss_kžlšg +) { + +2600 + `ALOGI +("Low…»ssu» mš memÜy upd©äom %" +PRId64 + "o %" PRId64, + +2601 +low_´essu»_mem +. +mš_Ä_ä“_·ges +, +mi +-> +f›ld +. +Ä_ä“_·ges +); + +2603 +low_´essu»_mem +. +mš_Ä_ä“_·ges + = +mi +-> +f›ld +. +Ä_ä“_·ges +; + +2611 ià( +low_´essu»_mem +. +max_Ä_ä“_·ges + == -1 || + +2612 ( +low_´essu»_mem +. +max_Ä_ä“_·ges + < +mi +-> +f›ld +. +Ä_ä“_·ges + && + +2613 +mi +-> +f›ld +. +Ä_ä“_·ges + - +low_´essu»_mem +. +max_Ä_ä“_·ges + < + +2614 +low_´essu»_mem +. +max_Ä_ä“_·ges + * 0.1)) { + +2615 ià( +debug_´oûss_kžlšg +) { + +2616 + `ALOGI +("Low…»ssu» max memÜy upd©äom %" +PRId64 + "o %" PRId64, + +2617 +low_´essu»_mem +. +max_Ä_ä“_·ges +, +mi +-> +f›ld +. +Ä_ä“_·ges +); + +2619 +low_´essu»_mem +. +max_Ä_ä“_·ges + = +mi +-> +f›ld +. +Ä_ä“_·ges +; + +2621 + } +} + +2623 +vm´essu»_Ëv– + + $upg¿de_Ëv– +( +vm´essu»_Ëv– + +Ëv– +) { + +2624  ( +vm´essu»_Ëv– +)(( +Ëv– + < +VMPRESS_LEVEL_CRITICAL +) ? + +2625 +Ëv– + + 1 :†evel); + +2626 + } +} + +2628 +vm´essu»_Ëv– + + $downg¿de_Ëv– +( +vm´essu»_Ëv– + +Ëv– +) { + +2629  ( +vm´essu»_Ëv– +)(( +Ëv– + > +VMPRESS_LEVEL_LOW +) ? + +2630 +Ëv– + - 1 :†evel); + +2631 + } +} + +2633 + ezÚe_w©”m¬k + { + +2634 + mWMARK_MIN + = 0, + +2635 + mWMARK_LOW +, + +2636 + mWMARK_HIGH +, + +2637 + mWMARK_NONE + + +2640  + szÚe_w©”m¬ks + { + +2641  + mhigh_wm¬k +; + +2642  + mlow_wm¬k +; + +2643  + mmš_wm¬k +; + +2646  +zÚe_w©”m¬ks + + gw©”m¬ks +; + +2651  +zÚe_w©”m¬k + + $g‘_lowe¡_w©”m¬k +( +memšfo + * +mi +, + +2652  +zÚe_w©”m¬ks + * +w©”m¬ks +) + +2654 +št64_t + +Ä_ä“_·ges + = +mi +-> +f›ld +.Ä_ä“_·ge - mi->f›ld. +cma_ä“ +; + +2656 ià( +Ä_ä“_·ges + < +w©”m¬ks +-> +mš_wm¬k +) { + +2657  +WMARK_MIN +; + +2659 ià( +Ä_ä“_·ges + < +w©”m¬ks +-> +low_wm¬k +) { + +2660  +WMARK_LOW +; + +2662 ià( +Ä_ä“_·ges + < +w©”m¬ks +-> +high_wm¬k +) { + +2663  +WMARK_HIGH +; + +2665  +WMARK_NONE +; + +2666 + } +} + +2668  + $ÿlc_zÚe_w©”m¬ks +( +zÚešfo + * +zi +,  +zÚe_w©”m¬ks + * +w©”m¬ks +) { + +2669 + `mem£t +( +w©”m¬ks +, 0, ( +zÚe_w©”m¬ks +)); + +2671  +node_idx + = 0;‚ode_idx < +zi +-> +node_couÁ +;‚ode_idx++) { + +2672  +zÚešfo_node + * +node + = & +zi +-> +nodes +[ +node_idx +]; + +2673  +zÚe_idx + = 0; zÚe_idx < +node +-> +zÚe_couÁ +; zone_idx++) { + +2674  +zÚešfo_zÚe + * +zÚe + = & +node +-> +zÚes +[ +zÚe_idx +]; + +2676 ià(! +zÚe +-> +f›lds +. +f›ld +. +´e£Á +) { + +2680 +w©”m¬ks +-> +high_wm¬k + +ð +zÚe +-> +max_´ÙeùiÚ + + zÚe-> +f›lds +. +f›ld +. +high +; + +2681 +w©”m¬ks +-> +low_wm¬k + +ð +zÚe +-> +max_´ÙeùiÚ + + zÚe-> +f›lds +. +f›ld +. +low +; + +2682 +w©”m¬ks +-> +mš_wm¬k + +ð +zÚe +-> +max_´ÙeùiÚ + + zÚe-> +f›lds +. +f›ld +. +mš +; + +2685 + } +} + +2687  + $upd©e_zÚešfo_w©”m¬ks +( +zÚešfo + * +zi +) { + +2688 ià( + `zÚešfo_·r£ +( +zi +) < 0) { + +2689 + `ALOGE +("Failedo…arse zoneinfo!"); + +2692 + `ÿlc_zÚe_w©”m¬ks +( +zi +, & +w©”m¬ks +); + +2694 + } +} + +2696  + $ÿlc_sw­_utžiz©iÚ +( +memšfo + * +mi +) { + +2697 +št64_t + +sw­_u£d + = +mi +-> +f›ld +. +tÙ®_sw­ + - + `g‘_ä“_sw­ +(mi); + +2698 +št64_t + +tÙ®_sw­·bË + = +mi +-> +f›ld +. +aùive_ªÚ + + mi->f›ld. +šaùive_ªÚ + + + +2699 +mi +-> +f›ld +. +shmem + + +sw­_u£d +; + +2700  +tÙ®_sw­·bË + > 0 ? ( +sw­_u£d + * 100) /otal_swappable : 0; + +2701 + } +} + +2703 + eev’t_sourû + { + +2704 + mPSI +, + +2705 + mVENDOR +, + +2708  + upsi_ev’t_d©a + { + +2709 +vm´essu»_Ëv– + + mËv– +; + +2710 +mem_ev’t_t + + mv’dÜ_ev’t +; + +2713  + $__mp_ev’t_psi +( +ev’t_sourû + +sourû +,  +psi_ev’t_d©a + +d©a +, + +2714 +ušt32_t + +ev’ts +,  +pÞlšg_·¿ms + * +pÞl_·¿ms +) { + +2715 + e»þaim_¡©e + { + +2716 +NO_RECLAIM + = 0, + +2717 +KSWAPD_RECLAIM +, + +2718 +DIRECT_RECLAIM +, + +2720  +št64_t + +š™_ws_»çuÉ +; + +2721  +št64_t + +´ev_wÜkšg£t_»çuÉ +; + +2722  +št64_t + +ba£_fže_Ìu +; + +2723  +št64_t + +š™_pgsÿn_ksw­d +; + +2724  +št64_t + +š™_pgsÿn_dœeù +; + +2725  +št64_t + +š™_pg»fžl +; + +2726  +boÞ + +kžlšg +; + +2727  +th¿shšg_lim™ + = +th¿shšg_lim™_pù +; + +2728  +time¥ec + +wm¬k_upd©e_tm +; + +2729  +wakeup_šfo + +wi +; + +2730  +time¥ec + +th¿shšg_»£t_tm +; + +2731  +št64_t + +´ev_th¿sh_growth + = 0; + +2732  +boÞ + +check_fžeÿche + = +çl£ +; + +2733  +max_th¿shšg + = 0; + +2735  +memšfo + +mi +; + +2736  +vm¡© + +vs +; + +2737  +psi_d©a +…si_data; + +2738  +time¥ec + +cu¼_tm +; + +2739 +št64_t + +th¿shšg + = 0; + +2740 +boÞ + +sw­_is_low + = +çl£ +; + +2741 +vm´essu»_Ëv– + +Ëv– + = ( +sourû + =ð +PSI +è? +d©a +.level: ( vmpressure_level)0; + +2742 +kžl_»asÚs + +kžl_»asÚ + = +NONE +; + +2743 +boÞ + +cyþe_aá”_kžl + = +çl£ +; + +2744 +»þaim_¡©e + +»þaim + = +NO_RECLAIM +; + +2745 +zÚe_w©”m¬k + +wm¬k + = +WMARK_NONE +; + +2746  +kžl_desc +[ +LINE_MAX +]; + +2747 +boÞ + +cut_th¿shšg_lim™ + = +çl£ +; + +2748  +mš_scÜe_adj + = 0; + +2749  +sw­_utž + = 0; + +2750 +št64_t + +sw­_low_th»shÞd +; + +2751  +sšû_th¿shšg_»£t_ms +; + +2752 +št64_t + +wÜkšg£t_»çuÉ_fže +; + +2753 +boÞ + +ü™iÿl_¡®l + = +çl£ +; + +2754 +boÞ + +š_dœeù_»þaim +; + +2755  +dœeù_»þaim_du¿tiÚ_ms +; + +2756 +boÞ + +š_ksw­d_»þaim +; + +2758 +mp_ev’t_couÁ +++; + +2759 ià( +debug_´oûss_kžlšg +) { + +2760 ià( +sourû + =ð +PSI +) + +2761 + `ALOGI +("% memÜy…»ssu»ƒv’ˆ#%" +PRIu64 + " isriggered", + +2762 +Ëv–_Çme +[ +Ëv– +], +mp_ev’t_couÁ +); + +2764 + `ALOGI +("v’dÜ kžÈev’ˆ#%" +PRIu64 + " i Œigg”ed", +mp_ev’t_couÁ +); + +2767 ià( + `þock_g‘time +( +CLOCK_MONOTONIC_COARSE +, & +cu¼_tm +) != 0) { + +2768 + `ALOGE +("Failedo get currentime"); + +2772 ià( +sourû + =ð +PSI +) { + +2773 ià( +ev’ts + > 0 ) { + +2775 ià( +Ëv– + < +´ev_Ëv– +) { + +2776 ià( +debug_´oûss_kžlšg +) + +2777 + `ALOGI +("Ignoring %s…ressureƒvent; occurredoo soon.", + +2778 +Ëv–_Çme +[ +Ëv– +]); + +2781 +´ev_Ëv– + = +Ëv– +; + +2784 +´ev_Ëv– + = +VMPRESS_LEVEL_LOW +; + +2787 + `»cÜd_wakeup_time +(& +cu¼_tm +, +ev’ts + ? +Ev’t + : +PÞlšg +, & +wi +); + +2790 +boÞ + +kžl_³ndšg + = + `is_kžl_³ndšg +(); + +2791 ià( +kžl_³ndšg + && ( +kžl_timeout_ms + == 0 || + +2792 + `g‘_time_diff_ms +(& +Ï¡_kžl_tm +, & +cu¼_tm +è< +¡©ic_ÿ¡ +<>( +kžl_timeout_ms +))) { + +2794 +wi +. +sk³d_wakeups +++; + +2795  +no_kžl +; + +2801 + `¡Ý_wa™_fÜ_´oc_kžl +(! +kžl_³ndšg +); + +2803 ià( + `vm¡©_·r£ +(& +vs +) < 0) { + +2804 + `ALOGE +("Failedo…arse vmstat!"); + +2808 +wÜkšg£t_»çuÉ_fže + = +vs +. +f›ld +. +wÜkšg£t_»çuÉ + ? : vs.field.workingset_refault_file; + +2810 ià( + `memšfo_·r£ +(& +mi +) < 0) { + +2811 + `ALOGE +("Failedo…arse meminfo!"); + +2816 ià( +kžlšg +) { + +2817 +kžlšg + = +çl£ +; + +2818 +cyþe_aá”_kžl + = +Œue +; + +2820 +ba£_fže_Ìu + = +vs +. +f›ld +. +Ä_šaùive_fže + + vs.f›ld. +Ä_aùive_fže +; + +2821 +š™_ws_»çuÉ + = +wÜkšg£t_»çuÉ_fže +; + +2822 +th¿shšg_»£t_tm + = +cu¼_tm +; + +2823 +´ev_th¿sh_growth + = 0; + +2827 ià( +sw­_ä“_low_³rûÁage +) { + +2828 +sw­_low_th»shÞd + = +mi +. +f›ld +. +tÙ®_sw­ + * +sw­_ä“_low_³rûÁage + / 100; + +2829 +sw­_is_low + = + `g‘_ä“_sw­ +(& +mi +è< +sw­_low_th»shÞd +; + +2831 +sw­_low_th»shÞd + = 0; + +2834 ià( +memev’t_li¡’” +) { + +2835 +š_dœeù_»þaim + = + +2836 +dœeù_»þaim_¡¬t_tm +. +tv_£c + !ð0 || dœeù_»þaim_¡¬t_tm. +tv_n£c + != 0; + +2837 +š_ksw­d_»þaim + = +ksw­d_¡¬t_tm +. +tv_£c + !ð0 || ksw­d_¡¬t_tm. +tv_n£c + != 0; + +2839 +š_dœeù_»þaim + = +vs +. +f›ld +. +pgsÿn_dœeù + !ð +š™_pgsÿn_dœeù +; + +2840 +š_ksw­d_»þaim + = ( +vs +. +f›ld +. +pgsÿn_ksw­d + !ð +š™_pgsÿn_ksw­d +) || + +2841 ( +vs +. +f›ld +. +pg»fžl + !ð +š™_pg»fžl +); + +2845 ià( +š_dœeù_»þaim +) { + +2846 +š™_pgsÿn_dœeù + = +vs +. +f›ld +. +pgsÿn_dœeù +; + +2847 +š™_pgsÿn_ksw­d + = +vs +. +f›ld +. +pgsÿn_ksw­d +; + +2848 +š™_pg»fžl + = +vs +. +f›ld +. +pg»fžl +; + +2849 +dœeù_»þaim_du¿tiÚ_ms + = + `g‘_time_diff_ms +(& +dœeù_»þaim_¡¬t_tm +, & +cu¼_tm +); + +2850 +»þaim + = +DIRECT_RECLAIM +; + +2851 } ià( +š_ksw­d_»þaim +) { + +2852 +š™_pgsÿn_ksw­d + = +vs +. +f›ld +. +pgsÿn_ksw­d +; + +2853 +š™_pg»fžl + = +vs +. +f›ld +. +pg»fžl +; + +2854 +»þaim + = +KSWAPD_RECLAIM +; + +2855 } ià(( +wÜkšg£t_»çuÉ_fže + =ð +´ev_wÜkšg£t_»çuÉ +) && + +2856 ( +sourû + =ð +PSI +)) { + +2861  +no_kžl +; + +2864 +´ev_wÜkšg£t_»çuÉ + = +wÜkšg£t_»çuÉ_fže +; + +2877 +sšû_th¿shšg_»£t_ms + = + `g‘_time_diff_ms +(& +th¿shšg_»£t_tm +, & +cu¼_tm +); + +2878 ià( +sšû_th¿shšg_»£t_ms + > +THRASHING_RESET_INTERVAL_MS +) { + +2879  +wšdows_·s£d +; + +2881 +´ev_th¿sh_growth + = ( +wÜkšg£t_»çuÉ_fže + - +š™_ws_»çuÉ +) * 100 + +2882 / ( +ba£_fže_Ìu + + 1); + +2883 +wšdows_·s£d + = ( +sšû_th¿shšg_»£t_ms + / +THRASHING_RESET_INTERVAL_MS +); + +2889 ià( +wšdows_·s£d + > 1 || +´ev_th¿sh_growth + < +th¿shšg_lim™ +) { + +2890 +´ev_th¿sh_growth + >>ð +wšdows_·s£d +; + +2894 +ba£_fže_Ìu + = +vs +. +f›ld +. +Ä_šaùive_fže + + vs.f›ld. +Ä_aùive_fže +; + +2895 +š™_ws_»çuÉ + = +wÜkšg£t_»çuÉ_fže +; + +2896 +th¿shšg_»£t_tm + = +cu¼_tm +; + +2897 +th¿shšg_lim™ + = +th¿shšg_lim™_pù +; + +2900 +th¿shšg + = ( +wÜkšg£t_»çuÉ_fže + - +š™_ws_»çuÉ +è* 100 / ( +ba£_fže_Ìu + + 1); + +2903 +th¿shšg + +ð +´ev_th¿sh_growth +; + +2904 ià( +max_th¿shšg + < +th¿shšg +) { + +2905 +max_th¿shšg + = +th¿shšg +; + +2908 +upd©e_w©”m¬ks +: + +2915 ià( +w©”m¬ks +. +high_wm¬k + =ð0 || (! +mem_ev’t_upd©e_zÚešfo_suµÜ‹d + && + +2916 + `g‘_time_diff_ms +(& +wm¬k_upd©e_tm +, & +cu¼_tm +) > 60000)) { + +2917  +zÚešfo + +zi +; + +2919 ià( + `upd©e_zÚešfo_w©”m¬ks +(& +zi +) < 0) { + +2922 +wm¬k_upd©e_tm + = +cu¼_tm +; + +2926 +wm¬k + = + `g‘_lowe¡_w©”m¬k +(& +mi +, & +w©”m¬ks +); + +2928 ià(! + `psi_·r£_mem +(& +psi_d©a +)) { + +2929 +ü™iÿl_¡®l + = +psi_d©a +. +mem_¡©s +[ +PSI_FULL +]. +avg10 + > () +¡®l_lim™_ü™iÿl +; + +2935 ià( +sourû + =ð +VENDOR +) { + +2936  +v’dÜ_kžl_»asÚ + = +d©a +. +v’dÜ_ev’t +. +ev’t_d©a +. +v’dÜ_kžl +. +»asÚ +; + +2937  +v’dÜ_kžl_mš_oom_scÜe_adj + = + +2938 +d©a +. +v’dÜ_ev’t +. +ev’t_d©a +. +v’dÜ_kžl +. +mš_oom_scÜe_adj +; + +2939 ià( +v’dÜ_kžl_»asÚ + < 0 || + +2940 +v’dÜ_kžl_»asÚ + > +VENDOR_KILL_REASON_END + || + +2941 +v’dÜ_kžl_mš_oom_scÜe_adj + < 0) { + +2942 + `ALOGE +("Invalid vendor kill„eason %d, min_oom_score_adj %d", + +2943 +v’dÜ_kžl_»asÚ +, +v’dÜ_kžl_mš_oom_scÜe_adj +); + +2947 +kžl_»asÚ + = ( +kžl_»asÚs +)( +v’dÜ_kžl_»asÚ + + +VENDOR_KILL_REASON_BASE +); + +2948 +mš_scÜe_adj + = +v’dÜ_kžl_mš_oom_scÜe_adj +; + +2949 + `¢´štf +( +kžl_desc +, (kill_desc), + +2950 "v’dÜ kžÈw™hh»asÚ %d, mš_scÜe_adj %d", +kžl_»asÚ +, +mš_scÜe_adj +); + +2951 } ià( +cyþe_aá”_kžl + && +wm¬k + < +WMARK_LOW +) { + +2957 +mš_scÜe_adj + = +´essu»_aá”_kžl_mš_scÜe +; + +2958 +kžl_»asÚ + = +PRESSURE_AFTER_KILL +; + +2959 + `¡ºýy +( +kžl_desc +, "min watermark is breachedƒven‡fter kill", (kill_desc)); + +2960 +kžl_desc +[(kill_desc) - 1] = '\0'; + +2961 } ià( +Ëv– + =ð +VMPRESS_LEVEL_CRITICAL + && +ev’ts + != 0) { + +2967 +kžl_»asÚ + = +NOT_RESPONDING +; + +2968 + `¡ºýy +( +kžl_desc +, "device is‚ot„esponding", (kill_desc)); + +2969 +kžl_desc +[(kill_desc) - 1] = '\0'; + +2970 } ià( +sw­_is_low + && +th¿shšg + > +th¿shšg_lim™_pù +) { + +2972 +kžl_»asÚ + = +LOW_SWAP_AND_THRASHING +; + +2973 + `¢´štf +( +kžl_desc +, (kžl_desc), "deviû i low oÀsw­ (%" +PRId64 + + +2974 "kB < %" +PRId64 + "kB)‡ndhrashing (%" PRId64 "%%)", + +2975 + `g‘_ä“_sw­ +(& +mi +è* +·ge_k +, +sw­_low_th»shÞd + *…age_k, +th¿shšg +); + +2977 ià( +wm¬k + > +WMARK_MIN + && +th¿shšg + < +th¿shšg_ü™iÿl_pù +) { + +2978 +mš_scÜe_adj + = +PERCEPTIBLE_APP_ADJ + + 1; + +2980 +check_fžeÿche + = +Œue +; + +2981 } ià( +sw­_is_low + && +wm¬k + < +WMARK_HIGH +) { + +2983 +kžl_»asÚ + = +LOW_MEM_AND_SWAP +; + +2984 + `¢´štf +( +kžl_desc +, (kill_desc), "%s watermark is breached‡nd swap is†ow (%" + +2985 +PRId64 + "kB < %" PRId64 "kB)", +wm¬k + < +WMARK_LOW + ? "min" : "low", + +2986 + `g‘_ä“_sw­ +(& +mi +è* +·ge_k +, +sw­_low_th»shÞd + *…age_k); + +2988 ià( +wm¬k + > +WMARK_MIN + && +th¿shšg + < +th¿shšg_ü™iÿl_pù +) { + +2989 +mš_scÜe_adj + = +PERCEPTIBLE_APP_ADJ + + 1; + +2991 } ià( +wm¬k + < +WMARK_HIGH + && +sw­_utž_max + < 100 && + +2992 ( +sw­_utž + = + `ÿlc_sw­_utžiz©iÚ +(& +mi +)è> +sw­_utž_max +) { + +2997 +kžl_»asÚ + = +LOW_MEM_AND_SWAP_UTIL +; + +2998 + `¢´štf +( +kžl_desc +, (kill_desc), "%s watermark is breached‡nd swap utilization" + +2999 " i high (%d%% > %d%%)", +wm¬k + < +WMARK_LOW + ? "min" : "low", + +3000 +sw­_utž +, +sw­_utž_max +); + +3001 } ià( +wm¬k + < +WMARK_HIGH + && +th¿shšg + > +th¿shšg_lim™ +) { + +3003 +kžl_»asÚ + = +LOW_MEM_AND_THRASHING +; + +3004 + `¢´štf +( +kžl_desc +, (kill_desc), "%s watermark is breached‡ndhrashing (%" + +3005 +PRId64 + "%%)", +wm¬k + < +WMARK_LOW + ? "mš" : "low", +th¿shšg +); + +3006 +cut_th¿shšg_lim™ + = +Œue +; + +3008 ià( +th¿shšg + < +th¿shšg_ü™iÿl_pù +) { + +3009 +mš_scÜe_adj + = +PERCEPTIBLE_APP_ADJ + + 1; + +3011 +check_fžeÿche + = +Œue +; + +3012 } ià( +»þaim + =ð +DIRECT_RECLAIM + && +th¿shšg + > +th¿shšg_lim™ +) { + +3014 +kžl_»asÚ + = +DIRECT_RECL_AND_THRASHING +; + +3015 + `¢´štf +( +kžl_desc +, (kill_desc), "device is in direct„eclaim‡ndhrashing (%" + +3016 +PRId64 + "%%)", +th¿shšg +); + +3017 +cut_th¿shšg_lim™ + = +Œue +; + +3019 ià( +th¿shšg + < +th¿shšg_ü™iÿl_pù +) { + +3020 +mš_scÜe_adj + = +PERCEPTIBLE_APP_ADJ + + 1; + +3022 +check_fžeÿche + = +Œue +; + +3023 } ià( +»þaim + =ð +DIRECT_RECLAIM + && +dœeù_»þaim_th»shÞd_ms + > 0 && + +3024 +dœeù_»þaim_du¿tiÚ_ms + > +dœeù_»þaim_th»shÞd_ms +) { + +3025 +kžl_»asÚ + = +DIRECT_RECL_STUCK +; + +3026 + `¢´štf +( +kžl_desc +, (kill_desc), "device is stuck in direct„eclaim (%ldms > %dms)", + +3027 +dœeù_»þaim_du¿tiÚ_ms +, +dœeù_»þaim_th»shÞd_ms +); + +3028 } ià( +check_fžeÿche +) { + +3029 +št64_t + +fže_Ìu_kb + = ( +vs +. +f›ld +. +Ä_šaùive_fže + + vs.f›ld. +Ä_aùive_fže +è* +·ge_k +; + +3031 ià( +fže_Ìu_kb + < +fžeÿche_mš_kb +) { + +3033 +kžl_»asÚ + = +LOW_FILECACHE_AFTER_THRASHING +; + +3034 + `¢´štf +( +kžl_desc +, (kill_desc), + +3035 "fžeÿchi low (%" +PRId64 + "kB < %" PRId64 "kB)‡fterhrashing", + +3036 +fže_Ìu_kb +, +fžeÿche_mš_kb +); + +3037 +mš_scÜe_adj + = +PERCEPTIBLE_APP_ADJ + + 1; + +3040 +check_fžeÿche + = +çl£ +; + +3045 ià( +kžl_»asÚ + =ð +NONE + && +wm¬k + < +WMARK_HIGH +) { + +3046 +kžl_»asÚ + = +LOW_MEM +; + +3047 + `¢´štf +( +kžl_desc +, (kill_desc), "%s watermark is breached", + +3048 +wm¬k + < +WMARK_LOW + ? "min" : "low"); + +3049 +mš_scÜe_adj + = +lowmem_mš_oom_scÜe +; + +3053 ià( +kžl_»asÚ + !ð +NONE +) { + +3054  +kžl_šfo + +ki + = { + +3055 . +kžl_»asÚ + = kill_reason, + +3056 . +kžl_desc + = kill_desc, + +3057 . +th¿shšg + = ()thrashing, + +3058 . +max_th¿shšg + = max_thrashing, + +3060  +boÞ + +fœ¡_kžl + = +Œue +; + +3063 ià( +fœ¡_kžl +) { + +3064 +fœ¡_kžl + = +çl£ +; + +3065 +w©”m¬ks +. +high_wm¬k + = 0; + +3066  +upd©e_w©”m¬ks +; + +3070 ià( +ü™iÿl_¡®l +) { + +3071 +mš_scÜe_adj + = 0; + +3073 + `psi_·r£_io +(& +psi_d©a +); + +3074 + `psi_·r£_ýu +(& +psi_d©a +); + +3075  +·ges_ä“d + = + `fšd_ªd_kžl_´oûss +( +mš_scÜe_adj +, & +ki +, & +mi +, & +wi +, & +cu¼_tm +, & +psi_d©a +); + +3076 ià( +·ges_ä“d + > 0) { + +3077 +kžlšg + = +Œue +; + +3078 +max_th¿shšg + = 0; + +3079 ià( +cut_th¿shšg_lim™ +) { + +3084 +th¿shšg_lim™ + = (th¿shšg_lim™ * (100 - +th¿shšg_lim™_deÿy_pù +)) / 100; + +3089 +no_kžl +: + +3091 ià( + `is_wa™šg_fÜ_kžl +()) { + +3093 +pÞl_·¿ms +-> +upd©e + = +POLLING_PAUSE +; + +3103 ià( +ev’ts + || +kžlšg + || +»þaim + =ð +DIRECT_RECLAIM +) { + +3104 +pÞl_·¿ms +-> +upd©e + = +POLLING_START +; + +3108 ià( +sw­_is_low + || +kžlšg +) { + +3110 +pÞl_·¿ms +-> +pÞlšg_š‹rv®_ms + = +PSI_POLL_PERIOD_SHORT_MS +; + +3113 +pÞl_·¿ms +-> +pÞlšg_š‹rv®_ms + = +PSI_POLL_PERIOD_LONG_MS +; + +3115 + } +} + +3117  + $mp_ev’t_psi +( +d©a +, +ušt32_t + +ev’ts +,  +pÞlšg_·¿ms + * +pÞl_·¿ms +) { + +3118  +psi_ev’t_d©a + +ev’t_d©a + = {. +Ëv– + = ( +vm´essu»_Ëv– +) +d©a +}; + +3119 + `__mp_ev’t_psi +( +PSI +, +ev’t_d©a +, +ev’ts +, +pÞl_·¿ms +); + +3120 + } +} + +3122  + g¡d +:: +¡ršg + + $G‘CgroupA‰ribu‹P©h +(cÚ¡ * +©Œ +) { + +3123 +¡d +:: +¡ršg + +·th +; + +3124 ià(! + `CgroupG‘A‰ribu‹P©h +( +©Œ +, & +·th +)) { + +3125 + `ALOGE +("UnknowÀcgrou°©Œibu‹ %s", +©Œ +); + +3127  +·th +; + +3128 + } +} + +3132  + $mp_ev’t_commÚ +( +d©a +, +ušt32_t + +ev’ts +,  +pÞlšg_·¿ms + * +pÞl_·¿ms +) { + +3133  +evcouÁ +; + +3134 +št64_t + +mem_u§ge +, +memsw_u§ge +; + +3135 +št64_t + +mem_´essu» +; + +3136  +memšfo + +mi +; + +3137  +zÚešfo + +zi +; + +3138  +time¥ec + +cu¼_tm +; + +3139  +kžl_sk_couÁ + = 0; + +3140 +vm´essu»_Ëv– + +Ëv– + = ( vm´essu»_Ëv–) +d©a +; + +3141  +Ùh”_ä“ + = 0, +Ùh”_fže + = 0; + +3142  +mš_scÜe_adj +; + +3143  +mšä“ + = 0; + +3144 cÚ¡ +¡d +:: +¡ršg + +mem_u§ge_·th + = + `G‘CgroupA‰ribu‹P©h +("MemUsage"); + +3145  +»»ad_d©a + +mem_u§ge_fže_d©a + = { + +3146 . +fž’ame + = +mem_u§ge_·th +. + `c_¡r +(), + +3147 . +fd + = -1, + +3149 cÚ¡ +¡d +:: +¡ršg + +memsw_u§ge_·th + = + `G‘CgroupA‰ribu‹P©h +("MemAndSwapUsage"); + +3150  +»»ad_d©a + +memsw_u§ge_fže_d©a + = { + +3151 . +fž’ame + = +memsw_u§ge_·th +. + `c_¡r +(), + +3152 . +fd + = -1, + +3154  +wakeup_šfo + +wi +; + +3156 +mp_ev’t_couÁ +++; + +3157 ià( +debug_´oûss_kžlšg +) { + +3158 + `ALOGI +("% memÜy…»ssu»ƒv’ˆ#%" +PRIu64 + " isriggered", + +3159 +Ëv–_Çme +[ +Ëv– +], +mp_ev’t_couÁ +); + +3162 ià(! +u£_psi_mÚ™Üs +) { + +3168  +lvl + = +VMPRESS_LEVEL_LOW +;†vÈ< +VMPRESS_LEVEL_COUNT +;†vl++) { + +3169 ià( +m³vfd +[ +lvl +] != -1 && + +3170 + `TEMP_FAILURE_RETRY +( + `»ad +( +m³vfd +[ +lvl +], + +3171 & +evcouÁ +, (evcount))) > 0 && + +3172 +evcouÁ + > 0 && +lvl + > +Ëv– +) { + +3173 +Ëv– + = +¡©ic_ÿ¡ +< +vm´essu»_Ëv– +>( +lvl +); + +3179 ià( +u£_psi_mÚ™Üs + && +ev’ts +) { + +3181 ià(! +pÞl_·¿ms +-> +pÞl_hªdËr + || +d©a + >…oll_params->poll_handler->data) { + +3182 +pÞl_·¿ms +-> +pÞlšg_š‹rv®_ms + = +PSI_POLL_PERIOD_SHORT_MS +; + +3183 +pÞl_·¿ms +-> +upd©e + = +POLLING_START +; + +3187 ià( + `þock_g‘time +( +CLOCK_MONOTONIC_COARSE +, & +cu¼_tm +) != 0) { + +3188 + `ALOGE +("Failedo get currentime"); + +3192 + `»cÜd_wakeup_time +(& +cu¼_tm +, +ev’ts + ? +Ev’t + : +PÞlšg +, & +wi +); + +3194 ià( +kžl_timeout_ms + && + +3195 + `g‘_time_diff_ms +(& +Ï¡_kžl_tm +, & +cu¼_tm +è< +¡©ic_ÿ¡ +<>( +kžl_timeout_ms +)) { + +3200 ià( + `is_kžl_³ndšg +()) { + +3201 +kžl_sk_couÁ +++; + +3202 +wi +. +sk³d_wakeups +++; + +3209 + `¡Ý_wa™_fÜ_´oc_kžl +( +Œue +); + +3215 + `¡Ý_wa™_fÜ_´oc_kžl +( +çl£ +); + +3218 ià( +kžl_sk_couÁ + > 0) { + +3219 + `ALOGI +("%lu memory…ressureƒvents were skipped‡fter‡ kill!", + +3220 +kžl_sk_couÁ +); + +3221 +kžl_sk_couÁ + = 0; + +3224 ià( + `memšfo_·r£ +(& +mi +è< 0 || + `zÚešfo_·r£ +(& +zi +) < 0) { + +3225 + `ALOGE +("Failedo get free memory!"); + +3229 ià( +u£_mšä“_Ëv–s +) { + +3230  +i +; + +3232 +Ùh”_ä“ + = +mi +. +f›ld +. +Ä_ä“_·ges + - +zi +. +tÙ®»£rve_·ges +; + +3233 ià( +mi +. +f›ld +. +Ä_fže_·ges + > (mi.f›ld. +shmem + + mi.f›ld. +uÃviùabË + + mi.f›ld. +sw­_ÿched +)) { + +3234 +Ùh”_fže + = ( +mi +. +f›ld +. +Ä_fže_·ges + - mi.f›ld. +shmem + - + +3235 +mi +. +f›ld +. +uÃviùabË + - mi.f›ld. +sw­_ÿched +); + +3237 +Ùh”_fže + = 0; + +3240 +mš_scÜe_adj + = +OOM_SCORE_ADJ_MAX + + 1; + +3241  +i + = 0; i < +lowmem_rg‘s_size +; i++) { + +3242 +mšä“ + = +lowmem_mšä“ +[ +i +]; + +3243 ià( +Ùh”_ä“ + < +mšä“ + && +Ùh”_fže + < minfree) { + +3244 +mš_scÜe_adj + = +lowmem_adj +[ +i +]; + +3249 ià( +mš_scÜe_adj + =ð +OOM_SCORE_ADJ_MAX + + 1) { + +3250 ià( +debug_´oûss_kžlšg + && +lowmem_rg‘s_size +) { + +3251 + `ALOGI +("Ignore %s memory…ressureƒvent " + +3253 +Ëv–_Çme +[ +Ëv– +], +Ùh”_ä“ + * +·ge_k +, +Ùh”_fže + *…age_k, + +3254 () +lowmem_mšä“ +[ +lowmem_rg‘s_size + - 1] * +·ge_k +); + +3259  +do_kžl +; + +3262 ià( +Ëv– + =ð +VMPRESS_LEVEL_LOW +) { + +3263 + `»cÜd_low_´essu»_Ëv–s +(& +mi +); + +3266 ià( +Ëv–_oomadj +[ +Ëv– +] > +OOM_SCORE_ADJ_MAX +) { + +3271 ià(( +mem_u§ge + = + `g‘_memÜy_u§ge +(& +mem_u§ge_fže_d©a +)) < 0) { + +3272  +do_kžl +; + +3274 ià(( +memsw_u§ge + = + `g‘_memÜy_u§ge +(& +memsw_u§ge_fže_d©a +)) < 0) { + +3275  +do_kžl +; + +3279 +mem_´essu» + = ( +mem_u§ge + * 100è/ +memsw_u§ge +; + +3281 ià( +’abË_´essu»_upg¿de + && +Ëv– + !ð +VMPRESS_LEVEL_CRITICAL +) { + +3283 ià( +mem_´essu» + < +upg¿de_´essu» +) { + +3284 +Ëv– + = + `upg¿de_Ëv– +(level); + +3285 ià( +debug_´oûss_kžlšg +) { + +3286 + `ALOGI +("Ev’ˆupg¿dedØ%s", +Ëv–_Çme +[ +Ëv– +]); + +3293 ià( + `g‘_ä“_sw­ +(& +mi +) >= + +3294 +mi +. +f›ld +. +tÙ®_sw­ + * +sw­_ä“_low_³rûÁage + / 100) { + +3297 ià( +mem_´essu» + > +downg¿de_´essu» +) { + +3298 ià( +debug_´oûss_kžlšg +) { + +3299 + `ALOGI +("IgnÜ% memÜy…»ssu»", +Ëv–_Çme +[ +Ëv– +]); + +3302 } ià( +Ëv– + =ð +VMPRESS_LEVEL_CRITICAL + && +mem_´essu» + > +upg¿de_´essu» +) { + +3303 ià( +debug_´oûss_kžlšg +) { + +3304 + `ALOGI +("Downgrade critical memory…ressure"); + +3307 +Ëv– + = + `downg¿de_Ëv– +(level); + +3311 +do_kžl +: + +3312 ià( +low_¿m_deviû +) { + +3314 ià( + `fšd_ªd_kžl_´oûss +( +u£_mšä“_Ëv–s + ? +mš_scÜe_adj + : +Ëv–_oomadj +[ +Ëv– +], + +3315 +NULL +, & +mi +, & +wi +, & +cu¼_tm +, NULL) == 0) { + +3316 ià( +debug_´oûss_kžlšg +) { + +3317 + `ALOGI +("Nothingo kill"); + +3321  +·ges_ä“d +; + +3322  +time¥ec + +Ï¡_»pÜt_tm +; + +3323  +»pÜt_sk_couÁ + = 0; + +3325 ià(! +u£_mšä“_Ëv–s +) { + +3327 ià( +mi +. +f›ld +. +Ä_ä“_·ges + >ð +low_´essu»_mem +. +max_Ä_ä“_·ges +) { + +3328 ià( +debug_´oûss_kžlšg +) { + +3329 + `ALOGI +("Ignoring…ressure since more memory is " + +3330 "avažabË (%" +PRId64 + ")han watermark (%" PRId64 ")", + +3331 +mi +. +f›ld +. +Ä_ä“_·ges +, +low_´essu»_mem +. +max_Ä_ä“_·ges +); + +3335 +mš_scÜe_adj + = +Ëv–_oomadj +[ +Ëv– +]; + +3338 +·ges_ä“d + = + `fšd_ªd_kžl_´oûss +( +mš_scÜe_adj +, +NULL +, & +mi +, & +wi +, & +cu¼_tm +, NULL); + +3340 ià( +·ges_ä“d + =ð0 && +mš_scÜe_adj + == 0) { + +3341 + `lmkd_no_kžl_ÿndid©es_hook +(); + +3344 ià( +·ges_ä“d + == 0) { + +3346 ià( + `g‘_time_diff_ms +(& +Ï¡_»pÜt_tm +, & +cu¼_tm +è< +FAIL_REPORT_RLIMIT_MS +) { + +3347 +»pÜt_sk_couÁ +++; + +3353 ià( +u£_mšä“_Ëv–s +) { + +3354 + `ALOGI +("Reþaimed %ldkB, cache(%ldkBèªd f»e(%" +PRId64 + "kB)-reserved(%" PRId64 "kB) " + +3356 +·ges_ä“d + * +·ge_k +, + +3357 +Ùh”_fže + * +·ge_k +, +mi +. +f›ld +. +Ä_ä“_·ges + *…age_k, + +3358 +zi +. +tÙ®»£rve_·ges + * +·ge_k +, + +3359 +mšä“ + * +·ge_k +, +mš_scÜe_adj +); + +3361 + `ALOGI +("Reþaimed %ldkB‡ˆoom_scÜe_adj %d", +·ges_ä“d + * +·ge_k +, +mš_scÜe_adj +); + +3364 ià( +»pÜt_sk_couÁ + > 0) { + +3365 + `ALOGI +("Suµ»s£d %lu fažed kžÈ»pÜts", +»pÜt_sk_couÁ +); + +3366 +»pÜt_sk_couÁ + = 0; + +3369 +Ï¡_»pÜt_tm + = +cu¼_tm +; + +3371 ià( + `is_wa™šg_fÜ_kžl +()) { + +3373 +pÞl_·¿ms +-> +upd©e + = +POLLING_PAUSE +; + +3375 + } +} + +3377  +boÞ + + $š™_mp_psi +( +vm´essu»_Ëv– + +Ëv– +, +boÞ + +u£_Ãw_¡¿‹gy +) { + +3378  +fd +; + +3381 ià(! +psi_th»shÞds +[ +Ëv– +]. +th»shÞd_ms +) { + +3382  +Œue +; + +3385 +fd + = + `š™_psi_mÚ™Ü +( +psi_th»shÞds +[ +Ëv– +]. +¡®l_ty³ +, + +3386 +psi_th»shÞds +[ +Ëv– +]. +th»shÞd_ms + * +US_PER_MS +, + +3387 +PSI_WINDOW_SIZE_MS + * +US_PER_MS +); + +3389 ià( +fd + < 0) { + +3390  +çl£ +; + +3393 +vm´essu»_hšfo +[ +Ëv– +]. +hªdËr + = +u£_Ãw_¡¿‹gy + ? +mp_ev’t_psi + : +mp_ev’t_commÚ +; + +3394 +vm´essu»_hšfo +[ +Ëv– +]. +d©a + =†evel; + +3395 ià( + `»gi¡”_psi_mÚ™Ü +( +•Þlfd +, +fd +, & +vm´essu»_hšfo +[ +Ëv– +]) < 0) { + +3396 + `de¡roy_psi_mÚ™Ü +( +fd +); + +3397  +çl£ +; + +3399 +maxev’ts +++; + +3400 +m³vfd +[ +Ëv– +] = +fd +; + +3402  +Œue +; + +3403 + } +} + +3405  + $de¡roy_mp_psi +( +vm´essu»_Ëv– + +Ëv– +) { + +3406  +fd + = +m³vfd +[ +Ëv– +]; + +3408 ià( +fd + < 0) { + +3412 ià( + `uÄegi¡”_psi_mÚ™Ü +( +•Þlfd +, +fd +) < 0) { + +3413 + `ALOGE +("Failedo unregister…si monitor for %s memory…ressure;ƒrrno=%d", + +3414 +Ëv–_Çme +[ +Ëv– +], +”ºo +); + +3416 +maxev’ts +--; + +3417 + `de¡roy_psi_mÚ™Ü +( +fd +); + +3418 +m³vfd +[ +Ëv– +] = -1; + +3419 + } +} + +3421 þas  + cMemcgV”siÚ + { + +3422 + mkNÙFound +, + +3423 + mkV1 +, + +3424 + mkV2 +, + +3427  +MemcgV”siÚ + + $__memcg_v”siÚ +() { + +3428 +¡d +:: +¡ršg + +cgroupv2_·th +, +memcg_·th +; + +3430 ià(! + `CgroupG‘CÚŒÞËrP©h +("memÜy", & +memcg_·th +)) { + +3431  +MemcgV”siÚ +:: +kNÙFound +; + +3433  + `CgroupG‘CÚŒÞËrP©h +( +CGROUPV2_HIERARCHY_NAME +, & +cgroupv2_·th +) && + +3434 +cgroupv2_·th + =ð +memcg_·th + + +3435 ? +MemcgV”siÚ +:: +kV2 + + +3436 : +MemcgV”siÚ +:: +kV1 +; + +3437 + } +} + +3439  +MemcgV”siÚ + + $memcg_v”siÚ +() { + +3440  +MemcgV”siÚ + +v”siÚ + = + `__memcg_v”siÚ +(); + +3442  +v”siÚ +; + +3443 + } +} + +3445  + $memev’t_li¡’”_nÙifiÿtiÚ +( +d©a + +__unu£d +, +ušt32_t + +ev’ts + __unused, + +3446  +pÞlšg_·¿ms +* +pÞl_·¿ms +) { + +3447  +time¥ec + +cu¼_tm +; + +3448 +¡d +:: +veùÜ +< +mem_ev’t_t +> +mem_ev’ts +; + +3450 ià( + `þock_g‘time +( +CLOCK_MONOTONIC_COARSE +, & +cu¼_tm +) != 0) { + +3451 +dœeù_»þaim_¡¬t_tm +. +tv_£c + = 0; + +3452 +dœeù_»þaim_¡¬t_tm +. +tv_n£c + = 0; + +3453 + `ALOGE +("Failedo get currentime for memevent†istener‚otification."); + +3457 ià(! +memev’t_li¡’” +-> + `g‘MemEv’ts +( +mem_ev’ts +)) { + +3458 +dœeù_»þaim_¡¬t_tm +. +tv_£c + = 0; + +3459 +dœeù_»þaim_¡¬t_tm +. +tv_n£c + = 0; + +3460 + `ALOGE +("Failed fetching memory†istenerƒvents."); + +3464 cÚ¡ +mem_ev’t_t +& +mem_ev’t + : +mem_ev’ts +) { + +3465  +mem_ev’t +. +ty³ +) { + +3467  +MEM_EVENT_DIRECT_RECLAIM_BEGIN +: + +3468 +dœeù_»þaim_¡¬t_tm + = +cu¼_tm +; + +3470  +MEM_EVENT_DIRECT_RECLAIM_END +: + +3471 +dœeù_»þaim_¡¬t_tm +. +tv_£c + = 0; + +3472 +dœeù_»þaim_¡¬t_tm +. +tv_n£c + = 0; + +3476  +MEM_EVENT_KSWAPD_WAKE +: + +3477 +ksw­d_¡¬t_tm + = +cu¼_tm +; + +3479  +MEM_EVENT_KSWAPD_SLEEP +: + +3480 +ksw­d_¡¬t_tm +. +tv_£c + = 0; + +3481 +ksw­d_¡¬t_tm +. +tv_n£c + = 0; + +3483  +MEM_EVENT_VENDOR_LMK_KILL +: { + +3484  +psi_ev’t_d©a + +ev’t_d©a + = {. +v’dÜ_ev’t + = +mem_ev’t +}; + +3485 + `__mp_ev’t_psi +( +VENDOR +, +ev’t_d©a +, 0, +pÞl_·¿ms +); + +3488  +MEM_EVENT_UPDATE_ZONEINFO +: { + +3489  +zÚešfo + +zi +; + +3490 + `upd©e_zÚešfo_w©”m¬ks +(& +zi +); + +3495 + } +} + +3497  +boÞ + + $š™_memev’t_li¡’”_mڙܚg +() { + +3498  +ev’t_hªdËr_šfo + +dœeù_»þaim_pÞl_hšfo + = {0, + +3499 +memev’t_li¡’”_nÙifiÿtiÚ +}; + +3501 ià( +memev’t_li¡’” +è +Œue +; + +3504 +ªdroid +:: +bpf +:: + `wa™FÜProgsLßded +(); + +3505 +memev’t_li¡’” + = +¡d +:: +make_unique +< +ªdroid +:: +bpf +:: +memev’ts +:: +MemEv’tLi¡’” +>( + +3506 +ªdroid +:: +bpf +:: +memev’ts +:: +MemEv’tCl›Á +:: +LMKD +); + +3508 ià(! +memev’t_li¡’” +-> + `ok +()) { + +3509 + `ALOGE +("Failedo initialize memevents†istener"); + +3510 +memev’t_li¡’” +. + `»£t +(); + +3511  +çl£ +; + +3514 ià(! +memev’t_li¡’” +-> + `»gi¡”Ev’t +( +MEM_EVENT_DIRECT_RECLAIM_BEGIN +) || + +3515 ! +memev’t_li¡’” +-> + `»gi¡”Ev’t +( +MEM_EVENT_DIRECT_RECLAIM_END +)) { + +3516 + `ALOGE +("Failedo„egister direct„eclaim memevents"); + +3517 +memev’t_li¡’” +. + `»£t +(); + +3518  +çl£ +; + +3520 ià(! +memev’t_li¡’” +-> + `»gi¡”Ev’t +( +MEM_EVENT_KSWAPD_WAKE +) || + +3521 ! +memev’t_li¡’” +-> + `»gi¡”Ev’t +( +MEM_EVENT_KSWAPD_SLEEP +)) { + +3522 + `ALOGE +("Failedo„egister kswapd memevents"); + +3523 +memev’t_li¡’” +. + `»£t +(); + +3524  +çl£ +; + +3527 ià(! +memev’t_li¡’” +-> + `»gi¡”Ev’t +( +MEM_EVENT_VENDOR_LMK_KILL +)) { + +3528 + `ALOGI +("Failedo„egister‡ndroid_vendor_kill memevents"); + +3531 ià(! +memev’t_li¡’” +-> + `»gi¡”Ev’t +( +MEM_EVENT_UPDATE_ZONEINFO +)) { + +3532 +mem_ev’t_upd©e_zÚešfo_suµÜ‹d + = +çl£ +; + +3533 + `ALOGI +("update_zoneinfo memevents‡re‚ot supported"); + +3535 +mem_ev’t_upd©e_zÚešfo_suµÜ‹d + = +Œue +; + +3538  +memev’t_li¡’”_fd + = +memev’t_li¡’” +-> + `g‘RšgBufãrFd +(); + +3539 ià( +memev’t_li¡’”_fd + < 0) { + +3540 +memev’t_li¡’” +. + `»£t +(); + +3541 + `ALOGE +("Inv®id memev’t_li¡’” fd: %d", +memev’t_li¡’”_fd +); + +3542  +çl£ +; + +3545  +•Þl_ev’t + +•ev +; + +3546 +•ev +. +ev’ts + = +EPOLLIN +; + +3547 +•ev +. +d©a +. +±r + = (*)& +dœeù_»þaim_pÞl_hšfo +; + +3548 ià( + `•Þl_ùl +( +•Þlfd +, +EPOLL_CTL_ADD +, +memev’t_li¡’”_fd +, & +•ev +) < 0) { + +3549 + `ALOGE +("Fažed„egi¡”šg memev’t_li¡’” fd: %d;ƒ¼no=%d", +memev’t_li¡’”_fd +, +”ºo +); + +3550 +memev’t_li¡’” +. + `»£t +(); + +3551  +çl£ +; + +3554 +dœeù_»þaim_¡¬t_tm +. +tv_£c + = 0; + +3555 +dœeù_»þaim_¡¬t_tm +. +tv_n£c + = 0; + +3557 +maxev’ts +++; + +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šä“_Ëv–s +); + +3571 ià(! +u£_Ãw_¡¿‹gy + && + `memcg_v”siÚ +(è!ð +MemcgV”siÚ +:: +kV1 +) { + +3572 + `ALOGE +("Old kill strategy can only be used with v1 cgroup hierarchy"); + +3573  +çl£ +; + +3576 ià( +u£_Ãw_¡¿‹gy +) { + +3578 +psi_th»shÞds +[ +VMPRESS_LEVEL_LOW +]. +th»shÞd_ms + = 0; + +3579 +psi_th»shÞds +[ +VMPRESS_LEVEL_MEDIUM +]. +th»shÞd_ms + = +psi_·¹Ÿl_¡®l_ms +; + +3580 +psi_th»shÞds +[ +VMPRESS_LEVEL_CRITICAL +]. +th»shÞd_ms + = +psi_com¶‘e_¡®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 + `de¡roy_mp_psi +( +VMPRESS_LEVEL_LOW +); + +3588  +çl£ +; + +3590 ià(! + `š™_mp_psi +( +VMPRESS_LEVEL_CRITICAL +, +u£_Ãw_¡¿‹gy +)) { + +3591 + `de¡roy_mp_psi +( +VMPRESS_LEVEL_MEDIUM +); + +3592 + `de¡roy_mp_psi +( +VMPRESS_LEVEL_LOW +); + +3593  +çl£ +; + +3595  +Œue +; + +3596 + } +} + +3598  +boÞ + + $š™_mp_commÚ +( +vm´essu»_Ëv– + +Ëv– +) { + +3601 ià( + `memcg_v”siÚ +(è!ð +MemcgV”siÚ +:: +kV1 +) { + +3602 + `ALOGE +("%s: glob® mڙܚg i Úly‡važabË fÜhv1 cgrou°h›¿rchy", +__func__ +); + +3603  +çl£ +; + +3606  +mpfd +; + +3607  +evfd +; + +3608  +evùlfd +; + +3609  +buf +[256]; + +3610  +•Þl_ev’t + +•ev +; + +3611  +»t +; + +3612  +Ëv–_idx + = () +Ëv– +; + +3613 cÚ¡ * +Ëv–¡r + = +Ëv–_Çme +[ +Ëv–_idx +]; + +3616 +mpfd + = + `Ý’ +( + `G‘CgroupA‰ribu‹P©h +("MemP»ssu»Lev–"). + `c_¡r +(), +O_RDONLY + | +O_CLOEXEC +); + +3617 ià( +mpfd + < 0) { + +3618 + `ALOGI +("NØk”ÃÈmemÜy.´essu»_Ëv– suµÜˆÓ¼no=%d)", +”ºo +); + +3619  +”r_Ý’_mpfd +; + +3622 +evùlfd + = + `Ý’ +( + `G‘CgroupA‰ribu‹P©h +("MemCgroupEv’tCÚŒÞ"). + `c_¡r +(), +O_WRONLY + | +O_CLOEXEC +); + +3623 ià( +evùlfd + < 0) { + +3624 + `ALOGI +("NØk”ÃÈmemÜy cgrou°ev’ˆcÚŒÞ (”ºo=%d)", +”ºo +); + +3625  +”r_Ý’_evùlfd +; + +3628 +evfd + = + `ev’tfd +(0, +EFD_NONBLOCK + | +EFD_CLOEXEC +); + +3629 ià( +evfd + < 0) { + +3630 + `ALOGE +("ev’tfd fažed f܆ev– %s;ƒ¼no=%d", +Ëv–¡r +, +”ºo +); + +3631  +”r_ev’tfd +; + +3634 +»t + = + `¢´štf +( +buf +, (buf), "%d %d %s", +evfd +, +mpfd +, +Ëv–¡r +); + +3635 ià( +»t + >ð( +ssize_t +)( +buf +)) { + +3636 + `ALOGE +("cgroup.ev’t_cڌކšov”æow f܆ev– %s", +Ëv–¡r +); + +3637  +”r +; + +3640 +»t + = + `TEMP_FAILURE_RETRY +( + `wr™e +( +evùlfd +, +buf +, + `¡¾’ +(buf) + 1)); + +3641 ià( +»t + == -1) { + +3642 + `ALOGE +("cgroup.event_control write failed for†evel %s;ƒrrno=%d", + +3643 +Ëv–¡r +, +”ºo +); + +3644  +”r +; + +3647 +•ev +. +ev’ts + = +EPOLLIN +; + +3649 +vm´essu»_hšfo +[ +Ëv–_idx +]. +d©a + =†evel_idx; + +3650 +vm´essu»_hšfo +[ +Ëv–_idx +]. +hªdËr + = +mp_ev’t_commÚ +; + +3651 +•ev +. +d©a +. +±r + = (*)& +vm´essu»_hšfo +[ +Ëv–_idx +]; + +3652 +»t + = + `•Þl_ùl +( +•Þlfd +, +EPOLL_CTL_ADD +, +evfd +, & +•ev +); + +3653 ià( +»t + == -1) { + +3654 + `ALOGE +("•Þl_ùÈf܆ev– % çžed;ƒ¼no=%d", +Ëv–¡r +, +”ºo +); + +3655  +”r +; + +3657 +maxev’ts +++; + +3658 +m³vfd +[ +Ëv– +] = +evfd +; + +3659 + `þo£ +( +evùlfd +); + +3660  +Œue +; + +3662 +”r +: + +3663 + `þo£ +( +evfd +); + +3664 +”r_ev’tfd +: + +3665 + `þo£ +( +evùlfd +); + +3666 +”r_Ý’_evùlfd +: + +3667 + `þo£ +( +mpfd +); + +3668 +”r_Ý’_mpfd +: + +3669  +çl£ +; + +3670 + } +} + +3672  + $de¡roy_mp_commÚ +( +vm´essu»_Ëv– + +Ëv– +) { + +3673  +•Þl_ev’t + +•ev +; + +3674  +fd + = +m³vfd +[ +Ë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 +maxev’ts +--; + +3685 + `þo£ +( +fd +); + +3686 +m³vfd +[ +Ëv– +] = -1; + +3687 + } +} + +3689  + $k”Ãl_ev’t_hªdËr +( +d©a + +__unu£d +, +ušt32_t + +ev’ts + __unused, + +3690  +pÞlšg_·¿ms + * +pÞl_·¿ms + +__unu£d +) { + +3691 + `pÞl_k”Ãl +( +kpÞl_fd +); + +3692 + } +} + +3694  +boÞ + + $š™_mÚ™Üs +() { + +3695 + `ALOGI +("Wakeu°couÁ” i »£ˆäom %" +PRIu64 + "Ø0", +mp_ev’t_couÁ +); + +3696 +mp_ev’t_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 does‚ot support memory…ressureƒvents or in-kernel†ow memory killer"); + +3706  +çl£ +; + +3708 ià( +u£_psi_mÚ™Üs +) { + +3709 + `ALOGI +("Using…si monitors for memory…ressure detection"); + +3711 + `ALOGI +("Using vmpressure for memory…ressure detection"); + +3714 +mÚ™Üs_š™Ÿlized + = +Œue +; + +3715  +Œue +; + +3716 + } +} + +3718  + $de¡roy_mÚ™Üs +() { + +3719 ià( +u£_psi_mÚ™Üs +) { + +3720 + `de¡roy_mp_psi +( +VMPRESS_LEVEL_CRITICAL +); + +3721 + `de¡roy_mp_psi +( +VMPRESS_LEVEL_MEDIUM +); + +3722 + `de¡roy_mp_psi +( +VMPRESS_LEVEL_LOW +); + +3724 + `de¡roy_mp_commÚ +( +VMPRESS_LEVEL_CRITICAL +); + +3725 + `de¡roy_mp_commÚ +( +VMPRESS_LEVEL_MEDIUM +); + +3726 + `de¡roy_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 +("pçžed: %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úŽ fažed: %s", + `¡»¼Ü +( +”ºo +)); + +3745 + `drÝ_»­”_comm +(); + +3746  +çl£ +; + +3749  +Œue +; + +3750 + } +} + +3752  +boÞ + + $š™_»­” +() { + +3753 ià(! +»­” +. + `is_»­šg_suµÜ‹d +()) { + +3754 + `ALOGI +("Process„eaping is‚ot supported"); + +3755  +çl£ +; + +3758 ià(! + `£tup_»­”_comm +()) { + +3759 + `ALOGE +("Failedo createhread communication channel"); + +3760  +çl£ +; + +3764  +•Þl_ev’t + +•ev +; + +3765  +ev’t_hªdËr_šfo + +kžl_çžed_hšfo + = { 0, +kžl_çž_hªdËr + }; + +3766 +•ev +. +ev’ts + = +EPOLLIN +; + +3767 +•ev +. +d©a +. +±r + = (*)& +kžl_çžed_hšfo +; + +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 initialize„eaper 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 +maxev’ts +++; + +3784  +Œue +; + +3785 + } +} + +3787  + $š™ +() { + +3788  +ev’t_hªdËr_šfo + +k”Ãl_pÞl_hšfo + = { 0, +k”Ãl_ev’t_hªdËr + }; + +3789  +»»ad_d©a + +fže_d©a + = { + +3790 . +fž’ame + = +ZONEINFO_PATH +, + +3791 . +fd + = -1, + +3793  +•Þl_ev’t + +•ev +; + +3794  +pidfd +; + +3795  +i +; + +3796  +»t +; + +3799 +·gesize + = + `g‘·gesize +(); + +3800 +·ge_k + = +·gesize + / 1024; + +3802 +•Þlfd + = + `•Þl_ü—‹ +( +MAX_EPOLL_EVENTS +); + +3803 ià( +•Þlfd + == -1) { + +3804 + `ALOGE +("•Þl_ü—‹ fažed (”ºo=%d)", +”ºo +); + +3809  +i + = 0; i < +MAX_DATA_CONN +; i++) { + +3810 +d©a_sock +[ +i +]. +sock + = -1; + +3813 +ù¾_sock +. +sock + = + `ªdroid_g‘_cÚŒÞ_sock‘ +("lmkd"); + +3814 ià( +ù¾_sock +. +sock + < 0) { + +3815 + `ALOGE +("get†mkd control socket failed"); + +3819 +»t + = + `li¡’ +( +ù¾_sock +. +sock +, +MAX_DATA_CONN +); + +3820 ià( +»t + < 0) { + +3821 + `ALOGE +("lmkd cÚŒÞ sock‘†i¡’ fažed (”ºo=%d)", +”ºo +); + +3825 +•ev +. +ev’ts + = +EPOLLIN +; + +3826 +ù¾_sock +. +hªdËr_šfo +. +hªdËr + = +ù¾_cÚÃù_hªdËr +; + +3827 +•ev +. +d©a +. +±r + = (*)&( +ù¾_sock +. +hªdËr_šfo +); + +3828 ià( + `•Þl_ùl +( +•Þlfd +, +EPOLL_CTL_ADD +, +ù¾_sock +. +sock +, & +•ev +) == -1) { + +3829 + `ALOGE +("•Þl_ùÈf܆mkd cÚŒÞ sock‘ fažed (”ºo=%d)", +”ºo +); + +3832 +maxev’ts +++; + +3834 +has_šk”Ãl_moduË + = ! + `acûss +( +INKERNEL_MINFREE_PATH +, +W_OK +); + +3835 +u£_šk”Ãl_š‹rçû + = +has_šk”Ãl_moduË +; + +3837 ià( +u£_šk”Ãl_š‹rçû +) { + +3838 + `ALOGI +("Using in-kernel†ow memory killer interface"); + +3839 ià( + `š™_pÞl_k”Ãl +()) { + +3840 +•ev +. +ev’ts + = +EPOLLIN +; + +3841 +•ev +. +d©a +. +±r + = (*)& +k”Ãl_pÞl_hšfo +; + +3842 ià( + `•Þl_ùl +( +•Þlfd +, +EPOLL_CTL_ADD +, +kpÞl_fd +, & +•ev +) != 0) { + +3843 + `ALOGE +("•Þl_ùÈf܆mkƒv’t çžed (”ºo=%d)", +”ºo +); + +3844 + `þo£ +( +kpÞl_fd +); + +3845 +kpÞl_fd + = -1; + +3847 +maxev’ts +++; + +3849 + `´Ý”ty_£t +("sys.lmk.reportkills", "1"); + +3856 ià(! +d–ay_mÚ™Üs_uÁž_boÙ + || + `´Ý”ty_g‘_boÞ +("sys.boÙ_com¶‘ed", +çl£ +)) { + +3857 ià(! + `š™_mÚ™Üs +()) { + +3862 + `´Ý”ty_£t +("sys.lmk.reportkills", "1"); + +3865  +i + = 0; i <ð + `ADJTOSLOT +( +OOM_SCORE_ADJ_MAX +); i++) { + +3866 +´oÿdj¦Ù_li¡ +[ +i +]. +Ãxt + = &procadjslot_list[i]; + +3867 +´oÿdj¦Ù_li¡ +[ +i +]. +´ev + = &procadjslot_list[i]; + +3870 + `mem£t +( +kžlút_idx +, +KILLCNT_INVALID_IDX +, (killcnt_idx)); + +3876 ià( + `»»ad_fže +(& +fže_d©a +è=ð +NULL +) { + +3877 + `ALOGE +("FažedØ»ad %s: %s", +fže_d©a +. +fž’ame +, + `¡»¼Ü +( +”ºo +)); + +3881 +pidfd + = + `TEMP_FAILURE_RETRY +( + `pidfd_Ý’ +( + `g‘pid +(), 0)); + +3882 ià( +pidfd + < 0) { + +3883 +pidfd_suµÜ‹d + = ( +”ºo + !ð +ENOSYS +); + +3885 +pidfd_suµÜ‹d + = +Œue +; + +3886 + `þo£ +( +pidfd +); + +3888 + `ALOGI +("Proûs pÞlšg i %s", +pidfd_suµÜ‹d + ? "supported" : "not supported" ); + +3890 ià(! + `lmkd_š™_hook +()) { + +3891 + `ALOGE +("Failedo initialize LMKD hooks."); + +3896 + } +} + +3898  +boÞ + + $pÞlšg_·u£d +( +pÞlšg_·¿ms + * +pÞl_·¿ms +) { + +3899  +pÞl_·¿ms +-> +·u£d_hªdËr + !ð +NULL +; + +3900 + } +} + +3902  + $»sume_pÞlšg +( +pÞlšg_·¿ms + * +pÞl_·¿ms +,  +time¥ec + +cu¼_tm +) { + +3903 +pÞl_·¿ms +-> +pÞl_¡¬t_tm + = +cu¼_tm +; + +3904 +pÞl_·¿ms +-> +pÞl_hªdËr + =…Þl_·¿ms-> +·u£d_hªdËr +; + +3905 +pÞl_·¿ms +-> +pÞlšg_š‹rv®_ms + = +PSI_POLL_PERIOD_SHORT_MS +; + +3906 +pÞl_·¿ms +-> +·u£d_hªdËr + = +NULL +; + +3907 + } +} + +3909  + $ÿÎ_hªdËr +( +ev’t_hªdËr_šfo +* +hªdËr_šfo +, + +3910  +pÞlšg_·¿ms + * +pÞl_·¿ms +, +ušt32_t + +ev’ts +) { + +3911  +time¥ec + +cu¼_tm +; + +3913 +w©chdog +. + `¡¬t +(); + +3914 +pÞl_·¿ms +-> +upd©e + = +POLLING_DO_NOT_CHANGE +; + +3915 +hªdËr_šfo +-> + `hªdËr +(hªdËr_šfo-> +d©a +, +ev’ts +, +pÞl_·¿ms +); + +3916 + `þock_g‘time +( +CLOCK_MONOTONIC_COARSE +, & +cu¼_tm +); + +3917 ià( +pÞl_·¿ms +-> +pÞl_hªdËr + =ð +hªdËr_šfo +) { + +3918 +pÞl_·¿ms +-> +Ï¡_pÞl_tm + = +cu¼_tm +; + +3921  +pÞl_·¿ms +-> +upd©e +) { + +3922  +POLLING_START +: + +3928 +pÞl_·¿ms +-> +pÞl_¡¬t_tm + = +cu¼_tm +; + +3929 +pÞl_·¿ms +-> +pÞl_hªdËr + = +hªdËr_šfo +; + +3930 +pÞl_·¿ms +-> +Ï¡_pÞl_tm + = +cu¼_tm +; + +3932  +POLLING_PAUSE +: + +3933 +pÞl_·¿ms +-> +·u£d_hªdËr + = +hªdËr_šfo +; + +3934 +pÞl_·¿ms +-> +pÞl_hªdËr + = +NULL +; + +3936  +POLLING_RESUME +: + +3937 + `»sume_pÞlšg +( +pÞl_·¿ms +, +cu¼_tm +); + +3939  +POLLING_DO_NOT_CHANGE +: + +3940 ià( +pÞl_·¿ms +-> +pÞl_hªdËr + && + +3941 + `g‘_time_diff_ms +(& +pÞl_·¿ms +-> +pÞl_¡¬t_tm +, & +cu¼_tm +è> +PSI_WINDOW_SIZE_MS +) { + +3943 +pÞl_·¿ms +-> +pÞl_hªdËr + = +NULL +; + +3947 +w©chdog +. + `¡Ý +(); + +3948 + } +} + +3950  + $mašloÝ +() { + +3951  +ev’t_hªdËr_šfo +* +hªdËr_šfo +; + +3952  +pÞlšg_·¿ms + +pÞl_·¿ms +; + +3953  +time¥ec + +cu¼_tm +; + +3954  +•Þl_ev’t + * +evt +; + +3955  +d–ay + = -1; + +3957 +pÞl_·¿ms +. +pÞl_hªdËr + = +NULL +; + +3958 +pÞl_·¿ms +. +·u£d_hªdËr + = +NULL +; + +3961  +•Þl_ev’t + +ev’ts +[ +MAX_EPOLL_EVENTS +]; + +3962  +Ãv’ts +; + +3963  +i +; + +3965 ià( +pÞl_·¿ms +. +pÞl_hªdËr +) { + +3966 +boÞ + +pÞl_now +; + +3968 + `þock_g‘time +( +CLOCK_MONOTONIC_COARSE +, & +cu¼_tm +); + +3969 ià( +pÞl_·¿ms +. +upd©e + =ð +POLLING_RESUME +) { + +3971 +pÞl_now + = +Œue +; + +3972 +Ãv’ts + = 0; + +3975 +d–ay + = + `g‘_time_diff_ms +(& +pÞl_·¿ms +. +Ï¡_pÞl_tm +, & +cu¼_tm +); + +3976 +d–ay + = (d–ay < +pÞl_·¿ms +. +pÞlšg_š‹rv®_ms +) ? + +3977 +pÞl_·¿ms +. +pÞlšg_š‹rv®_ms + - +d–ay + :…oll_params.polling_interval_ms; + +3980 +Ãv’ts + = + `•Þl_wa™ +( +•Þlfd +, +ev’ts +, +maxev’ts +, +d–ay +); + +3983 + `þock_g‘time +( +CLOCK_MONOTONIC_COARSE +, & +cu¼_tm +); + +3984 +pÞl_now + = ( + `g‘_time_diff_ms +(& +pÞl_·¿ms +. +Ï¡_pÞl_tm +, & +cu¼_tm +) >= + +3985 +pÞl_·¿ms +. +pÞlšg_š‹rv®_ms +); + +3987 ià( +pÞl_now +) { + +3988 + `ÿÎ_hªdËr +( +pÞl_·¿ms +. +pÞl_hªdËr +, &poll_params, 0); + +3991 ià( +kžl_timeout_ms + && + `is_wa™šg_fÜ_kžl +()) { + +3992 + `þock_g‘time +( +CLOCK_MONOTONIC_COARSE +, & +cu¼_tm +); + +3993 +d–ay + = +kžl_timeout_ms + - + `g‘_time_diff_ms +(& +Ï¡_kžl_tm +, & +cu¼_tm +); + +3995 +Ãv’ts + = ( +d–ay + > 0è? + `•Þl_wa™ +( +•Þlfd +, +ev’ts +, +maxev’ts +, delay) : 0; + +3996 ià( +Ãv’ts + == 0) { + +3998 + `¡Ý_wa™_fÜ_´oc_kžl +( +çl£ +); + +3999 ià( + `pÞlšg_·u£d +(& +pÞl_·¿ms +)) { + +4000 + `þock_g‘time +( +CLOCK_MONOTONIC_COARSE +, & +cu¼_tm +); + +4001 +pÞl_·¿ms +. +upd©e + = +POLLING_RESUME +; + +4002 + `»sume_pÞlšg +(& +pÞl_·¿ms +, +cu¼_tm +); + +4007 +Ãv’ts + = + `•Þl_wa™ +( +•Þlfd +, +ev’ts +, +maxev’ts +, -1); + +4011 ià( +Ãv’ts + == -1) { + +4012 ià( +”ºo + =ð +EINTR +) + +4014 + `ALOGE +("•Þl_wa™ fažed (”ºo=%d)", +”ºo +); + +4025  +i + = 0, +evt + = & +ev’ts +[0]; i < +Ãv’ts +; ++i,ƒvt++) { + +4026 ià(( +evt +-> +ev’ts + & +EPOLLHUP +è&&ƒvt-> +d©a +. +±r +) { + +4027 +hªdËr_šfo + = ( +ev’t_hªdËr_šfo +*) +evt +-> +d©a +. +±r +; + +4028 ià( +hªdËr_šfo +-> +hªdËr + =ð +kžl_dÚe_hªdËr +) { + +4029 + `ÿÎ_hªdËr +( +hªdËr_šfo +, & +pÞl_·¿ms +, +evt +-> +ev’ts +); + +4031 + `ALOGI +("lmkd data connection dropped"); + +4032 +w©chdog +. + `¡¬t +(); + +4033 + `ù¾_d©a_þo£ +( +hªdËr_šfo +-> +d©a +); + +4034 +w©chdog +. + `¡Ý +(); + +4040  +i + = 0, +evt + = & +ev’ts +[0]; i < +Ãv’ts +; ++i,ƒvt++) { + +4041 ià( +evt +-> +ev’ts + & +EPOLLERR +) { + +4042 + `ALOGD +("EPOLLERR oÀev’ˆ#%d", +i +); + +4044 ià( +evt +-> +ev’ts + & +EPOLLHUP +) { + +4048 ià( +evt +-> +d©a +. +±r +) { + +4049 +hªdËr_šfo + = ( +ev’t_hªdËr_šfo +*) +evt +-> +d©a +. +±r +; + +4050 + `ÿÎ_hªdËr +( +hªdËr_šfo +, & +pÞl_·¿ms +, +evt +-> +ev’ts +); + +4054 + } +} + +4056  + $issue_»š™ +() { + +4057  +sock +; + +4059 +sock + = + `lmkd_cÚÃù +(); + +4060 ià( +sock + < 0) { + +4061 + `ALOGE +("çžedØcÚÃùØlmkd: %s", + `¡»¼Ü +( +”ºo +)); + +4065 +upd©e_´Ýs_»suÉ + +»s + = + `lmkd_upd©e_´Ýs +( +sock +); + +4066  +»s +) { + +4067  +UPDATE_PROPS_SUCCESS +: + +4068 + `ALOGI +("lmkd updated…roperties successfully"); + +4070  +UPDATE_PROPS_SEND_ERR +: + +4071 + `ALOGE +("çžedØ£nd†mkd„eque¡: %s", + `¡»¼Ü +( +”ºo +)); + +4073  +UPDATE_PROPS_RECV_ERR +: + +4074 + `ALOGE +("çžedØ»ûivlmkd„•ly: %s", + `¡»¼Ü +( +”ºo +)); + +4076  +UPDATE_PROPS_FORMAT_ERR +: + +4077 + `ALOGE +("lmkd„eply is invalid"); + +4079  +UPDATE_PROPS_FAIL +: + +4080 + `ALOGE +("lmkd failedo update its…roperties"); + +4084 + `þo£ +( +sock +); + +4085  +»s + =ð +UPDATE_PROPS_SUCCESS + ? 0 : -1; + +4086 + } +} + +4088  + $Ú_boÙ_com¶‘ed +() { + +4089  +sock +; + +4091 +sock + = + `lmkd_cÚÃù +(); + +4092 ià( +sock + < 0) { + +4093 + `ALOGE +("çžedØcÚÃùØlmkd: %s", + `¡»¼Ü +( +”ºo +)); + +4097 +boÙ_com¶‘ed_nÙifiÿtiÚ_»suÉ + +»s + = + `lmkd_nÙify_boÙ_com¶‘ed +( +sock +); + +4099  +»s +) { + +4100  +BOOT_COMPLETED_NOTIF_SUCCESS +: + +4102  +BOOT_COMPLETED_NOTIF_ALREADY_HANDLED +: + +4103 + `ALOGW +("lmkd‡lready handled boot-completed operations"); + +4105  +BOOT_COMPLETED_NOTIF_SEND_ERR +: + +4106 + `ALOGE +("failedo send†mkd„equest: %m"); + +4108  +BOOT_COMPLETED_NOTIF_RECV_ERR +: + +4109 + `ALOGE +("failedo„eceive„equest: %m"); + +4111  +BOOT_COMPLETED_NOTIF_FORMAT_ERR +: + +4112 + `ALOGE +("lmkd„eply is invalid"); + +4114  +BOOT_COMPLETED_NOTIF_FAILS +: + +4115 + `ALOGE +("lmkd failedo„eceive boot-completed‚otification"); + +4119 + `þo£ +( +sock +); + +4120  +»s + =ð +BOOT_COMPLETED_NOTIF_SUCCESS + ? 0 : -1; + +4121 + } +} + +4123  +boÞ + + $upd©e_´Ý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_´oûss_kžlšg + = + `GET_LMK_PROPERTY +( +boÞ +, "debug", +çl£ +); + +4134 +’abË_´essu»_upg¿de + = + +4135 + `GET_LMK_PROPERTY +( +boÞ +, "ü™iÿl_upg¿de", +çl£ +); + +4136 +upg¿de_´essu» + = + +4137 ( +št64_t +) + `GET_LMK_PROPERTY +( +št32 +, "upgrade_pressure", 100); + +4138 +downg¿de_´essu» + = + +4139 ( +št64_t +) + `GET_LMK_PROPERTY +( +št32 +, "downgrade_pressure", 100); + +4140 +kžl_h—v›¡_sk + = + +4141 + `GET_LMK_PROPERTY +( +boÞ +, "kžl_h—v›¡_sk", +çl£ +); + +4142 +low_¿m_deviû + = + `´Ý”ty_g‘_boÞ +("ro.cÚfig.low_¿m", +çl£ +); + +4143 +kžl_timeout_ms + = + +4144 () + `GET_LMK_PROPERTY +( +št32 +, "kill_timeout_ms", 100); + +4145 +´essu»_aá”_kžl_mš_scÜe + = + +4146 () + `GET_LMK_PROPERTY +( +št32 +, "pressure_after_kill_min_score", 0); + +4147 +u£_mšä“_Ëv–s + = + +4148 + `GET_LMK_PROPERTY +( +boÞ +, "u£_mšä“_Ëv–s", +çl£ +); + +4149 +³r_­p_memcg + = + +4150 + `´Ý”ty_g‘_boÞ +("ro.cÚfig.³r_­p_memcg", +low_¿m_deviû +); + +4151 +sw­_ä“_low_³rûÁage + = + `þ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_com¶‘e_¡®l_ms + = + `GET_LMK_PROPERTY +( +št32 +, "psi_complete_stall_ms", + +4156 +DEF_COMPLETE_STALL +); + +4157 +th¿shšg_lim™_pù + = + +4158 +¡d +:: + `max +(0, + `GET_LMK_PROPERTY +( +št32 +, "thrashing_limit", + +4159 +low_¿m_deviû + ? +DEF_THRASHING_LOWRAM + : +DEF_THRASHING +)); + +4160 +th¿shšg_lim™_deÿy_pù + = + `þamp +(0, 100, + `GET_LMK_PROPERTY +( +št32 +, "thrashing_limit_decay", + +4161 +low_¿m_deviû + ? +DEF_THRASHING_DECAY_LOWRAM + : +DEF_THRASHING_DECAY +)); + +4162 +th¿shšg_ü™iÿl_pù + = +¡d +:: + `max +( + +4163 0, + `GET_LMK_PROPERTY +( +št32 +, "th¿shšg_lim™_ü™iÿl", +th¿shšg_lim™_pù + * 3)); + +4164 +sw­_utž_max + = + `þamp +(0, 100, + `GET_LMK_PROPERTY +( +št32 +, "swap_util_max", 100)); + +4165 +fžeÿche_mš_kb + = + `GET_LMK_PROPERTY +( +št64 +, "filecache_min_kb", 0); + +4166 +¡®l_lim™_ü™iÿl + = + `GET_LMK_PROPERTY +( +št64 +, "stall_limit_critical", 100); + +4167 +d–ay_mÚ™Üs_uÁž_boÙ + = + `GET_LMK_PROPERTY +( +boÞ +, "d–ay_mÚ™Üs_uÁž_boÙ", +çl£ +); + +4168 +dœeù_»þaim_th»shÞd_ms + = + +4169 + `GET_LMK_PROPERTY +( +št64 +, "dœeù_»þaim_th»shÞd_ms", +DEF_DIRECT_RECL_THRESH_MS +); + +4170 +sw­_com´essiÚ_¿tio + = + +4171 + `GET_LMK_PROPERTY +( +št64 +, "sw­_com´essiÚ_¿tio", +DEF_SWAP_COMP_RATIO +); + +4172 +lowmem_mš_oom_scÜe + = + +4173 +¡d +:: + `max +( +PERCEPTIBLE_APP_ADJ + + 1, + +4174 + `GET_LMK_PROPERTY +( +št32 +, "lowmem_mš_oom_scÜe", +DEF_LOWMEM_MIN_SCORE +)); + +4176 +»­” +. + `’abË_debug +( +debug_´oûss_kžlšg +); + +4179 ià(! + `lmkd_upd©e_´Ýs_hook +()) { + +4180 + `ALOGE +("Failedo update LMKD hook…rops."); + +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 +("FažedØ»£ˆ" +LMKD_REINIT_PROP + "…roperty"); + +4193  + `issue_»š™ +(); + +4194 } ià(! + `¡rcmp +( +¬gv +[1], "--boot_completed")) { + +4195  + `Ú_boÙ_com¶‘ed +(); + +4199 ià(! + `upd©e_´Ýs +()) { + +4200 + `ALOGE +("Failedo initialize…rops,ƒxiting."); + +4204 +ùx + = + `ü—‹_ªdroid_logg” +( +KILLINFO_LOG_TAG +); + +4206 ià(! + `š™ +()) { + +4207 ià(! +u£_šk”Ãl_š‹rçû +) { + +4220 ià( + `mlock®l +( +MCL_CURRENT + | +MCL_FUTURE + | +MCL_ONFAULT +è&& ( +”ºo + !ð +EINVAL +)) { + +4221 + `ALOGW +("mlock®Èçžed %s", + `¡»¼Ü +( +”ºo +)); + +4225  +sched_·¿m + +·¿m + = { + +4226 . +sched_´iÜ™y + = 1, + +4228 ià( + `sched_£tscheduËr +(0, +SCHED_FIFO +, & +·¿m +)) { + +4229 + `ALOGW +("£ˆSCHED_FIFO fažed %s", + `¡»¼Ü +( +”ºo +)); + +4233 ià( + `š™_»­” +()) { + +4234 + `ALOGI +("Process„eaper initialized with %dhreads inhe…ool", + +4235 +»­” +. + `th»ad_út +()); + +4238 ià(! +w©chdog +. + `š™ +()) { + +4239 + `ALOGE +("Failedo initializehe watchdog"); + +4242 + `mašloÝ +(); + +4245 + `ªdroid_log_de¡roy +(& +ùx +); + +4247 + `ALOGI +("exiting"); + +4249 + } +} + + @reaper.cpp + +17  + #LOG_TAG + "lowmemÜykžËr" + + ) + +19  + ~ + +20  + ~<”ºo.h +> + +21  + ~ + +22  + ~ + +23  + ~ + +24  + ~<¡ršg.h +> + +25  + ~<¡dlib.h +> + +26  + ~ + +27  + ~ + +28  + ~ + +29  + ~ + +30  + ~ + +31  + ~ + +32  + ~ + +34  + ~<´oûssgroup/´oûssgroup.h +> + +35  + ~ + +37  + ~"»­”.h +" + +39  + #NS_PER_MS + ( +NS_PER_SEC + / +MS_PER_SEC +) + + ) + +40  + #THREAD_POOL_SIZE + 2 + + ) + +42 #iâdeà +__NR_´oûss_m»Ëa£ + + +43  + #__NR_´oûss_m»Ëa£ + 448 + + ) + +46  + $´oûss_m»Ëa£ +( +pidfd +,  +æags +) { + +47  + `sysÿÎ +( +__NR_´oûss_m»Ëa£ +, +pidfd +, +æags +); + +48 + } +} + +50  +šlše +  + $g‘_time_diff_ms +( +time¥ec + * +äom +, + +51  +time¥ec + * +to +) { + +52  ( +to +-> +tv_£c + - +äom +->tv_£cè* () +MS_PER_SEC + + + +53 ( +to +-> +tv_n£c + - +äom +->tv_n£cè/ () +NS_PER_MS +; + +54 + } +} + +56  +£t_´oûss_group_ªd_´io +( +uid_t + +uid +,  +pid +, cÚ¡ +¡d +:: +veùÜ +<¡d:: +¡ršg +>& +´ofžes +, + +57  +´io +) { + +58 +DIR +* + gd +; + +59  + g´oc_·th +[ +PATH_MAX +]; + +60  +dœ’t +* + gde +; + +62 ià(! +S‘ProûssProfžesCached +( +uid +, +pid +, +´ofžes +)) { + +63 +ALOGW +("FažedØ£ˆsk…rofže fÜh´oûs (%dèbešg kžËd", +pid +); + +66 +¢´štf +( +´oc_·th +, Õroc_·th), "/´oc/%d/sk", +pid +); + +67 ià(!( + gd + = +Ý’dœ +( +´oc_·th +))) { + +68 +ALOGW +("FažedØÝ’ %s;ƒ¼no=%d:…roûs pid(%dèmighˆhavd›d", +´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 +("FažedØg‘_pid fÜ '%s' oàpid(%d)", +de +-> +d_Çme +, +pid +); + +84 ià( +£riÜ™y +( +PRIO_PROCESS +, +t_pid +, +´io +è&& + g”ºo + !ð +ESRCH +) { + +85 +ALOGW +("UÇbËØ¿i£…riÜ™y oàkžlšg_pid (%d):ƒ¼no=%d", +t_pid +, +”ºo +); + +88 +þo£dœ +( +d +); + +91 * + $»­”_maš +(* +·¿m +) { + +92 +R—³r + * +»­” + = +¡©ic_ÿ¡ +( +·¿m +); + +93  +time¥ec + +¡¬t_tm +, +’d_tm +; + +94  +R—³r +:: +rg‘_´oc + +rg‘ +; + +95 +pid_t + +tid + = + `g‘tid +(); + +98 ià(! + `S‘TaskProfžes +( +tid +, {"CPUSET_SP_FOREGROUND"}, +Œue +)) { + +99 + `ALOGE +("Failedo‡ssign cpusetohe„eaperhread"); + +102 ià( + `£riÜ™y +( +PRIO_PROCESS +, +tid +, +ANDROID_PRIORITY_HIGHEST +)) { + +103 + `ALOGW +("UÇbËØ¿i£…riÜ™y oàth»­”h»ad (%d):ƒ¼no=%d", +tid +, +”ºo +); + +107 +rg‘ + = +»­” +-> + `dequeue_»que¡ +(); + +109 ià( +»­” +-> + `debug_’abËd +()) { + +110 + `þock_g‘time +( +CLOCK_MONOTONIC_COARSE +, & +¡¬t_tm +); + +113 ià( + `pidfd_£nd_sigÇl +( +rg‘ +. +pidfd +, +SIGKILL +, +NULL +, 0)) { + +115 +»­” +-> + `nÙify_kžl_çžu» +( +rg‘ +. +pid +); + +116  +dÚe +; + +119 + `£t_´oûss_group_ªd_´io +( +rg‘ +. +uid +,¬g‘. +pid +, + +121 +ANDROID_PRIORITY_NORMAL +); + +123 ià( + `´oûss_m»Ëa£ +( +rg‘ +. +pidfd +, 0)) { + +124 + `ALOGE +("´oûss_m»Ëa£ %d fažed: %s", +rg‘ +. +pid +, + `¡»¼Ü +( +”ºo +)); + +125  +dÚe +; + +127 ià( +»­” +-> + `debug_’abËd +()) { + +128 + `þock_g‘time +( +CLOCK_MONOTONIC_COARSE +, & +’d_tm +); + +129 + `ALOGI +("Proûs %d wa »­ed iÀ%ldms", +rg‘ +. +pid +, + +130 + `g‘_time_diff_ms +(& +¡¬t_tm +, & +’d_tm +)); + +133 +dÚe +: + +134 + `þo£ +( +rg‘ +. +pidfd +); + +135 +»­” +-> + `»que¡_com¶‘e +(); + +138  +NULL +; + +139 + } +} + +141 +boÞ + + gR—³r +:: + $is_»­šg_suµÜ‹d +() { + +143 +UNKNOWN +, + +144 +SUPPORTED +, + +145 +UNSUPPORTED + + +146 } +»­_suµÜt + = +UNKNOWN +; + +148 ià( +»­_suµÜt + =ð +UNKNOWN +) { + +149 ià( + `´oûss_m»Ëa£ +(-1, 0è&& +”ºo + =ð +ENOSYS +) { + +150 +»­_suµÜt + = +UNSUPPORTED +; + +152 +»­_suµÜt + = +SUPPORTED +; + +155  +»­_suµÜt + =ð +SUPPORTED +; + +156 + } +} + +158 +boÞ + + gR—³r +:: + $š™ +( +comm_fd +) { + +159  +Çme +[16]; + +160  +sched_·¿m + +·¿m + = { + +161 . +sched_´iÜ™y + = 0, + +164 ià( +th»ad_út_ + > 0) { + +166  +çl£ +; + +169 +th»ad_poÞ_ + = +Ãw + +±h»ad_t +[ +THREAD_POOL_SIZE +]; + +170  +i + = 0; i < +THREAD_POOL_SIZE +; i++) { + +171 ià( + `±h»ad_ü—‹ +(& +th»ad_poÞ_ +[ +th»ad_út_ +], +NULL +, +»­”_maš +, +this +)) { + +172 + `ALOGE +("±h»ad_ü—‹ fažed: %s", + `¡»¼Ü +( +”ºo +)); + +176 ià( + `±h»ad_£tsched·¿m +( +th»ad_poÞ_ +[ +th»ad_út_ +], +SCHED_OTHER +, & +·¿m +)) { + +177 + `ALOGW +("£ˆSCHED_FIFO fažed %s", + `¡»¼Ü +( +”ºo +)); + +179 + `¢´štf +( +Çme +, Òame), "lmkd_»­”%d", +th»ad_út_ +); + +180 ià( + `±h»ad_£Šame_Å +( +th»ad_poÞ_ +[ +th»ad_út_ +], +Çme +)) { + +181 + `ALOGW +("±h»ad_£Šame_Å fažed: %s", + `¡»¼Ü +( +”ºo +)); + +183 +th»ad_út_ +++; + +186 ià(! +th»ad_út_ +) { + +187 +d–‘e +[] +th»ad_poÞ_ +; + +188  +çl£ +; + +191 +queue_ +. + `»£rve +( +th»ad_út_ +); + +192 +comm_fd_ + = +comm_fd +; + +193  +Œue +; + +194 + } +} + +196 +boÞ + + gR—³r +:: + $async_kžl +(cÚ¡  +rg‘_´oc +& +rg‘ +) { + +197 ià( +rg‘ +. +pidfd + == -1) { + +198  +çl£ +; + +201 ià(! +th»ad_út_ +) { + +202  +çl£ +; + +205 +mu‹x_ +. + `lock +(); + +206 ià( +aùive_»que¡s_ + >ð +th»ad_út_ +) { + +207 +mu‹x_ +. + `uÆock +(); + +208  +çl£ +; + +210 +aùive_»que¡s_ +++; + +214 +queue_ +. + `push_back +({ + `dup +( +rg‘ +. +pidfd +),¬g‘. +pid +,¬g‘. +uid + }); + +216 +cÚd_ +. + `nÙify_Úe +(); + +217 +mu‹x_ +. + `uÆock +(); + +219  +Œue +; + +220 + } +} + +222  + gR—³r +:: + $kžl +(cÚ¡  +rg‘_´oc +& +rg‘ +, +boÞ + +synchrÚous +) { + +224 ià( +rg‘ +. +pidfd + < 0) { + +225  :: + `kžl +( +rg‘ +. +pid +, +SIGKILL +); + +228 ià(! +synchrÚous + && + `async_kžl +( +rg‘ +)) { + +233  +»suÉ + = + `pidfd_£nd_sigÇl +( +rg‘ +. +pidfd +, +SIGKILL +, +NULL +, 0); + +234 ià( +»suÉ +) { + +235  +»suÉ +; + +239 + } +} + +241 + gR—³r +:: +rg‘_´oc + +R—³r +:: + $dequeue_»que¡ +() { + +242  +rg‘_´oc + +rg‘ +; + +243 +¡d +:: +unique_lock +<¡d:: +mu‹x +> + `lock +( +mu‹x_ +); + +245  +queue_ +. + `em±y +()) { + +246 +cÚd_ +. + `wa™ +( +lock +); + +248 +rg‘ + = +queue_ +. + `back +(); + +249 +queue_ +. + `pÝ_back +(); + +251  +rg‘ +; + +252 + } +} + +254  + gR—³r +:: + $»que¡_com¶‘e +() { + +255 +¡d +:: +scÝed_lock +<¡d:: +mu‹x +> + `lock +( +mu‹x_ +); + +256 +aùive_»que¡s_ +--; + +257 + } +} + +259  + gR—³r +:: + $nÙify_kžl_çžu» +( +pid +) { + +260 +¡d +:: +scÝed_lock +<¡d:: +mu‹x +> + `lock +( +mu‹x_ +); + +262 + `ALOGE +("FažedØkžÈ´oûs %d", +pid +); + +263 ià( + `TEMP_FAILURE_RETRY +( + `wr™e +( +comm_fd_ +, & +pid +, (pid))) != (pid)) { + +264 + `ALOGE +("th»ad communiÿtiÚ wr™çžed: %s", + `¡»¼Ü +( +”ºo +)); + +266 + } +} + + @reaper.h + +17 #´agm¨ +Úû + + +19  + ~ + +20  + ~ + +21  + ~ + +23 þas  + cR—³r + { + +24 + mpublic +: + +25  + srg‘_´oc + { + +26  +pidfd +; + +27  + mpid +; + +28 +uid_t + + muid +; + +30 + g´iv©e +: + +32 +¡d +:: +mu‹x + +mu‹x_ +; + +33 + g¡d +:: +cÚd™iÚ_v¬ŸbË + +cÚd_ +; + +35 + g¡d +:: +veùÜ +< +rg‘_´oc +> +queue_ +; + +36  + gaùive_»que¡s_ +; + +38  + gcomm_fd_ +; + +39  + gth»ad_út_ +; + +40 +±h»ad_t +* + gth»ad_poÞ_ +; + +41 +boÞ + + gdebug_’abËd_ +; + +43 +boÞ + +async_kžl +(cÚ¡  +rg‘_´oc +& +rg‘ +); + +44 + gpublic +: + +45 + $R—³r +(è: + `aùive_»que¡s_ +(0), + `th»ad_út_ +(0), + $debug_’abËd_ +( +çl£ +è{ + } +} + +47  +boÞ + +is_»­šg_suµÜ‹d +(); + +49 +boÞ + +š™ +( +comm_fd +); + +50  + $th»ad_út +(ècÚ¡ {  +th»ad_út_ +; + } +} + +51  + $’abË_debug +( +boÞ + +’abË +è{ +debug_’abËd_ + =ƒÇbË; + } +} + +52 +boÞ + + $debug_’abËd +(ècÚ¡ {  +debug_’abËd_ +; + } +} + +55  +kžl +(cÚ¡  +rg‘_´oc +& +rg‘ +, +boÞ + +synchrÚous +); + +57 +rg‘_´oc + +dequeue_»que¡ +(); + +58  +»que¡_com¶‘e +(); + +59  +nÙify_kžl_çžu» +( +pid +); + + @statslog.cpp + +17  + ~ + +18  + ~<”ºo.h +> + +19  + ~ + +20  + ~ + +21  + ~ + +22  + ~<¡©¦og.h +> + +23  + ~<¡dlib.h +> + +24  + ~<¡ršg.h +> + +25  + ~<¡dlib.h +> + +26  + ~<¡ršg.h +> + +27  + ~ + +28  + ~ + +29  + ~ + +30  + ~ + +31  + ~ + +33  + ~<¡ršg +> + +35  + ~ + +36  + ~<´oûssgroup/´oûssgroup.h +> + +38 #ifdeà +LMKD_LOG_STATS + + +40  + #STRINGIFY +( +x +è + `STRINGIFY_INTERNAL +(x) + + ) + +41  + #STRINGIFY_INTERNAL +( +x +è#x + + ) + +46  + #BUILD_BUG_ON +( +cÚd +è(()([1 - 2 * !!(cÚd)])) + + ) + +48  +boÞ + + g’abË_¡©s_log + = +´Ý”ty_g‘_boÞ +("ro.lmk.log_¡©s", +Œue +); + +50  + s´oc + { + +51  + mpid +; + +52  + mskÇme +[ +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  + $memÜy_¡©_·r£_lše +(cÚ¡ * +lše +,  +memÜy_¡© +* +mem_¡ +) { + +72  +key +[ +MAX_TASKNAME_LEN + + 1]; + +73 +št64_t + +v®ue +; + +75 + `ssÿnf +( +lše +, "%" + `STRINGIFY +( +MAX_TASKNAME_LEN +è"  %" +SCNd64 + "", +key +, & +v®ue +); + +77 ià( + `¡rcmp +( +key +, "total_") < 0) { + +81 ià(! + `¡rcmp +( +key +, "total_pgfault")) + +82 +mem_¡ +-> +pgçuÉ + = +v®ue +; + +83 ià(! + `¡rcmp +( +key +, "total_pgmajfault")) + +84 +mem_¡ +-> +pgmajçuÉ + = +v®ue +; + +85 ià(! + `¡rcmp +( +key +, "total_rss")) + +86 +mem_¡ +-> +rss_š_by‹s + = +v®ue +; + +87 ià(! + `¡rcmp +( +key +, "total_cache")) + +88 +mem_¡ +-> +ÿche_š_by‹s + = +v®ue +; + +89 ià(! + `¡rcmp +( +key +, "total_swap")) + +90 +mem_¡ +-> +sw­_š_by‹s + = +v®ue +; + +91 + } +} + +93  + $memÜy_¡©_äom_cgroup +( +memÜy_¡© +* +mem_¡ +,  +pid +, +uid_t + +uid + +__unu£d +) { + +94 +¡d +:: +¡ršg + +·th +; + +95 ià(! + `CgroupG‘A‰ribu‹P©hFÜTask +("MemSts", +pid +, & +·th +)) { + +96 + `ALOGE +("Querying MemStats…ath failed"); + +100 +FILE +* +å + = + `fÝ’ +( +·th +. + `c_¡r +(), "r"); + +102 ià( +å + =ð +NULL +) { + +106  +buf +[ +LINE_MAX +]; + +107  + `fg‘s +( +buf +, +LINE_MAX +, +å +è!ð +NULL +) { + +108 + `memÜy_¡©_·r£_lše +( +buf +, +mem_¡ +); + +110 + `fþo£ +( +å +); + +113 + } +} + +115  + $memÜy_¡©_äom_´ocfs +( +memÜy_¡© +* +mem_¡ +,  +pid +) { + +116  +·th +[ +PATH_MAX +]; + +117  +bufãr +[ +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 +, +bufãr +, (buffer)); + +126 ià( +»t + < 0) { + +127 + `þo£ +( +fd +); + +130 + `þo£ +( +fd +); + +135 +št64_t + +pgçuÉ + = 0, +pgmajçuÉ + = 0, +¡¬‰ime + = 0; + +136 ià( + `ssÿnf +( +bufãr +, + +137 "%*u %* %* %*d %*d %*d %*d %*d %*d %" +SCNd64 + " %*d " + +138 "%" +SCNd64 + " %*d %*u %*u %*d %*d %*d %*d %*d %*d " + +139 "%" +SCNd64 + "", + +140 & +pgçuÉ +, & +pgmajçuÉ +, & +¡¬‰ime +) != 3) { + +143 +mem_¡ +-> +pgçuÉ + =…gfault; + +144 +mem_¡ +-> +pgmajçuÉ + =…gmajfault; + +145 +mem_¡ +-> +´oûss_¡¬t_time_ns + = +¡¬‰ime + * ( +NS_PER_SEC + / + `syscÚf +( +_SC_CLK_TCK +)); + +148 + } +} + +150  +memÜy_¡© + * + $¡©s_»ad_memÜy_¡© +( +boÞ + +³r_­p_memcg +,  +pid +, +uid_t + +uid +, + +151 +št64_t + +rss_by‹s +, iÁ64_ˆ +sw­_by‹s +) { + +152  +memÜy_¡© + +mem_¡ + = {}; + +153 ià(! +’abË_¡©s_log +) { + +154  +NULL +; + +157 ià( +³r_­p_memcg +) { + +158 ià( + `memÜy_¡©_äom_cgroup +(& +mem_¡ +, +pid +, +uid +) == 0) { + +159  & +mem_¡ +; + +162 ià( + `memÜy_¡©_äom_´ocfs +(& +mem_¡ +, +pid +) == 0) { + +163 +mem_¡ +. +rss_š_by‹s + = +rss_by‹s +; + +164 +mem_¡ +. +sw­_š_by‹s + = +sw­_by‹s +; + +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_skÇme +( +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_skÇme +( +pid +, cÚ¡ * +skÇme +) { + +206 ià(! +’abË_¡©s_log + || ! +skÇme +) { + +210  +´oc +* +´oý + = + `pid_lookup +( +pid +); + +211 ià( +´oý + !ð +NULL +) { + +212 ià( + `¡rcmp +( +´oý +-> +skÇme +,askname) == 0) { + +215 + `¡©s_»move_skÇme +( +pid +); + +217 +´oý + = +¡©ic_ÿ¡ +< +´oc +*>( + `m®loc +((proc))); + +218 +´oý +-> +pid + =…id; + +219 + `¡ºýy +( +´oý +-> +skÇme +,askÇme, +MAX_TASKNAME_LEN + - 1); + +220 +´oý +-> +skÇme +[ +MAX_TASKNAME_LEN + - 1] = '\0'; + +221 + `´oc_𣹠+( +´oý +); + +222 + } +} + +224  + $¡©s_purge_skÇmes +() { + +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 + `mem£t +( +pidhash +, 0, +PIDHASH_SZ + * (*pidhash)); + +241 + } +} + +243 cÚ¡ * + $¡©s_g‘_sk_Çme +( +pid +) { + +244  +´oc +*…roøð + `pid_lookup +( +pid +); + +245  +´oc + ?…roc-> +skÇme + : +NULL +; + +246 + } +} + +252  +šlše + +size_t + + $·ck_št32 +( +LMK_KILL_OCCURRED_PACKET + +·ck‘ +, + +253 +size_t + +šdex +, + +254 +št32_t + +v®ue +) { + +255 +št32_t +* +št_bufãr + = (št32_t*)( +·ck‘ + + +šdex +); + +257 * +št_bufãr + = + `htÚl +( +v®ue +); + +259  +šdex + + ( +št32_t +); + +260 + } +} + +266  +šlše + +size_t + + $·ck_št64 +( +LMK_KILL_OCCURRED_PACKET + +·ck‘ +, + +267 +size_t + +šdex +, + +268 +št64_t + +v®ue +) { + +269 +št64_t +* +št64_bufãr + = (št64_t*)( +·ck‘ + + +šdex +); + +271 * +št64_bufãr + = + `htÚq +( +v®ue +); + +273  +šdex + + ( +št64_t +); + +274 + } +} + +284  +šlše + +size_t + + $·ck_¡ršg +( +LMK_KILL_OCCURRED_PACKET + +·ck‘ +, + +285 +size_t + +šdex +, + +286 cÚ¡ * +v®ue +) { + +287 cÚ¡ +size_t + +Ën_´oc_Çme + = + `MIN +( + `¡¾’ +( +v®ue +), +MAX_TASKNAME_LEN + - 1); + +288 +št16_t +* +shÜt_bufãr + = (št16_t*)( +·ck‘ + + +šdex +); + +289 * +shÜt_bufãr + = + `htÚs +(( +št16_t +) +Ën_´oc_Çme +); + +291 * +by‹_bufãr + = (*)( +shÜt_bufãr + + 1); + +292 + `¡ºýy +( +by‹_bufãr +, +v®ue +, +MAX_TASKNAME_LEN + - 1); + +293 +by‹_bufãr +[ +MAX_TASKNAME_LEN + - 1] = '\0'; + +295  +šdex + + ( +št16_t +è+ +Ën_´oc_Çme + + 1; + +296 + } +} + +298 +size_t + + $lmkd_·ck_£t_kžl_occu¼ed +( +LMK_KILL_OCCURRED_PACKET + +·ck‘ +, + +299  +kžl_¡© + *kill_stat, + +300  +memÜy_¡© + * +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_¡© +-> +pgçuÉ +); + +312 +šdex + = + `·ck_št64 +( +·ck‘ +, index, +mem_¡© +-> +pgmajçuÉ +); + +313 +šdex + = + `·ck_št64 +( +·ck‘ +, index, +mem_¡© +-> +rss_š_by‹s +); + +314 +šdex + = + `·ck_št64 +( +·ck‘ +, index, +mem_¡© +-> +ÿche_š_by‹s +); + +315 +šdex + = + `·ck_št64 +( +·ck‘ +, index, +mem_¡© +-> +sw­_š_by‹s +); + +316 +šdex + = + `·ck_št64 +( +·ck‘ +, index, +mem_¡© +-> +´oûss_¡¬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, +kžl_¡© +-> +uid +); + +327 +šdex + = + `·ck_št32 +( +·ck‘ +, index, +kžl_¡© +-> +oom_scÜe +); + +328 +šdex + = + `·ck_št32 +( +·ck‘ +, index, +kžl_¡© +-> +mš_oom_scÜe +); + +329 +šdex + = + `·ck_št32 +( +·ck‘ +, index, () +kžl_¡© +-> +ä“_mem_kb +); + +330 +šdex + = + `·ck_št32 +( +·ck‘ +, index, () +kžl_¡© +-> +ä“_sw­_kb +); + +331 +šdex + = + `·ck_št32 +( +·ck‘ +, index, () +kžl_¡© +-> +kžl_»asÚ +); + +332 +šdex + = + `·ck_št32 +( +·ck‘ +, index, +kžl_¡© +-> +th¿shšg +); + +333 +šdex + = + `·ck_št32 +( +·ck‘ +, index, +kžl_¡© +-> +max_th¿shšg +); + +335 +šdex + = + `·ck_¡ršg +( +·ck‘ +, index, +kžl_¡© +-> +skÇme +); + +336  +šdex +; + +337 + } +} + + @statslog.h + +17 #iâdeà +_STATSLOG_H_ + + +18  + #_STATSLOG_H_ + + + ) + +20  + ~ + +22  + ~ + +23  + ~<š‰y³s.h +> + +24  + ~<¡dboÞ.h +> + +25  + ~ + +26  + ~ + +28  + ~ + +29  + ~ + +31 + g__BEGIN_DECLS + + +33  + #MAX_TASKNAME_LEN + 128 + + ) + +45  + #LMKD_REPLY_MAX_SIZE + 222 + + ) + +48  + smemÜy_¡© + { + +49 +št64_t + + mpgçuÉ +; + +50 +št64_t + + mpgmajçuÉ +; + +51 +št64_t + + mrss_š_by‹s +; + +52 +št64_t + + mÿche_š_by‹s +; + +53 +št64_t + + msw­_š_by‹s +; + +54 +št64_t + + m´oûss_¡¬t_time_ns +; + +58 + ekžl_»asÚs + { + +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  + skžl_¡© + { + +78 +št32_t + + muid +; + +79 cÚ¡ * + mskÇme +; + +80 +kžl_»asÚs + + mkžl_»asÚ +; + +81 +št32_t + + moom_scÜe +; + +82 +št32_t + + mmš_oom_scÜe +; + +83 +št64_t + + mä“_mem_kb +; + +84 +št64_t + + mä“_sw­_kb +; + +85 +št32_t + + mth¿shšg +; + +86 +št32_t + + mmax_th¿shšg +; + +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_kžl_occu¼ed +( +LMK_KILL_OCCURRED_PACKET + +·ck‘ +, + +103  +kžl_¡© + * +kžl_¡ +, + +104  +memÜy_¡© + * +mem_¡ +); + +109  +memÜy_¡© + * +¡©s_»ad_memÜy_¡© +( +boÞ + +³r_­p_memcg +,  +pid +, +uid_t + +uid +, + +110 +št64_t + +rss_by‹s +, iÁ64_ˆ +sw­_by‹s +); + +115  +¡©s_¡Üe_skÇme +( +pid +, cÚ¡ * +skÇme +); + +120  +¡©s_purge_skÇmes +(); + +125  +¡©s_»move_skÇme +( +pid +); + +127 cÚ¡ * +¡©s_g‘_sk_Çme +( +pid +); + +131  +šlše + +size_t + + +132 + $lmkd_·ck_£t_kžl_occu¼ed +( +LMK_KILL_OCCURRED_PACKET + +·ck‘ + +__unu£d +, + +133  +kžl_¡© + * +kžl_¡ + +__unu£d +, + +134  +memÜy_¡© + * +mem_¡ + +__unu£d +) { + +135  - +EINVAL +; + +136 + } +} + +138  +šlše +  +memÜy_¡© + * + $¡©s_»ad_memÜy_¡© +( +boÞ + +³r_­p_memcg + +__unu£d +, + +139  +pid + +__unu£d +, +uid_t + +uid + __unused, + +140 +št64_t + +rss_by‹s + +__unu£d +, iÁ64_ˆ +sw­_by‹s + __unused) { + +141  +NULL +; + +142 + } +} + +144  +šlše +  + $¡©s_¡Üe_skÇme +( +pid + +__unu£d +, cÚ¡ * +skÇme + __unu£dè{ + } +} + +146  +šlše +  + $¡©s_purge_skÇmes +(è{ + } +} + +148  +šlše +  + $¡©s_»move_skÇme +( +pid + +__unu£d +è{ + } +} + +150  +šlše + cÚ¡ * + $¡©s_g‘_sk_Çme +( +pid + +__unu£d +è{  +NULL +; + } +} + +154 + g__END_DECLS + + + @tests/Android.bp + +15 + gackage + { + +16 + guÉ_‹am +: "trendy_team_android_kernel", + +17 + guÉ_­¶iÿbË_liûn£s +: ["Android-Apache-2.0"], + +20 + gc_‹¡ + { + +23 + ged_libs +: [ + +28 +¡©ic_libs +: [ + +30 +rg‘ +: { + +31 +ªdroid +: { + +32 +¤cs +: ["lmkd_test.cpp"], + +34 + gcæags +: [ + +38 +compže_muÉžib +: "first", + +41 +c_‹¡ + { + +43 +_su™es +: ["device-tests"], + +44 + gœe_roÙ +: +Œue +, + +46 + ged_libs +: [ + +51 +¡©ic_libs +: [ + +53 +rg‘ +: { + +54 +ªdroid +: { + +55 +¤cs +: ["lmkd_tests.cpp"], + +57 + gcæags +: [ + +61 +compže_muÉžib +: "first", + + @tests/lmkd_test.cpp + +17  + ~ + +18  + ~<¡dio.h +> + +19  + ~<¡ršg.h +> + +20  + ~<¡ršg +> + +21  + ~ + +22  + ~ + +23  + ~ + +25  + ~<ªdroid-ba£/fže.h +> + +26  + ~<ªdroid-ba£/loggšg.h +> + +27  + ~<ªdroid-ba£/´Ý”t›s.h +> + +28  + ~<ªdroid-ba£/¡ršg´štf.h +> + +29  + ~<ªdroid-ba£/¡ršgs.h +> + +30  + ~ + +31  + ~ + +32  + ~ + +33  + ~ + +34  + ~ + +35  + ~<´iv©e/ªdroid_fžesy¡em_cÚfig.h +> + +37 +usšg + +Çme¥aû + + gªdroid +:: +ba£ +; + +39  + #INKERNEL_MINFREE_PATH + "/sys/moduË/lowmemÜykžËr/·¿m‘”s/mšä“" + + ) + +40  + #LMKDTEST_RESPAWN_FLAG + "LMKDTEST_RESPAWN" + + ) + +42  + #LMKD_LOGCAT_MARKER + "lowmemÜykžËr" + + ) + +43  + #LMKD_KILL_MARKER_TEMPLATE + +LMKD_LOGCAT_MARKER + ": KžÈ'%s'" + + ) + +44  + #OOM_MARKER + "OuˆoàmemÜy" + + ) + +45  + #OOM_KILL_MARKER + "KžËd…roûss" + + ) + +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 + g¡d +:: +¡ršg + + $»adCommªd +(cÚ¡ +¡d +:: +¡ršg +& +commªd +) { + +61 +FILE +* +å + = + `pÝ’ +( +commªd +. + `c_¡r +(), "r"); + +62 +¡d +:: +¡ršg + +cÚ‹Á +; + +63 + `R—dFdToSŒšg +( + `fž’o +( +å +), & +cÚ‹Á +); + +64 + `pþo£ +( +å +); + +65  +cÚ‹Á +; + +66 + } +} + +68 + g¡d +:: +¡ršg + + $»adLogÿt +(cÚ¡ +¡d +:: +¡ršg +& +m¬k” +) { + +69 +¡d +:: +¡ršg + +cÚ‹Á + = + `»adCommªd +("logcat -d -b‡ll"); + +70 +size_t + +pos + = +cÚ‹Á +. + `fšd +( +m¬k” +); + +71 ià( +pos + =ð +¡d +:: +¡ršg +:: +Åos +)  ""; + +72 +cÚ‹Á +. + `”a£ +(0, +pos +); + +73  +cÚ‹Á +; + +74 + } +} + +76 +boÞ + + $wr™eFže +(cÚ¡ +¡d +:: +¡ršg +& +fže +, const std::string& string) { + +77 ià( + `g‘uid +(è=ð +¡©ic_ÿ¡ +<>( +AID_ROOT +)) { + +78  + `Wr™eSŒšgToFže +( +¡ršg +, +fže +); + +80  +¡ršg + =ð + `»adCommªd +( + +81 "echØ-À'" + +¡ršg + + "' | su„oÙ“ " + +fže + + " 2>&1"); + +82 + } +} + +84 +boÞ + + $wr™eKmsg +(cÚ¡ +¡d +:: +¡ršg +& +m¬k” +) { + +85  + `wr™eFže +("/dev/kmsg", +m¬k” +); + +86 + } +} + +88 + g¡d +:: +¡ršg + + $g‘TextAround +(cÚ¡ +¡d +:: +¡ršg +& +‹xt +, +size_t + +pos +, + +89 +size_t + +lšes_befÜe +, size_ˆ +lšes_aá” +) { + +90 +size_t + +¡¬t_pos + = +pos +; + +94  +lšes_befÜe + > 0 && + +95 ( +¡¬t_pos + = +‹xt +. + `rfšd +('\n', s¹_pos)è!ð +¡d +:: +¡ršg +:: +Åos +) { + +96 +lšes_befÜe +--; + +99 +¡¬t_pos + = +‹xt +. + `rfšd +('\n', start_pos); + +100 +¡¬t_pos + = (¡¬t_po =ð +¡d +:: +¡ršg +:: +Åos +) ? 0 : start_pos + 1; + +104  +lšes_aá” + > 0 && + +105 ( +pos + = +‹xt +. + `fšd +('\n',…os)è!ð +¡d +:: +¡ršg +:: +Åos +) { + +106 +pos +++; + +107 +lšes_aá” +--; + +109  +‹xt +. + `sub¡r +( +¡¬t_pos +, ( +pos + =ð +¡d +:: +¡ršg +:: +Åos +) ? + +110 +¡d +:: +¡ršg +:: +Åos + : +pos + - +¡¬t_pos +); + +111 + } +} + +113 +boÞ + + $g‘TaskName +( +¡d +:: +¡ršg + & +Çme +) { + +114 +¡d +:: +¡ršg + +cmdlše +; + +116 ià(! + `R—dFžeToSŒšg +("/´oc/£lf/cmdlše", & +cmdlše +)) { + +117 + `GTEST_LOG_ +( +INFO +) << "Failedo„ead /proc/self/cmdline"; + +118  +çl£ +; + +121 +Çme + = +cmdlše +. + `c_¡r +(); + +122  +Œue +; + +123 + } +} + +126  + #STATE_INIT + 0 + + ) + +127  + #STATE_CHILD_READY + 1 + + ) + +128  + #STATE_PARENT_READY + 2 + + ) + +130  + s¡©e_sync + { + +131 +±h»ad_mu‹x_t + + mmu‹x +; + +132 +±h»ad_cÚd_t + + mcÚd™iÚ +; + +133  + m¡©e +; + +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 +±h»ad_mu‹x©Œ_t + +m©Œ +; + +146 + `±h»ad_mu‹x©Œ_š™ +(& +m©Œ +); + +147 + `±h»ad_mu‹x©Œ_£sh¬ed +(& +m©Œ +, +PTHREAD_PROCESS_SHARED +); + +148 + `±h»ad_mu‹x_š™ +(& +ssync +-> +mu‹x +, & +m©Œ +); + +150 +±h»ad_cÚd©Œ_t + +ÿ‰r +; + +151 + `±h»ad_cÚd©Œ_š™ +(& +ÿ‰r +); + +152 + `±h»ad_cÚd©Œ_£sh¬ed +(& +ÿ‰r +, +PTHREAD_PROCESS_SHARED +); + +153 + `±h»ad_cÚd_š™ +(& +ssync +-> +cÚd™iÚ +, & +ÿ‰r +); + +155 +ssync +-> +¡©e + = +STATE_INIT +; + +156  +ssync +; + +157 + } +} + +159  + $de¡roy_¡©e_sync_obj +( +¡©e_sync + * +ssync +) { + +160 + `±h»ad_cÚd_de¡roy +(& +ssync +-> +cÚd™iÚ +); + +161 + `±h»ad_mu‹x_de¡roy +(& +ssync +-> +mu‹x +); + +162 + `munm­ +( +ssync +, ( +¡©e_sync +)); + +163 + } +} + +165  + $sigÇl_¡©e +( +¡©e_sync + * +ssync +,  +¡©e +) { + +166 + `±h»ad_mu‹x_lock +(& +ssync +-> +mu‹x +); + +167 +ssync +-> +¡©e + = state; + +168 + `±h»ad_cÚd_sigÇl +(& +ssync +-> +cÚd™iÚ +); + +169 + `±h»ad_mu‹x_uÆock +(& +ssync +-> +mu‹x +); + +170 + } +} + +172  + $wa™_fÜ_¡©e +( +¡©e_sync + * +ssync +,  +¡©e +) { + +173 + `±h»ad_mu‹x_lock +(& +ssync +-> +mu‹x +); + +174  +ssync +-> +¡©e + != state) { + +175 + `±h»ad_cÚd_wa™ +(& +ssync +-> +cÚd™iÚ +, &ssync-> +mu‹x +); + +177 + `±h»ad_mu‹x_uÆock +(& +ssync +-> +mu‹x +); + +178 + } +} + +181  + ssh¬ed_d©a + { + +182 +size_t + + m®loÿ‹d +; + +183 +boÞ + + mfšished +; + +184 +size_t + + mtÙ®_size +; + +185 +size_t + + m¡•_size +; + +186 +size_t + + m¡•_d–ay +; + +187  + moomadj +; + +190 vÞ©ž* + gg±r +; + +191  + $add_´essu» +( +sh¬ed_d©a + * +d©a +) { + +192 vÞ©ž* +±r +; + +193 +size_t + +®loÿ‹d_size + = 0; + +195 +d©a +-> +fšished + = +çl£ +; + +196  +®loÿ‹d_size + < +d©a +-> +tÙ®_size +) { + +197 +±r + = + `mm­ +( +NULL +, +d©a +-> +¡•_size +, +PROT_READ + | +PROT_WRITE +, + +198 +MAP_ANONYMOUS + | +MAP_PRIVATE +, 0, 0); + +199 ià( +±r + !ð +MAP_FAILED +) { + +201 +g±r + = +±r +; + +203 + `mem£t +((*) +±r +, ()( +®loÿ‹d_size + + 1), +d©a +-> +¡•_size +); + +204 +®loÿ‹d_size + +ð +d©a +-> +¡•_size +; + +205 +d©a +-> +®loÿ‹d + = +®loÿ‹d_size +; + +207 + `u¦“p +( +d©a +-> +¡•_d–ay +); + +209 +d©a +-> +fšished + = ( +®loÿ‹d_size + >ðd©a-> +tÙ®_size +); + +210 + } +} + +213  + $runMemSŒessTe¡ +() { + +214  +sh¬ed_d©a + * +d©a +; + +215  +¡©e_sync + * +ssync +; + +216  +sock +; + +217 +pid_t + +pid +; + +218 +uid_t + +uid + = + `g‘uid +(); + +221 ià(! + `acûss +( +INKERNEL_MINFREE_PATH +, +W_OK +)) { + +222 + `GTEST_LOG_ +( +INFO +) << "Must‚ot have kernel†owmemorykiller driver," + +227 + `ASSERT_FALSE +(( +sock + = + `lmkd_cÚÃù +()) < 0) + +228 << "FažedØcÚÃùØlmkd…roûss,ƒ¼=" << + `¡»¼Ü +( +”ºo +); + +231 +d©a + = ( +sh¬ed_d©a +*) + `mm­ +( +NULL +, (shared_data), + +232 +PROT_READ + | +PROT_WRITE +, +MAP_ANONYMOUS + | +MAP_SHARED +, -1, 0); + +233 + `ASSERT_FALSE +( +d©a + =ð +MAP_FAILED +) << "Memory‡llocation failure"; + +234 +d©a +-> +tÙ®_size + = ( +size_t +)-1; + +235 +d©a +-> +¡•_size + = +ALLOC_STEP +; + +236 +d©a +-> +¡•_d–ay + = +ALLOC_DELAY +; + +239 + `ASSERT_FALSE +(( +ssync + = + `š™_¡©e_sync_obj +()è=ð +NULL +) + +243 +d©a +-> +oomadj + = +OOM_ADJ_MAX +; + +244  +d©a +-> +oomadj + >ð +OOM_ADJ_MIN +) { + +245 + `ASSERT_FALSE +(( +pid + = + `fÜk +()) < 0) + +246 << "FažedØ¥awÀ¨chžd…roûss,ƒ¼=" << + `¡»¼Ü +( +”ºo +); + +247 ià( +pid + != 0) { + +249  +lmk_´oýrio + +·¿ms +; + +251 + `wa™_fÜ_¡©e +( +ssync +, +STATE_CHILD_READY +); + +252 +·¿ms +. +pid + =…id; + +253 +·¿ms +. +uid + = uid; + +254 +·¿ms +. +oomadj + = +d©a +->oomadj; + +255 +·¿ms +. +±y³ + = +PROC_TYPE_APP +; + +256 + `ASSERT_FALSE +( + `lmkd_»gi¡”_´oc +( +sock +, & +·¿ms +) < 0) + +257 << "FažedØcommuniÿ‹ w™h†mkd,ƒ¼=" << + `¡»¼Ü +( +”ºo +); + +259 + `sigÇl_¡©e +( +ssync +, +STATE_PARENT_READY +); + +260 + `wa™pid +( +pid +, +NULL +, 0); + +261 ià( +d©a +-> +fšished +) { + +262 + `GTEST_LOG_ +( +INFO +è<< "Chžd [pid=" << +pid + << "]‡llocated " + +263 << +d©a +-> +®loÿ‹d + / +ONE_MB + << "MB"; + +265 + `GTEST_LOG_ +( +INFO +è<< "Chžd [pid=" << +pid + << "]‡llocated " + +266 << +d©a +-> +®loÿ‹d + / +ONE_MB + + +269 +d©a +-> +oomadj + -ð +OOM_ADJ_STEP +; + +272 +pid + = + `g‘pid +(); + +273 + `GTEST_LOG_ +( +INFO +è<< "Chžd [pid=" << +pid + + +275 << +d©a +-> +oomadj +; + +276 +d©a +-> +®loÿ‹d + = 0; + +277 +d©a +-> +fšished + = +çl£ +; + +278 ià( + `´Ý”ty_g‘_boÞ +("ro.cÚfig.low_¿m", +çl£ +)) { + +279 + `ASSERT_FALSE +( + `ü—‹_memcg +( +uid +, +pid +) != 0) + +280 << "Chžd [pid=" << +pid + << "] failedo create‡ cgroup"; + +282 + `sigÇl_¡©e +( +ssync +, +STATE_CHILD_READY +); + +283 + `wa™_fÜ_¡©e +( +ssync +, +STATE_PARENT_READY +); + +284 + `add_´essu» +( +d©a +); + +286 + `FAIL +(è<< "Chžd [pid=" << +pid + << "] was‚ot killed"; + +290 + `de¡roy_¡©e_sync_obj +( +ssync +); + +291 + `munm­ +( +d©a +, ( +sh¬ed_d©a +)); + +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à( + `g‘’v +( +LMKDTEST_RESPAWN_FLAG +è!ð +NULL +) { + +305 + `runMemSŒessTe¡ +(); + +311 +¡d +:: +¡ršg + +m¬k” + = + `SŒšgPrštf +( + +312 "LMKDe¡ s¹ %lu\n", +¡©ic_ÿ¡ +<>( + `time +( +nuαr +))); + +313 + `ASSERT_TRUE +( + `wr™eKmsg +( +m¬k” +)); + +316 +¡d +:: +¡ršg + +sk_Çme +; + +317 + `ASSERT_TRUE +( + `g‘TaskName +( +sk_Çme +)); + +319 +¡d +:: +¡ršg + +‹¡_ouut +; + +320 ià( + `g‘uid +(è!ð +¡©ic_ÿ¡ +<>( +AID_ROOT +)) { + +322 +¡d +:: +¡ršg + +commªd + = + `SŒšgPrštf +( + +323 "%sñrusu„oÙ % 2>&1", +LMKDTEST_RESPAWN_FLAG +, + +324 +sk_Çme +. + `c_¡r +()); + +325 +¡d +:: +¡ršg + +‹¡_ouut + = + `»adCommªd +( +commªd +); + +326 + `GTEST_LOG_ +( +INFO +è<< +‹¡_ouut +; + +329 + `runMemSŒessTe¡ +(); + +334 +¡d +:: +¡ršg + +logÿt_out + = + `»adLogÿt +( +m¬k” +); + +337 +¡d +:: +¡ršg¡»am + +kžl_logs +; + +338  +h™_couÁ + = 0; + +339 +size_t + +pos + = 0; + +340 +m¬k” + = + `SŒšgPrštf +( +LMKD_KILL_MARKER_TEMPLATE +, +sk_Çme +. + `c_¡r +()); + +342  +Œue +) { + +343 ià(( +pos + = +logÿt_out +. + `fšd +( +m¬k” +,…os)è!ð +¡d +:: +¡ršg +:: +Åos +) { + +344 +kžl_logs + << + `g‘TextAround +( +logÿt_out +, +pos +, 0, 1); + +345 +pos + +ð +m¬k” +. + `Ëngth +(); + +346 +h™_couÁ +++; + +351 + `GTEST_LOG_ +( +INFO +è<< "====Logged kžls====" << +¡d +:: +’dl + + +352 << +kžl_logs +. + `¡r +(); + +353 + `EXPECT_TRUE +( +h™_couÁ + =ð +STEP_COUNT +) << "Number of kills " << hit_count + +355 << +STEP_COUNT +; + +358 +pos + = +logÿt_out +. + `fšd +( +OOM_MARKER +); + +359 +boÞ + +oom_d‘eùed + = ( +pos + !ð +¡d +:: +¡ršg +:: +Åos +); + +360 +boÞ + +oom_kžl_d‘eùed + = ( +oom_d‘eùed + && + +361 +logÿt_out +. + `fšd +( +OOM_KILL_MARKER +, +pos +è!ð +¡d +:: +¡ršg +:: +Åos +); + +363 + `EXPECT_FALSE +( +oom_kžl_d‘eùed +) << "OOM kill is detected!"; + +364 ià( +oom_d‘eùed + || +oom_kžl_d‘eùed +) { + +366 +pos + = 0; + +367 ( +pos + = +logÿt_out +. + `fšd +( +OOM_MARKER +,…os)è!ð +¡d +:: +¡ršg +:: +Åos +) { + +368 + `GTEST_LOG_ +( +INFO +è<< "====Log ¬ound OOM====" << +¡d +:: +’dl + + +369 << + `g‘TextAround +( +logÿt_out +, +pos +, + +370 +MIN_LOG_SIZE + / 2, MIN_LOG_SIZE / 2); + +371 +pos + +ð + `¡¾’ +( +OOM_MARKER +); + +376 + `GTEST_LOG_ +( +INFO +è<< "====Com¶‘logÿˆouut====" << +¡d +:: +’dl + + +377 << +logÿt_out +; + +378 + } +} + + @tests/lmkd_tests.cpp + +16  + ~ + +17  + ~ + +18  + ~ + +19  + ~<¡ršg +> + +21  + ~<ªdroid-ba£/fže.h +> + +22  + ~<ªdroid-ba£/loggšg.h +> + +23  + ~<ªdroid-ba£/¡ršg´štf.h +> + +24  + ~ + +25  + ~ + +26  + ~ + +27  + ~ + +28  + ~<´iv©e/ªdroid_fžesy¡em_cÚfig.h +> + +29  + ~<¡dlib.h +> + +31 +usšg + +Çme¥aû + + gªdroid +:: +ba£ +; + +33  + #INKERNEL_MINFREE_PATH + "/sys/moduË/lowmemÜykžËr/·¿m‘”s/mšä“" + + ) + +35  + #LMKD_LOGCAT_MARKER + "lowmemÜykžËr" + + ) + +36  + #LMKD_KILL_TEMPLATE + "KžÈ\'[^']*\' \\\(%d\\)" + + ) + +37  + #LMKD_REAP_TEMPLATE + "Proûs %d wa »­ed" + + ) + +38  + #LMKD_REAP_FAIL_TEMPLATE + "´oûss_m»Ëa£ %d fažed" + + ) + +40  + #LMKD_KILL_LINE_START + +LMKD_LOGCAT_MARKER + ": Kžl" + + ) + +41  + #LMKD_KILLED_LINE_START + +LMKD_LOGCAT_MARKER + ": Proûs gÙ kžËd" + + ) + +42  + #LMKD_REAP_LINE_START + +LMKD_LOGCAT_MARKER + ": Proûss" + + ) + +43  + #LMKD_REAP_TIME_TEMPLATE + +LMKD_LOGCAT_MARKER + ": Proûs %d wa »­ed iÀ%ldms" + + ) + +44  + #LMKD_REAP_MRELESE_ERR_MARKER + ":…roûss_m»Ëa£" + + ) + +45  + #LMKD_REAP_NO_PROCESS_TEMPLATE + ":…roûss_m»Ëa£ %d fažed: NØsuch…roûss" + + ) + +47  + #ONE_MB + (1 << 20) + + ) + +50  + #OOM_ADJ_MAX + 1000 + + ) + +51  + #ALLOC_STEP + (5 * +ONE_MB +) + + ) + +52  + #ALLOC_DELAY + 200 + + ) + +55 vÞ©ž* + gg±r +; + +57 þas  + cLmkdTe¡ + : +public + :: +‹¡šg +:: +Te¡ + { + +58 +public +: + +59 +vœtu® +  + $S‘Up +() { + +61 ià( + `g‘uid +(è!ð +¡©ic_ÿ¡ +<>( +AID_ROOT +)) { + +62 + `GTEST_SKIP +() << "Must be„oot, skippingest"; + +65 ià(! + `__ªdroid_log_is_debuggabË +()) { + +66 + `GTEST_SKIP +() << "Must be userdebug build, skippingest"; + +69 ià(! + `acûss +( +INKERNEL_MINFREE_PATH +, +W_OK +)) { + +70 + `GTEST_SKIP +() << "Must‚ot have kernel†owmemorykiller driver," + +75 ià(! + `´Ý”ty_g‘_boÞ +("ro.lmk.debug", +Œue +)) { + +76 + `GTEST_SKIP +() << "Can't„un with„o.lmk.debug…roperty seto 'false', skippingest"; + +80 + `ASSERT_FALSE +(( +sock + = + `lmkd_cÚÃù +()) < 0) + +81 << "FažedØcÚÃùØlmkd…roûss,ƒ¼=" << + `¡»¼Ü +( +”ºo +); + +84 ià(! + `´Ý”ty_g‘_boÞ +("ro.lmk.debug", +çl£ +)) { + +85 + `EXPECT_EQ +( + `´Ý”ty_£t +("ro.lmk.debug", "true"), 0); + +86 + `EXPECT_EQ +( + `lmkd_upd©e_´Ýs +( +sock +), +UPDATE_PROPS_SUCCESS +) + +90 +uid + = + `g‘uid +(); + +93 +vœtu® +  + $T—rDown +() { + +95 + `þo£ +( +sock +); + +96 + } +} + +98  + $S‘upChžd +( +pid_t + +pid +,  +oomadj +) { + +99  +lmk_´oýrio + +·¿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 << "FažedØcommuniÿ‹ w™h†mkd,ƒ¼=" << + `¡»¼Ü +( +”ºo +); + +107 + `GTEST_LOG_ +( +INFO +è<< "T¬g‘…roûs " << +pid + << "†aunched"; + +108 ià( + `´Ý”ty_g‘_boÞ +("ro.cÚfig.low_¿m", +çl£ +)) { + +109 + `ASSERT_FALSE +( + `ü—‹_memcg +( +uid +, +pid +) != 0) + +110 << "T¬g‘…roûs " << +pid + << " failedo create‡ cgroup"; + +112 + } +} + +114  + $S’dProcsPrioReque¡ +( +lmk_´ocs_´io + +´ocs_´io_»que¡ +,  +´ocs_couÁ +) { + +115 + `ASSERT_FALSE +( + `lmkd_»gi¡”_´ocs +( +sock +, & +´ocs_´io_»que¡ +, +´ocs_couÁ +) < 0) + +116 << "FažedØcommuniÿ‹ w™h†mkd,ƒ¼=" << + `¡»¼Ü +( +”ºo +); + +117 + } +} + +119  + $S’dG‘KžlCouÁReque¡ +( +lmk_g‘kžlút +* +g‘_kžl_út_»que¡ +) { + +120 + `ASSERT_GE +( + `lmkd_g‘_kžl_couÁ +( +sock +, +g‘_kžl_út_»que¡ +), 0) + +122 + } +} + +124  + g¡d +:: +¡ršg + + $ExecCommªd +(cÚ¡ +¡d +:: +¡ršg +& +commªd +) { + +125 +FILE +* +å + = + `pÝ’ +( +commªd +. + `c_¡r +(), "r"); + +126 +¡d +:: +¡ršg + +cÚ‹Á +; + +127 + `R—dFdToSŒšg +( + `fž’o +( +å +), & +cÚ‹Á +); + +128 + `pþo£ +( +å +); + +129  +cÚ‹Á +; + +130 + } +} + +132  + g¡d +:: +¡ršg + + $R—dLogÿt +(cÚ¡ +¡d +:: +¡ršg +& +g +, cÚ¡ std::¡ršg& +»gex +) { + +133 +¡d +:: +¡ršg + +cmd + = "logcat -d -b‡ll"; + +134 ià(! +g +. + `em±y +()) { + +135 +cmd + +ð" - \"" + +g + + "\""; + +137 ià(! +»gex +. + `em±y +()) { + +138 +cmd + +ð" -\"" + +»gex + + "\""; + +140  + `ExecCommªd +( +cmd +); + +141 + } +} + +143  +size_t + + $CÚsumeMemÜy +( +size_t + +tÙ®_size +, size_ˆ +¡•_size +, size_ˆ +¡•_d–ay +) { + +144 vÞ©ž* +±r +; + +145 +size_t + +®loÿ‹d_size + = 0; + +147  +®loÿ‹d_size + < +tÙ®_size +) { + +148 +±r + = + `mm­ +( +NULL +, +¡•_size +, +PROT_READ + | +PROT_WRITE +, +MAP_ANONYMOUS + | +MAP_PRIVATE +, 0, 0); + +149 ià( +±r + !ð +MAP_FAILED +) { + +151 +g±r + = +±r +; + +153 + `mem£t +((*) +±r +, ()( +®loÿ‹d_size + + 1), +¡•_size +); + +154 +®loÿ‹d_size + +ð +¡•_size +; + +156 + `u¦“p +( +¡•_d–ay +); + +158  +®loÿ‹d_size +; + +159 + } +} + +161  +boÞ + + $P¬£ProcSize +(cÚ¡ +¡d +:: +¡ršg +& +lše +, & +rss +, & +sw­ +) { + +162 +size_t + +pos + = +lše +. + `fšd +("to free"); + +163 ià( +pos + =ð +¡d +:: +¡ršg +:: +Åos +) { + +164  +çl£ +; + +166  + `ssÿnf +( +lše +. + `c_¡r +(è+ +pos +, "tØä“ %ldkB„ss, %ldkB sw­", & +rss +, & +sw­ +) == 2; + +167 + } +} + +169  +boÞ + + $P¬£R—pTime +(cÚ¡ +¡d +:: +¡ršg +& +lše +, +pid_t + +pid +, & +»­_time +) { + +170  +»­_pid +; + +171  + `ssÿnf +( +lše +. + `c_¡r +(), +LMKD_REAP_TIME_TEMPLATE +, & +»­_pid +, & +»­_time +) == 2 && + +172 +»­_pid + =ð +pid +; + +173 + } +} + +175  +boÞ + + $P¬£R—pNoProûss +(cÚ¡ +¡d +:: +¡ršg +& +lše +, +pid_t + +pid +) { + +176  +»­_pid +; + +177  + `ssÿnf +( +lše +. + `c_¡r +(), +LMKD_REAP_NO_PROCESS_TEMPLATE +, & +»­_pid +) == 1 && + +178 +»­_pid + =ð +pid +; + +179 + } +} + +181 +uid_t + + $g‘LmkdTe¡Uid +(ècÚ¡ {  +uid +; + } +} + +183 + g´iv©e +: + +184  +sock +; + +185 +uid_t + + guid +; + +188 + $TEST_F +( +LmkdTe¡ +, +T¬g‘R—pšg +) { + +190 ià( + `sysÿÎ +( +__NR_´oûss_m»Ëa£ +, -1, 0è&& +”ºo + =ð +ENOSYS +) { + +191 + `GTEST_SKIP +() << "Must support…rocess_mrelease syscall, skippingest"; + +195 +pid_t + +pid + = + `fÜk +(); + +196 + `ASSERT_FALSE +( +pid + < 0è<< "FažedØ¥awÀ¨chžd…roûss,ƒ¼=" << + `¡»¼Ü +( +”ºo +); + +197 ià( +pid + != 0) { + +199 + `wa™pid +( +pid +, +NULL +, 0); + +202 + `S‘upChžd +( + `g‘pid +(), +OOM_ADJ_MAX +); + +204 + `CÚsumeMemÜy +(( +size_t +)-1, +ALLOC_STEP +, +ALLOC_DELAY +); + +206 + `FAIL +(è<< "T¬g‘…roûs " << +pid + << " was‚ot killed"; + +210 + `u¦“p +(200000); + +212 +¡d +:: +¡ršg + +»gex + = + `SŒšgPrštf +("((" +LMKD_KILL_TEMPLATE + ")|(" +LMKD_REAP_TEMPLATE + + +213 ")|(" +LMKD_REAP_FAIL_TEMPLATE + "))", + +214 +pid +,…id,…id); + +215 +¡d +:: +¡ršg + +logÿt_out + = + `R—dLogÿt +( +LMKD_LOGCAT_MARKER + ":I", +»gex +); + +218 +size_t + +lše_¡¬t + = +logÿt_out +. + `fšd +( +LMKD_KILL_LINE_START +); + +219 + `ASSERT_TRUE +( +lše_¡¬t + !ð +¡d +:: +¡ršg +:: +Åos +) << "Kill„eport is‚ot found"; + +220 +size_t + +lše_’d + = +logÿt_out +. + `fšd +('\n', +lše_¡¬t +); + +221 +¡d +:: +¡ršg + +lše + = +logÿt_out +. + `sub¡r +( + +222 +lše_¡¬t +, +lše_’d + =ð +¡d +:: +¡ršg +:: +Åos + ? std::string::npos :†ine_end -†ine_start); + +223  +rss +, +sw­ +; + +224 + `ASSERT_TRUE +( + `P¬£ProcSize +( +lše +, +rss +, +sw­ +)) << "Kill„eport format is invalid"; + +226 +lše_¡¬t + = 0; + +227 +»Œy +: + +229 +lše_¡¬t + = +logÿt_out +. + `fšd +( +LMKD_REAP_LINE_START +,†ine_start); + +230 ià( +lše_¡¬t + =ð +¡d +:: +¡ršg +:: +Åos +) { + +232 +lše_¡¬t + = +logÿt_out +. + `fšd +( +LMKD_REAP_MRELESE_ERR_MARKER +); + +234 + `ASSERT_TRUE +( +lše_¡¬t + !ð +¡d +:: +¡ršg +:: +Åos +) << "Reapingime„eport is‚ot found"; + +236 +lše_’d + = +logÿt_out +. + `fšd +('\n', +lše_¡¬t +); + +237 +lše + = +logÿt_out +. + `sub¡r +( +lše_¡¬t +, +lše_’d + =ð +¡d +:: +¡ršg +:: +Åos + ? std::string::npos + +238 : +lše_’d + - +lše_¡¬t +); + +239 + `ASSERT_TRUE +( + `P¬£R—pNoProûss +( +lše +, +pid +)) << "Failedo„eaphearget " <<…id; + +242 +lše_’d + = +logÿt_out +. + `fšd +('\n', +lše_¡¬t +); + +243 +lše + = +logÿt_out +. + `sub¡r +( + +244 +lše_¡¬t +, +lše_’d + =ð +¡d +:: +¡ršg +:: +Åos + ? std::string::npos :†ine_end -†ine_start); + +245 ià( +lše +. + `fšd +( +LMKD_KILLED_LINE_START +è!ð +¡d +:: +¡ršg +:: +Åos +) { + +247 +lše_¡¬t + = +lše_’d +; + +248  +»Œy +; + +250  +»­_time +; + +251 + `ASSERT_TRUE +( + `P¬£R—pTime +( +lše +, +pid +, +»­_time +) &&„eap_time >= 0) + +255 ià( +»­_time + > 0) { + +256  +»þaim_¥“d + = (() +rss + + +sw­ +è/ +»­_time +; + +257 + `GTEST_LOG_ +( +INFO +è<< "Reþaim s³ed " << +»þaim_¥“d + << "kB/m (" << +rss + << "kB„ss + " + +258 << +sw­ + << "kB sw­è/ " << +»­_time + << "ms"; + +260 + } +} + +266 + $TEST_F +( +LmkdTe¡ +, +b©ch_´ocs_oom_scÜe_adj +) { + +267  + sChždProûssInfo + { + +268 +pid_t + +pid +; + +269  +Üigš®_oom_scÜe +; + +270  +»q_Ãw_oom_scÜe +; + +273  +ChždProûssInfo + +chžd»n_šfo +[ +PROCS_PRIO_MAX_RECORD_COUNT +]; + +275  +i + = 0; i < +PROCS_PRIO_MAX_RECORD_COUNT +; i++) { + +276 +chžd»n_šfo +[ +i +]. +pid + = + `fÜk +(); + +277 ià( +chžd»n_šfo +[ +i +]. +pid + < 0) { + +278 cÚ¡‡utØ +chžd + : +chžd»n_šfo +) + +279 ià( +chžd +. +pid + >ð0è + `kžl +(chžd.pid, +SIGKILL +); + +280 + `FAIL +(è<< "Fažed fÜkšg…roûs š i‹¿tiÚ=" << +i +; + +281 } ià( +chžd»n_šfo +[ +i +]. +pid + == 0) { + +286  +Œue +) { + +287 + `¦“p +(20); + +292  +lmk_´ocs_´io + +´ocs_´io_»que¡ +; + +293 cÚ¡ +uid_t + +·»Á_uid + = + `g‘LmkdTe¡Uid +(); + +295  +i + = 0; i < +PROCS_PRIO_MAX_RECORD_COUNT +; i++) { + +296 ià( +chžd»n_šfo +[ +i +]. +pid + < 0) ; + +298 cÚ¡ +¡d +:: +¡ršg + +´oûss_oom_·th + = + +299 "´oc/" + +¡d +:: + `to_¡ršg +( +chžd»n_šfo +[ +i +]. +pid +) + "/oom_score_adj"; + +300 +¡d +:: +¡ršg + +cu¼_oom_scÜe +; + +301 ià(! + `R—dFžeToSŒšg +( +´oûss_oom_·th +, & +cu¼_oom_scÜe +è|| cu¼_oom_scÜe. + `em±y +()) { + +302 cÚ¡‡utØ +chžd + : +chžd»n_šfo +) + +303 ià( +chžd +. +pid + >ð0è + `kžl +(chžd.pid, +SIGKILL +); + +304 + `FAIL +() << "Failed„eading original oom score for child…rocess: " + +305 << +chžd»n_šfo +[ +i +]. +pid +; + +308 +chžd»n_šfo +[ +i +]. +Üigš®_oom_scÜe + = + `©oi +( +cu¼_oom_scÜe +. + `c_¡r +()); + +309 +chžd»n_šfo +[ +i +]. +»q_Ãw_oom_scÜe + = + +310 (() +chžd»n_šfo +[ +i +]. +Üigš®_oom_scÜe + != i) ? i : (i + 10); + +311 +´ocs_´io_»que¡ +. +´ocs +[ +i +] = {. +pid + = +chžd»n_šfo +[i].pid, + +312 . +uid + = +·»Á_uid +, + +313 . +oomadj + = +chžd»n_šfo +[ +i +]. +»q_Ãw_oom_scÜe +, + +314 . +±y³ + = +´oc_ty³ +:: +PROC_TYPE_APP +}; + +322 + `S’dProcsPrioReque¡ +( +´ocs_´io_»que¡ +, +PROCS_PRIO_MAX_RECORD_COUNT +); + +323  +lmk_g‘kžlút + +kžl_út_»q + = {. +mš_oomadj + = -1000, . +max_oomadj + = 1000}; + +324 + `S’dG‘KžlCouÁReque¡ +(& +kžl_út_»q +); + +326 autØ +chžd_šfo + : +chžd»n_šfo +) { + +327 ià( +chžd_šfo +. +pid + < 0) ; + +328 cÚ¡ +¡d +:: +¡ršg + +´oûss_oom_·th + = + +329 "´oc/" + +¡d +:: + `to_¡ršg +( +chžd_šfo +. +pid +) + "/oom_score_adj"; + +330 +¡d +:: +¡ršg + +cu¼_oom_scÜe +; + +331 ià(! + `R—dFžeToSŒšg +( +´oûss_oom_·th +, & +cu¼_oom_scÜe +è|| cu¼_oom_scÜe. + `em±y +()) { + +332 cÚ¡‡utØ +chžd + : +chžd»n_šfo +) + +333 ià( +chžd +. +pid + >ð0è + `kžl +(chžd.pid, +SIGKILL +); + +334 + `FAIL +(è<< "Fažed„—dšg‚ew oom scÜfÜ chžd…roûss: " << +chžd_šfo +. +pid +; + +336 + `kžl +( +chžd_šfo +. +pid +, +SIGKILL +); + +338 cÚ¡  +aùu®_Ãw_oom_scÜe + = + `©oi +( +cu¼_oom_scÜe +. + `c_¡r +()); + +339 + `ASSERT_EQ +( +chžd_šfo +. +»q_Ãw_oom_scÜe +, +aùu®_Ãw_oom_scÜe +) + +340 << "Chžd w™h…id=" << +chžd_šfo +. +pid + << " didn't update its OOM score"; + +342 + } +} + +344  + $maš +( +¬gc +, ** +¬gv +) { + +345 :: +‹¡šg +:: + `In™GoogËTe¡ +(& +¬gc +, +¬gv +); + +346 + `In™Loggšg +( +¬gv +, +Std”rLogg” +); + +347  + `RUN_ALL_TESTS +(); + +348 + } +} + + @watchdog.cpp + +17  + #LOG_TAG + "lowmemÜykžËr" + + ) + +19  + ~<”ºo.h +> + +20  + ~ + +21  + ~<¡ršg.h +> + +23  + ~<´oûssgroup/´oûssgroup.h +> + +25  + ~"w©chdog.h +" + +27 * + $w©chdog_maš +(* +·¿m +) { + +28 +W©chdog + * +w©chdog + = +¡©ic_ÿ¡ +( +·¿m +); + +29 +sig£t_t + +sig£t +; + +30  +signum +; + +33 ià(! + `S‘TaskProfžes +( + `g‘tid +(), {"CPUSET_SP_FOREGROUND"}, +Œue +)) { + +34 + `ALOGE +("Failedo‡ssign cpusetohe watchdoghread"); + +37 ià(! +w©chdog +-> + `ü—‹_tim” +( +sig£t +)) { + +38 + `ALOGE +("Watchdogimer creation failed!"); + +39  +NULL +; + +42  +Œue +) { + +43 ià( + `sigwa™ +(& +sig£t +, & +signum +) == -1) { + +44 + `ALOGE +("sigwa™ fažed: %s", + `¡»¼Ü +( +”ºo +)); + +47 +w©chdog +-> + `b™e +(); + +50  +NULL +; + +51 + } +} + +53 +boÞ + + gW©chdog +:: + $š™ +() { + +54 +±h»ad_t + +th»ad +; + +56 ià( + `±h»ad_ü—‹ +(& +th»ad +, +NULL +, +w©chdog_maš +, +this +)) { + +57 + `ALOGE +("±h»ad_ü—‹ fažed: %s", + `¡»¼Ü +( +”ºo +)); + +58  +çl£ +; + +60 ià( + `±h»ad_£Šame_Å +( +th»ad +, "lmkd_watchdog")) { + +61 + `ALOGW +("±h»ad_£Šame_Å fažed: %s", + `¡»¼Ü +( +”ºo +)); + +64  +Œue +; + +65 + } +} + +67 +boÞ + + gW©chdog +:: + $¡¬t +() { + +69  +™im”¥ec + +Ãw_tim” +; + +71 ià(! +tim”_ü—‹d_ +) { + +72  +çl£ +; + +75 +Ãw_tim” +. +™_v®ue +. +tv_£c + = +timeout_ +; + +76 +Ãw_tim” +. +™_v®ue +. +tv_n£c + = 0; + +77 +Ãw_tim” +. +™_š‹rv® +. +tv_£c + = +timeout_ +; + +78 +Ãw_tim” +. +™_š‹rv® +. +tv_n£c + = 0; + +80 ià( + `tim”_£‰ime +( +tim”_ +, 0, & +Ãw_tim” +, +NULL +)) { + +81 + `ALOGE +("tim”_£‰imçžed: %s", + `¡»¼Ü +( +”ºo +)); + +82  +çl£ +; + +85  +Œue +; + +86 + } +} + +88 +boÞ + + gW©chdog +:: + $¡Ý +() { + +89  +™im”¥ec + +Ãw_tim” + = {}; + +91 ià(! +tim”_ü—‹d_ +) { + +92  +çl£ +; + +95 ià( + `tim”_£‰ime +( +tim”_ +, 0, & +Ãw_tim” +, +NULL +)) { + +96 + `ALOGE +("tim”_£‰imçžed: %s", + `¡»¼Ü +( +”ºo +)); + +97  +çl£ +; + +100  +Œue +; + +101 + } +} + +103 +boÞ + + gW©chdog +:: + $ü—‹_tim” +( +sig£t_t + & +sig£t +) { + +104  +sigev’t + +£v’t +; + +106 + `sigem±y£t +(& +sig£t +); + +107 + `sigadd£t +(& +sig£t +, +SIGALRM +); + +108 ià( + `sig´ocmask +( +SIG_BLOCK +, & +sig£t +, +NULL +)) { + +109 + `ALOGE +("sig´ocmask fažed: %s", + `¡»¼Ü +( +”ºo +)); + +110  +çl£ +; + +113 +£v’t +. +sigev_nÙify + = +SIGEV_THREAD_ID +; + +114 +£v’t +. +sigev_nÙify_th»ad_id + = + `g‘tid +(); + +115 +£v’t +. +sigev_signo + = +SIGALRM +; + +116 ià( + `tim”_ü—‹ +( +CLOCK_MONOTONIC +, & +£v’t +, & +tim”_ +)) { + +117 + `ALOGE +("tim”_ü—‹ fažed: %s", + `¡»¼Ü +( +”ºo +)); + +118  +çl£ +; + +121 +tim”_ü—‹d_ + = +Œue +; + +122  +Œue +; + +123 + } +} + + @watchdog.h + +17 #´agm¨ +Úû + + +19  + ~<©omic +> + +20  + ~ + +21  + ~ + +23 þas  + cW©chdog + { + +24 + m´iv©e +: + +25  +timeout_ +; + +26 +tim”_t + + mtim”_ +; + +27 + m¡d +:: +©omic +< +boÞ +> +tim”_ü—‹d_ +; + +28 (* + mÿÎback_ +)(); + +29 + mpublic +: + +30 + $W©chdog +( +timeout +, (* +ÿÎback +)()) : + +31 + `timeout_ +( +timeout +), + `tim”_ü—‹d_ +( +çl£ +), + $ÿÎback_ +( +ÿÎback +) {} + +33 +boÞ + + `š™ +(); + +34 +boÞ + + `¡¬t +(); + +35 +boÞ + + `¡Ý +(); + +37 +boÞ + + `ü—‹_tim” +( +sig£t_t + & +sig£t +); + +38  + $b™e +(è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 0000000000000000000000000000000000000000..412c10481703b5c70503e4088d4ea3726453eff2 GIT binary patch literal 217176 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 alv4h5+*Hd)Sr3TxYyt0`!+@jr&i?_L&#@f< literal 0 HcmV?d00001