From: Andrew Cooper Date: Thu, 10 Aug 2017 11:35:22 +0000 (+0100) Subject: Fix xtf_init_grant_table() to actually work on older versions of Xen X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=11ae3010a30c89a6aef762dd03727a5b49e9d8d8;p=people%2Fandrewcoop%2Fxen-test-framework.git Fix xtf_init_grant_table() to actually work on older versions of Xen (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 --- diff --git a/common/grant_table.c b/common/grant_table.c index 15cd966..344cfe2 100644 --- a/common/grant_table.c +++ b/common/grant_table.c @@ -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 ) {