[PATCH 34 of 38] xen: remove irq bindcount

From: Jeremy Fitzhardinge
Date: Thu Nov 13 2008 - 14:47:39 EST


There should be no need for us to maintain our own bind count for
irqs, since the surrounding irq system should keep track of shared
irqs for us.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@xxxxxxxxxx>
---
drivers/xen/events.c | 26 +++++++-------------------
1 file changed, 7 insertions(+), 19 deletions(-)

diff --git a/drivers/xen/events.c b/drivers/xen/events.c
--- a/drivers/xen/events.c
+++ b/drivers/xen/events.c
@@ -53,7 +53,7 @@

/* Interrupt types. */
enum xen_irq_type {
- IRQT_UNBOUND,
+ IRQT_UNBOUND = 0,
IRQT_PIRQ,
IRQT_VIRQ,
IRQT_IPI,
@@ -94,9 +94,6 @@
};
static unsigned long cpu_evtchn_mask[NR_CPUS][NR_EVENT_CHANNELS/BITS_PER_LONG];

-/* Reference counts for bindings to IRQs. */
-static int irq_bindcount[NR_IRQS];
-
/* Xen will never allocate port zero for any purpose. */
#define VALID_EVTCHN(chn) ((chn) != 0)

@@ -320,9 +317,8 @@
{
int irq;

- /* Only allocate from dynirq range */
for_each_irq_nr(irq)
- if (irq_bindcount[irq] == 0)
+ if (irq_info[irq].type == IRQT_UNBOUND)
break;

if (irq == nr_irqs)
@@ -351,8 +347,6 @@
irq_info[irq] = mk_evtchn_info(evtchn);
}

- irq_bindcount[irq]++;
-
spin_unlock(&irq_mapping_update_lock);

return irq;
@@ -389,8 +383,6 @@
bind_evtchn_to_cpu(evtchn, cpu);
}

- irq_bindcount[irq]++;
-
out:
spin_unlock(&irq_mapping_update_lock);
return irq;
@@ -427,8 +419,6 @@
bind_evtchn_to_cpu(evtchn, cpu);
}

- irq_bindcount[irq]++;
-
spin_unlock(&irq_mapping_update_lock);

return irq;
@@ -441,7 +431,7 @@

spin_lock(&irq_mapping_update_lock);

- if ((--irq_bindcount[irq] == 0) && VALID_EVTCHN(evtchn)) {
+ if (VALID_EVTCHN(evtchn)) {
close.port = evtchn;
if (HYPERVISOR_event_channel_op(EVTCHNOP_close, &close) != 0)
BUG();
@@ -667,6 +657,8 @@
/* Rebind a new event channel to an existing irq. */
void rebind_evtchn_irq(int evtchn, int irq)
{
+ struct irq_info *info = info_for_irq(irq);
+
/* Make sure the irq is masked, since the new event channel
will also be masked. */
disable_irq(irq);
@@ -676,8 +668,8 @@
/* After resume the irq<->evtchn mappings are all cleared out */
BUG_ON(evtchn_to_irq[evtchn] != -1);
/* Expect irq to have been bound before,
- so the bindcount should be non-0 */
- BUG_ON(irq_bindcount[irq] == 0);
+ so there should be a proper type */
+ BUG_ON(info->type != IRQT_UNBOUND);

evtchn_to_irq[evtchn] = irq;
irq_info[irq] = mk_evtchn_info(evtchn);
@@ -930,9 +922,5 @@
for (i = 0; i < NR_EVENT_CHANNELS; i++)
mask_evtchn(i);

- /* Dynamic IRQ space is currently unbound. Zero the refcnts. */
- for_each_irq_nr(i)
- irq_bindcount[i] = 0;
-
irq_ctx_init(smp_processor_id());
}


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/