linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* PATCH 2.4.0.1.ac10: a KISS memory pressure callback
@ 2000-06-07  7:34 Jeff Garzik
       [not found] ` <oupln0hkgag.fsf@pigdrop.muc.suse.de>
  0 siblings, 1 reply; 2+ messages in thread
From: Jeff Garzik @ 2000-06-07  7:34 UTC (permalink / raw)
  To: linux-mm; +Cc: Linux Kernel Mailing List

[-- Attachment #1: Type: text/plain, Size: 213 bytes --]

Cheesy maybe, effective probably.
-- 
Jeff Garzik              | Liberty is always dangerous, but
Building 1024            | it is the safest thing we have.
MandrakeSoft, Inc.       |      -- Harry Emerson Fosdick

[-- Attachment #2: freemem.patch --]
[-- Type: text/plain, Size: 3435 bytes --]

Index: mm/vmscan.c
===================================================================
RCS file: /g/cvslan/linux_2_3/mm/vmscan.c,v
retrieving revision 1.1.1.40
diff -u -r1.1.1.40 vmscan.c
--- mm/vmscan.c	2000/06/05 03:14:23	1.1.1.40
+++ mm/vmscan.c	2000/06/07 07:32:47
@@ -428,6 +428,31 @@
 }
 
 /*
+ * The freemem notifier list holds a list of functions
+ * that are to be called when trying to free pages.
+ *
+ * Call them...  We don't use notifier_call_chain
+ * because the return code from a freemem notifier
+ * is treated as a shrink_*_memory-style return value.
+ */
+extern struct notifier_block *freemem_notifier_list;
+static int shrink_misc_memory (int priority, unsigned int gfp_mask)
+{
+	int count = 0;
+	struct notifier_block *nb = freemem_notifier_list;
+
+	while (nb) {
+		count += nb->notifier_call(nb,
+			(unsigned long) priority,
+			(void *)(unsigned long) gfp_mask);
+		nb = nb->next;
+	}
+
+	return count;
+}
+
+
+/*
  * We need to make the locks finer granularity, but right
  * now we need this so that we can do page allocations
  * without holding the kernel lock etc.
@@ -476,6 +501,13 @@
 				if (!--count)
 					goto done;
 			}
+		}
+
+		/* call everybody who registered a mem pressure notifier */
+		count -= shrink_misc_memory(priority, gfp_mask);
+		if (count <= 0) {
+			ret = 1;
+			goto done;
 		}
 
 		/*
Index: kernel/ksyms.c
===================================================================
RCS file: /g/cvslan/linux_2_3/kernel/ksyms.c,v
retrieving revision 1.1.1.62
diff -u -r1.1.1.62 ksyms.c
--- kernel/ksyms.c	2000/05/29 23:48:48	1.1.1.62
+++ kernel/ksyms.c	2000/06/07 07:32:53
@@ -448,6 +448,8 @@
 EXPORT_SYMBOL(machine_power_off);
 EXPORT_SYMBOL(register_reboot_notifier);
 EXPORT_SYMBOL(unregister_reboot_notifier);
+EXPORT_SYMBOL(register_freemem_notifier);
+EXPORT_SYMBOL(unregister_freemem_notifier);
 EXPORT_SYMBOL(_ctype);
 EXPORT_SYMBOL(secure_tcp_sequence_number);
 EXPORT_SYMBOL(get_random_bytes);
Index: kernel/sys.c
===================================================================
RCS file: /g/cvslan/linux_2_3/kernel/sys.c,v
retrieving revision 1.1.1.19
diff -u -r1.1.1.19 sys.c
--- kernel/sys.c	2000/05/31 13:07:05	1.1.1.19
+++ kernel/sys.c	2000/06/07 07:32:53
@@ -47,15 +47,51 @@
  */
 
 static struct notifier_block *reboot_notifier_list = NULL;
+struct notifier_block *freemem_notifier_list = NULL;
+static spinlock_t notifier_lock = SPIN_LOCK_UNLOCKED;
 
 int register_reboot_notifier(struct notifier_block * nb)
 {
-	return notifier_chain_register(&reboot_notifier_list, nb);
+	int i;
+
+	spin_lock(&notifier_lock);
+	i = notifier_chain_register(&reboot_notifier_list, nb);
+	spin_unlock(&notifier_lock);
+
+	return i;
 }
 
 int unregister_reboot_notifier(struct notifier_block * nb)
+{
+	int i;
+
+	spin_lock(&notifier_lock);
+	i = notifier_chain_unregister(&reboot_notifier_list, nb);
+	spin_unlock(&notifier_lock);
+
+	return i;
+}
+
+int register_freemem_notifier(struct notifier_block * nb)
 {
-	return notifier_chain_unregister(&reboot_notifier_list, nb);
+	int i;
+
+	spin_lock(&notifier_lock);
+	i = notifier_chain_register(&freemem_notifier_list, nb);
+	spin_unlock(&notifier_lock);
+
+	return i;
+}
+
+int unregister_freemem_notifier(struct notifier_block * nb)
+{
+	int i;
+
+	spin_lock(&notifier_lock);
+	i = notifier_chain_unregister(&freemem_notifier_list, nb);
+	spin_unlock(&notifier_lock);
+
+	return i;
 }
 
 asmlinkage long sys_ni_syscall(void)

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2000-06-07 10:25 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2000-06-07  7:34 PATCH 2.4.0.1.ac10: a KISS memory pressure callback Jeff Garzik
     [not found] ` <oupln0hkgag.fsf@pigdrop.muc.suse.de>
2000-06-07 10:25   ` PATCH 2.4.0.1.ac10: a KISS memory pressure callback (rev 2) Jeff Garzik

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox