Staging: android: lowmemorykiller: Only iterate over process list when needed.
authorArve Hjønnevåg <arve@android.com>
Mon, 11 May 2009 22:45:09 +0000 (15:45 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 19 Jun 2009 18:00:52 +0000 (11:00 -0700)
Use NR_ACTIVE plus NR_INACTIVE as a size estimate for our fake cache
instead the sum of rss. Neither method is accurate.

Also skip the process scan, if the amount of memory available is above
the largest threshold set.

Signed-off-by: Arve Hjønnevåg <arve@android.com>
Cc: David Rientjes <rientjes@google.com>
Cc: San Mehat <san@android.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/android/lowmemorykiller.c

index 3715d56ca96b3b3aa45eac1f028ae1b120680788..b9a2e843e2fe4259353ac93dd57fafa2b15587ed 100644 (file)
@@ -71,23 +71,30 @@ static int lowmem_shrink(int nr_to_scan, gfp_t gfp_mask)
        }
        if(nr_to_scan > 0)
                lowmem_print(3, "lowmem_shrink %d, %x, ofree %d, ma %d\n", nr_to_scan, gfp_mask, other_free, min_adj);
+       rem = global_page_state(NR_ACTIVE) + global_page_state(NR_INACTIVE);
+       if (nr_to_scan <= 0 || min_adj == OOM_ADJUST_MAX + 1) {
+               lowmem_print(5, "lowmem_shrink %d, %x, return %d\n", nr_to_scan, gfp_mask, rem);
+               return rem;
+       }
+
        read_lock(&tasklist_lock);
        for_each_process(p) {
-               if(p->oomkilladj >= 0 && p->mm) {
-                       tasksize = get_mm_rss(p->mm);
-                       if(nr_to_scan > 0 && tasksize > 0 && p->oomkilladj >= min_adj) {
-                               if(selected == NULL ||
-                                  p->oomkilladj > selected->oomkilladj ||
-                                  (p->oomkilladj == selected->oomkilladj &&
-                                   tasksize > selected_tasksize)) {
-                                       selected = p;
-                                       selected_tasksize = tasksize;
-                                       lowmem_print(2, "select %d (%s), adj %d, size %d, to kill\n",
-                                                    p->pid, p->comm, p->oomkilladj, tasksize);
-                               }
-                       }
-                       rem += tasksize;
+               if (p->oomkilladj < min_adj || !p->mm)
+                       continue;
+               tasksize = get_mm_rss(p->mm);
+               if (tasksize <= 0)
+                       continue;
+               if (selected) {
+                       if (p->oomkilladj < selected->oomkilladj)
+                               continue;
+                       if (p->oomkilladj == selected->oomkilladj &&
+                           tasksize <= selected_tasksize)
+                               continue;
                }
+               selected = p;
+               selected_tasksize = tasksize;
+               lowmem_print(2, "select %d (%s), adj %d, size %d, to kill\n",
+                            p->pid, p->comm, p->oomkilladj, tasksize);
        }
        if(selected != NULL) {
                lowmem_print(1, "send sigkill to %d (%s), adj %d, size %d\n",