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;
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;
}
}
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)
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 */