diff options
Diffstat (limited to 'gnu/packages/patches/strace-kernel-4.16.patch')
-rw-r--r-- | gnu/packages/patches/strace-kernel-4.16.patch | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/gnu/packages/patches/strace-kernel-4.16.patch b/gnu/packages/patches/strace-kernel-4.16.patch new file mode 100644 index 0000000000..e86d3be439 --- /dev/null +++ b/gnu/packages/patches/strace-kernel-4.16.patch @@ -0,0 +1,92 @@ +Fix test failure when using Linux-Libre >= 4.16. + +Taken from upstream: +https://github.com/strace/strace/commit/bcff87c31c0f27c678a43d6b7f67dab363a974fa + +From bcff87c31c0f27c678a43d6b7f67dab363a974fa Mon Sep 17 00:00:00 2001 +From: Masatake YAMATO <yamato@redhat.com> +Date: Wed, 2 May 2018 17:11:07 +0900 +Subject: [PATCH] tests/ioctl_kvm_run.c: handle cpuid at the end of vcpu dentry + +Since Linux 4.16, kernel appends the cpuid as suffix to the entry +for a kvm vcpu in /proc/$pid/fd like: + + anon_inode:kvm-vcpu:0 + +That was + + anon_inode:kvm-vcpu + +This kernel change causes the test case failure on newer kernels. +Update the test to deal with the new name as well as the old one. + +* tests/ioctl_kvm_run.c: Include unistd.h for using readlink(2). +(vcpu_dev_should_have_cpuid): New function for detecting whether +a proc entry for given fd has the cpuid suffix or not. +(main): Trim vcpu_dev to remove the cpuid suffix if needed. +(vcpu_dev): Remove const modifier. +--- + tests/ioctl_kvm_run.c | 29 ++++++++++++++++++++++++++++- + 1 file changed, 28 insertions(+), 1 deletion(-) + +diff --git a/tests/ioctl_kvm_run.c b/tests/ioctl_kvm_run.c +index 179461430..e1bef5796 100644 +--- a/tests/ioctl_kvm_run.c ++++ b/tests/ioctl_kvm_run.c +@@ -40,6 +40,7 @@ + # include <string.h> + # include <sys/ioctl.h> + # include <sys/mman.h> ++# include <unistd.h> + # include <linux/kvm.h> + + static int +@@ -56,7 +57,7 @@ kvm_ioctl(int fd, unsigned long cmd, const char *cmd_str, void *arg) + + static const char dev[] = "/dev/kvm"; + static const char vm_dev[] = "anon_inode:kvm-vm"; +-static const char vcpu_dev[] = "anon_inode:kvm-vcpu"; ++static char vcpu_dev[] = "anon_inode:kvm-vcpu:0"; + static size_t page_size; + + extern const char code[]; +@@ -165,6 +166,23 @@ run_kvm(const int vcpu_fd, struct kvm_run *const run, const size_t mmap_size, + } + } + ++static int ++vcpu_dev_should_have_cpuid(int fd) ++{ ++ int r = 0; ++ char *filename = NULL; ++ char buf[sizeof(vcpu_dev)]; ++ ++ if (asprintf(&filename, "/proc/%d/fd/%d", getpid(), fd) < 0) ++ error_msg_and_fail("asprintf"); ++ ++ if (readlink(filename, buf, sizeof(buf)) == sizeof(buf) - 1 ++ && (memcmp(buf, vcpu_dev, sizeof(buf) - 1) == 0)) ++ r = 1; ++ free(filename); ++ return r; ++} ++ + int + main(void) + { +@@ -208,6 +226,15 @@ main(void) + (unsigned long) page_size, (unsigned long) page_size, mem); + + int vcpu_fd = KVM_IOCTL(vm_fd, KVM_CREATE_VCPU, NULL); ++ if (!vcpu_dev_should_have_cpuid(vcpu_fd)) ++ /* ++ * This is an older kernel that doesn't place a cpuid ++ * at the end of the dentry associated with vcpu_fd. ++ * Trim the cpuid part of vcpu_dev like: ++ * "anon_inode:kvm-vcpu:0" -> "anon_inode:kvm-vcpu" ++ */ ++ vcpu_dev[strlen (vcpu_dev) - 2] = '\0'; ++ + printf("ioctl(%d<%s>, KVM_CREATE_VCPU, 0) = %d<%s>\n", + vm_fd, vm_dev, vcpu_fd, vcpu_dev); + |