On Wed, Jun 03, 2009 at 01:02:59PM +0100, Keir Fraser wrote:
> Wasteful of memory, so I checked in a modified version as c/s 19707, which
> dynamically sizes the array. Please take a look and check it's okay.
>
> It probably breaks ia64 build due to undefined nr_ioapics and
> nr_ioapic_registers[], but I think yours broke ia64 too so we're even. :-)
>
> Isaku: can you suggest ia64 equivalents for nr_ioapics and
> nr_ioapic_registers[]? We can do some ifdef magic at the top of intremap.c,
> including defining a nr_ioapic_registers() macro, if that helps.
Here is the patch. I'm going to test it, though.
[] operator is an obstacle to use CPP magic.
So I did just quick hack to send this patch as soon as possible.
You may want to wrap it with a function.
thanks,
vtd: ia64 fix of intremap.c
19707:07cf79dfb59c caused compilation error on ia64.
This patch fixes it.
Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
diff --git a/xen/arch/ia64/linux-xen/iosapic.c
b/xen/arch/ia64/linux-xen/iosapic.c
--- a/xen/arch/ia64/linux-xen/iosapic.c
+++ b/xen/arch/ia64/linux-xen/iosapic.c
@@ -1275,4 +1275,22 @@ int iosapic_guest_write(unsigned long ph
spin_unlock_irqrestore(&irq_descp(vec)->lock, flags);
return 0;
}
+
+/* for vtd interrupt remapping. xen/drivers/vtd/intremap.c */
+int iosapic_get_nr_iosapics(void)
+{
+ int index;
+
+ for (index = NR_IOSAPICS - 1; index >= 0; index--) {
+ if (iosapic_lists[index].addr)
+ break;
+ }
+
+ return index + 1;
+}
+
+int iosapic_get_nr_pins(int index)
+{
+ return iosapic_lists[index].num_rte;
+}
#endif /* XEN */
diff --git a/xen/drivers/passthrough/vtd/intremap.c
b/xen/drivers/passthrough/vtd/intremap.c
--- a/xen/drivers/passthrough/vtd/intremap.c
+++ b/xen/drivers/passthrough/vtd/intremap.c
@@ -33,6 +33,10 @@
#ifdef __ia64__
#define dest_SMI -1
+#define nr_ioapics iosapic_get_nr_iosapics()
+#define nr_ioapic_registers(i) iosapic_get_nr_pins(i)
+#else
+#define nr_ioapic_registers(i) nr_ioapic_registers[i]
#endif
/* apic_pin_2_ir_idx[apicid][pin] = interrupt remapping table index */
@@ -45,7 +49,7 @@ static int init_apic_pin_2_ir_idx(void)
nr_pins = 0;
for ( i = 0; i < nr_ioapics; i++ )
- nr_pins += nr_ioapic_registers[i];
+ nr_pins += nr_ioapic_registers(i);
_apic_pin_2_ir_idx = xmalloc_array(unsigned int, nr_pins);
apic_pin_2_ir_idx = xmalloc_array(unsigned int *, nr_ioapics);
@@ -63,7 +67,7 @@ static int init_apic_pin_2_ir_idx(void)
for ( i = 0; i < nr_ioapics; i++ )
{
apic_pin_2_ir_idx[i] = &_apic_pin_2_ir_idx[nr_pins];
- nr_pins += nr_ioapic_registers[i];
+ nr_pins += nr_ioapic_registers(i);
}
return 0;
diff --git a/xen/include/asm-ia64/linux-xen/asm/iosapic.h
b/xen/include/asm-ia64/linux-xen/asm/iosapic.h
--- a/xen/include/asm-ia64/linux-xen/asm/iosapic.h
+++ b/xen/include/asm-ia64/linux-xen/asm/iosapic.h
@@ -186,6 +186,9 @@ struct rte_entry {
#define IOSAPIC_RTEINDEX(reg) (((reg) - 0x10) >> 1)
extern unsigned long ia64_vector_mask[];
extern unsigned long ia64_xen_vector[];
+
+int iosapic_get_nr_iosapics(void);
+int iosapic_get_nr_pins(int index);
#endif /* XEN */
#define IO_APIC_BASE(idx) ((unsigned int *)iosapic_lists[idx].addr)
--
yamahata
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|