[kvm-unit-tests GIT PULL 4/9] s390x: Test for share/unshare call support before using them

Janosch Frank
2021-05-26T14:56:04Z

Testing for facility only means the UV Call facility is available.
The UV will only indicate the share/unshare calls for a protected
guest 2, so lets also check that.

Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Acked-by: Thomas Huth <thuth@redhat.com>
---
lib/s390x/malloc_io.c | 5 +++--
s390x/uv-guest.c | 6 ++++++
2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/lib/s390x/malloc_io.c b/lib/s390x/malloc_io.c
index 1dcf1691..78582eac 100644
--- a/lib/s390x/malloc_io.c
+++ b/lib/s390x/malloc_io.c
@@ -19,6 +19,7 @@
#include <alloc_page.h>
#include <asm/facility.h>
#include <bitops.h>
+#include <uv.h>

static int share_pages(void *p, int count)
{
@@ -47,7 +48,7 @@ void *alloc_io_mem(int size, int flags)
assert(size);

p = alloc_pages_flags(order, AREA_DMA31 | flags);
- if (!p || !test_facility(158))
+ if (!p || !uv_os_is_guest())
return p;

n = share_pages(p, 1 << order);
@@ -65,7 +66,7 @@ void free_io_mem(void *p, int size)

assert(IS_ALIGNED((uintptr_t)p, PAGE_SIZE));

- if (test_facility(158))
+ if (uv_os_is_guest())
unshare_pages(p, 1 << order);
free_pages(p);
}
diff --git a/s390x/uv-guest.c b/s390x/uv-guest.c
index 393d7f5c..e99029a7 100644
--- a/s390x/uv-guest.c
+++ b/s390x/uv-guest.c
@@ -16,6 +16,7 @@
#include <asm/facility.h>
#include <asm/uv.h>
#include <sclp.h>
+#include <uv.h>

static unsigned long page;

@@ -142,6 +143,11 @@ int main(void)
goto done;
}

+ if (!uv_os_is_guest()) {
+ report_skip("Not a protected guest");
+ goto done;
+ }
+
page = (unsigned long)alloc_page();
test_priv();
test_invalid();
--
2.31.1