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 #include #include +#include #include #include @@ -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 #include #include +#include #include #include @@ -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 #include +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)