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

[xen stable-4.12] xen/grants: fix hypercall continuation for GNTTABOP_cache_flush



commit 9756cbede6772a2c4b225fef4875be65ef75e1f7
Author:     Juergen Gross <jgross@xxxxxxxx>
AuthorDate: Thu May 7 14:53:13 2020 +0200
Commit:     Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Thu May 7 14:53:13 2020 +0200

    xen/grants: fix hypercall continuation for GNTTABOP_cache_flush
    
    The GNTTABOP_cache_flush hypercall has a wrong test for hypercall
    continuation, the test today is:
    
        if ( rc > 0 || opaque_out != 0 )
    
    Unfortunately this will be true even in case of an error (rc < 0),
    possibly leading to very long lasting hypercalls (times of more
    than an hour have been observed in a test case).
    
    Correct the test condition to result in false with rc < 0 and set
    opaque_out only if no error occurred, to be on the safe side.
    
    Partially-suggested-by: Jan Beulich <jbeulich@xxxxxxxx>
    Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
    Reviewed-by: Julien Grall <jgrall@xxxxxxxxxx>
    Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
    master commit: 46d8f69d466a05863737fb81d8c9ef39c3be8b45
    master date: 2020-04-29 14:12:50 +0100
---
 xen/common/grant_table.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c
index 38d5524a0e..1adb173e06 100644
--- a/xen/common/grant_table.c
+++ b/xen/common/grant_table.c
@@ -3571,12 +3571,12 @@ do_grant_table_op(
         if ( unlikely(!guest_handle_okay(cflush, count)) )
             goto out;
         rc = gnttab_cache_flush(cflush, &opaque_in, count);
-        if ( rc > 0 )
+        if ( rc >= 0 )
         {
             guest_handle_add_offset(cflush, rc);
             uop = guest_handle_cast(cflush, void);
+            opaque_out = opaque_in;
         }
-        opaque_out = opaque_in;
         break;
     }
 
@@ -3586,7 +3586,7 @@ do_grant_table_op(
     }
 
   out:
-    if ( rc > 0 || opaque_out != 0 )
+    if ( rc > 0 || (opaque_out != 0 && rc == 0) )
     {
         /* Adjust rc, see gnttab_copy() for why this is needed. */
         if ( cmd == GNTTABOP_copy )
--
generated by git-patchbot for /home/xen/git/xen.git#stable-4.12



 


Rackspace

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