diff -ur linux.orig/arch/i386/kernel/irq.c linux/arch/i386/kernel/irq.c
--- linux.orig/arch/i386/kernel/irq.c	Thu May 10 11:18:00 2001
+++ linux/arch/i386/kernel/irq.c	Thu May 10 11:14:17 2001
@@ -32,6 +32,7 @@
 #include <linux/kernel_stat.h>
 #include <linux/irq.h>
 #include <linux/proc_fs.h>
+#include <linux/mm/reservation.h>
 
 #include <asm/atomic.h>
 #include <asm/io.h>
@@ -576,7 +577,10 @@
 	irq_desc_t *desc = irq_desc + irq;
 	struct irqaction * action;
 	unsigned int status;
+	struct page_reservation *saved_irq_rsv;
 
+	saved_irq_rsv = current->page_reservations;
+	current->page_reservations = &irq_rsv;
 	kstat.irqs[cpu][irq]++;
 	spin_lock(&desc->lock);
 	desc->handler->ack(irq);
@@ -638,6 +642,7 @@
 
 	if (softirq_active(cpu) & softirq_mask(cpu))
 		do_softirq();
+	current->page_reservations = saved_irq_rsv;
 	return 1;
 }
 
diff -ur linux.orig/include/linux/mm/reservation.h linux/include/linux/mm/reservation.h
--- linux.orig/include/linux/mm/reservation.h	Thu May 10 11:18:05 2001
+++ linux/include/linux/mm/reservation.h	Thu May 10 11:10:12 2001
@@ -32,6 +32,8 @@
 	zone_t			*zone;
 };
 
+extern struct page_reservation irq_rsv;
+
 extern void init_page_reservation(struct page_reservation *rsv, int flags, int zone);
 extern void destroy_page_reservation(struct page_reservation *rsv);
 
diff -ur linux.orig/init/main.c linux/init/main.c
--- linux.orig/init/main.c	Thu May 10 11:18:03 2001
+++ linux/init/main.c	Thu May 10 11:14:45 2001
@@ -28,6 +28,7 @@
 #include <linux/iobuf.h>
 #include <linux/bootmem.h>
 #include <linux/tty.h>
+#include <linux/mm/reservation.h>
 
 #include <asm/io.h>
 #include <asm/bugs.h>
@@ -655,6 +656,8 @@
 #endif
 	mempages = num_physpages;
 
+	if (reserve_pages(&irq_rsv, GFP_KERNEL, mempages >> 8))
+		panic("unable to reserve memory.\n");
 	fork_init(mempages);
 	proc_caches_init();
 	vfs_caches_init(mempages);
diff -ur linux.orig/mm/page_alloc.c linux/mm/page_alloc.c
--- linux.orig/mm/page_alloc.c	Thu May 10 11:18:05 2001
+++ linux/mm/page_alloc.c	Thu May 10 11:10:00 2001
@@ -20,6 +20,7 @@
 #include <linux/slab.h>
 #include <linux/mm/reservation.h>
 
+struct page_reservation irq_rsv;
 int nr_swap_pages;
 int nr_active_pages;
 int nr_inactive_dirty_pages;
@@ -467,7 +468,7 @@
 	 * TODO: with memory reservations in place, much of the code
 	 * below is completely bogus.  Clean this up!  -ben
 	 */
-	if (!order && current->page_reservations && !in_interrupt()) {
+	if (!order && current->page_reservations) {
 		page = __alloc_pages_limit(zonelist, order, PAGES_RSV, direct_reclaim);
 		if (page)
 			goto out_success;
@@ -1013,6 +1014,8 @@
 		}
 	}
 	build_zonelists(pgdat);
+
+	init_page_reservation(&irq_rsv, RSV_MULTISHOT, ZONE_NORMAL);
 }
 
 void __init free_area_init(unsigned long *zones_size)
