|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen master] xen/smp: Support NULL IPI function pointers
commit 06c30ad7662f0c9fc8bc1c356f8aeaa63fb731ec
Author: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
AuthorDate: Wed Nov 17 16:16:23 2021 +0000
Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
CommitDate: Mon Nov 29 13:53:05 2021 +0000
xen/smp: Support NULL IPI function pointers
There are several cases where the act of interrupting a remote processor has
the required side effect. Explicitly allow NULL function pointers so the
calling code doesn't have to provide a stub implementation.
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
---
xen/arch/x86/mm/hap/hap.c | 11 +----------
xen/arch/x86/mm/p2m-ept.c | 11 ++---------
xen/common/smp.c | 6 +++++-
3 files changed, 8 insertions(+), 20 deletions(-)
diff --git a/xen/arch/x86/mm/hap/hap.c b/xen/arch/x86/mm/hap/hap.c
index 73575deb0d..5b269ef8b3 100644
--- a/xen/arch/x86/mm/hap/hap.c
+++ b/xen/arch/x86/mm/hap/hap.c
@@ -696,15 +696,6 @@ static void hap_update_cr3(struct vcpu *v, int do_locking,
bool noflush)
hvm_update_guest_cr3(v, noflush);
}
-/*
- * Dummy function to use with on_selected_cpus in order to trigger a vmexit on
- * selected pCPUs. When the VM resumes execution it will get a new ASID/VPID
- * and thus a clean TLB.
- */
-static void dummy_flush(void *data)
-{
-}
-
static bool flush_tlb(bool (*flush_vcpu)(void *ctxt, struct vcpu *v),
void *ctxt)
{
@@ -737,7 +728,7 @@ static bool flush_tlb(bool (*flush_vcpu)(void *ctxt, struct
vcpu *v),
* not currently running will already be flushed when scheduled because of
* the ASID tickle done in the loop above.
*/
- on_selected_cpus(mask, dummy_flush, NULL, 0);
+ on_selected_cpus(mask, NULL, NULL, 0);
return true;
}
diff --git a/xen/arch/x86/mm/p2m-ept.c b/xen/arch/x86/mm/p2m-ept.c
index b2d57a3ee8..1459f66c00 100644
--- a/xen/arch/x86/mm/p2m-ept.c
+++ b/xen/arch/x86/mm/p2m-ept.c
@@ -1236,14 +1236,6 @@ static void ept_memory_type_changed(struct p2m_domain
*p2m)
ept_sync_domain(p2m);
}
-static void __ept_sync_domain(void *info)
-{
- /*
- * The invalidation will be done before VMENTER (see
- * vmx_vmenter_helper()).
- */
-}
-
static void ept_sync_domain_prepare(struct p2m_domain *p2m)
{
struct domain *d = p2m->domain;
@@ -1269,7 +1261,8 @@ static void ept_sync_domain_prepare(struct p2m_domain
*p2m)
static void ept_sync_domain_mask(struct p2m_domain *p2m, const cpumask_t *mask)
{
- on_selected_cpus(mask, __ept_sync_domain, p2m, 1);
+ /* Invalidation will be done in vmx_vmenter_helper(). */
+ on_selected_cpus(mask, NULL, NULL, 1);
}
void ept_sync_domain(struct p2m_domain *p2m)
diff --git a/xen/common/smp.c b/xen/common/smp.c
index 79f4ebd145..781bcf2c24 100644
--- a/xen/common/smp.c
+++ b/xen/common/smp.c
@@ -87,7 +87,11 @@ void smp_call_function_interrupt(void)
irq_enter();
- if ( call_data.wait )
+ if ( unlikely(!func) )
+ {
+ cpumask_clear_cpu(cpu, &call_data.selected);
+ }
+ else if ( call_data.wait )
{
(*func)(info);
smp_mb();
--
generated by git-patchbot for /home/xen/git/xen.git#master
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |