|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen master] x86/IRQ: reduce casting involved in guest action retrieval
commit a00b271677bfa6365cd0446e09a0f41017e166d3
Author: Jan Beulich <jbeulich@xxxxxxxx>
AuthorDate: Fri Dec 4 13:17:24 2020 +0100
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Fri Dec 4 13:17:24 2020 +0100
x86/IRQ: reduce casting involved in guest action retrieval
Introduce a helper function covering both the IRQ_GUEST check and the
cast involved in obtaining the (correctly typed) pointer. Where possible
add const and/or reduce variable scope.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Wei Liu <wl@xxxxxxx>
---
xen/arch/x86/irq.c | 76 ++++++++++++++++++++++--------------------------------
1 file changed, 31 insertions(+), 45 deletions(-)
diff --git a/xen/arch/x86/irq.c b/xen/arch/x86/irq.c
index 0f2c491edc..3387c1b5c3 100644
--- a/xen/arch/x86/irq.c
+++ b/xen/arch/x86/irq.c
@@ -1042,6 +1042,11 @@ typedef struct {
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.
@@ -1111,11 +1116,9 @@ static void irq_guest_eoi_timer_fn(void *data)
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);
/*
@@ -1351,16 +1354,15 @@ static void flush_ready_eoi(void)
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;
@@ -1400,18 +1402,11 @@ void pirq_guest_eoi(struct pirq *pirq)
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);
@@ -1510,8 +1505,8 @@ static int irq_acktype(const struct irq_desc *desc)
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;
@@ -1519,8 +1514,8 @@ int pirq_shared(struct domain *d, int pirq)
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);
@@ -1544,9 +1539,7 @@ int pirq_guest_bind(struct vcpu *v, struct pirq *pirq,
int will_share)
goto out;
}
- action = (irq_guest_action_t *)desc->action;
-
- if ( !(desc->status & IRQ_GUEST) )
+ if ( !(action = guest_action(desc)) )
{
if ( desc->action != NULL )
{
@@ -1659,21 +1652,18 @@ int pirq_guest_bind(struct vcpu *v, struct pirq *pirq,
int will_share)
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);
@@ -1793,14 +1783,12 @@ static bool pirq_guest_force_unbind(struct domain *d,
struct pirq *pirq)
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;
}
@@ -1827,7 +1815,7 @@ static bool pirq_guest_force_unbind(struct domain *d,
struct pirq *pirq)
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);
@@ -2444,7 +2432,6 @@ static void dump_irqs(unsigned char key)
{
int i, irq, pirq;
struct irq_desc *desc;
- irq_guest_action_t *action;
struct domain *d;
const struct pirq *info;
unsigned long flags;
@@ -2454,6 +2441,8 @@ static void dump_irqs(unsigned char key)
for ( irq = 0; irq < nr_irqs; irq++ )
{
+ const irq_guest_action_t *action;
+
if ( !(irq & 0x1f) )
process_pending_softirqs();
@@ -2473,10 +2462,9 @@ static void dump_irqs(unsigned char key)
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');
@@ -2651,17 +2639,15 @@ void fixup_irqs(const cpumask_t *mask, bool verbose)
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);
}
--
generated by git-patchbot for /home/xen/git/xen.git#master
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |