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