patch-2.4.11-dontuse linux/mm/oom_kill.c
Next file: linux/mm/page_alloc.c
Previous file: linux/mm/mmap.c
Back to the patch index
Back to the overall index
- Lines: 68
- Date:
Fri Oct 5 13:13:43 2001
- Orig file:
v2.4.10/linux/mm/oom_kill.c
- Orig date:
Sun Sep 23 11:41:01 2001
diff -u --recursive --new-file v2.4.10/linux/mm/oom_kill.c linux/mm/oom_kill.c
@@ -192,3 +192,67 @@
schedule();
return;
}
+
+static inline int node_zones_low(pg_data_t *pgdat)
+{
+ zone_t * zone;
+ int i;
+
+ for (i = pgdat->nr_zones-1; i >= 0; i--) {
+ zone = pgdat->node_zones + i;
+
+ if (zone->free_pages > (zone->pages_low))
+ return 0;
+
+ }
+ return 1;
+}
+
+static int all_zones_low(void)
+{
+ pg_data_t * pgdat = pgdat_list;
+
+ pgdat = pgdat_list;
+ do {
+ if (node_zones_low(pgdat))
+ continue;
+ return 0;
+ } while ((pgdat = pgdat->node_next));
+
+ return 1;
+}
+
+/**
+ * out_of_memory - is the system out of memory?
+ *
+ * Returns 0 if there is still enough memory left,
+ * 1 when we are out of memory (otherwise).
+ */
+int out_of_memory(void)
+{
+ long cache_mem, limit;
+
+ /* Enough free memory? Not OOM. */
+ if (!all_zones_low())
+ return 0;
+
+ /* Enough swap space left? Not OOM. */
+ if (nr_swap_pages > 0)
+ return 0;
+
+ /*
+ * If the buffer and page cache (including swap cache) are over
+ * their (/proc tunable) minimum, we're still not OOM. We test
+ * this to make sure we don't return OOM when the system simply
+ * has a hard time with the cache.
+ */
+ cache_mem = atomic_read(&page_cache_size);
+ limit = 2;
+ limit *= num_physpages / 100;
+
+ if (cache_mem > limit)
+ return 0;
+
+ /* Else... */
+ return 1;
+}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)