#include "notifier.h"
#include "freezer.h"
#include "swap-common.h"
+#include "dedup-common.h"
#define MAX_VICTIMS_BETWEEN_CHECK 3
return victim_cnt;
}
-/* lowmem actions */
+static int dedup_prepare(void)
+{
+ if (dedup_get_state() != DEDUP_ONE_SHOT)
+ return RESOURCED_ERROR_FAIL;
+
+ if (proc_get_freezer_status() == CGROUP_FREEZER_PAUSED)
+ resourced_notify(RESOURCED_NOTIFIER_FREEZER_CGROUP_STATE,
+ (void *)CGROUP_FREEZER_ENABLED);
+
+ return RESOURCED_ERROR_NONE;
+}
+/* lowmem actions */
static int high_mem_act(void *data)
{
int ret, status;
return RESOURCED_ERROR_NONE;
}
+static int medium_mem_act(void *data)
+{
+ int status = 0;
+ int scan_mode = KSM_SCAN_PARTIAL;
+
+ if (dedup_prepare() < 0)
+ return RESOURCED_ERROR_FAIL;
+
+ if (vconf_get_int(VCONFKEY_SYSMAN_LOW_MEMORY, &status) != 0)
+ _E("vconf get failed %s", VCONFKEY_SYSMAN_LOW_MEMORY);
+
+ if (status != VCONFKEY_SYSMAN_LOW_MEMORY_NORMAL) {
+ vconf_set_int(VCONFKEY_SYSMAN_LOW_MEMORY,
+ VCONFKEY_SYSMAN_LOW_MEMORY_NORMAL);
+ lowmem_memory_level_send_system_event(MEM_LEVEL_MEDIUM);
+ }
+ lowmem_change_lowmem_state(MEM_LEVEL_MEDIUM);
+
+ resourced_notify(RESOURCED_NOTIFIER_DEDUP_SCAN, &scan_mode);
+
+ return RESOURCED_ERROR_NONE;
+}
+static int critical_mem_act(void *data)
+{
+ int scan_mode = KSM_SCAN_FULL;
+
+ if (dedup_prepare() < 0)
+ return RESOURCED_ERROR_FAIL;
+
+ resourced_notify(RESOURCED_NOTIFIER_DEDUP_SCAN, &scan_mode);
+
+ return RESOURCED_ERROR_NONE;
+}
+
+
static int lowmem_controller_initialize(void *data)
{
/**
/* Initialize actions for the memory levels */
lowmem_initialize_controller_ops_action(MEM_LEVEL_HIGH, high_mem_act);
+ lowmem_initialize_controller_ops_action(MEM_LEVEL_MEDIUM, medium_mem_act);
+ lowmem_initialize_controller_ops_action(MEM_LEVEL_CRITICAL, critical_mem_act);
return RESOURCED_ERROR_NONE;
}
#include "lowmem.h"
#include "module.h"
#include "memory-cgroup.h"
+#include "dedup-common.h"
static int mem_state_dummy_governor(void *data)
{
/* Initialize governors for the memory levels */
lowmem_initialize_controller_ops_governor(MEM_LEVEL_HIGH, mem_state_dummy_governor);
+ lowmem_initialize_controller_ops_governor(MEM_LEVEL_MEDIUM, mem_state_dummy_governor);
+ lowmem_initialize_controller_ops_governor(MEM_LEVEL_CRITICAL, mem_state_dummy_governor);
return RESOURCED_ERROR_NONE;
}
{
switch (mem_state) {
case MEM_LEVEL_HIGH:
+ case MEM_LEVEL_MEDIUM:
+ case MEM_LEVEL_CRITICAL:
lowmem_actions[mem_state].governor = governor;
return;
default:
{
switch (mem_state) {
case MEM_LEVEL_HIGH:
+ case MEM_LEVEL_MEDIUM:
+ case MEM_LEVEL_CRITICAL:
lowmem_actions[mem_state].action = action;
return;
default:
resourced_notify(RESOURCED_NOTIFIER_SWAP_ACTIVATE, NULL);
}
-static void dedup_act(enum ksm_scan_mode mode)
-{
- int ret, status;
- int data;
-
- if (dedup_get_state() != DEDUP_ONE_SHOT)
- return;
-
- if (proc_get_freezer_status() == CGROUP_FREEZER_PAUSED)
- resourced_notify(RESOURCED_NOTIFIER_FREEZER_CGROUP_STATE,
- (void *)CGROUP_FREEZER_ENABLED);
-
- if (mode == KSM_SCAN_PARTIAL) {
- ret = vconf_get_int(VCONFKEY_SYSMAN_LOW_MEMORY, &status);
- if (ret)
- _E("vconf get failed %s", VCONFKEY_SYSMAN_LOW_MEMORY);
-
- if (status != VCONFKEY_SYSMAN_LOW_MEMORY_NORMAL) {
- vconf_set_int(VCONFKEY_SYSMAN_LOW_MEMORY,
- VCONFKEY_SYSMAN_LOW_MEMORY_NORMAL);
- lowmem_memory_level_send_system_event(MEM_LEVEL_MEDIUM);
- }
- lowmem_change_lowmem_state(MEM_LEVEL_MEDIUM);
-
- data = KSM_SCAN_PARTIAL;
- resourced_notify(RESOURCED_NOTIFIER_DEDUP_SCAN, &data);
- } else if (mode == KSM_SCAN_FULL) {
- data = KSM_SCAN_FULL;
- resourced_notify(RESOURCED_NOTIFIER_DEDUP_SCAN, &data);
- }
-}
-
static void swap_compact_act(void)
{
lowmem_change_lowmem_state(MEM_LEVEL_CRITICAL);
switch (mem_state) {
case MEM_LEVEL_HIGH:
+ case MEM_LEVEL_MEDIUM:
assert(lowmem_actions[mem_state].governor != NULL);
assert(lowmem_actions[mem_state].action != NULL);
if (lowmem_actions[mem_state].governor(NULL) < 0)
break;
lowmem_actions[mem_state].action(NULL);
break;
- case MEM_LEVEL_MEDIUM:
- dedup_act(KSM_SCAN_PARTIAL);
- break;
case MEM_LEVEL_LOW:
swap_activate_act();
break;
case MEM_LEVEL_CRITICAL:
- dedup_act(KSM_SCAN_FULL);
+ assert(lowmem_actions[mem_state].governor != NULL);
+ assert(lowmem_actions[mem_state].action != NULL);
+ if (lowmem_actions[mem_state].governor(NULL) < 0)
+ break;
+ lowmem_actions[mem_state].action(NULL);
swap_compact_act();
break;
case MEM_LEVEL_OOM: