[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [xen-devel][PATCH][VTD] Fix apic pin to interrupt remapping table index



Look fine for me. Thanks.

Regards,
Weidong

Isaku Yamahata wrote:
> 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)


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.