struct domain *guest[IRQ_MAX_GUESTS];
} irq_guest_action_t;
+static irq_guest_action_t *guest_action(const struct irq_desc *desc)
+{
+ return desc->status & IRQ_GUEST ? (void *)desc->action : NULL;
+}
+
/*
* Stack of interrupts awaiting EOI on each CPU. These must be popped in
* order, as only the current highest-priority pending irq can be EOIed.
spin_lock_irq(&desc->lock);
- if ( !(desc->status & IRQ_GUEST) )
+ if ( !(action = guest_action(desc)) )
goto out;
- action = (irq_guest_action_t *)desc->action;
-
ASSERT(action->ack_type != ACKTYPE_NONE);
/*
pending_eoi_sp(peoi) = sp+1;
}
-static void __set_eoi_ready(struct irq_desc *desc)
+static void __set_eoi_ready(const struct irq_desc *desc)
{
- irq_guest_action_t *action = (irq_guest_action_t *)desc->action;
+ irq_guest_action_t *action = guest_action(desc);
struct pending_eoi *peoi = this_cpu(pending_eoi);
int irq, sp;
irq = desc - irq_desc;
- if ( !(desc->status & IRQ_GUEST) ||
- (action->in_flight != 0) ||
+ if ( !action || action->in_flight ||
!cpumask_test_and_clear_cpu(smp_processor_id(),
action->cpu_eoi_map) )
return;
void desc_guest_eoi(struct irq_desc *desc, struct pirq *pirq)
{
- irq_guest_action_t *action;
+ irq_guest_action_t *action = guest_action(desc);
cpumask_t cpu_eoi_map;
- if ( !(desc->status & IRQ_GUEST) )
- {
- spin_unlock_irq(&desc->lock);
- return;
- }
-
- action = (irq_guest_action_t *)desc->action;
-
- if ( unlikely(!test_and_clear_bool(pirq->masked)) ||
+ if ( unlikely(!action) ||
+ unlikely(!test_and_clear_bool(pirq->masked)) ||
unlikely(--action->in_flight != 0) )
{
spin_unlock_irq(&desc->lock);
int pirq_shared(struct domain *d, int pirq)
{
- struct irq_desc *desc;
- irq_guest_action_t *action;
+ struct irq_desc *desc;
+ const irq_guest_action_t *action;
unsigned long flags;
int shared;
if ( desc == NULL )
return 0;
- action = (irq_guest_action_t *)desc->action;
- shared = ((desc->status & IRQ_GUEST) && (action->nr_guests > 1));
+ action = guest_action(desc);
+ shared = (action && (action->nr_guests > 1));
spin_unlock_irqrestore(&desc->lock, flags);
goto out;
}
- action = (irq_guest_action_t *)desc->action;
-
- if ( !(desc->status & IRQ_GUEST) )
+ if ( !(action = guest_action(desc)) )
{
if ( desc->action != NULL )
{
static irq_guest_action_t *__pirq_guest_unbind(
struct domain *d, struct pirq *pirq, struct irq_desc *desc)
{
- irq_guest_action_t *action;
+ irq_guest_action_t *action = guest_action(desc);
cpumask_t cpu_eoi_map;
int i;
- action = (irq_guest_action_t *)desc->action;
-
if ( unlikely(action == NULL) )
{
dprintk(XENLOG_G_WARNING, "dom%d: pirq %d: desc->action is NULL!\n",
d->domain_id, pirq->pirq);
+ BUG_ON(!(desc->status & IRQ_GUEST));
return NULL;
}
- BUG_ON(!(desc->status & IRQ_GUEST));
-
for ( i = 0; (i < action->nr_guests) && (action->guest[i] != d); i++ )
continue;
BUG_ON(i == action->nr_guests);
desc = pirq_spin_lock_irq_desc(pirq, NULL);
BUG_ON(desc == NULL);
- if ( !(desc->status & IRQ_GUEST) )
- goto out;
-
- action = (irq_guest_action_t *)desc->action;
+ action = guest_action(desc);
if ( unlikely(action == NULL) )
{
- dprintk(XENLOG_G_WARNING, "dom%d: pirq %d: desc->action is NULL!\n",
- d->domain_id, pirq->pirq);
+ if ( desc->status & IRQ_GUEST )
+ dprintk(XENLOG_G_WARNING, "%pd: pirq %d: desc->action is NULL!\n",
+ d, pirq->pirq);
goto out;
}
static void do_IRQ_guest(struct irq_desc *desc, unsigned int vector)
{
- irq_guest_action_t *action = (irq_guest_action_t *)desc->action;
+ irq_guest_action_t *action = guest_action(desc);
unsigned int i;
struct pending_eoi *peoi = this_cpu(pending_eoi);
{
int i, irq, pirq;
struct irq_desc *desc;
- irq_guest_action_t *action;
struct domain *d;
const struct pirq *info;
unsigned long flags;
for ( irq = 0; irq < nr_irqs; irq++ )
{
+ const irq_guest_action_t *action;
+
if ( !(irq & 0x1f) )
process_pending_softirqs();
if ( ssid )
printk("Z=%-25s ", ssid);
- if ( desc->status & IRQ_GUEST )
+ action = guest_action(desc);
+ if ( action )
{
- action = (irq_guest_action_t *)desc->action;
-
printk("in-flight=%d%c",
action->in_flight, action->nr_guests ? ' ' : '\n');
void fixup_eoi(void)
{
unsigned int irq, sp;
- struct irq_desc *desc;
- irq_guest_action_t *action;
struct pending_eoi *peoi;
/* Clean up cpu_eoi_map of every interrupt to exclude this CPU. */
for ( irq = 0; irq < nr_irqs; irq++ )
{
- desc = irq_to_desc(irq);
- if ( !(desc->status & IRQ_GUEST) )
+ irq_guest_action_t *action = guest_action(irq_to_desc(irq));
+
+ if ( !action )
continue;
- action = (irq_guest_action_t *)desc->action;
cpumask_clear_cpu(smp_processor_id(), action->cpu_eoi_map);
}