x86/IRQ: move and rename __do_IRQ_guest()

This is for it to be next to do_IRQ(). Beyond the actual code movement
this
- drops the leading underscores,
- passes in desc and vector, rather than irq,
- flips the order of two ASSERT()s,
- changes i and sp to unsigned int,
- restricts the scope of d and sp,
- corrects style.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
This commit is contained in:
Jan Beulich committed 2019-12-27 09:52:41 +01:00
1 parent 160e7544d6
commit 189da94865
1 file changed
+56 -59
+56 -59
View File
@@ -1144,64 +1144,6 @@ static void irq_guest_eoi_timer_fn(void *data)
spin_unlock_irq(&desc->lock);
}
static void __do_IRQ_guest(int irq)
{
struct irq_desc *desc = irq_to_desc(irq);
irq_guest_action_t *action = (irq_guest_action_t *)desc->action;
struct domain *d;
int i, sp;
struct pending_eoi *peoi = this_cpu(pending_eoi);
unsigned int vector = (u8)get_irq_regs()->entry_vector;
if ( unlikely(action->nr_guests == 0) )
{
/* An interrupt may slip through while freeing an ACKTYPE_EOI irq. */
ASSERT(action->ack_type == ACKTYPE_EOI);
ASSERT(desc->status & IRQ_DISABLED);
if ( desc->handler->end )
desc->handler->end(desc, vector);
return;
}
/*
* Stop the timer as soon as we're certain we'll set it again further down,
* to prevent the current timeout (if any) to needlessly expire.
*/
if ( action->ack_type != ACKTYPE_NONE )
stop_timer(&action->eoi_timer);
if ( action->ack_type == ACKTYPE_EOI )
{
sp = pending_eoi_sp(peoi);
ASSERT((sp == 0) || (peoi[sp-1].vector < vector));
ASSERT(sp < (NR_DYNAMIC_VECTORS-1));
peoi[sp].irq = irq;
peoi[sp].vector = vector;
peoi[sp].ready = 0;
pending_eoi_sp(peoi) = sp+1;
cpumask_set_cpu(smp_processor_id(), action->cpu_eoi_map);
}
for ( i = 0; i < action->nr_guests; i++ )
{
struct pirq *pirq;
d = action->guest[i];
pirq = pirq_info(d, domain_irq_to_pirq(d, irq));
if ( (action->ack_type != ACKTYPE_NONE) &&
!test_and_set_bool(pirq->masked) )
action->in_flight++;
if ( !is_hvm_domain(d) || !hvm_do_IRQ_dpci(d, pirq) )
send_guest_pirq(d, pirq);
}
if ( action->ack_type != ACKTYPE_NONE )
{
migrate_timer(&action->eoi_timer, smp_processor_id());
set_timer(&action->eoi_timer, NOW() + MILLISECS(1));
}
}
/*
* Retrieve Xen irq-descriptor corresponding to a domain-specific irq.
* The descriptor is returned locked. This function is safe against changes
@@ -1870,6 +1812,61 @@ static bool pirq_guest_force_unbind(struct domain *d, struct pirq *pirq)
return bound;
}
static void do_IRQ_guest(struct irq_desc *desc, unsigned int vector)
{
irq_guest_action_t *action = (irq_guest_action_t *)desc->action;
unsigned int i;
struct pending_eoi *peoi = this_cpu(pending_eoi);
if ( unlikely(!action->nr_guests) )
{
/* An interrupt may slip through while freeing an ACKTYPE_EOI irq. */
ASSERT(action->ack_type == ACKTYPE_EOI);
ASSERT(desc->status & IRQ_DISABLED);
if ( desc->handler->end )
desc->handler->end(desc, vector);
return;
}
/*
* Stop the timer as soon as we're certain we'll set it again further down,
* to prevent the current timeout (if any) to needlessly expire.
*/
if ( action->ack_type != ACKTYPE_NONE )
stop_timer(&action->eoi_timer);
if ( action->ack_type == ACKTYPE_EOI )
{
unsigned int sp = pending_eoi_sp(peoi);
ASSERT(sp < (NR_DYNAMIC_VECTORS - 1));
ASSERT(!sp || (peoi[sp - 1].vector < vector));
peoi[sp].irq = desc->irq;
peoi[sp].vector = vector;
peoi[sp].ready = 0;
pending_eoi_sp(peoi) = sp + 1;
cpumask_set_cpu(smp_processor_id(), action->cpu_eoi_map);
}
for ( i = 0; i < action->nr_guests; i++ )
{
struct domain *d = action->guest[i];
struct pirq *pirq = pirq_info(d, domain_irq_to_pirq(d, desc->irq));;
if ( (action->ack_type != ACKTYPE_NONE) &&
!test_and_set_bool(pirq->masked) )
action->in_flight++;
if ( !is_hvm_domain(d) || !hvm_do_IRQ_dpci(d, pirq) )
send_guest_pirq(d, pirq);
}
if ( action->ack_type != ACKTYPE_NONE )
{
migrate_timer(&action->eoi_timer, smp_processor_id());
set_timer(&action->eoi_timer, NOW() + MILLISECS(1));
}
}
void do_IRQ(struct cpu_user_regs *regs)
{
struct irqaction *action;
@@ -1954,7 +1951,7 @@ void do_IRQ(struct cpu_user_regs *regs)
}
tsc_in = tb_init_done ? get_cycles() : 0;
__do_IRQ_guest(irq);
do_IRQ_guest(desc, vector);
TRACE_3D(TRC_HW_IRQ_HANDLED, irq, tsc_in, get_cycles());
goto out_no_end;
}
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.