mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
pass-through: adjust pIRQ migration
For one it is quite pointless to iterate over all pIRQ-s the domain has when just one is being adjusted. Introduce hvm_migrate_pirq() as an externally accessible function. Additionally it is bogus to migrate the pIRQ to a vCPU different from the one the event is supposed to be posted to - if anything, it might be worth considering not to migrate the pIRQ at all in the posting case. Signed-off-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Kevin Tian <kevin.tian@intel.com> Reviewed-by: Wei Liu <wei.liu2@citrix.com> Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
This commit is contained in:
1 parent
e2d3f0e8d1
commit
782cf8ba46
3 files changed
+13
-7
No files matched your search
+10
-5
@@ -462,10 +462,9 @@ void hvm_migrate_timers(struct vcpu *v)
|
||||
pt_migrate(v);
|
||||
}
|
||||
|
||||
static int hvm_migrate_pirq(struct domain *d, struct hvm_pirq_dpci *pirq_dpci,
|
||||
void *arg)
|
||||
void hvm_migrate_pirq(struct hvm_pirq_dpci *pirq_dpci, const struct vcpu *v)
|
||||
{
|
||||
struct vcpu *v = arg;
|
||||
ASSERT(iommu_enabled && hvm_domain_irq(v->domain)->dpci);
|
||||
|
||||
if ( (pirq_dpci->flags & HVM_IRQ_DPCI_MACH_MSI) &&
|
||||
/* Needn't migrate pirq if this pirq is delivered to guest directly.*/
|
||||
@@ -476,11 +475,17 @@ static int hvm_migrate_pirq(struct domain *d, struct hvm_pirq_dpci *pirq_dpci,
|
||||
pirq_spin_lock_irq_desc(dpci_pirq(pirq_dpci), NULL);
|
||||
|
||||
if ( !desc )
|
||||
return 0;
|
||||
return;
|
||||
ASSERT(MSI_IRQ(desc - irq_desc));
|
||||
irq_set_affinity(desc, cpumask_of(v->processor));
|
||||
spin_unlock_irq(&desc->lock);
|
||||
}
|
||||
}
|
||||
|
||||
static int migrate_pirq(struct domain *d, struct hvm_pirq_dpci *pirq_dpci,
|
||||
void *arg)
|
||||
{
|
||||
hvm_migrate_pirq(pirq_dpci, arg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -493,7 +498,7 @@ void hvm_migrate_pirqs(struct vcpu *v)
|
||||
return;
|
||||
|
||||
spin_lock(&d->event_lock);
|
||||
pt_pirq_iterate(d, hvm_migrate_pirq, v);
|
||||
pt_pirq_iterate(d, migrate_pirq, v);
|
||||
spin_unlock(&d->event_lock);
|
||||
}
|
||||
|
||||
|
||||
@@ -434,8 +434,8 @@ int pt_irq_create_bind(
|
||||
if ( vcpu )
|
||||
pirq_dpci->gmsi.posted = true;
|
||||
}
|
||||
if ( dest_vcpu_id >= 0 )
|
||||
hvm_migrate_pirqs(d->vcpu[dest_vcpu_id]);
|
||||
if ( vcpu && iommu_enabled )
|
||||
hvm_migrate_pirq(pirq_dpci, vcpu);
|
||||
|
||||
/* Use interrupt posting if it is supported. */
|
||||
if ( iommu_intpost )
|
||||
|
||||
@@ -288,6 +288,7 @@ bool hvm_set_guest_bndcfgs(struct vcpu *v, u64 val);
|
||||
bool hvm_check_cpuid_faulting(struct vcpu *v);
|
||||
void hvm_migrate_timers(struct vcpu *v);
|
||||
void hvm_do_resume(struct vcpu *v);
|
||||
void hvm_migrate_pirq(struct hvm_pirq_dpci *pirq_dpci, const struct vcpu *v);
|
||||
void hvm_migrate_pirqs(struct vcpu *v);
|
||||
|
||||
void hvm_inject_event(const struct x86_event *event);
|
||||
|
||||