aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/irq.c
diff options
context:
space:
mode:
authorAndrew Cooper <andrew.cooper3@citrix.com>2011-09-05 15:08:38 +0100
committerAndrew Cooper <andrew.cooper3@citrix.com>2011-09-05 15:08:38 +0100
commit8d8bc3af8818ca8c3c4b2d20f898084cff8ac3cb (patch)
tree4272fbff63b03b4c9a6808c566c746ed734d859b /xen/arch/x86/irq.c
parent0ba296917d257c87dbfb71a77cf20768c7e084ce (diff)
downloadxen-8d8bc3af8818ca8c3c4b2d20f898084cff8ac3cb.tar.gz
xen-8d8bc3af8818ca8c3c4b2d20f898084cff8ac3cb.tar.bz2
xen-8d8bc3af8818ca8c3c4b2d20f898084cff8ac3cb.zip
IRQ: Fold irq_status into irq_cfg
irq_status is an int for each of nr_irqs which represents a single boolean variable. Fold it into the bitfield in irq_cfg, which saves 768 bytes per CPU with per-cpu IDTs in use. Signed-off-by Andrew Cooper <andrew.cooper3@citrix.com>
Diffstat (limited to 'xen/arch/x86/irq.c')
-rw-r--r--xen/arch/x86/irq.c28
1 files changed, 7 insertions, 21 deletions
diff --git a/xen/arch/x86/irq.c b/xen/arch/x86/irq.c
index 24bd74b551..4357389c5a 100644
--- a/xen/arch/x86/irq.c
+++ b/xen/arch/x86/irq.c
@@ -43,11 +43,6 @@ vmask_t global_used_vector_map;
u8 __read_mostly *irq_vector;
struct irq_desc __read_mostly *irq_desc = NULL;
-int __read_mostly *irq_status = NULL;
-#define IRQ_UNUSED (0)
-#define IRQ_USED (1)
-#define IRQ_RSVD (2)
-
#define IRQ_VECTOR_UNASSIGNED (0)
static DECLARE_BITMAP(used_vectors, NR_VECTORS);
@@ -141,7 +136,7 @@ static int __init __bind_irq_vector(int irq, int vector, cpumask_t cpu_mask)
ASSERT(!test_bit(vector, cfg->used_vectors));
set_bit(vector, cfg->used_vectors);
}
- irq_status[irq] = IRQ_USED;
+ cfg->used = IRQ_USED;
if (IO_APIC_IRQ(irq))
irq_vector[irq] = vector;
return 0;
@@ -163,7 +158,7 @@ static inline int find_unassigned_irq(void)
int irq;
for (irq = nr_irqs_gsi; irq < nr_irqs; irq++)
- if (irq_status[irq] == IRQ_UNUSED)
+ if (irq_cfg[irq].used == IRQ_UNUSED)
return irq;
return -ENOSPC;
}
@@ -215,8 +210,6 @@ static void dynamic_irq_cleanup(unsigned int irq)
xfree(action);
}
-static void init_one_irq_status(int irq);
-
static void __clear_irq_vector(int irq)
{
int cpu, vector;
@@ -235,7 +228,7 @@ static void __clear_irq_vector(int irq)
cfg->vector = IRQ_VECTOR_UNASSIGNED;
cpus_clear(cfg->cpu_mask);
- init_one_irq_status(irq);
+ cfg->used = IRQ_UNUSED;
if (likely(!cfg->move_in_progress))
return;
@@ -307,17 +300,13 @@ static void __init init_one_irq_desc(struct irq_desc *desc)
INIT_LIST_HEAD(&desc->rl_link);
}
-static void init_one_irq_status(int irq)
-{
- irq_status[irq] = IRQ_UNUSED;
-}
-
static void __init init_one_irq_cfg(struct irq_cfg *cfg)
{
cfg->vector = IRQ_VECTOR_UNASSIGNED;
cpus_clear(cfg->cpu_mask);
cpus_clear(cfg->old_cpu_mask);
cfg->used_vectors = NULL;
+ cfg->used = IRQ_UNUSED;
}
int __init init_irq_data(void)
@@ -331,15 +320,13 @@ int __init init_irq_data(void)
irq_desc = xmalloc_array(struct irq_desc, nr_irqs);
irq_cfg = xmalloc_array(struct irq_cfg, nr_irqs);
- irq_status = xmalloc_array(int, nr_irqs);
irq_vector = xmalloc_array(u8, nr_irqs_gsi);
- if ( !irq_desc || !irq_cfg || !irq_status ||! irq_vector )
+ if ( !irq_desc || !irq_cfg ||! irq_vector )
return -ENOMEM;
memset(irq_desc, 0, nr_irqs * sizeof(*irq_desc));
memset(irq_cfg, 0, nr_irqs * sizeof(*irq_cfg));
- memset(irq_status, 0, nr_irqs * sizeof(*irq_status));
memset(irq_vector, 0, nr_irqs_gsi * sizeof(*irq_vector));
for (irq = 0; irq < nr_irqs; irq++) {
@@ -349,7 +336,6 @@ int __init init_irq_data(void)
desc->chip_data = cfg;
init_one_irq_desc(desc);
init_one_irq_cfg(cfg);
- init_one_irq_status(irq);
}
/* Never allocate the hypercall vector or Linux/BSD fast-trap vector. */
@@ -459,7 +445,7 @@ int __assign_irq_vector(int irq, struct irq_cfg *cfg, const cpumask_t *mask)
/* This is the only place normal IRQs are ever marked
* as "in use". If they're not in use yet, check to see
* if we need to assign a global vector mask. */
- if ( irq_status[irq] == IRQ_USED )
+ if ( cfg->used == IRQ_USED )
{
irq_used_vectors = cfg->used_vectors;
}
@@ -512,7 +498,7 @@ next:
cfg->vector = vector;
cpus_copy(cfg->cpu_mask, tmp_mask);
- irq_status[irq] = IRQ_USED;
+ cfg->used = IRQ_USED;
ASSERT((cfg->used_vectors == NULL)
|| (cfg->used_vectors == irq_used_vectors));
cfg->used_vectors = irq_used_vectors;