mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-16 05:26:07 +00:00
xen: identity map gsi->irqs
Impact: preserve compat with native Reserve the lower irq range for use for hardware interrupts so we can identity-map them. [v2: Rebased on top tip/irq/core] Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
This commit is contained in:
parent
7b586d7185
commit
0794bfc743
@ -33,6 +33,7 @@
|
|||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
#include <asm/idle.h>
|
#include <asm/idle.h>
|
||||||
|
#include <asm/io_apic.h>
|
||||||
#include <asm/sync_bitops.h>
|
#include <asm/sync_bitops.h>
|
||||||
#include <asm/xen/hypercall.h>
|
#include <asm/xen/hypercall.h>
|
||||||
#include <asm/xen/hypervisor.h>
|
#include <asm/xen/hypervisor.h>
|
||||||
@ -46,9 +47,6 @@
|
|||||||
#include <xen/interface/hvm/hvm_op.h>
|
#include <xen/interface/hvm/hvm_op.h>
|
||||||
#include <xen/interface/hvm/params.h>
|
#include <xen/interface/hvm/params.h>
|
||||||
|
|
||||||
/* Leave low irqs free for identity mapping */
|
|
||||||
#define LEGACY_IRQS 16
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This lock protects updates to the following mapping and reference-count
|
* This lock protects updates to the following mapping and reference-count
|
||||||
* arrays. The lock does not need to be acquired to read the mapping tables.
|
* arrays. The lock does not need to be acquired to read the mapping tables.
|
||||||
@ -351,6 +349,17 @@ static void unmask_evtchn(int port)
|
|||||||
put_cpu();
|
put_cpu();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int get_nr_hw_irqs(void)
|
||||||
|
{
|
||||||
|
int ret = 1;
|
||||||
|
|
||||||
|
#ifdef CONFIG_X86_IO_APIC
|
||||||
|
ret = get_nr_irqs_gsi();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static int find_unbound_irq(void)
|
static int find_unbound_irq(void)
|
||||||
{
|
{
|
||||||
struct irq_data *data;
|
struct irq_data *data;
|
||||||
@ -382,8 +391,8 @@ static int find_unbound_irq(void)
|
|||||||
|
|
||||||
static bool identity_mapped_irq(unsigned irq)
|
static bool identity_mapped_irq(unsigned irq)
|
||||||
{
|
{
|
||||||
/* only identity map legacy irqs */
|
/* identity map all the hardware irqs */
|
||||||
return irq < LEGACY_IRQS;
|
return irq < get_nr_hw_irqs();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pirq_unmask_notify(int irq)
|
static void pirq_unmask_notify(int irq)
|
||||||
@ -552,6 +561,7 @@ int xen_allocate_pirq(unsigned gsi)
|
|||||||
|
|
||||||
if (identity_mapped_irq(gsi)) {
|
if (identity_mapped_irq(gsi)) {
|
||||||
irq = gsi;
|
irq = gsi;
|
||||||
|
irq_to_desc_alloc_node(irq, 0);
|
||||||
dynamic_irq_init(irq);
|
dynamic_irq_init(irq);
|
||||||
} else
|
} else
|
||||||
irq = find_unbound_irq();
|
irq = find_unbound_irq();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user