Skip to contentSkip to conversation

linux/evtchn: allocate pirq_needs_eoi bitmap dynamically

PATCH New Jan Beulich 1 participant 1 message Dec 10, 2008 Xen hypervisor interface

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 linux/evtchn: allocate pirq_needs_eoi bitmap dynamically

Original patch from: Isaku Yamahata <[email protected]>

As usual, written and tested on 2.6.27.8 and made apply to the 2.6.18 tree without further testing.

drivers/xen/core/evtchn.c +6 -7
@@ -35,6 +35,7 @@
 #include <linux/interrupt.h>
 #include <linux/sched.h>
 #include <linux/kernel_stat.h>
+#include <linux/bootmem.h>
 #include <linux/version.h>
 #include <asm/atomic.h>
 #include <asm/system.h>
@@ -755,8 +756,7 @@ static struct irq_chip dynirq_chip = {
 
 /* Bitmap indicating which PIRQs require Xen to be notified on unmask. */
 static int pirq_eoi_does_unmask;
-static DECLARE_BITMAP(pirq_needs_eoi, ALIGN(NR_PIRQS, PAGE_SIZE * 8))
-	__attribute__ ((__section__(".bss.page_aligned"), __aligned__(PAGE_SIZE)));
+static unsigned long *pirq_needs_eoi;
 
 static void pirq_unmask_and_notify(unsigned int evtchn, unsigned int irq)
 {
@@ -1041,8 +1041,7 @@ void irq_resume(void)
 	if (pirq_eoi_does_unmask) {
 		struct physdev_pirq_eoi_gmfn eoi_gmfn;
 
-		eoi_gmfn.gmfn = arbitrary_virt_to_machine(pirq_needs_eoi)
-			>> PAGE_SHIFT;
+		eoi_gmfn.gmfn = virt_to_machine(pirq_needs_eoi) >> PAGE_SHIFT;
 		if (HYPERVISOR_physdev_op(PHYSDEVOP_pirq_eoi_gmfn, &eoi_gmfn))
 			BUG();
 	}
@@ -1137,9 +1137,9 @@ void __init xen_init_IRQ(void)
 
 	init_evtchn_cpu_bindings();
 
-	BUG_ON(!bitmap_empty(pirq_needs_eoi, PAGE_SIZE * 8));
-	eoi_gmfn.gmfn = arbitrary_virt_to_machine(pirq_needs_eoi)
-		>> PAGE_SHIFT;
+	pirq_needs_eoi = alloc_bootmem_pages(sizeof(unsigned long)
+		* BITS_TO_LONGS(ALIGN(NR_PIRQS, PAGE_SIZE * 8)));
+ 	eoi_gmfn.gmfn = virt_to_machine(pirq_needs_eoi) >> PAGE_SHIFT;
 	if (HYPERVISOR_physdev_op(PHYSDEVOP_pirq_eoi_gmfn, &eoi_gmfn) == 0)
 		pirq_eoi_does_unmask = 1;