memory : consider sysinfo.mem_unit to get memory size 36/154936/4
authorKichan Kwon <k_c.kwon@samsung.com>
Wed, 11 Oct 2017 11:28:46 +0000 (20:28 +0900)
committerKichan Kwon <k_c.kwon@samsung.com>
Fri, 13 Oct 2017 05:11:32 +0000 (14:11 +0900)
- If (RAM + swap) size is larger than 4G, sysinfo.mem_unit
  is set to more than 1
- In this case, overflow can occur. So we have to use
  larger variable for storing memory size

Change-Id: Idf8e0ceade0596423a7d800e3db134391ced6ff0
Signed-off-by: Kichan Kwon <k_c.kwon@samsung.com>
src/memory/vmpressure-lowmem-handler.c

index fd3de35c0def68c6957846d1d026be53ceac2551..e37f53bc7aa26fa1c7912dcd86d837155323f9c0 100644 (file)
@@ -271,7 +271,7 @@ static size_t cur_mem_state = LOWMEM_NORMAL;
 static int num_max_victims = MAX_MEMORY_CGROUP_VICTIMS;
 static int num_vict_between_check = MAX_VICTIMS_BETWEEN_CHECK;
 
-static unsigned long totalram;
+static unsigned long long totalram;
 static unsigned long ktotalram;
 
 static struct module_ops memory_modules_ops;
@@ -327,12 +327,18 @@ static int lowmem_launch_oompopup(void)
 static inline void get_total_memory(void)
 {
        struct sysinfo si;
+       unsigned long long total_memory;
+
        if (totalram)
                return;
 
        if (!sysinfo(&si)) {
-               totalram = si.totalram;
-               ktotalram = BYTE_TO_KBYTE(totalram);
+               total_memory = (unsigned long long)si.totalram * si.mem_unit;
+               totalram = total_memory;
+
+               /* ktotalram can cover up to 4TB */
+               total_memory = BYTE_TO_KBYTE(totalram);
+               ktotalram = (total_memory >= ULONG_MAX) ? ULONG_MAX : total_memory;
        }
 }
 
@@ -602,15 +608,20 @@ static int compare_victims(const struct task_info *ta, const struct task_info *t
 
 static int compare_victims_point(const struct task_info *ta, const struct task_info *tb)
 {
-       unsigned int pa, pb;
+       long long pa, pb;
 
        assert(ta != NULL);
        assert(tb != NULL);
 
-       pa = ta->oom_score_adj * (ktotalram / 1000) + ta->size;
-       pb = tb->oom_score_adj * (ktotalram / 1000) + tb->size;
+       pa = (long long)(ta->oom_score_adj) * (ktotalram / 1000) + ta->size;
+       pb = (long long)(tb->oom_score_adj) * (ktotalram / 1000) + tb->size;
 
-       return pb - pa;
+       if (pa > pb)
+               return -1;
+       else if (pa < pb)
+               return 1;
+       else
+               return 0;
 }
 
 static void lowmem_free_task_info_array(GArray *array)
@@ -1472,7 +1483,7 @@ static int memory_load_2048_config(struct parse_result *result, void *user_data)
 static void setup_memcg_params(void)
 {
        int i;
-       unsigned long total_ramsize = BYTE_TO_MBYTE(totalram);
+       unsigned long long total_ramsize = BYTE_TO_MBYTE(totalram);
        _D("Total: %lu MB", total_ramsize);
        if (total_ramsize <= MEM_SIZE_64) {
                /* set thresholds for ram size 64M */