diff --git a/Update-linux-headers-to-5.11-rc2.patch b/Update-linux-headers-to-5.11-rc2.patch new file mode 100644 index 00000000..528a148d --- /dev/null +++ b/Update-linux-headers-to-5.11-rc2.patch @@ -0,0 +1,1017 @@ +From: Eric Farman +Date: Mon, 4 Jan 2021 21:20:56 +0100 +Subject: Update linux headers to 5.11-rc2 + +Git-commit: b3c818a47f419b6e2f5508fe29e7a30843236fee +References: bsc#1183634 + +Signed-off-by: Eric Farman +Message-Id: <20210104202057.48048-3-farman@linux.ibm.com> +[CH: dropped qatomic->atomic changes in pvrdma_ring.h] +Signed-off-by: Cornelia Huck +Signed-off-by: Bruce Rogers +--- + .../infiniband/hw/vmw_pvrdma/pvrdma_verbs.h | 2 +- + include/standard-headers/drm/drm_fourcc.h | 175 +++++++++++++++++- + include/standard-headers/linux/const.h | 36 ++++ + include/standard-headers/linux/ethtool.h | 2 +- + include/standard-headers/linux/fuse.h | 30 ++- + include/standard-headers/linux/kernel.h | 9 +- + include/standard-headers/linux/pci_regs.h | 16 ++ + include/standard-headers/linux/vhost_types.h | 9 + + include/standard-headers/linux/virtio_gpu.h | 82 ++++++++ + include/standard-headers/linux/virtio_ids.h | 44 +++-- + linux-headers/asm-arm64/kvm.h | 3 - + linux-headers/asm-generic/unistd.h | 6 +- + linux-headers/asm-mips/unistd_n32.h | 1 + + linux-headers/asm-mips/unistd_n64.h | 1 + + linux-headers/asm-mips/unistd_o32.h | 1 + + linux-headers/asm-powerpc/unistd_32.h | 1 + + linux-headers/asm-powerpc/unistd_64.h | 1 + + linux-headers/asm-s390/unistd_32.h | 1 + + linux-headers/asm-s390/unistd_64.h | 1 + + linux-headers/asm-x86/kvm.h | 1 + + linux-headers/asm-x86/unistd_32.h | 1 + + linux-headers/asm-x86/unistd_64.h | 1 + + linux-headers/asm-x86/unistd_x32.h | 1 + + linux-headers/linux/kvm.h | 56 +++++- + linux-headers/linux/userfaultfd.h | 9 + + linux-headers/linux/vfio.h | 1 + + linux-headers/linux/vhost.h | 4 + + 27 files changed, 454 insertions(+), 41 deletions(-) + +diff --git a/include/standard-headers/drivers/infiniband/hw/vmw_pvrdma/pvrdma_verbs.h b/include/standard-headers/drivers/infiniband/hw/vmw_pvrdma/pvrdma_verbs.h +index 0a8c7c9311994e3a9c3fabdabea1..1677208a411fa575d490de6cce15 100644 +--- a/include/standard-headers/drivers/infiniband/hw/vmw_pvrdma/pvrdma_verbs.h ++++ b/include/standard-headers/drivers/infiniband/hw/vmw_pvrdma/pvrdma_verbs.h +@@ -176,7 +176,7 @@ struct pvrdma_port_attr { + uint8_t subnet_timeout; + uint8_t init_type_reply; + uint8_t active_width; +- uint16_t active_speed; ++ uint8_t active_speed; + uint8_t phys_state; + uint8_t reserved[2]; + }; +diff --git a/include/standard-headers/drm/drm_fourcc.h b/include/standard-headers/drm/drm_fourcc.h +index 0de1a552cab235c00ff21de583f0..c47e19810c056da941878e6177dc 100644 +--- a/include/standard-headers/drm/drm_fourcc.h ++++ b/include/standard-headers/drm/drm_fourcc.h +@@ -57,6 +57,30 @@ extern "C" { + * may preserve meaning - such as number of planes - from the fourcc code, + * whereas others may not. + * ++ * Modifiers must uniquely encode buffer layout. In other words, a buffer must ++ * match only a single modifier. A modifier must not be a subset of layouts of ++ * another modifier. For instance, it's incorrect to encode pitch alignment in ++ * a modifier: a buffer may match a 64-pixel aligned modifier and a 32-pixel ++ * aligned modifier. That said, modifiers can have implicit minimal ++ * requirements. ++ * ++ * For modifiers where the combination of fourcc code and modifier can alias, ++ * a canonical pair needs to be defined and used by all drivers. Preferred ++ * combinations are also encouraged where all combinations might lead to ++ * confusion and unnecessarily reduced interoperability. An example for the ++ * latter is AFBC, where the ABGR layouts are preferred over ARGB layouts. ++ * ++ * There are two kinds of modifier users: ++ * ++ * - Kernel and user-space drivers: for drivers it's important that modifiers ++ * don't alias, otherwise two drivers might support the same format but use ++ * different aliases, preventing them from sharing buffers in an efficient ++ * format. ++ * - Higher-level programs interfacing with KMS/GBM/EGL/Vulkan/etc: these users ++ * see modifiers as opaque tokens they can check for equality and intersect. ++ * These users musn't need to know to reason about the modifier value ++ * (i.e. they are not expected to extract information out of the modifier). ++ * + * Vendors should document their modifier usage in as much detail as + * possible, to ensure maximum compatibility across devices, drivers and + * applications. +@@ -154,6 +178,12 @@ extern "C" { + #define DRM_FORMAT_ARGB16161616F fourcc_code('A', 'R', '4', 'H') /* [63:0] A:R:G:B 16:16:16:16 little endian */ + #define DRM_FORMAT_ABGR16161616F fourcc_code('A', 'B', '4', 'H') /* [63:0] A:B:G:R 16:16:16:16 little endian */ + ++/* ++ * RGBA format with 10-bit components packed in 64-bit per pixel, with 6 bits ++ * of unused padding per component: ++ */ ++#define DRM_FORMAT_AXBXGXRX106106106106 fourcc_code('A', 'B', '1', '0') /* [63:0] A:x:B:x:G:x:R:x 10:6:10:6:10:6:10:6 little endian */ ++ + /* packed YCbCr */ + #define DRM_FORMAT_YUYV fourcc_code('Y', 'U', 'Y', 'V') /* [31:0] Cr0:Y1:Cb0:Y0 8:8:8:8 little endian */ + #define DRM_FORMAT_YVYU fourcc_code('Y', 'V', 'Y', 'U') /* [31:0] Cb0:Y1:Cr0:Y0 8:8:8:8 little endian */ +@@ -319,7 +349,6 @@ extern "C" { + */ + + /* Vendor Ids: */ +-#define DRM_FORMAT_MOD_NONE 0 + #define DRM_FORMAT_MOD_VENDOR_NONE 0 + #define DRM_FORMAT_MOD_VENDOR_INTEL 0x01 + #define DRM_FORMAT_MOD_VENDOR_AMD 0x02 +@@ -391,6 +420,16 @@ extern "C" { + */ + #define DRM_FORMAT_MOD_LINEAR fourcc_mod_code(NONE, 0) + ++/* ++ * Deprecated: use DRM_FORMAT_MOD_LINEAR instead ++ * ++ * The "none" format modifier doesn't actually mean that the modifier is ++ * implicit, instead it means that the layout is linear. Whether modifiers are ++ * used is out-of-band information carried in an API-specific way (e.g. in a ++ * flag for drm_mode_fb_cmd2). ++ */ ++#define DRM_FORMAT_MOD_NONE 0 ++ + /* Intel framebuffer modifiers */ + + /* +@@ -1055,6 +1094,140 @@ drm_fourcc_canonicalize_nvidia_format_mod(uint64_t modifier) + */ + #define AMLOGIC_FBC_OPTION_MEM_SAVING (1ULL << 0) + ++/* ++ * AMD modifiers ++ * ++ * Memory layout: ++ * ++ * without DCC: ++ * - main surface ++ * ++ * with DCC & without DCC_RETILE: ++ * - main surface in plane 0 ++ * - DCC surface in plane 1 (RB-aligned, pipe-aligned if DCC_PIPE_ALIGN is set) ++ * ++ * with DCC & DCC_RETILE: ++ * - main surface in plane 0 ++ * - displayable DCC surface in plane 1 (not RB-aligned & not pipe-aligned) ++ * - pipe-aligned DCC surface in plane 2 (RB-aligned & pipe-aligned) ++ * ++ * For multi-plane formats the above surfaces get merged into one plane for ++ * each format plane, based on the required alignment only. ++ * ++ * Bits Parameter Notes ++ * ----- ------------------------ --------------------------------------------- ++ * ++ * 7:0 TILE_VERSION Values are AMD_FMT_MOD_TILE_VER_* ++ * 12:8 TILE Values are AMD_FMT_MOD_TILE__* ++ * 13 DCC ++ * 14 DCC_RETILE ++ * 15 DCC_PIPE_ALIGN ++ * 16 DCC_INDEPENDENT_64B ++ * 17 DCC_INDEPENDENT_128B ++ * 19:18 DCC_MAX_COMPRESSED_BLOCK Values are AMD_FMT_MOD_DCC_BLOCK_* ++ * 20 DCC_CONSTANT_ENCODE ++ * 23:21 PIPE_XOR_BITS Only for some chips ++ * 26:24 BANK_XOR_BITS Only for some chips ++ * 29:27 PACKERS Only for some chips ++ * 32:30 RB Only for some chips ++ * 35:33 PIPE Only for some chips ++ * 55:36 - Reserved for future use, must be zero ++ */ ++#define AMD_FMT_MOD fourcc_mod_code(AMD, 0) ++ ++#define IS_AMD_FMT_MOD(val) (((val) >> 56) == DRM_FORMAT_MOD_VENDOR_AMD) ++ ++/* Reserve 0 for GFX8 and older */ ++#define AMD_FMT_MOD_TILE_VER_GFX9 1 ++#define AMD_FMT_MOD_TILE_VER_GFX10 2 ++#define AMD_FMT_MOD_TILE_VER_GFX10_RBPLUS 3 ++ ++/* ++ * 64K_S is the same for GFX9/GFX10/GFX10_RBPLUS and hence has GFX9 as canonical ++ * version. ++ */ ++#define AMD_FMT_MOD_TILE_GFX9_64K_S 9 ++ ++/* ++ * 64K_D for non-32 bpp is the same for GFX9/GFX10/GFX10_RBPLUS and hence has ++ * GFX9 as canonical version. ++ */ ++#define AMD_FMT_MOD_TILE_GFX9_64K_D 10 ++#define AMD_FMT_MOD_TILE_GFX9_64K_S_X 25 ++#define AMD_FMT_MOD_TILE_GFX9_64K_D_X 26 ++#define AMD_FMT_MOD_TILE_GFX9_64K_R_X 27 ++ ++#define AMD_FMT_MOD_DCC_BLOCK_64B 0 ++#define AMD_FMT_MOD_DCC_BLOCK_128B 1 ++#define AMD_FMT_MOD_DCC_BLOCK_256B 2 ++ ++#define AMD_FMT_MOD_TILE_VERSION_SHIFT 0 ++#define AMD_FMT_MOD_TILE_VERSION_MASK 0xFF ++#define AMD_FMT_MOD_TILE_SHIFT 8 ++#define AMD_FMT_MOD_TILE_MASK 0x1F ++ ++/* Whether DCC compression is enabled. */ ++#define AMD_FMT_MOD_DCC_SHIFT 13 ++#define AMD_FMT_MOD_DCC_MASK 0x1 ++ ++/* ++ * Whether to include two DCC surfaces, one which is rb & pipe aligned, and ++ * one which is not-aligned. ++ */ ++#define AMD_FMT_MOD_DCC_RETILE_SHIFT 14 ++#define AMD_FMT_MOD_DCC_RETILE_MASK 0x1 ++ ++/* Only set if DCC_RETILE = false */ ++#define AMD_FMT_MOD_DCC_PIPE_ALIGN_SHIFT 15 ++#define AMD_FMT_MOD_DCC_PIPE_ALIGN_MASK 0x1 ++ ++#define AMD_FMT_MOD_DCC_INDEPENDENT_64B_SHIFT 16 ++#define AMD_FMT_MOD_DCC_INDEPENDENT_64B_MASK 0x1 ++#define AMD_FMT_MOD_DCC_INDEPENDENT_128B_SHIFT 17 ++#define AMD_FMT_MOD_DCC_INDEPENDENT_128B_MASK 0x1 ++#define AMD_FMT_MOD_DCC_MAX_COMPRESSED_BLOCK_SHIFT 18 ++#define AMD_FMT_MOD_DCC_MAX_COMPRESSED_BLOCK_MASK 0x3 ++ ++/* ++ * DCC supports embedding some clear colors directly in the DCC surface. ++ * However, on older GPUs the rendering HW ignores the embedded clear color ++ * and prefers the driver provided color. This necessitates doing a fastclear ++ * eliminate operation before a process transfers control. ++ * ++ * If this bit is set that means the fastclear eliminate is not needed for these ++ * embeddable colors. ++ */ ++#define AMD_FMT_MOD_DCC_CONSTANT_ENCODE_SHIFT 20 ++#define AMD_FMT_MOD_DCC_CONSTANT_ENCODE_MASK 0x1 ++ ++/* ++ * The below fields are for accounting for per GPU differences. These are only ++ * relevant for GFX9 and later and if the tile field is *_X/_T. ++ * ++ * PIPE_XOR_BITS = always needed ++ * BANK_XOR_BITS = only for TILE_VER_GFX9 ++ * PACKERS = only for TILE_VER_GFX10_RBPLUS ++ * RB = only for TILE_VER_GFX9 & DCC ++ * PIPE = only for TILE_VER_GFX9 & DCC & (DCC_RETILE | DCC_PIPE_ALIGN) ++ */ ++#define AMD_FMT_MOD_PIPE_XOR_BITS_SHIFT 21 ++#define AMD_FMT_MOD_PIPE_XOR_BITS_MASK 0x7 ++#define AMD_FMT_MOD_BANK_XOR_BITS_SHIFT 24 ++#define AMD_FMT_MOD_BANK_XOR_BITS_MASK 0x7 ++#define AMD_FMT_MOD_PACKERS_SHIFT 27 ++#define AMD_FMT_MOD_PACKERS_MASK 0x7 ++#define AMD_FMT_MOD_RB_SHIFT 30 ++#define AMD_FMT_MOD_RB_MASK 0x7 ++#define AMD_FMT_MOD_PIPE_SHIFT 33 ++#define AMD_FMT_MOD_PIPE_MASK 0x7 ++ ++#define AMD_FMT_MOD_SET(field, value) \ ++ ((uint64_t)(value) << AMD_FMT_MOD_##field##_SHIFT) ++#define AMD_FMT_MOD_GET(field, value) \ ++ (((value) >> AMD_FMT_MOD_##field##_SHIFT) & AMD_FMT_MOD_##field##_MASK) ++#define AMD_FMT_MOD_CLEAR(field) \ ++ (~((uint64_t)AMD_FMT_MOD_##field##_MASK << AMD_FMT_MOD_##field##_SHIFT)) ++ + #if defined(__cplusplus) + } + #endif +diff --git a/include/standard-headers/linux/const.h b/include/standard-headers/linux/const.h +new file mode 100644 +index 0000000000000000000000000000000000000000..5e489872516827f195db45746660b9ed7d1f4870 +--- /dev/null ++++ b/include/standard-headers/linux/const.h +@@ -0,0 +1,36 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ ++/* const.h: Macros for dealing with constants. */ ++ ++#ifndef _LINUX_CONST_H ++#define _LINUX_CONST_H ++ ++/* Some constant macros are used in both assembler and ++ * C code. Therefore we cannot annotate them always with ++ * 'UL' and other type specifiers unilaterally. We ++ * use the following macros to deal with this. ++ * ++ * Similarly, _AT() will cast an expression with a type in C, but ++ * leave it unchanged in asm. ++ */ ++ ++#ifdef __ASSEMBLY__ ++#define _AC(X,Y) X ++#define _AT(T,X) X ++#else ++#define __AC(X,Y) (X##Y) ++#define _AC(X,Y) __AC(X,Y) ++#define _AT(T,X) ((T)(X)) ++#endif ++ ++#define _UL(x) (_AC(x, UL)) ++#define _ULL(x) (_AC(x, ULL)) ++ ++#define _BITUL(x) (_UL(1) << (x)) ++#define _BITULL(x) (_ULL(1) << (x)) ++ ++#define __ALIGN_KERNEL(x, a) __ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1) ++#define __ALIGN_KERNEL_MASK(x, mask) (((x) + (mask)) & ~(mask)) ++ ++#define __KERNEL_DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) ++ ++#endif /* _LINUX_CONST_H */ +diff --git a/include/standard-headers/linux/ethtool.h b/include/standard-headers/linux/ethtool.h +index 0df22f7538e3227e9d2a07e5bca9..8bfd01d230dac8ce236b84b59790 100644 +--- a/include/standard-headers/linux/ethtool.h ++++ b/include/standard-headers/linux/ethtool.h +@@ -16,7 +16,7 @@ + + #include "net/eth.h" + +-#include "standard-headers/linux/kernel.h" ++#include "standard-headers/linux/const.h" + #include "standard-headers/linux/types.h" + #include "standard-headers/linux/if_ether.h" + +diff --git a/include/standard-headers/linux/fuse.h b/include/standard-headers/linux/fuse.h +index 82c0a38b591ecf0685557bf57eac..950d7edb7ef683071481d0a69d8b 100644 +--- a/include/standard-headers/linux/fuse.h ++++ b/include/standard-headers/linux/fuse.h +@@ -175,6 +175,10 @@ + * + * 7.32 + * - add flags to fuse_attr, add FUSE_ATTR_SUBMOUNT, add FUSE_SUBMOUNTS ++ * ++ * 7.33 ++ * - add FUSE_HANDLE_KILLPRIV_V2, FUSE_WRITE_KILL_SUIDGID, FATTR_KILL_SUIDGID ++ * - add FUSE_OPEN_KILL_SUIDGID + */ + + #ifndef _LINUX_FUSE_H +@@ -206,7 +210,7 @@ + #define FUSE_KERNEL_VERSION 7 + + /** Minor version number of this interface */ +-#define FUSE_KERNEL_MINOR_VERSION 32 ++#define FUSE_KERNEL_MINOR_VERSION 33 + + /** The node ID of the root inode */ + #define FUSE_ROOT_ID 1 +@@ -267,6 +271,7 @@ struct fuse_file_lock { + #define FATTR_MTIME_NOW (1 << 8) + #define FATTR_LOCKOWNER (1 << 9) + #define FATTR_CTIME (1 << 10) ++#define FATTR_KILL_SUIDGID (1 << 11) + + /** + * Flags returned by the OPEN request +@@ -316,6 +321,11 @@ struct fuse_file_lock { + * foffset and moffset fields in struct + * fuse_setupmapping_out and fuse_removemapping_one. + * FUSE_SUBMOUNTS: kernel supports auto-mounting directory submounts ++ * FUSE_HANDLE_KILLPRIV_V2: fs kills suid/sgid/cap on write/chown/trunc. ++ * Upon write/truncate suid/sgid is only killed if caller ++ * does not have CAP_FSETID. Additionally upon ++ * write/truncate sgid is killed only if file has group ++ * execute permission. (Same as Linux VFS behavior). + */ + #define FUSE_ASYNC_READ (1 << 0) + #define FUSE_POSIX_LOCKS (1 << 1) +@@ -345,6 +355,7 @@ struct fuse_file_lock { + #define FUSE_EXPLICIT_INVAL_DATA (1 << 25) + #define FUSE_MAP_ALIGNMENT (1 << 26) + #define FUSE_SUBMOUNTS (1 << 27) ++#define FUSE_HANDLE_KILLPRIV_V2 (1 << 28) + + /** + * CUSE INIT request/reply flags +@@ -374,11 +385,14 @@ struct fuse_file_lock { + * + * FUSE_WRITE_CACHE: delayed write from page cache, file handle is guessed + * FUSE_WRITE_LOCKOWNER: lock_owner field is valid +- * FUSE_WRITE_KILL_PRIV: kill suid and sgid bits ++ * FUSE_WRITE_KILL_SUIDGID: kill suid and sgid bits + */ + #define FUSE_WRITE_CACHE (1 << 0) + #define FUSE_WRITE_LOCKOWNER (1 << 1) +-#define FUSE_WRITE_KILL_PRIV (1 << 2) ++#define FUSE_WRITE_KILL_SUIDGID (1 << 2) ++ ++/* Obsolete alias; this flag implies killing suid/sgid only. */ ++#define FUSE_WRITE_KILL_PRIV FUSE_WRITE_KILL_SUIDGID + + /** + * Read flags +@@ -427,6 +441,12 @@ struct fuse_file_lock { + */ + #define FUSE_ATTR_SUBMOUNT (1 << 0) + ++/** ++ * Open flags ++ * FUSE_OPEN_KILL_SUIDGID: Kill suid and sgid if executable ++ */ ++#define FUSE_OPEN_KILL_SUIDGID (1 << 0) ++ + enum fuse_opcode { + FUSE_LOOKUP = 1, + FUSE_FORGET = 2, /* no reply */ +@@ -588,14 +608,14 @@ struct fuse_setattr_in { + + struct fuse_open_in { + uint32_t flags; +- uint32_t unused; ++ uint32_t open_flags; /* FUSE_OPEN_... */ + }; + + struct fuse_create_in { + uint32_t flags; + uint32_t mode; + uint32_t umask; +- uint32_t padding; ++ uint32_t open_flags; /* FUSE_OPEN_... */ + }; + + struct fuse_open_out { +diff --git a/include/standard-headers/linux/kernel.h b/include/standard-headers/linux/kernel.h +index 1eeba2ef9242dfd61a820ba615bb..7848c5ae25e2385e59fd710ccf2f 100644 +--- a/include/standard-headers/linux/kernel.h ++++ b/include/standard-headers/linux/kernel.h +@@ -3,13 +3,6 @@ + #define _LINUX_KERNEL_H + + #include "standard-headers/linux/sysinfo.h" +- +-/* +- * 'kernel.h' contains some often-used function prototypes etc +- */ +-#define __ALIGN_KERNEL(x, a) __ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1) +-#define __ALIGN_KERNEL_MASK(x, mask) (((x) + (mask)) & ~(mask)) +- +-#define __KERNEL_DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) ++#include "standard-headers/linux/const.h" + + #endif /* _LINUX_KERNEL_H */ +diff --git a/include/standard-headers/linux/pci_regs.h b/include/standard-headers/linux/pci_regs.h +index a95d55f9f25761ab78c8ef529dc4..e709ae8235e7fd2deeeb63b0ad50 100644 +--- a/include/standard-headers/linux/pci_regs.h ++++ b/include/standard-headers/linux/pci_regs.h +@@ -531,6 +531,7 @@ + #define PCI_EXP_LNKCAP_SLS_8_0GB 0x00000003 /* LNKCAP2 SLS Vector bit 2 */ + #define PCI_EXP_LNKCAP_SLS_16_0GB 0x00000004 /* LNKCAP2 SLS Vector bit 3 */ + #define PCI_EXP_LNKCAP_SLS_32_0GB 0x00000005 /* LNKCAP2 SLS Vector bit 4 */ ++#define PCI_EXP_LNKCAP_SLS_64_0GB 0x00000006 /* LNKCAP2 SLS Vector bit 5 */ + #define PCI_EXP_LNKCAP_MLW 0x000003f0 /* Maximum Link Width */ + #define PCI_EXP_LNKCAP_ASPMS 0x00000c00 /* ASPM Support */ + #define PCI_EXP_LNKCAP_ASPM_L0S 0x00000400 /* ASPM L0s Support */ +@@ -562,6 +563,7 @@ + #define PCI_EXP_LNKSTA_CLS_8_0GB 0x0003 /* Current Link Speed 8.0GT/s */ + #define PCI_EXP_LNKSTA_CLS_16_0GB 0x0004 /* Current Link Speed 16.0GT/s */ + #define PCI_EXP_LNKSTA_CLS_32_0GB 0x0005 /* Current Link Speed 32.0GT/s */ ++#define PCI_EXP_LNKSTA_CLS_64_0GB 0x0006 /* Current Link Speed 64.0GT/s */ + #define PCI_EXP_LNKSTA_NLW 0x03f0 /* Negotiated Link Width */ + #define PCI_EXP_LNKSTA_NLW_X1 0x0010 /* Current Link Width x1 */ + #define PCI_EXP_LNKSTA_NLW_X2 0x0020 /* Current Link Width x2 */ +@@ -670,6 +672,7 @@ + #define PCI_EXP_LNKCAP2_SLS_8_0GB 0x00000008 /* Supported Speed 8GT/s */ + #define PCI_EXP_LNKCAP2_SLS_16_0GB 0x00000010 /* Supported Speed 16GT/s */ + #define PCI_EXP_LNKCAP2_SLS_32_0GB 0x00000020 /* Supported Speed 32GT/s */ ++#define PCI_EXP_LNKCAP2_SLS_64_0GB 0x00000040 /* Supported Speed 64GT/s */ + #define PCI_EXP_LNKCAP2_CROSSLINK 0x00000100 /* Crosslink supported */ + #define PCI_EXP_LNKCTL2 48 /* Link Control 2 */ + #define PCI_EXP_LNKCTL2_TLS 0x000f +@@ -678,6 +681,7 @@ + #define PCI_EXP_LNKCTL2_TLS_8_0GT 0x0003 /* Supported Speed 8GT/s */ + #define PCI_EXP_LNKCTL2_TLS_16_0GT 0x0004 /* Supported Speed 16GT/s */ + #define PCI_EXP_LNKCTL2_TLS_32_0GT 0x0005 /* Supported Speed 32GT/s */ ++#define PCI_EXP_LNKCTL2_TLS_64_0GT 0x0006 /* Supported Speed 64GT/s */ + #define PCI_EXP_LNKCTL2_ENTER_COMP 0x0010 /* Enter Compliance */ + #define PCI_EXP_LNKCTL2_TX_MARGIN 0x0380 /* Transmit Margin */ + #define PCI_EXP_LNKCTL2_HASD 0x0020 /* HW Autonomous Speed Disable */ +@@ -723,6 +727,7 @@ + #define PCI_EXT_CAP_ID_DPC 0x1D /* Downstream Port Containment */ + #define PCI_EXT_CAP_ID_L1SS 0x1E /* L1 PM Substates */ + #define PCI_EXT_CAP_ID_PTM 0x1F /* Precision Time Measurement */ ++#define PCI_EXT_CAP_ID_DVSEC 0x23 /* Designated Vendor-Specific */ + #define PCI_EXT_CAP_ID_DLF 0x25 /* Data Link Feature */ + #define PCI_EXT_CAP_ID_PL_16GT 0x26 /* Physical Layer 16.0 GT/s */ + #define PCI_EXT_CAP_ID_MAX PCI_EXT_CAP_ID_PL_16GT +@@ -831,6 +836,13 @@ + #define PCI_PWR_CAP_BUDGET(x) ((x) & 1) /* Included in system budget */ + #define PCI_EXT_CAP_PWR_SIZEOF 16 + ++/* Root Complex Event Collector Endpoint Association */ ++#define PCI_RCEC_RCIEP_BITMAP 4 /* Associated Bitmap for RCiEPs */ ++#define PCI_RCEC_BUSN 8 /* RCEC Associated Bus Numbers */ ++#define PCI_RCEC_BUSN_REG_VER 0x02 /* Least version with BUSN present */ ++#define PCI_RCEC_BUSN_NEXT(x) (((x) >> 8) & 0xff) ++#define PCI_RCEC_BUSN_LAST(x) (((x) >> 16) & 0xff) ++ + /* Vendor-Specific (VSEC, PCI_EXT_CAP_ID_VNDR) */ + #define PCI_VNDR_HEADER 4 /* Vendor-Specific Header */ + #define PCI_VNDR_HEADER_ID(x) ((x) & 0xffff) +@@ -1066,6 +1078,10 @@ + #define PCI_L1SS_CTL1_LTR_L12_TH_SCALE 0xe0000000 /* LTR_L1.2_THRESHOLD_Scale */ + #define PCI_L1SS_CTL2 0x0c /* Control 2 Register */ + ++/* Designated Vendor-Specific (DVSEC, PCI_EXT_CAP_ID_DVSEC) */ ++#define PCI_DVSEC_HEADER1 0x4 /* Designated Vendor-Specific Header1 */ ++#define PCI_DVSEC_HEADER2 0x8 /* Designated Vendor-Specific Header2 */ ++ + /* Data Link Feature */ + #define PCI_DLF_CAP 0x04 /* Capabilities Register */ + #define PCI_DLF_EXCHANGE_ENABLE 0x80000000 /* Data Link Feature Exchange Enable */ +diff --git a/include/standard-headers/linux/vhost_types.h b/include/standard-headers/linux/vhost_types.h +index 486630b33287408183ce932564ad..0bd2684a2ae47993594e5f8fcf5b 100644 +--- a/include/standard-headers/linux/vhost_types.h ++++ b/include/standard-headers/linux/vhost_types.h +@@ -138,6 +138,15 @@ struct vhost_vdpa_config { + uint8_t buf[0]; + }; + ++/* vhost vdpa IOVA range ++ * @first: First address that can be mapped by vhost-vDPA ++ * @last: Last address that can be mapped by vhost-vDPA ++ */ ++struct vhost_vdpa_iova_range { ++ uint64_t first; ++ uint64_t last; ++}; ++ + /* Feature bits */ + /* Log all write descriptors. Can be changed while device is active. */ + #define VHOST_F_LOG_ALL 26 +diff --git a/include/standard-headers/linux/virtio_gpu.h b/include/standard-headers/linux/virtio_gpu.h +index 4183cdc74b33fc510a83f3c47293..1357e4774ea65573eae228a33b08 100644 +--- a/include/standard-headers/linux/virtio_gpu.h ++++ b/include/standard-headers/linux/virtio_gpu.h +@@ -55,6 +55,11 @@ + */ + #define VIRTIO_GPU_F_RESOURCE_UUID 2 + ++/* ++ * VIRTIO_GPU_CMD_RESOURCE_CREATE_BLOB ++ */ ++#define VIRTIO_GPU_F_RESOURCE_BLOB 3 ++ + enum virtio_gpu_ctrl_type { + VIRTIO_GPU_UNDEFINED = 0, + +@@ -71,6 +76,8 @@ enum virtio_gpu_ctrl_type { + VIRTIO_GPU_CMD_GET_CAPSET, + VIRTIO_GPU_CMD_GET_EDID, + VIRTIO_GPU_CMD_RESOURCE_ASSIGN_UUID, ++ VIRTIO_GPU_CMD_RESOURCE_CREATE_BLOB, ++ VIRTIO_GPU_CMD_SET_SCANOUT_BLOB, + + /* 3d commands */ + VIRTIO_GPU_CMD_CTX_CREATE = 0x0200, +@@ -81,6 +88,8 @@ enum virtio_gpu_ctrl_type { + VIRTIO_GPU_CMD_TRANSFER_TO_HOST_3D, + VIRTIO_GPU_CMD_TRANSFER_FROM_HOST_3D, + VIRTIO_GPU_CMD_SUBMIT_3D, ++ VIRTIO_GPU_CMD_RESOURCE_MAP_BLOB, ++ VIRTIO_GPU_CMD_RESOURCE_UNMAP_BLOB, + + /* cursor commands */ + VIRTIO_GPU_CMD_UPDATE_CURSOR = 0x0300, +@@ -93,6 +102,7 @@ enum virtio_gpu_ctrl_type { + VIRTIO_GPU_RESP_OK_CAPSET, + VIRTIO_GPU_RESP_OK_EDID, + VIRTIO_GPU_RESP_OK_RESOURCE_UUID, ++ VIRTIO_GPU_RESP_OK_MAP_INFO, + + /* error responses */ + VIRTIO_GPU_RESP_ERR_UNSPEC = 0x1200, +@@ -103,6 +113,15 @@ enum virtio_gpu_ctrl_type { + VIRTIO_GPU_RESP_ERR_INVALID_PARAMETER, + }; + ++enum virtio_gpu_shm_id { ++ VIRTIO_GPU_SHM_ID_UNDEFINED = 0, ++ /* ++ * VIRTIO_GPU_CMD_RESOURCE_MAP_BLOB ++ * VIRTIO_GPU_CMD_RESOURCE_UNMAP_BLOB ++ */ ++ VIRTIO_GPU_SHM_ID_HOST_VISIBLE = 1 ++}; ++ + #define VIRTIO_GPU_FLAG_FENCE (1 << 0) + + struct virtio_gpu_ctrl_hdr { +@@ -359,4 +378,67 @@ struct virtio_gpu_resp_resource_uuid { + uint8_t uuid[16]; + }; + ++/* VIRTIO_GPU_CMD_RESOURCE_CREATE_BLOB */ ++struct virtio_gpu_resource_create_blob { ++ struct virtio_gpu_ctrl_hdr hdr; ++ uint32_t resource_id; ++#define VIRTIO_GPU_BLOB_MEM_GUEST 0x0001 ++#define VIRTIO_GPU_BLOB_MEM_HOST3D 0x0002 ++#define VIRTIO_GPU_BLOB_MEM_HOST3D_GUEST 0x0003 ++ ++#define VIRTIO_GPU_BLOB_FLAG_USE_MAPPABLE 0x0001 ++#define VIRTIO_GPU_BLOB_FLAG_USE_SHAREABLE 0x0002 ++#define VIRTIO_GPU_BLOB_FLAG_USE_CROSS_DEVICE 0x0004 ++ /* zero is invalid blob mem */ ++ uint32_t blob_mem; ++ uint32_t blob_flags; ++ uint32_t nr_entries; ++ uint64_t blob_id; ++ uint64_t size; ++ /* ++ * sizeof(nr_entries * virtio_gpu_mem_entry) bytes follow ++ */ ++}; ++ ++/* VIRTIO_GPU_CMD_SET_SCANOUT_BLOB */ ++struct virtio_gpu_set_scanout_blob { ++ struct virtio_gpu_ctrl_hdr hdr; ++ struct virtio_gpu_rect r; ++ uint32_t scanout_id; ++ uint32_t resource_id; ++ uint32_t width; ++ uint32_t height; ++ uint32_t format; ++ uint32_t padding; ++ uint32_t strides[4]; ++ uint32_t offsets[4]; ++}; ++ ++/* VIRTIO_GPU_CMD_RESOURCE_MAP_BLOB */ ++struct virtio_gpu_resource_map_blob { ++ struct virtio_gpu_ctrl_hdr hdr; ++ uint32_t resource_id; ++ uint32_t padding; ++ uint64_t offset; ++}; ++ ++/* VIRTIO_GPU_RESP_OK_MAP_INFO */ ++#define VIRTIO_GPU_MAP_CACHE_MASK 0x0f ++#define VIRTIO_GPU_MAP_CACHE_NONE 0x00 ++#define VIRTIO_GPU_MAP_CACHE_CACHED 0x01 ++#define VIRTIO_GPU_MAP_CACHE_UNCACHED 0x02 ++#define VIRTIO_GPU_MAP_CACHE_WC 0x03 ++struct virtio_gpu_resp_map_info { ++ struct virtio_gpu_ctrl_hdr hdr; ++ uint32_t map_info; ++ uint32_t padding; ++}; ++ ++/* VIRTIO_GPU_CMD_RESOURCE_UNMAP_BLOB */ ++struct virtio_gpu_resource_unmap_blob { ++ struct virtio_gpu_ctrl_hdr hdr; ++ uint32_t resource_id; ++ uint32_t padding; ++}; ++ + #endif +diff --git a/include/standard-headers/linux/virtio_ids.h b/include/standard-headers/linux/virtio_ids.h +index b052355ac7a324e173f4ea44c48d..bc1c0621f5edd18ee6e3c9328f4d 100644 +--- a/include/standard-headers/linux/virtio_ids.h ++++ b/include/standard-headers/linux/virtio_ids.h +@@ -29,24 +29,30 @@ + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. */ + +-#define VIRTIO_ID_NET 1 /* virtio net */ +-#define VIRTIO_ID_BLOCK 2 /* virtio block */ +-#define VIRTIO_ID_CONSOLE 3 /* virtio console */ +-#define VIRTIO_ID_RNG 4 /* virtio rng */ +-#define VIRTIO_ID_BALLOON 5 /* virtio balloon */ +-#define VIRTIO_ID_RPMSG 7 /* virtio remote processor messaging */ +-#define VIRTIO_ID_SCSI 8 /* virtio scsi */ +-#define VIRTIO_ID_9P 9 /* 9p virtio console */ +-#define VIRTIO_ID_RPROC_SERIAL 11 /* virtio remoteproc serial link */ +-#define VIRTIO_ID_CAIF 12 /* Virtio caif */ +-#define VIRTIO_ID_GPU 16 /* virtio GPU */ +-#define VIRTIO_ID_INPUT 18 /* virtio input */ +-#define VIRTIO_ID_VSOCK 19 /* virtio vsock transport */ +-#define VIRTIO_ID_CRYPTO 20 /* virtio crypto */ +-#define VIRTIO_ID_IOMMU 23 /* virtio IOMMU */ +-#define VIRTIO_ID_MEM 24 /* virtio mem */ +-#define VIRTIO_ID_FS 26 /* virtio filesystem */ +-#define VIRTIO_ID_PMEM 27 /* virtio pmem */ +-#define VIRTIO_ID_MAC80211_HWSIM 29 /* virtio mac80211-hwsim */ ++#define VIRTIO_ID_NET 1 /* virtio net */ ++#define VIRTIO_ID_BLOCK 2 /* virtio block */ ++#define VIRTIO_ID_CONSOLE 3 /* virtio console */ ++#define VIRTIO_ID_RNG 4 /* virtio rng */ ++#define VIRTIO_ID_BALLOON 5 /* virtio balloon */ ++#define VIRTIO_ID_IOMEM 6 /* virtio ioMemory */ ++#define VIRTIO_ID_RPMSG 7 /* virtio remote processor messaging */ ++#define VIRTIO_ID_SCSI 8 /* virtio scsi */ ++#define VIRTIO_ID_9P 9 /* 9p virtio console */ ++#define VIRTIO_ID_MAC80211_WLAN 10 /* virtio WLAN MAC */ ++#define VIRTIO_ID_RPROC_SERIAL 11 /* virtio remoteproc serial link */ ++#define VIRTIO_ID_CAIF 12 /* Virtio caif */ ++#define VIRTIO_ID_MEMORY_BALLOON 13 /* virtio memory balloon */ ++#define VIRTIO_ID_GPU 16 /* virtio GPU */ ++#define VIRTIO_ID_CLOCK 17 /* virtio clock/timer */ ++#define VIRTIO_ID_INPUT 18 /* virtio input */ ++#define VIRTIO_ID_VSOCK 19 /* virtio vsock transport */ ++#define VIRTIO_ID_CRYPTO 20 /* virtio crypto */ ++#define VIRTIO_ID_SIGNAL_DIST 21 /* virtio signal distribution device */ ++#define VIRTIO_ID_PSTORE 22 /* virtio pstore device */ ++#define VIRTIO_ID_IOMMU 23 /* virtio IOMMU */ ++#define VIRTIO_ID_MEM 24 /* virtio mem */ ++#define VIRTIO_ID_FS 26 /* virtio filesystem */ ++#define VIRTIO_ID_PMEM 27 /* virtio pmem */ ++#define VIRTIO_ID_MAC80211_HWSIM 29 /* virtio mac80211-hwsim */ + + #endif /* _LINUX_VIRTIO_IDS_H */ +diff --git a/linux-headers/asm-arm64/kvm.h b/linux-headers/asm-arm64/kvm.h +index a72de1ae4cb5638b42ea7057a9cc..b6a0eaa32ae68ff63a86b89f2c20 100644 +--- a/linux-headers/asm-arm64/kvm.h ++++ b/linux-headers/asm-arm64/kvm.h +@@ -156,9 +156,6 @@ struct kvm_sync_regs { + __u64 device_irq_level; + }; + +-struct kvm_arch_memory_slot { +-}; +- + /* + * PMU filter structure. Describe a range of events with a particular + * action. To be used with KVM_ARM_VCPU_PMU_V3_FILTER. +diff --git a/linux-headers/asm-generic/unistd.h b/linux-headers/asm-generic/unistd.h +index 2056318988f774931c4e0a310414..728752917785efe99cc6a325edbb 100644 +--- a/linux-headers/asm-generic/unistd.h ++++ b/linux-headers/asm-generic/unistd.h +@@ -517,7 +517,7 @@ __SC_COMP(__NR_settimeofday, sys_settimeofday, compat_sys_settimeofday) + __SC_3264(__NR_adjtimex, sys_adjtimex_time32, sys_adjtimex) + #endif + +-/* kernel/timer.c */ ++/* kernel/sys.c */ + #define __NR_getpid 172 + __SYSCALL(__NR_getpid, sys_getpid) + #define __NR_getppid 173 +@@ -859,9 +859,11 @@ __SYSCALL(__NR_pidfd_getfd, sys_pidfd_getfd) + __SYSCALL(__NR_faccessat2, sys_faccessat2) + #define __NR_process_madvise 440 + __SYSCALL(__NR_process_madvise, sys_process_madvise) ++#define __NR_epoll_pwait2 441 ++__SC_COMP(__NR_epoll_pwait2, sys_epoll_pwait2, compat_sys_epoll_pwait2) + + #undef __NR_syscalls +-#define __NR_syscalls 441 ++#define __NR_syscalls 442 + + /* + * 32 bit systems traditionally used different +diff --git a/linux-headers/asm-mips/unistd_n32.h b/linux-headers/asm-mips/unistd_n32.h +index aba284d190a0f7b887943283bfb6..59e53b6e076fc4ac2d044a1b5a1f 100644 +--- a/linux-headers/asm-mips/unistd_n32.h ++++ b/linux-headers/asm-mips/unistd_n32.h +@@ -370,6 +370,7 @@ + #define __NR_pidfd_getfd (__NR_Linux + 438) + #define __NR_faccessat2 (__NR_Linux + 439) + #define __NR_process_madvise (__NR_Linux + 440) ++#define __NR_epoll_pwait2 (__NR_Linux + 441) + + + #endif /* _ASM_MIPS_UNISTD_N32_H */ +diff --git a/linux-headers/asm-mips/unistd_n64.h b/linux-headers/asm-mips/unistd_n64.h +index 0465ab94db8966b453f1e1863e00..683558a7f8ad6178f83caedc9cac 100644 +--- a/linux-headers/asm-mips/unistd_n64.h ++++ b/linux-headers/asm-mips/unistd_n64.h +@@ -346,6 +346,7 @@ + #define __NR_pidfd_getfd (__NR_Linux + 438) + #define __NR_faccessat2 (__NR_Linux + 439) + #define __NR_process_madvise (__NR_Linux + 440) ++#define __NR_epoll_pwait2 (__NR_Linux + 441) + + + #endif /* _ASM_MIPS_UNISTD_N64_H */ +diff --git a/linux-headers/asm-mips/unistd_o32.h b/linux-headers/asm-mips/unistd_o32.h +index 5222a0dd50e18b778dcc38f45af8..ca6a7e5c0b91e7b61e1919360831 100644 +--- a/linux-headers/asm-mips/unistd_o32.h ++++ b/linux-headers/asm-mips/unistd_o32.h +@@ -416,6 +416,7 @@ + #define __NR_pidfd_getfd (__NR_Linux + 438) + #define __NR_faccessat2 (__NR_Linux + 439) + #define __NR_process_madvise (__NR_Linux + 440) ++#define __NR_epoll_pwait2 (__NR_Linux + 441) + + + #endif /* _ASM_MIPS_UNISTD_O32_H */ +diff --git a/linux-headers/asm-powerpc/unistd_32.h b/linux-headers/asm-powerpc/unistd_32.h +index 21066a3d5f4a65bd2a1e09c002a3..4624c9004368474b9bbb7d534bef 100644 +--- a/linux-headers/asm-powerpc/unistd_32.h ++++ b/linux-headers/asm-powerpc/unistd_32.h +@@ -423,6 +423,7 @@ + #define __NR_pidfd_getfd 438 + #define __NR_faccessat2 439 + #define __NR_process_madvise 440 ++#define __NR_epoll_pwait2 441 + + + #endif /* _ASM_POWERPC_UNISTD_32_H */ +diff --git a/linux-headers/asm-powerpc/unistd_64.h b/linux-headers/asm-powerpc/unistd_64.h +index c153da29f2362aa32b379a711ac8..7e851b30bb13bc407be07ffe01ac 100644 +--- a/linux-headers/asm-powerpc/unistd_64.h ++++ b/linux-headers/asm-powerpc/unistd_64.h +@@ -395,6 +395,7 @@ + #define __NR_pidfd_getfd 438 + #define __NR_faccessat2 439 + #define __NR_process_madvise 440 ++#define __NR_epoll_pwait2 441 + + + #endif /* _ASM_POWERPC_UNISTD_64_H */ +diff --git a/linux-headers/asm-s390/unistd_32.h b/linux-headers/asm-s390/unistd_32.h +index 3b4f2dda6049767ea56e3a29ecf6..c94d2c3a22d698692ff4b2a2d890 100644 +--- a/linux-headers/asm-s390/unistd_32.h ++++ b/linux-headers/asm-s390/unistd_32.h +@@ -413,5 +413,6 @@ + #define __NR_pidfd_getfd 438 + #define __NR_faccessat2 439 + #define __NR_process_madvise 440 ++#define __NR_epoll_pwait2 441 + + #endif /* _ASM_S390_UNISTD_32_H */ +diff --git a/linux-headers/asm-s390/unistd_64.h b/linux-headers/asm-s390/unistd_64.h +index 030a51fa3828b9a8ea64d42dc84b..984a06b7ebe4e8e56b9a26dc01b5 100644 +--- a/linux-headers/asm-s390/unistd_64.h ++++ b/linux-headers/asm-s390/unistd_64.h +@@ -361,5 +361,6 @@ + #define __NR_pidfd_getfd 438 + #define __NR_faccessat2 439 + #define __NR_process_madvise 440 ++#define __NR_epoll_pwait2 441 + + #endif /* _ASM_S390_UNISTD_64_H */ +diff --git a/linux-headers/asm-x86/kvm.h b/linux-headers/asm-x86/kvm.h +index 89e5f3d1bba86b8bbb0e7a80cbed..8e76d3701db3f2432c91c9bd3262 100644 +--- a/linux-headers/asm-x86/kvm.h ++++ b/linux-headers/asm-x86/kvm.h +@@ -12,6 +12,7 @@ + + #define KVM_PIO_PAGE_OFFSET 1 + #define KVM_COALESCED_MMIO_PAGE_OFFSET 2 ++#define KVM_DIRTY_LOG_PAGE_OFFSET 64 + + #define DE_VECTOR 0 + #define DB_VECTOR 1 +diff --git a/linux-headers/asm-x86/unistd_32.h b/linux-headers/asm-x86/unistd_32.h +index cfba368f9dffa9ed90eeff567849..18fb99dfa287ae7d01b77980a030 100644 +--- a/linux-headers/asm-x86/unistd_32.h ++++ b/linux-headers/asm-x86/unistd_32.h +@@ -431,6 +431,7 @@ + #define __NR_pidfd_getfd 438 + #define __NR_faccessat2 439 + #define __NR_process_madvise 440 ++#define __NR_epoll_pwait2 441 + + + #endif /* _ASM_X86_UNISTD_32_H */ +diff --git a/linux-headers/asm-x86/unistd_64.h b/linux-headers/asm-x86/unistd_64.h +index 61af7250955feef3be80c70eeccc..bde959328d65f30e0480f9c62c28 100644 +--- a/linux-headers/asm-x86/unistd_64.h ++++ b/linux-headers/asm-x86/unistd_64.h +@@ -353,6 +353,7 @@ + #define __NR_pidfd_getfd 438 + #define __NR_faccessat2 439 + #define __NR_process_madvise 440 ++#define __NR_epoll_pwait2 441 + + + #endif /* _ASM_X86_UNISTD_64_H */ +diff --git a/linux-headers/asm-x86/unistd_x32.h b/linux-headers/asm-x86/unistd_x32.h +index a6890cb1f5b534b152455e07e707..4ff6b17d3bb4de09ffd5b1c22b5a 100644 +--- a/linux-headers/asm-x86/unistd_x32.h ++++ b/linux-headers/asm-x86/unistd_x32.h +@@ -306,6 +306,7 @@ + #define __NR_pidfd_getfd (__X32_SYSCALL_BIT + 438) + #define __NR_faccessat2 (__X32_SYSCALL_BIT + 439) + #define __NR_process_madvise (__X32_SYSCALL_BIT + 440) ++#define __NR_epoll_pwait2 (__X32_SYSCALL_BIT + 441) + #define __NR_rt_sigaction (__X32_SYSCALL_BIT + 512) + #define __NR_rt_sigreturn (__X32_SYSCALL_BIT + 513) + #define __NR_ioctl (__X32_SYSCALL_BIT + 514) +diff --git a/linux-headers/linux/kvm.h b/linux-headers/linux/kvm.h +index 56ce14ad209f7f47615d0940c980..020b62a619a710d3ff7f4c6e679c 100644 +--- a/linux-headers/linux/kvm.h ++++ b/linux-headers/linux/kvm.h +@@ -250,6 +250,7 @@ struct kvm_hyperv_exit { + #define KVM_EXIT_ARM_NISV 28 + #define KVM_EXIT_X86_RDMSR 29 + #define KVM_EXIT_X86_WRMSR 30 ++#define KVM_EXIT_DIRTY_RING_FULL 31 + + /* For KVM_EXIT_INTERNAL_ERROR */ + /* Emulate instruction failed. */ +@@ -1053,6 +1054,8 @@ struct kvm_ppc_resize_hpt { + #define KVM_CAP_X86_USER_SPACE_MSR 188 + #define KVM_CAP_X86_MSR_FILTER 189 + #define KVM_CAP_ENFORCE_PV_FEATURE_CPUID 190 ++#define KVM_CAP_SYS_HYPERV_CPUID 191 ++#define KVM_CAP_DIRTY_LOG_RING 192 + + #ifdef KVM_CAP_IRQ_ROUTING + +@@ -1511,7 +1514,7 @@ struct kvm_enc_region { + /* Available with KVM_CAP_MANUAL_DIRTY_LOG_PROTECT_2 */ + #define KVM_CLEAR_DIRTY_LOG _IOWR(KVMIO, 0xc0, struct kvm_clear_dirty_log) + +-/* Available with KVM_CAP_HYPERV_CPUID */ ++/* Available with KVM_CAP_HYPERV_CPUID (vcpu) / KVM_CAP_SYS_HYPERV_CPUID (system) */ + #define KVM_GET_SUPPORTED_HV_CPUID _IOWR(KVMIO, 0xc1, struct kvm_cpuid2) + + /* Available with KVM_CAP_ARM_SVE */ +@@ -1557,6 +1560,9 @@ struct kvm_pv_cmd { + /* Available with KVM_CAP_X86_MSR_FILTER */ + #define KVM_X86_SET_MSR_FILTER _IOW(KVMIO, 0xc6, struct kvm_msr_filter) + ++/* Available with KVM_CAP_DIRTY_LOG_RING */ ++#define KVM_RESET_DIRTY_RINGS _IO(KVMIO, 0xc7) ++ + /* Secure Encrypted Virtualization command */ + enum sev_cmd_id { + /* Guest initialization commands */ +@@ -1710,4 +1716,52 @@ struct kvm_hyperv_eventfd { + #define KVM_DIRTY_LOG_MANUAL_PROTECT_ENABLE (1 << 0) + #define KVM_DIRTY_LOG_INITIALLY_SET (1 << 1) + ++/* ++ * Arch needs to define the macro after implementing the dirty ring ++ * feature. KVM_DIRTY_LOG_PAGE_OFFSET should be defined as the ++ * starting page offset of the dirty ring structures. ++ */ ++#ifndef KVM_DIRTY_LOG_PAGE_OFFSET ++#define KVM_DIRTY_LOG_PAGE_OFFSET 0 ++#endif ++ ++/* ++ * KVM dirty GFN flags, defined as: ++ * ++ * |---------------+---------------+--------------| ++ * | bit 1 (reset) | bit 0 (dirty) | Status | ++ * |---------------+---------------+--------------| ++ * | 0 | 0 | Invalid GFN | ++ * | 0 | 1 | Dirty GFN | ++ * | 1 | X | GFN to reset | ++ * |---------------+---------------+--------------| ++ * ++ * Lifecycle of a dirty GFN goes like: ++ * ++ * dirtied harvested reset ++ * 00 -----------> 01 -------------> 1X -------+ ++ * ^ | ++ * | | ++ * +------------------------------------------+ ++ * ++ * The userspace program is only responsible for the 01->1X state ++ * conversion after harvesting an entry. Also, it must not skip any ++ * dirty bits, so that dirty bits are always harvested in sequence. ++ */ ++#define KVM_DIRTY_GFN_F_DIRTY BIT(0) ++#define KVM_DIRTY_GFN_F_RESET BIT(1) ++#define KVM_DIRTY_GFN_F_MASK 0x3 ++ ++/* ++ * KVM dirty rings should be mapped at KVM_DIRTY_LOG_PAGE_OFFSET of ++ * per-vcpu mmaped regions as an array of struct kvm_dirty_gfn. The ++ * size of the gfn buffer is decided by the first argument when ++ * enabling KVM_CAP_DIRTY_LOG_RING. ++ */ ++struct kvm_dirty_gfn { ++ __u32 flags; ++ __u32 slot; ++ __u64 offset; ++}; ++ + #endif /* __LINUX_KVM_H */ +diff --git a/linux-headers/linux/userfaultfd.h b/linux-headers/linux/userfaultfd.h +index 8d3996eb8285583ba11952bc85e5..1ba9a9feeb833e16bcffefa044de 100644 +--- a/linux-headers/linux/userfaultfd.h ++++ b/linux-headers/linux/userfaultfd.h +@@ -257,4 +257,13 @@ struct uffdio_writeprotect { + __u64 mode; + }; + ++/* ++ * Flags for the userfaultfd(2) system call itself. ++ */ ++ ++/* ++ * Create a userfaultfd that can handle page faults only in user mode. ++ */ ++#define UFFD_USER_MODE_ONLY 1 ++ + #endif /* _LINUX_USERFAULTFD_H */ +diff --git a/linux-headers/linux/vfio.h b/linux-headers/linux/vfio.h +index b92dcc4dafd5f00fd1ab89199aee..609099e455cdf86cf471808b03a4 100644 +--- a/linux-headers/linux/vfio.h ++++ b/linux-headers/linux/vfio.h +@@ -820,6 +820,7 @@ enum { + enum { + VFIO_CCW_IO_IRQ_INDEX, + VFIO_CCW_CRW_IRQ_INDEX, ++ VFIO_CCW_REQ_IRQ_INDEX, + VFIO_CCW_NUM_IRQS + }; + +diff --git a/linux-headers/linux/vhost.h b/linux-headers/linux/vhost.h +index 75232185324abb8bf16521b525ed..c998860d7bbc4351c37c702ea69e 100644 +--- a/linux-headers/linux/vhost.h ++++ b/linux-headers/linux/vhost.h +@@ -146,4 +146,8 @@ + + /* Set event fd for config interrupt*/ + #define VHOST_VDPA_SET_CONFIG_CALL _IOW(VHOST_VIRTIO, 0x77, int) ++ ++/* Get the valid iova range */ ++#define VHOST_VDPA_GET_IOVA_RANGE _IOR(VHOST_VIRTIO, 0x78, \ ++ struct vhost_vdpa_iova_range) + #endif diff --git a/bundles.tar.xz b/bundles.tar.xz index c4106a76..aac01974 100644 --- a/bundles.tar.xz +++ b/bundles.tar.xz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b7ff5cf2fc82b361e7b07710e20758d230d543d7d1c967bdf131b5793573207e -size 68660 +oid sha256:5eea7b1721613d6f843d6e94469431d4382e88e106bff9ac121acfcab88df9fc +size 79240 diff --git a/qemu.changes b/qemu.changes index fdbbc1ff..572ceb3c 100644 --- a/qemu.changes +++ b/qemu.changes @@ -1,3 +1,12 @@ +------------------------------------------------------------------- +Wed Mar 17 13:07:33 UTC 2021 - Bruce Rogers + +- Fix s390x "mediated device is in use" error condition + (bsc#1183634) + update-linux-headers-Include-const.h.patch + Update-linux-headers-to-5.11-rc2.patch + vfio-ccw-Connect-the-device-request-noti.patch + ------------------------------------------------------------------- Tue Mar 16 22:33:26 UTC 2021 - Bruce Rogers diff --git a/qemu.spec b/qemu.spec index 3bc37425..a8aee671 100644 --- a/qemu.spec +++ b/qemu.spec @@ -150,68 +150,71 @@ Patch00014: target-arm-Introduce-PREDDESC-field-defi.patch Patch00015: target-arm-Update-PFIRST-PNEXT-for-pred_.patch Patch00016: target-arm-Update-ZIP-UZP-TRN-for-pred_d.patch Patch00017: target-arm-Update-REV-PUNPK-for-pred_des.patch -Patch00018: net-Fix-handling-of-id-in-netdev_add-and.patch -Patch00019: block-Separate-blk_is_writable-and-blk_s.patch -Patch00020: hw-intc-arm_gic-Fix-interrupt-ID-in-GICD.patch -Patch00021: virtio-move-use-disabled-flag-property-t.patch -Patch00022: qemu-nbd-Use-SOMAXCONN-for-socket-listen.patch -Patch00023: qemu-storage-daemon-Enable-object-add.patch -Patch00024: blockjob-Fix-crash-with-IOthread-when-bl.patch -Patch00025: monitor-Fix-assertion-failure-on-shutdow.patch -Patch00026: spice-app-avoid-crash-when-core-spice-mo.patch -Patch00027: i386-acpi-restore-device-paths-for-pre-5.patch -Patch00028: hw-s390x-fix-build-for-virtio-9p-ccw.patch -Patch00029: s390x-pci-restore-missing-Query-PCI-Func.patch -Patch00030: lsilogic-Use-PCIDevice-exit-instead-of-D.patch -Patch00031: vhost-user-blk-fix-blkcfg-num_queues-end.patch -Patch00032: e1000-fail-early-for-evil-descriptor.patch -Patch00033: hw-s390x-modularize-virtio-gpu-ccw.patch -Patch00034: net-vmxnet3-validate-configuration-value.patch -Patch00035: XXX-dont-dump-core-on-sigabort.patch -Patch00036: qemu-binfmt-conf-Modify-default-path.patch -Patch00037: qemu-cvs-gettimeofday.patch -Patch00038: qemu-cvs-ioctl_debug.patch -Patch00039: qemu-cvs-ioctl_nodirection.patch -Patch00040: linux-user-add-binfmt-wrapper-for-argv-0.patch -Patch00041: PPC-KVM-Disable-mmu-notifier-check.patch -Patch00042: linux-user-binfmt-support-host-binaries.patch -Patch00043: linux-user-Fake-proc-cpuinfo.patch -Patch00044: linux-user-use-target_ulong.patch -Patch00045: Make-char-muxer-more-robust-wrt-small-FI.patch -Patch00046: linux-user-lseek-explicitly-cast-non-set.patch -Patch00047: AIO-Reduce-number-of-threads-for-32bit-h.patch -Patch00048: xen_disk-Add-suse-specific-flush-disable.patch -Patch00049: qemu-bridge-helper-reduce-security-profi.patch -Patch00050: qemu-binfmt-conf-use-qemu-ARCH-binfmt.patch -Patch00051: roms-Makefile-pass-a-packaging-timestamp.patch -Patch00052: Raise-soft-address-space-limit-to-hard-l.patch -Patch00053: increase-x86_64-physical-bits-to-42.patch -Patch00054: i8254-Fix-migration-from-SLE11-SP2.patch -Patch00055: acpi_piix4-Fix-migration-from-SLE11-SP2.patch -Patch00056: Make-installed-scripts-explicitly-python.patch -Patch00057: hw-smbios-handle-both-file-formats-regar.patch -Patch00058: xen-add-block-resize-support-for-xen-dis.patch -Patch00059: tests-qemu-iotests-Triple-timeout-of-i-o.patch -Patch00060: tests-Fix-block-tests-to-be-compatible-w.patch -Patch00061: xen-ignore-live-parameter-from-xen-save-.patch -Patch00062: tests-change-error-message-in-test-162.patch -Patch00063: hw-intc-exynos4210_gic-provide-more-room.patch -Patch00064: configure-only-populate-roms-if-softmmu.patch -Patch00065: pc-bios-s390-ccw-net-avoid-warning-about.patch -Patch00066: roms-change-cross-compiler-naming-to-be-.patch -Patch00067: test-add-mapping-from-arch-of-i686-to-qe.patch -Patch00068: configure-remove-pkgversion-from-CONFIG_.patch -Patch00069: docs-add-SUSE-support-statements-to-html.patch -Patch00070: s390x-Fix-stringop-truncation-issue-repo.patch -Patch00071: Revert-qht-constify-qht_statistics_init.patch -Patch00072: qht-Revert-some-constification-in-qht.c.patch -Patch00073: meson-install-ivshmem-client-and-ivshmem.patch -Patch00074: Revert-roms-efirom-tests-uefi-test-tools.patch -Patch00075: Makefile-Don-t-check-pc-bios-as-pre-requ.patch -Patch00076: roms-Makefile-add-cross-file-to-qboot-me.patch -Patch00077: usb-Help-compiler-out-to-avoid-a-warning.patch -Patch00078: module-for-virtio-gpu-pre-load-module-to.patch -Patch00079: qom-handle-case-of-chardev-spice-module-.patch +Patch00018: update-linux-headers-Include-const.h.patch +Patch00019: Update-linux-headers-to-5.11-rc2.patch +Patch00020: vfio-ccw-Connect-the-device-request-noti.patch +Patch00021: net-Fix-handling-of-id-in-netdev_add-and.patch +Patch00022: block-Separate-blk_is_writable-and-blk_s.patch +Patch00023: hw-intc-arm_gic-Fix-interrupt-ID-in-GICD.patch +Patch00024: virtio-move-use-disabled-flag-property-t.patch +Patch00025: qemu-nbd-Use-SOMAXCONN-for-socket-listen.patch +Patch00026: qemu-storage-daemon-Enable-object-add.patch +Patch00027: blockjob-Fix-crash-with-IOthread-when-bl.patch +Patch00028: monitor-Fix-assertion-failure-on-shutdow.patch +Patch00029: spice-app-avoid-crash-when-core-spice-mo.patch +Patch00030: i386-acpi-restore-device-paths-for-pre-5.patch +Patch00031: hw-s390x-fix-build-for-virtio-9p-ccw.patch +Patch00032: s390x-pci-restore-missing-Query-PCI-Func.patch +Patch00033: lsilogic-Use-PCIDevice-exit-instead-of-D.patch +Patch00034: vhost-user-blk-fix-blkcfg-num_queues-end.patch +Patch00035: e1000-fail-early-for-evil-descriptor.patch +Patch00036: hw-s390x-modularize-virtio-gpu-ccw.patch +Patch00037: net-vmxnet3-validate-configuration-value.patch +Patch00038: XXX-dont-dump-core-on-sigabort.patch +Patch00039: qemu-binfmt-conf-Modify-default-path.patch +Patch00040: qemu-cvs-gettimeofday.patch +Patch00041: qemu-cvs-ioctl_debug.patch +Patch00042: qemu-cvs-ioctl_nodirection.patch +Patch00043: linux-user-add-binfmt-wrapper-for-argv-0.patch +Patch00044: PPC-KVM-Disable-mmu-notifier-check.patch +Patch00045: linux-user-binfmt-support-host-binaries.patch +Patch00046: linux-user-Fake-proc-cpuinfo.patch +Patch00047: linux-user-use-target_ulong.patch +Patch00048: Make-char-muxer-more-robust-wrt-small-FI.patch +Patch00049: linux-user-lseek-explicitly-cast-non-set.patch +Patch00050: AIO-Reduce-number-of-threads-for-32bit-h.patch +Patch00051: xen_disk-Add-suse-specific-flush-disable.patch +Patch00052: qemu-bridge-helper-reduce-security-profi.patch +Patch00053: qemu-binfmt-conf-use-qemu-ARCH-binfmt.patch +Patch00054: roms-Makefile-pass-a-packaging-timestamp.patch +Patch00055: Raise-soft-address-space-limit-to-hard-l.patch +Patch00056: increase-x86_64-physical-bits-to-42.patch +Patch00057: i8254-Fix-migration-from-SLE11-SP2.patch +Patch00058: acpi_piix4-Fix-migration-from-SLE11-SP2.patch +Patch00059: Make-installed-scripts-explicitly-python.patch +Patch00060: hw-smbios-handle-both-file-formats-regar.patch +Patch00061: xen-add-block-resize-support-for-xen-dis.patch +Patch00062: tests-qemu-iotests-Triple-timeout-of-i-o.patch +Patch00063: tests-Fix-block-tests-to-be-compatible-w.patch +Patch00064: xen-ignore-live-parameter-from-xen-save-.patch +Patch00065: tests-change-error-message-in-test-162.patch +Patch00066: hw-intc-exynos4210_gic-provide-more-room.patch +Patch00067: configure-only-populate-roms-if-softmmu.patch +Patch00068: pc-bios-s390-ccw-net-avoid-warning-about.patch +Patch00069: roms-change-cross-compiler-naming-to-be-.patch +Patch00070: test-add-mapping-from-arch-of-i686-to-qe.patch +Patch00071: configure-remove-pkgversion-from-CONFIG_.patch +Patch00072: docs-add-SUSE-support-statements-to-html.patch +Patch00073: s390x-Fix-stringop-truncation-issue-repo.patch +Patch00074: Revert-qht-constify-qht_statistics_init.patch +Patch00075: qht-Revert-some-constification-in-qht.c.patch +Patch00076: meson-install-ivshmem-client-and-ivshmem.patch +Patch00077: Revert-roms-efirom-tests-uefi-test-tools.patch +Patch00078: Makefile-Don-t-check-pc-bios-as-pre-requ.patch +Patch00079: roms-Makefile-add-cross-file-to-qboot-me.patch +Patch00080: usb-Help-compiler-out-to-avoid-a-warning.patch +Patch00081: module-for-virtio-gpu-pre-load-module-to.patch +Patch00082: qom-handle-case-of-chardev-spice-module-.patch # Patches applied in roms/seabios/: Patch01000: seabios-use-python2-explicitly-as-needed.patch Patch01001: seabios-switch-to-python3-as-needed.patch @@ -1109,23 +1112,26 @@ This package records qemu testsuite results and represents successful testing. %patch00066 -p1 %patch00067 -p1 %patch00068 -p1 -%if %{legacy_qemu_kvm} %patch00069 -p1 -%endif %patch00070 -p1 %patch00071 -p1 +%if %{legacy_qemu_kvm} %patch00072 -p1 +%endif %patch00073 -p1 %patch00074 -p1 %patch00075 -p1 -%ifarch aarch64 %patch00076 -p1 +%patch00077 -p1 +%patch00078 -p1 +%ifarch aarch64 +%patch00079 -p1 %endif %ifarch %arm %ix86 ppc -%patch00077 -p1 +%patch00080 -p1 %endif -%patch00078 -p1 -%patch00079 -p1 +%patch00081 -p1 +%patch00082 -p1 %patch01000 -p1 %patch01001 -p1 %patch01002 -p1 diff --git a/update-linux-headers-Include-const.h.patch b/update-linux-headers-Include-const.h.patch new file mode 100644 index 00000000..3feeef3c --- /dev/null +++ b/update-linux-headers-Include-const.h.patch @@ -0,0 +1,48 @@ +From: Eric Farman +Date: Mon, 4 Jan 2021 21:20:55 +0100 +Subject: update-linux-headers: Include const.h +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Git-commit: ab5ec23f9cc25215c1281d575c07c0f35e8e9e26 +References: bsc#1183634 + +Kernel commit a85cbe6159ff ("uapi: move constants from + to ") breaks our script +because of the unrecognized include. Let's add that to +our processing. + +Signed-off-by: Eric Farman +Reviewed-by: Peter Xu +Reviewed-by: Philippe Mathieu-Daudé +Message-Id: <20210104202057.48048-2-farman@linux.ibm.com> +Signed-off-by: Cornelia Huck +Signed-off-by: Bruce Rogers +--- + scripts/update-linux-headers.sh | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/scripts/update-linux-headers.sh b/scripts/update-linux-headers.sh +index 9efbaf2f84b38bee183517934b84..fa6f2b6272b78223d28f4c823858 100755 +--- a/scripts/update-linux-headers.sh ++++ b/scripts/update-linux-headers.sh +@@ -41,6 +41,7 @@ cp_portable() { + -e 'pvrdma_verbs' \ + -e 'drm.h' \ + -e 'limits' \ ++ -e 'linux/const' \ + -e 'linux/kernel' \ + -e 'linux/sysinfo' \ + -e 'asm-generic/kvm_para' \ +@@ -190,7 +191,9 @@ for i in "$tmpdir"/include/linux/*virtio*.h \ + "$tmpdir/include/linux/input.h" \ + "$tmpdir/include/linux/input-event-codes.h" \ + "$tmpdir/include/linux/pci_regs.h" \ +- "$tmpdir/include/linux/ethtool.h" "$tmpdir/include/linux/kernel.h" \ ++ "$tmpdir/include/linux/ethtool.h" \ ++ "$tmpdir/include/linux/const.h" \ ++ "$tmpdir/include/linux/kernel.h" \ + "$tmpdir/include/linux/vhost_types.h" \ + "$tmpdir/include/linux/sysinfo.h"; do + cp_portable "$i" "$output/include/standard-headers/linux" diff --git a/vfio-ccw-Connect-the-device-request-noti.patch b/vfio-ccw-Connect-the-device-request-noti.patch new file mode 100644 index 00000000..f5858414 --- /dev/null +++ b/vfio-ccw-Connect-the-device-request-noti.patch @@ -0,0 +1,115 @@ +From: Eric Farman +Date: Mon, 4 Jan 2021 21:20:57 +0100 +Subject: vfio-ccw: Connect the device request notifier + +Git-commit: b2f96f9e4f5fbc8f2770a436191cb328da4d5350 +References: 1183634 + +Now that the vfio-ccw code has a notifier interface to request that +a device be unplugged, let's wire that together. + +Signed-off-by: Eric Farman +Reviewed-by: Cornelia Huck +Message-Id: <20210104202057.48048-4-farman@linux.ibm.com> +Signed-off-by: Cornelia Huck +Signed-off-by: Bruce Rogers +--- + hw/vfio/ccw.c | 40 ++++++++++++++++++++++++++++++++++++---- + 1 file changed, 36 insertions(+), 4 deletions(-) + +diff --git a/hw/vfio/ccw.c b/hw/vfio/ccw.c +index d2755d7fc5cace038ca7e4f87822..bc78a0ad7638c329bbc06a69a432 100644 +--- a/hw/vfio/ccw.c ++++ b/hw/vfio/ccw.c +@@ -49,6 +49,7 @@ struct VFIOCCWDevice { + struct ccw_crw_region *crw_region; + EventNotifier io_notifier; + EventNotifier crw_notifier; ++ EventNotifier req_notifier; + bool force_orb_pfch; + bool warned_orb_pfch; + }; +@@ -287,6 +288,21 @@ static void vfio_ccw_crw_read(VFIOCCWDevice *vcdev) + } while (1); + } + ++static void vfio_ccw_req_notifier_handler(void *opaque) ++{ ++ VFIOCCWDevice *vcdev = opaque; ++ Error *err = NULL; ++ ++ if (!event_notifier_test_and_clear(&vcdev->req_notifier)) { ++ return; ++ } ++ ++ qdev_unplug(DEVICE(vcdev), &err); ++ if (err) { ++ warn_reportf_err(err, VFIO_MSG_PREFIX, vcdev->vdev.name); ++ } ++} ++ + static void vfio_ccw_crw_notifier_handler(void *opaque) + { + VFIOCCWDevice *vcdev = opaque; +@@ -386,6 +402,10 @@ static void vfio_ccw_register_irq_notifier(VFIOCCWDevice *vcdev, + notifier = &vcdev->crw_notifier; + fd_read = vfio_ccw_crw_notifier_handler; + break; ++ case VFIO_CCW_REQ_IRQ_INDEX: ++ notifier = &vcdev->req_notifier; ++ fd_read = vfio_ccw_req_notifier_handler; ++ break; + default: + error_setg(errp, "vfio: Unsupported device irq(%d)", irq); + return; +@@ -440,6 +460,9 @@ static void vfio_ccw_unregister_irq_notifier(VFIOCCWDevice *vcdev, + case VFIO_CCW_CRW_IRQ_INDEX: + notifier = &vcdev->crw_notifier; + break; ++ case VFIO_CCW_REQ_IRQ_INDEX: ++ notifier = &vcdev->req_notifier; ++ break; + default: + error_report("vfio: Unsupported device irq(%d)", irq); + return; +@@ -661,20 +684,28 @@ static void vfio_ccw_realize(DeviceState *dev, Error **errp) + + vfio_ccw_register_irq_notifier(vcdev, VFIO_CCW_IO_IRQ_INDEX, &err); + if (err) { +- goto out_notifier_err; ++ goto out_io_notifier_err; + } + + if (vcdev->crw_region) { + vfio_ccw_register_irq_notifier(vcdev, VFIO_CCW_CRW_IRQ_INDEX, &err); + if (err) { +- vfio_ccw_unregister_irq_notifier(vcdev, VFIO_CCW_IO_IRQ_INDEX); +- goto out_notifier_err; ++ goto out_crw_notifier_err; + } + } + ++ vfio_ccw_register_irq_notifier(vcdev, VFIO_CCW_REQ_IRQ_INDEX, &err); ++ if (err) { ++ goto out_req_notifier_err; ++ } ++ + return; + +-out_notifier_err: ++out_req_notifier_err: ++ vfio_ccw_unregister_irq_notifier(vcdev, VFIO_CCW_CRW_IRQ_INDEX); ++out_crw_notifier_err: ++ vfio_ccw_unregister_irq_notifier(vcdev, VFIO_CCW_IO_IRQ_INDEX); ++out_io_notifier_err: + vfio_ccw_put_region(vcdev); + out_region_err: + vfio_ccw_put_device(vcdev); +@@ -696,6 +727,7 @@ static void vfio_ccw_unrealize(DeviceState *dev) + S390CCWDeviceClass *cdc = S390_CCW_DEVICE_GET_CLASS(cdev); + VFIOGroup *group = vcdev->vdev.group; + ++ vfio_ccw_unregister_irq_notifier(vcdev, VFIO_CCW_REQ_IRQ_INDEX); + vfio_ccw_unregister_irq_notifier(vcdev, VFIO_CCW_CRW_IRQ_INDEX); + vfio_ccw_unregister_irq_notifier(vcdev, VFIO_CCW_IO_IRQ_INDEX); + vfio_ccw_put_region(vcdev);