memlimit: Introduce gui app and widget limits 32/250432/4
authorKarol Lewandowski <k.lewandowsk@samsung.com>
Thu, 24 Dec 2020 11:14:29 +0000 (12:14 +0100)
committerKarol Lewandowski <k.lewandowsk@samsung.com>
Wed, 30 Dec 2020 12:44:35 +0000 (13:44 +0100)
Use MemLimitGUIApp and MemLimitWidget options to set gui app and widget
limits, respectively.

Change-Id: I70e1040438dd930ea06f268fde0514c3381e17ad

src/memory/lowmem-limit.c
src/memory/memory.conf

index 4f8459b..e38237f 100644 (file)
 #define MEM_CONF_FILE                   RD_CONFIG_FILE(memory)
 #define MEMLIMIT_CONFIG_SECTION        "MemLimit"
 #define MEMLIMIT_CONFIG_TRIGGER        "MemLimitTrigger"
-#define MEMLIMIT_CONFIG_SERVICE        "MemLimitService"
+
+#define MEMLIMIT_CONFIG_LIM_PFX MEMLIMIT_CONFIG_SECTION
+#define MEMLIMIT_CONFIG_SERVICE MEMLIMIT_CONFIG_LIM_PFX "Service"
+#define MEMLIMIT_CONFIG_GUIAPP  MEMLIMIT_CONFIG_LIM_PFX "GUIApp"
+#define MEMLIMIT_CONFIG_WIDGET  MEMLIMIT_CONFIG_LIM_PFX "Widget"
 #define MIN_LIMIT_VALUE                1 /* MB */
 
 enum mem_limit_type {
@@ -73,6 +77,8 @@ static enum mem_limit_type mem_limit;
 static GHashTable *memory_limit_hash;
 static char *registerpath;
 static int mem_service_limit;
+static int mem_guiapp_limit;
+static int mem_widget_limit;
 
 struct memory_limit_event {
        fd_handler_h fdh;
@@ -571,11 +577,16 @@ static int memlimit_config_parse(struct parse_result *result, void *user_data)
                                registerpath = MEMCG_USAGE;
                }
                _I("Control %s event with %s node about memcg", result->value, registerpath);
-       } else if (!strncmp(result->name, MEMLIMIT_CONFIG_SERVICE,
-           sizeof(MEMLIMIT_CONFIG_SERVICE))) {
-               if (mem_limit != MEM_LIMIT_NONE)
-                       mem_service_limit = atoi(result->value);
+       } else if (!strncmp(result->name, MEMLIMIT_CONFIG_LIM_PFX, sizeof(MEMLIMIT_CONFIG_LIM_PFX)-1)) {
+               const int limit = atoi(result->value);
+               if (!strcmp(result->name, MEMLIMIT_CONFIG_SERVICE))
+                       mem_service_limit = limit;
+               else if (!strcmp(result->name, MEMLIMIT_CONFIG_GUIAPP))
+                       mem_guiapp_limit = limit;
+               else if (!strcmp(result->name, MEMLIMIT_CONFIG_WIDGET))
+                       mem_widget_limit = limit;
        }
+
        return RESOURCED_ERROR_NONE;
 }
 
@@ -646,6 +657,8 @@ void lowmem_limit_set(pid_t pid, unsigned int limit)
 
 static int lowmem_limit_service(void *data)
 {
+       assert(data);
+
        struct proc_status *ps = (struct proc_status *)data;
 
        if (mem_service_limit)
@@ -653,13 +666,33 @@ static int lowmem_limit_service(void *data)
        return RESOURCED_ERROR_NONE;
 }
 
+static int lowmem_limit_appwidget(void *data)
+{
+       assert(data);
+
+       struct proc_status *ps = (struct proc_status *)data;
+
+       if (mem_guiapp_limit && ps->pai->type == PROC_TYPE_GUI)
+               lowmem_limit_set(ps->pid, mem_guiapp_limit);
+       if (mem_widget_limit && ps->pai->type == PROC_TYPE_WIDGET)
+               lowmem_limit_set(ps->pid, mem_widget_limit);
+
+       return RESOURCED_ERROR_NONE;
+}
+
 void lowmem_limit_init(void)
 {
        /* Load configuration */
        config_parse(MEM_CONF_FILE, memlimit_config_parse,
                        NULL);
+
+       if (mem_limit == MEM_LIMIT_NONE)
+               return;
+
        if (mem_service_limit)
                register_notifier(RESOURCED_NOTIFIER_SERVICE_LAUNCH, lowmem_limit_service);
+       if (mem_guiapp_limit || mem_widget_limit)
+               register_notifier(RESOURCED_NOTIFIER_APP_LAUNCH, lowmem_limit_appwidget);
 }
 
 void lowmem_limit_exit(void)
@@ -671,6 +704,6 @@ void lowmem_limit_exit(void)
 #endif
        }
 
-       if (mem_service_limit)
-               unregister_notifier(RESOURCED_NOTIFIER_SERVICE_LAUNCH, lowmem_limit_service);
+       unregister_notifier(RESOURCED_NOTIFIER_SERVICE_LAUNCH, lowmem_limit_service);
+       unregister_notifier(RESOURCED_NOTIFIER_APP_LAUNCH, lowmem_limit_appwidget);
 }
index a30c6af..b6cc5cd 100644 (file)
@@ -203,9 +203,12 @@ Fraglevel=800
 #              threshold(regiter event using usage_in_bytes and kill process in resourced)
 #              others(don't register any event for memory limit)
 MemLimitTrigger=oom
-# How long does the resourced allow that each service applications use memory
-# But, it only allows to enable when the MemLimitTrigger option is oom or threshold.
+
+# Memory limits for each supported application types.  Effective only when MemLimitTrigger
+# is set to oom or threshold.
 MemLimitService=128            # MB
+# MemLimitWidget=160            # MB
+# MemLimitGUIApp=1024           # MB
 
 [Logging]
 Enable=1