@@ -16,7 +16,7 @@ typedef struct ManagedOOMReply {
1616 ManagedOOMMode mode ;
1717 char * path ;
1818 char * property ;
19- unsigned limit ;
19+ uint32_t limit ;
2020} ManagedOOMReply ;
2121
2222static void managed_oom_reply_destroy (ManagedOOMReply * reply ) {
@@ -53,10 +53,10 @@ static int process_managed_oom_reply(
5353 assert (m );
5454
5555 static const JsonDispatch dispatch_table [] = {
56- { "mode" , JSON_VARIANT_STRING , managed_oom_mode , offsetof(ManagedOOMReply , mode ), JSON_MANDATORY },
57- { "path" , JSON_VARIANT_STRING , json_dispatch_string , offsetof(ManagedOOMReply , path ), JSON_MANDATORY },
58- { "property" , JSON_VARIANT_STRING , json_dispatch_string , offsetof(ManagedOOMReply , property ), JSON_MANDATORY },
59- { "limit" , JSON_VARIANT_UNSIGNED , json_dispatch_unsigned , offsetof(ManagedOOMReply , limit ), 0 },
56+ { "mode" , JSON_VARIANT_STRING , managed_oom_mode , offsetof(ManagedOOMReply , mode ), JSON_MANDATORY },
57+ { "path" , JSON_VARIANT_STRING , json_dispatch_string , offsetof(ManagedOOMReply , path ), JSON_MANDATORY },
58+ { "property" , JSON_VARIANT_STRING , json_dispatch_string , offsetof(ManagedOOMReply , property ), JSON_MANDATORY },
59+ { "limit" , JSON_VARIANT_UNSIGNED , json_dispatch_uint32 , offsetof(ManagedOOMReply , limit ), 0 },
6060 {},
6161 };
6262
@@ -87,7 +87,8 @@ static int process_managed_oom_reply(
8787 if (ret == - ENOMEM ) {
8888 r = ret ;
8989 goto finish ;
90- } else if (ret < 0 )
90+ }
91+ if (ret < 0 )
9192 continue ;
9293
9394 monitor_hm = streq (reply .property , "ManagedOOMSwap" ) ?
@@ -100,19 +101,15 @@ static int process_managed_oom_reply(
100101
101102 limit = m -> default_mem_pressure_limit ;
102103
103- if (streq (reply .property , "ManagedOOMMemoryPressure" )) {
104- if (reply .limit > UINT32_MAX ) /* out of range */
104+ if (streq (reply .property , "ManagedOOMMemoryPressure" ) && reply .limit > 0 ) {
105+ int permyriad = UINT32_SCALE_TO_PERMYRIAD (reply .limit );
106+
107+ ret = store_loadavg_fixed_point (
108+ (unsigned long ) permyriad / 100 ,
109+ (unsigned long ) permyriad % 100 ,
110+ & limit );
111+ if (ret < 0 )
105112 continue ;
106- if (reply .limit != 0 ) {
107- int permyriad = UINT32_SCALE_TO_PERMYRIAD (reply .limit );
108-
109- ret = store_loadavg_fixed_point (
110- (unsigned long ) permyriad / 100 ,
111- (unsigned long ) permyriad % 100 ,
112- & limit );
113- if (ret < 0 )
114- continue ;
115- }
116113 }
117114
118115 ret = oomd_insert_cgroup_context (NULL , monitor_hm , empty_to_root (reply .path ));
@@ -354,11 +351,11 @@ static int monitor_cgroup_contexts_handler(sd_event_source *s, uint64_t usec, vo
354351 }
355352 }
356353
357- if (oomd_swap_free_below (& m -> system_context , ( 100 - m -> swap_used_limit ) )) {
354+ if (oomd_swap_free_below (& m -> system_context , 10000 - m -> swap_used_limit_permyriad )) {
358355 _cleanup_hashmap_free_ Hashmap * candidates = NULL ;
359356
360- log_notice ("Swap used (%" PRIu64 ") / total (%" PRIu64 ") is more than %u%%" ,
361- m -> system_context .swap_used , m -> system_context .swap_total , m -> swap_used_limit );
357+ log_notice ("Swap used (%" PRIu64 ") / total (%" PRIu64 ") is more than " PERMYRIAD_AS_PERCENT_FORMAT_STR ,
358+ m -> system_context .swap_used , m -> system_context .swap_total , PERMYRIAD_AS_PERCENT_FORMAT_VAL ( m -> swap_used_limit_permyriad ) );
362359
363360 r = get_monitored_cgroup_contexts_candidates (m -> monitored_swap_cgroup_contexts , & candidates );
364361 if (r == - ENOMEM )
@@ -484,18 +481,24 @@ static int manager_connect_bus(Manager *m) {
484481 return 0 ;
485482}
486483
487- int manager_start (Manager * m , bool dry_run , int swap_used_limit , int mem_pressure_limit_permyriad , usec_t mem_pressure_usec ) {
484+ int manager_start (
485+ Manager * m ,
486+ bool dry_run ,
487+ int swap_used_limit_permyriad ,
488+ int mem_pressure_limit_permyriad ,
489+ usec_t mem_pressure_usec ) {
490+
488491 unsigned long l , f ;
489492 int r ;
490493
491494 assert (m );
492495
493496 m -> dry_run = dry_run ;
494497
495- m -> swap_used_limit = swap_used_limit != -1 ? swap_used_limit : DEFAULT_SWAP_USED_LIMIT ;
496- assert (m -> swap_used_limit <= 100 );
498+ m -> swap_used_limit_permyriad = swap_used_limit_permyriad >= 0 ? swap_used_limit_permyriad : DEFAULT_SWAP_USED_LIMIT_PERCENT * 100 ;
499+ assert (m -> swap_used_limit_permyriad <= 10000 );
497500
498- if (mem_pressure_limit_permyriad != -1 ) {
501+ if (mem_pressure_limit_permyriad >= 0 ) {
499502 assert (mem_pressure_limit_permyriad <= 10000 );
500503
501504 l = mem_pressure_limit_permyriad / 100 ;
@@ -543,12 +546,12 @@ int manager_get_dump_string(Manager *m, char **ret) {
543546
544547 fprintf (f ,
545548 "Dry Run: %s\n"
546- "Swap Used Limit: %u%% \n"
549+ "Swap Used Limit: " PERMYRIAD_AS_PERCENT_FORMAT_STR " \n"
547550 "Default Memory Pressure Limit: %lu.%02lu%%\n"
548551 "Default Memory Pressure Duration: %s\n"
549552 "System Context:\n" ,
550553 yes_no (m -> dry_run ),
551- m -> swap_used_limit ,
554+ PERMYRIAD_AS_PERCENT_FORMAT_VAL ( m -> swap_used_limit_permyriad ) ,
552555 LOAD_INT (m -> default_mem_pressure_limit ), LOAD_FRAC (m -> default_mem_pressure_limit ),
553556 format_timespan (buf , sizeof (buf ), m -> default_mem_pressure_duration_usec , USEC_PER_SEC ));
554557 oomd_dump_system_context (& m -> system_context , f , "\t" );
0 commit comments