]> xenbits.xensource.com Git - people/andrewcoop/xen-test-framework.git/commitdiff
Fix xtf_init_grant_table() to actually work on older versions of Xen
authorAndrew Cooper <andrew.cooper3@citrix.com>
Thu, 10 Aug 2017 11:35:22 +0000 (12:35 +0100)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Thu, 10 Aug 2017 11:42:19 +0000 (12:42 +0100)
(Now that such testing has taken place.)

On such versions of Xen, GNTTABOP_set_version will return -ENOSYS even when
trying to set a version of 1.  In such a case, v1 is the only version known to
Xen, so treat this condition non-fatally.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
common/grant_table.c

index 15cd9661a9526cc4e8483dfa102e3f84cb964287..344cfe27d51ae001793ca6e980336767b503711f 100644 (file)
@@ -20,20 +20,30 @@ const char *gntst_strerror(int err)
 
 int xtf_init_grant_table(unsigned int version)
 {
-    struct gnttab_set_version ver = { version };
+    int rc = 0;
 
-    int rc = hypercall_grant_table_op(GNTTABOP_set_version, &ver, 1);
+    static bool set_version_unavailable;
+    if ( !set_version_unavailable )
+    {
+        struct gnttab_set_version ver = { version };
 
-    if ( rc == -ENOSYS )
-        /* Sufficiently old Xen which doesn't support gnttab v2. */
-        return -ENODEV;
+        rc = hypercall_grant_table_op(GNTTABOP_set_version, &ver, 1);
 
-    if ( rc )
-    {
-        printk("%s() GNTTABOP_set_version failed: rc %d\n", __func__, rc);
-        return -EIO;
+        if ( rc == -ENOSYS )
+            /* Hypercall unavailable on older versions of Xen. */
+            set_version_unavailable = true;
+
+        else if ( rc )
+        {
+            printk("%s() GNTTABOP_set_version failed: rc %d\n", __func__, rc);
+            return -EIO;
+        }
     }
 
+    if ( set_version_unavailable && version != 1 )
+        /* Sufficiently old Xen which only knows about gnttab v1. */
+        return -ENODEV;
+
     static bool gnttab_mapped;
     if ( !gnttab_mapped )
     {