[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen stable-4.11] x86/domctl: have XEN_DOMCTL_getpageframeinfo3 preemptible



commit 6a4006708f47ec6f5c4ae78fb344c2e5be66e78a
Author:     Anthony PERARD <anthony.perard@xxxxxxxxxx>
AuthorDate: Wed Dec 11 15:26:34 2019 +0100
Commit:     Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Wed Dec 11 15:26:34 2019 +0100

    x86/domctl: have XEN_DOMCTL_getpageframeinfo3 preemptible
    
    This hypercall can take a long time to finish because it attempts to
    grab the `hostp2m' lock up to 1024 times. The accumulated wait for the
    lock can take several seconds.
    
    This can easily happen with a guest with 32 vcpus and plenty of RAM,
    during localhost migration.
    
    While the patch doesn't fix the problem with the lock contention and
    the fact that the `hostp2m' lock is currently global (and not on a
    single page), it is still an improvement to the hypercall. It will in
    particular, down the road, allow dropping the arbitrary limit of 1024
    entries per request.
    
    Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx>
    Acked-by: Jan Beulich <jbeulich@xxxxxxxx>
    master commit: 48599114d3ca24157c25f6684bb9322f6dca12bb
    master date: 2019-11-26 14:16:09 +0100
---
 xen/arch/x86/domctl.c       | 20 ++++++++++++++++++++
 xen/include/public/domctl.h |  4 ++++
 2 files changed, 24 insertions(+)

diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c
index d6fcb3db23..6aa42941b2 100644
--- a/xen/arch/x86/domctl.c
+++ b/xen/arch/x86/domctl.c
@@ -488,6 +488,26 @@ long arch_do_domctl(
                 ret = -EFAULT;
                 break;
             }
+
+            /*
+             * Avoid checking for preemption when the `hostp2m' lock isn't
+             * involve, i.e. non-translated guest, and avoid preemption on
+             * the last iteration.
+             */
+            if ( paging_mode_translate(d) &&
+                 likely((i + 1) < num) && hypercall_preempt_check() )
+            {
+                domctl->u.getpageframeinfo3.num = num - i - 1;
+                domctl->u.getpageframeinfo3.array.p =
+                    guest_handle + ((i + 1) * width);
+                if ( __copy_to_guest(u_domctl, domctl, 1) )
+                {
+                    ret = -EFAULT;
+                    break;
+                }
+                return hypercall_create_continuation(__HYPERVISOR_domctl,
+                                                     "h", u_domctl);
+            }
         }
 
         break;
diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h
index 0535da81c6..0ab9fa0f85 100644
--- a/xen/include/public/domctl.h
+++ b/xen/include/public/domctl.h
@@ -138,6 +138,10 @@ DEFINE_XEN_GUEST_HANDLE(xen_domctl_getdomaininfo_t);
 #define XEN_DOMCTL_PFINFO_LTAB_MASK (0xfU<<28)
 
 /* XEN_DOMCTL_getpageframeinfo3 */
+/*
+ * Both value `num' and `array' may get modified by the hypercall to allow
+ * preemption.
+ */
 struct xen_domctl_getpageframeinfo3 {
     /* IN variables. */
     uint64_aligned_t num;
--
generated by git-patchbot for /home/xen/git/xen.git#stable-4.11

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/xen-changelog

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.