From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932609Ab0JLPq3 (ORCPT ); Tue, 12 Oct 2010 11:46:29 -0400 Received: from rcsinet10.oracle.com ([148.87.113.121]:27770 "EHLO rcsinet10.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757505Ab0JLPq1 (ORCPT >); Tue, 12 Oct 2010 11:46:27 -0400 From: Konrad Rzeszutek Wilk To: linux-kernel@vger.kernel.org Cc: Jan Beulich , xen-devel@lists.xensource.com, Jeremy Fitzhardinge , Konrad Rzeszutek Wilk , Stefano Stabellini , Jeremy Fitzhardinge , Konrad Rzeszutek Wilk Subject: [PATCH 05/23] xen: identity map gsi->irqs Date: Tue, 12 Oct 2010 11:44:13 -0400 Message-Id: <1286898271-32018-6-git-send-email-konrad.wilk@oracle.com> X-Mailer: git-send-email 1.7.0.4 In-Reply-To: <1286898271-32018-1-git-send-email-konrad.wilk@oracle.com> References: <1286898271-32018-1-git-send-email-konrad.wilk@oracle.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Jeremy Fitzhardinge Impact: preserve compat with native Reserve the lower irq range for use for hardware interrupts so we can identity-map them. Signed-off-by: Jeremy Fitzhardinge Signed-off-by: Konrad Rzeszutek Wilk --- drivers/xen/events.c | 23 +++++++++++++++++------ 1 files changed, 17 insertions(+), 6 deletions(-) diff --git a/drivers/xen/events.c b/drivers/xen/events.c index b8f030a..8eeb808 100644 --- a/drivers/xen/events.c +++ b/drivers/xen/events.c @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -46,9 +47,6 @@ #include #include -/* Leave low irqs free for identity mapping */ -#define LEGACY_IRQS 16 - /* * 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. @@ -351,12 +349,24 @@ static void unmask_evtchn(int port) 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) { int irq; struct irq_desc *desc; + int start = get_nr_hw_irqs(); - for (irq = 0; irq < nr_irqs; irq++) { + for (irq = start; irq < nr_irqs; irq++) { desc = irq_to_desc(irq); /* only 0->15 have init'd desc; handle irq > 16 */ if (desc == NULL) @@ -383,8 +393,8 @@ static int find_unbound_irq(void) static bool identity_mapped_irq(unsigned irq) { - /* only identity map legacy irqs */ - return irq < LEGACY_IRQS; + /* identity map all the hardware irqs */ + return irq < get_nr_hw_irqs(); } static void pirq_unmask_notify(int irq) @@ -553,6 +563,7 @@ int xen_allocate_pirq(unsigned gsi) if (identity_mapped_irq(gsi)) { irq = gsi; + irq_to_desc_alloc_node(irq, 0); dynamic_irq_init(irq); } else irq = find_unbound_irq(); -- 1.7.0.4