All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] libxc: Pause & unpause the domain in xc_mem_event_enable based on its initial state.
@ 2014-06-30 13:45 Tamas K Lengyel
  2014-06-30 14:21 ` Andrew Cooper
  0 siblings, 1 reply; 8+ messages in thread
From: Tamas K Lengyel @ 2014-06-30 13:45 UTC (permalink / raw)
  To: xen-devel; +Cc: Tamas K Lengyel, ian.jackson, ian.campbell, stefano.stabellini

In an attempt to mitigate XSA-99, xc_mem_event_enable ensures that the domain is paused
for the duration of the event ring setup. However, it disregards the initial state of
the domain, which might already be paused, resulting in 1) an uneccessary hypercall to
pause it again and 2) unpauses it unconditionally which is an opaque and potentially
unwanted side-effect. This patch fixes both issues.

Signed-off-by: Tamas K Lengyel <tamas.k.lengyel@tum.de>
---
 tools/libxc/xc_mem_event.c | 30 +++++++++++++++++++++++++-----
 1 file changed, 25 insertions(+), 5 deletions(-)

diff --git a/tools/libxc/xc_mem_event.c b/tools/libxc/xc_mem_event.c
index 0b2eecb..5cf74d0 100644
--- a/tools/libxc/xc_mem_event.c
+++ b/tools/libxc/xc_mem_event.c
@@ -62,6 +62,7 @@ void *xc_mem_event_enable(xc_interface *xch, domid_t domain_id, int param,
     void *ring_page = NULL;
     unsigned long pfn;
     xen_pfn_t ring_pfn, mmap_pfn;
+    xc_domaininfo_t dom_info;
     unsigned int op, mode;
     int rc1, rc2, saved_errno;
 
@@ -71,14 +72,24 @@ void *xc_mem_event_enable(xc_interface *xch, domid_t domain_id, int param,
         return NULL;
     }
 
-    /* Pause the domain for ring page setup */
-    rc1 = xc_domain_pause(xch, domain_id);
-    if ( rc1 != 0 )
+    rc1 = xc_domain_getinfolist(xch, domain_id, 1, &dom_info);
+    if ( rc1 != 1 || dom_info.domain != domain_id )
     {
-        PERROR("Unable to pause domain\n");
+        PERROR("Error getting domain info\n");
         return NULL;
     }
 
+    /* Pause the domain for ring page setup if it isn't already */
+    if( !(dom_info.flags & XEN_DOMINF_paused) )
+    {
+        rc1 = xc_domain_pause(xch, domain_id);
+        if ( rc1 != 0 )
+        {
+            PERROR("Unable to pause domain\n");
+            return NULL;
+        }
+    }
+
     /* Get the pfn of the ring page */
     rc1 = xc_get_hvm_param(xch, domain_id, param, &pfn);
     if ( rc1 != 0 )
@@ -154,7 +165,16 @@ void *xc_mem_event_enable(xc_interface *xch, domid_t domain_id, int param,
  out:
     saved_errno = errno;
 
-    rc2 = xc_domain_unpause(xch, domain_id);
+    /* Only unpause the domain if it was running originally */
+    if( !(dom_info.flags & XEN_DOMINF_paused) )
+    {
+        rc2 = xc_domain_unpause(xch, domain_id);
+    }
+    else
+    {
+        rc2 = 0;
+    }
+
     if ( rc1 != 0 || rc2 != 0 )
     {
         if ( rc2 != 0 )
-- 
2.0.0

^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2014-07-01 16:35 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-06-30 13:45 [PATCH] libxc: Pause & unpause the domain in xc_mem_event_enable based on its initial state Tamas K Lengyel
2014-06-30 14:21 ` Andrew Cooper
2014-06-30 14:33   ` Tamas K Lengyel
2014-06-30 14:40     ` Andrew Cooper
2014-06-30 14:46       ` Tamas K Lengyel
     [not found]         ` <CAGU+auv8ESpyu2QaE=_kO2AxuNrkn0AdyDzr2QOv5A01V3SEEA@mail.gmail.com>
2014-06-30 22:54           ` Aravindh Puthiyaparambil (aravindp)
2014-07-01  8:02             ` Jan Beulich
2014-07-01 16:35               ` Aravindh Puthiyaparambil (aravindp)

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.