From ffdd260aa7a2683f12b6b8b442faca4e8433ce8e Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Tue, 28 Apr 2020 05:33:33 -0400 Subject: [PATCH] import libvirt-4.5.0-42.module+el8.2.0+6024+15a2423f --- .gitignore | 1 + .libvirt.metadata | 1 + ...pying-bitmaps-to-larger-data-buffers.patch | 56 + ...IA-V100-GPU-with-NVLink2-passthrough.patch | 183 + ...e-types-to-qemuDomainMachineNeedsFDC.patch | 35 + ...HEL-Fix-virConnectGetMaxVcpus-output.patch | 46 + ...round-changed-Broadwell-Haswell-CPUs.patch | 165 + ...y-after-firewalld-switch-to-nftables.patch | 146 + ...ility-to-set-sgio-values-for-hostdev.patch | 77 + ...iv-sgio-for-SCSI-generic-host-device.patch | 64 + ...ix-crash-trying-to-use-iSCSI-hostdev.patch | 45 + ...IO-use-sysfs_path-to-get-unpriv_sgio.patch | 42 + ...ulated-sysfs_path-to-set-unpriv_sgio.patch | 170 + ...pe-before-getting-it-s-dev-node-name.patch | 232 + ...-virSCSIDeviceGetUnprivSGIOSysfsPath.patch | 148 + ...ort-TAPEs-in-virSCSIDeviceGetDevName.patch | 219 + ...-non-block-devices-in-virGetDeviceID.patch | 37 + ...y-after-firewalld-switch-to-nftables.patch | 84 + ...-StateAutoStart-from-StateInitialize.patch | 93 + ..._ACCESS_DENIED-to-include-driverName.patch | 163 + ...up-into-virCgroupDetectControllersCB.patch | 108 + ...r-Separate-AutoStart-from-Initialize.patch | 295 + ...lers-not-managed-by-systemd-on-error.patch | 83 + ...nding-ACL-access-API-name-generation.patch | 60 + ..._ACCESS_DENIED-to-include-driverName.patch | 173 + ...CCESS_DENIED-to-include-driverName_1.patch | 159 + ...ss-their-UID-matches-the-current-UID.patch | 61 + ...pervisorCPU-on-read-only-connections.patch | 46 + ...apabilities-on-read-only-connections.patch | 38 + ...veDefineXML-on-read-only-connections.patch | 40 + ...eGetXMLDesc-on-read-only-connections.patch | 98 + ...of-domains-into-bhyveStateInitialize.patch | 65 + ...r-uid-and-fid-PCI-address-attributes.patch | 67 + ...conf-Add-validation-of-input-devices.patch | 76 + ...e-release-uid-and-fid-in-PCI-address.patch | 527 + ...pose-virDomainSCSIDriveAddressIsUsed.patch | 69 + ...sg-typo-in-virDomainVideoDefValidate.patch | 35 + ...nf-Fix-check-for-chardev-source-path.patch | 113 + ...e-address-caching-for-PCI-extensions.patch | 241 + ...flag-and-zPCI-member-for-PCI-address.patch | 283 + ...roduce-new-hostdev-attribute-display.patch | 416 + ...t-conf-Introduce-new-video-type-none.patch | 504 + ...uce-parser-formatter-for-uid-and-fid.patch | 574 + ...onf-Introduce-virCPUDefCheckFeatures.patch | 103 + ...troduce-virDomainDefPostParseMemtune.patch | 210 + ...ce-virDomainDefPostParseVideo-helper.patch | 89 + ...virDomainGraphicsDefHasOpenGL-helper.patch | 105 + ...roduce-virDomainVideoDefClear-helper.patch | 84 + ...m-post-parse-to-QEMU-validation-code.patch | 122 + ...validation-check-out-of-qemu_command.patch | 247 + ...gepages-validation-out-of-XML-parser.patch | 126 + ...f-Parse-and-format-nested-hv-feature.patch | 152 + ...e-and-format-the-HTM-pSeries-feature.patch | 194 + ...e-guestfwd-channel-device-info-again.patch | 48 + ...in-virDomainHostdevDefParseXMLSubsys.patch | 175 + ...boot-order-error-during-domain-parse.patch | 214 + ...add-support-for-Hyper-V-PV-TLB-flush.patch | 262 + ...d-support-for-Hyper-V-frequency-MSRs.patch | 262 + ...yper-V-reenlightenment-notifications.patch | 264 + ...Element-in-virDomainDeviceInfoFormat.patch | 154 + ...nge-HAVE_FIREWALLD-to-WITH_FIREWALLD.patch | 110 + ...ely-install-a-firewalld-libvirt-zone.patch | 280 + ...Add-support-for-stibp-x86_64-feature.patch | 202 + ...invalid-memory-in-virCPUx86Translate.patch | 59 + ...op-CPUID-definition-for-hv-spinlocks.patch | 82 + ...Drop-KVM_-from-hyperv-feature-macros.patch | 156 + ...libvirt-cpu-Drop-unused-KVM-features.patch | 102 + ...t-cpu-Introduce-virCPUDataAddFeature.patch | 176 + ...low-include-files-for-CPU-definition.patch | 159 + ...cleanup-when-signature-parsing-fails.patch | 51 + ...-more-parsing-logic-into-common-code.patch | 782 + ...t-cpu-simplify-failure-cleanup-paths.patch | 397 + ...nf-Introduce-virCPUDefFilterFeatures.patch | 91 + ...y-to-CPU-feature-filtering-callbacks.patch | 165 + ...map-Add-Cascadelake-Server-CPU-model.patch | 211 + ...bvirt-cpu_map-Add-Icelake-CPU-models.patch | 219 + ...O-bit-for-IA32_ARCH_CAPABILITIES-MSR.patch | 47 + ...L-bit-for-IA32_ARCH_CAPABILITIES-MSR.patch | 46 + ...pu_map-Add-features-for-Icelake-CPUs.patch | 379 + ...Add-hex-representation-of-signatures.patch | 318 + ...-signatures-for-Broadwell-CPU-models.patch | 254 + ...more-signatures-for-Conroe-CPU-model.patch | 41 + ...re-signatures-for-Haswell-CPU-models.patch | 76 + ...-signatures-for-IvyBridge-CPU-models.patch | 50 + ...re-signatures-for-Nehalem-CPU-models.patch | 54 + ...more-signatures-for-Penryn-CPU-model.patch | 41 + ...ignatures-for-SandyBridge-CPU-models.patch | 50 + ...atures-for-Skylake-Client-CPU-models.patch | 58 + ...re-signatures-for-Westmere-CPU-model.patch | 184 + ...upport-for-arch-capabilities-feature.patch | 110 + ...Add-support-for-cldemote-CPU-feature.patch | 46 + ...rt-cpu_map-Define-md-clear-CPUID-bit.patch | 102 + ...config-from-Icelake-Server-CPU-model.patch | 190 + ...-IA32_ARCH_CAPABILITIES-MSR-features.patch | 155 + ...6-Add-support-for-BFLOAT16-data-type.patch | 46 + ...-for-storing-MSR-features-in-CPU-map.patch | 328 + ...-virCPUx86DataGetSignature-for-tests.patch | 81 + ...86-Add-x86ModelCopySignatures-helper.patch | 77 + ...-multiple-signatures-for-a-CPU-model.patch | 114 + ...u_x86-Do-not-cache-microcode-version.patch | 60 + ...x86-Fix-memory-leak-virCPUx86GetHost.patch | 43 + ...-placement-of-CheckFeature-functions.patch | 119 + ...t-cpu_x86-Introduce-virCPUx86DataCmp.patch | 60 + ...e-virCPUx86DataItem-container-struct.patch | 850 + ...Introduce-virCPUx86FeatureFilter-MSR.patch | 133 + ...Log-decoded-CPU-model-and-signatures.patch | 79 + ...PU-model-names-are-unique-in-cpu_map.patch | 49 + ...86-Make-x86cpuidAndBits-more-general.patch | 64 + ...-Make-x86cpuidClearBits-more-general.patch | 84 + ..._x86-Make-x86cpuidMatch-more-general.patch | 96 + ...ake-x86cpuidMatchMasked-more-general.patch | 88 + ...86-Make-x86cpuidSetBits-more-general.patch | 64 + ...-cpu_x86-Move-CheckFeature-functions.patch | 115 + ...ures-from-IA32_ARCH_CAPABILITIES-MSR.patch | 61 + ...-cpu_x86-Rename-virCPUx86CPUIDSorter.patch | 50 + ...cpu_x86-Rename-virCPUx86DataAddCPUID.patch | 274 + ..._x86-Rename-virCPUx86DataAddCPUIDInt.patch | 107 + ...6-Rename-virCPUx86DataItem-variables.patch | 328 + ...cpu_x86-Rename-virCPUx86Vendor.cpuid.patch | 99 + ...pu_x86-Rename-virCPUx86VendorToCPUID.patch | 60 + .../libvirt-cpu_x86-Rename-x86DataCpuid.patch | 141 + ...x86-Rename-x86DataCpuidNext-function.patch | 113 + ...uire-cpuid-within-feature-in-CPU-map.patch | 46 + ...tor-model-parsing-from-x86ModelParse.patch | 110 + ...ture-list-parsing-from-x86ModelParse.patch | 129 + ...signature-parsing-from-x86ModelParse.patch | 103 + ...te-vendor-parsing-from-x86ModelParse.patch | 109 + .../libvirt-cpu_x86-Simplify-x86DataAdd.patch | 54 + ..._x86-Store-CPU-signature-in-an-array.patch | 161 + ...e-virCPUx86DataItem-content-in-union.patch | 487 + ...Ux86DataIteratorInit-into-a-function.patch | 147 + ...est-Add-data-for-Ice-Lake-Server-CPU.patch | 1429 + ...dd-data-for-Intel-R-Core-TM-i7-7600U.patch | 979 + ...Add-data-for-Intel-R-Core-TM-i7-8700.patch | 873 + ...ta-for-Intel-R-Xeon-R-CPU-E3-1225-v5.patch | 885 + ...ta-for-Intel-R-Xeon-R-CPU-E5-2630-v4.patch | 824 + ...-data-for-Intel-R-Xeon-R-CPU-E5-2650.patch | 1144 + ...dd-data-for-Intel-R-Xeon-R-CPU-E7540.patch | 1317 + ...for-Intel-R-Xeon-R-Platinum-8268-CPU.patch | 968 + ...ort-for-MSR-features-to-cpu-parse.sh.patch | 41 + .../libvirt-cputest-Test-CPU-signatures.patch | 755 + ...-secret-driver-before-storage-driver.patch | 59 + ...-tun-from-the-list-of-shared-devices.patch | 39 + ...ion-to-describe-secondary-connection.patch | 173 + ...diated-devices-hostdev-section-a-bit.patch | 44 + ...ma-Add-missing-alias-to-vsock-device.patch | 39 + ...e-the-virtio-options-from-each-other.patch | 44 + ...in-virDomainConfNWFilterTeardownImpl.patch | 46 + ...x-storage-Fix-typo-lsilogic-lsiLogic.patch | 42 + ...clean-traffic-gateway-into-nwfilters.patch | 77 + ...introduce-a-family-of-NULLSTR-macros.patch | 55 + SOURCES/libvirt-lib-Drop-UDEVSETTLE.patch | 73 + ...ocking-restrict-sockets-to-mode-0600.patch | 54 + ...ogging-restrict-sockets-to-mode-0600.patch | 54 + ...bvirt-lxc-Use-virCgroupGetMemoryStat.patch | 100 + ...bvirt-m4-Drop-needless-string-checks.patch | 51 + ...4-Provide-default-value-fore-UDEVADM.patch | 100 + ...ne-for-virtual-network-bridge-device.patch | 332 + ...llow-icmp-icmpv6-in-libvirt-zonefile.patch | 61 + ...ges-to-libvirt-zone-when-appropriate.patch | 174 + ...-error-if-unable-to-read-leases-file.patch | 59 + ...e-SEGV-for-NWFilter-Snoop-processing.patch | 79 + ...-MAC-and-IP-values-to-filter-binding.patch | 164 + ...s-wait-longer-5-30s-on-hard-shutdown.patch | 56 + ...-longer-on-kill-per-assigned-Hostdev.patch | 138 + ...dd-APIs-for-translating-CPU-features.patch | 124 + ...pability-for-the-HTM-pSeries-feature.patch | 80 + ...qemu-Add-ccw-support-for-vhost-vsock.patch | 343 + ...k-for-whether-KVM-nesting-is-enabled.patch | 162 + ...pport-for-PCI-devices-on-S390-guests.patch | 316 + ...ter-to-qemuMonitorJSONParsePropsList.patch | 89 + ...mu-Add-zPCI-address-definition-check.patch | 156 + ...uests-with-graphics-and-no-USB-mouse.patch | 76 + ...etUnprivSGIO-hostdev-shareable-logic.patch | 53 + ...Alter-val-usage-in-qemuSetUnprivSGIO.patch | 60 + ...o-add-pci-root-for-s390-s390x-guests.patch | 46 + ...cate-resume-events-and-state-changes.patch | 243 + ...ing-non-native-binaries-all-the-time.patch | 45 + .../libvirt-qemu-Clarify-QEMU_CAPS_KVM.patch | 88 + ...t-qemu-Don-t-cache-microcode-version.patch | 154 + ...emu-Don-t-check-for-dev-kvm-presence.patch | 45 + ...virt-qemu-Don-t-ignore-resume-events.patch | 68 + ...u-Don-t-use-full-CPU-model-expansion.patch | 2643 ++ ...em-prealloc-among-with-.prealloc-yes.patch | 200 + ...atures-from-host-model-with-old-QEMU.patch | 65 + ...bvirt-qemu-Drop-QEMU_CAPS_ENABLE_KVM.patch | 108 + ...abel-from-qemuProcessInitCpuAffinity.patch | 74 + ...isabled-CPU-features-unknown-to-QEMU.patch | 99 + ...e-from-qemuDomainDefValidateFeatures.patch | 60 + ...Drop-user-prefix-for-guestfwd-netdev.patch | 65 + ...Enable-PCI-multi-bus-for-S390-guests.patch | 54 + ...ne-from-getting-a-PCI-address-on-Q35.patch | 45 + ...lidation-code-into-a-separate-helper.patch | 93 + ...-pr-helper-process-info-on-reconnect.patch | 104 + ...evs-in-qemuHostdevPrepareSCSIDevices.patch | 41 + ...UTE_NONNULL-for-qemuMonitorAddObject.patch | 41 + ...-qemu-Fix-KVM-features-with-QEMU-4.1.patch | 67 + ...access-in-qemuProcessInitCpuAffinity.patch | 47 + ...ed-by-qemuDomainDefFormatBufInternal.patch | 51 + ...mu-Fix-hyperv-features-with-QEMU-4.1.patch | 100 + ...x-leak-in-qemuProcessInitCpuAffinity.patch | 65 + ...Fix-logic-error-in-qemuSetUnprivSGIO.patch | 59 + ...ix-post-copy-migration-on-the-source.patch | 110 + ...-qemu-Fix-probing-of-AMD-SEV-support.patch | 143 + ...-qemu-Fix-qemuProcessInitCpuAffinity.patch | 76 + ...etting-global_period-cputune-element.patch | 40 + ...mu-Forbid-MSR-features-with-old-QEMU.patch | 80 + ...ested-hv-feature-on-the-command-line.patch | 68 + ...-qemu-Format-the-HTM-pSeries-feature.patch | 102 + ...use-zPCI-device-in-QEMU-command-line.patch | 834 + ...nstantiation-issues-during-reconnect.patch | 88 + ...U_CAPS_MACHINE_PSERIES_CAP_NESTED_HV.patch | 109 + ...a-new-graphics-display-type-headless.patch | 908 + ...oduce-generic-qemuMonitorGetGuestCPU.patch | 323 + ...bvirt-qemu-Introduce-zPCI-capability.patch | 156 + ...onitorGetGuestCPU-usable-on-x86-only.patch | 228 + ...unning-reason-to-resume-event-detail.patch | 121 + ...nning-reason-to-RESUME-event-handler.patch | 123 + ...mu-Prefer-dashes-for-hyperv-features.patch | 160 + ...t-qemu-Probe-for-max-x86_64-cpu-type.patch | 155 + ...or-unavailable-features-CPU-property.patch | 3972 +++ ...mu-Probe-host-CPU-after-capabilities.patch | 403 + ...R_DOMAIN_EVENT_RESUMED_FROM_SNAPSHOT.patch | 42 + ...emove-duplicated-qemuAgentCheckError.patch | 48 + ...ssSecurityDriver-from-qemuOpenFileAs.patch | 157 + ...ort-more-appropriate-running-reasons.patch | 61 + ...qemu-Rework-setting-process-affinity.patch | 265 + ...dentity-for-the-reconnect-all-thread.patch | 94 + ...and-cpuset.mems-before-exec-ing-qemu.patch | 70 + ...names-from-query-cpu-model-expansion.patch | 133 + ...eatures-in-virQEMUCapsGetCPUFeatures.patch | 69 + ...tachChrDevice-to-build-device-string.patch | 43 + ...e-up-PR_MANAGER_STATUS_CHANGED-event.patch | 275 + .../libvirt-qemu-add-vfio-ap-capability.patch | 58 + ...e-video-devices-within-a-single-loop.patch | 52 + ...error-rerror-for-usb-device-frontend.patch | 73 + ...caps-Add-vfio-pci.display-capability.patch | 142 + ...ask-for-CAP_DAC_OVERRIDE-if-non-root.patch | 39 + ...EV-platform-data-into-qemuCaps-cache.patch | 238 + ...roduce-a-capability-for-egl-headless.patch | 223 + ...r-probing-to-avoid-permission-issues.patch | 127 + ...sev-only-to-domains-that-require-SEV.patch | 65 + ...mat-image-properties-for-empty-drive.patch | 143 + ...-and-throttling-info-for-empty-drive.patch | 108 + ...vfio-pci.display-option-onto-cmdline.patch | 479 + ...aphics-iteration-to-its-own-function.patch | 105 + ...m-the-default-cgroup-device-acl-list.patch | 81 + ...of-qemuBuildChrChardevStr-into-flags.patch | 313 + ...e-domain-mount-namespace-selectively.patch | 75 + ...O-memLockLimit-calculation-for-PPC64.patch | 66 + ...dev-FD-passing-for-vhostuser-backend.patch | 171 + ...rdev-FD-passing-with-standalone-args.patch | 63 + ...et-chardevs-operating-in-client-mode.patch | 132 + ...issions-for-pre-created-UNIX-sockets.patch | 50 + ...-object-for-TLS-if-it-does-not-exist.patch | 40 + ...cess-srcPriv-when-it-s-not-allocated.patch | 42 + ...lug-Fix-asynchronous-unplug-of-shmem.patch | 47 + ...message-in-qemuDomainAttachNetDevice.patch | 51 + ...nging-rom-enabled-attr-for-net-iface.patch | 40 + ...ay-property-only-with-vfio-pci-mdevs.patch | 43 + ...re-robust-against-programming-errors.patch | 91 + ...onitorJSONExtractCPUArchInfo-wrapper.patch | 88 + ...-of-arch-in-reply-of-query-cpus-fast.patch | 52 + ...-be-the-directory-to-create-files-in.patch | 66 + ...ner-s-SEV-files-created-before-start.patch | 51 + ...ndLine-Use-a-helper-variable-mdevsrc.patch | 49 + ...oLogd-param-from-vhostuser-code-path.patch | 98 + ...uest-agent-in-qemuAgentGetInterfaces.patch | 50 + ...time-switch-type-checking-for-videos.patch | 59 + .../libvirt-qemu-vfio-ap-device-support.patch | 166 + ...rt-qemu-vnc-switch-to-tls-creds-x509.patch | 87 + ...iv-instead-of-its-individual-members.patch | 172 + ...heck-for-range-only-if-IP-prefix-set.patch | 41 + ...NestedJobAllowed-Allow-QEMU_JOB_NONE.patch | 47 + ...Device-Remove-associated-chardev-too.patch | 76 + ...emory-Don-t-enforce-dynamicOwnership.patch | 90 + ...ateStorageSource-Relax-PR-validation.patch | 64 + ...emoryPathsImpl-Don-t-overwrite-error.patch | 45 + ...t-NS-iff-domain-was-started-with-one.patch | 52 + ...roduce-virQEMUCapsGetCPUModelX86Data.patch | 120 + ...Introduce-virQEMUCapsGetCPUModelInfo.patch | 65 + ...ities-Use-virQEMUCapsGetCPUModelInfo.patch | 132 + ...-Use-canonical-names-of-CPU-features.patch | 137 + ...e-consistent-syntax-for-CPU-features.patch | 121 + ...-bridge-detection-function-for-PPC64.patch | 85 + ...main-add-a-PPC64-memLockLimit-helper.patch | 219 + ...lug-Attach-guestfwd-using-netdev_add.patch | 65 + ...-Check-for-duplicate-drive-addresses.patch | 43 + ...lug-Detach-guestfwd-using-netdev_del.patch | 137 + ...qemuDomainDetachExtensionDevice-call.patch | 52 + ...l-to-qemuDomainDetachExtensionDevice.patch | 99 + ...ration-Avoid-writing-to-freed-memory.patch | 48 + ...duce-qemuMonitorJSONGetPRManagerInfo.patch | 180 + ...refer-generic-qemuMonitorGetGuestCPU.patch | 81 + ...ement-qemuSecurityDomainSetPathLabel.patch | 166 + ...est-Don-t-plug-a-SCSI-disk-at-unit-7.patch | 71 + ...test-Test-guestfwd-attach-and-detach.patch | 117 + ...Add-tests-for-Icelake-Server-pconfig.patch | 128 + ...dd-test-for-CPU-features-translation.patch | 134 + ...hsession-update-deprecated-functions.patch | 63 + ...-for-correct-usage-when-LookupByUUID.patch | 78 + ...dac-Relabel-dev-sev-in-the-namespace.patch | 122 + ...y-dac-also-label-listen-UNIX-sockets.patch | 64 + ...report-an-error-when-not-returning-1.patch | 55 + ...ry-leak-in-virNWFilterBindingDispose.patch | 69 + ...t-in-virDomainDetachDeviceAlias-docs.patch | 40 + ...-qemu-img-command-when-shrinking-vol.patch | 47 + ...ol-to-have-any-format-for-encryption.patch | 137 + ...orage-Allow-inputvol-to-be-encrypted.patch | 347 + ...h-from-_virStorageBackendQemuImgInfo.patch | 61 + ...t-Introduce-virnetdevopenvswitchtest.patch | 356 + ...-Add-QEMU-caps-data-for-future-4.1.0.patch | 25247 ++++++++++++++++ ...pabilities-data-for-QEMU-2.11-x86_64.patch | 20429 +++++++++++++ ...ilities-data-for-QEMU-3.1.0-on-ppc64.patch | 24815 +++++++++++++++ ...ain-capabilities-case-for-QEMU-4.1.0.patch | 203 + ...ibvirt-tests-Add-linux-high-ids-test.patch | 1112 + ...d-missing-thread_siblings_list-files.patch | 654 + ...tests-Add-more-tests-to-qemucaps2xml.patch | 1089 + ...uptest-to-add-virCgroupGetMemoryStat.patch | 112 + ...Follow-up-on-qemucaps2xmldata-rename.patch | 37 + ...bvirt-tests-Resolve-possible-overrun.patch | 84 + ...mucapabilities-data-for-qemucaps2xml.patch | 478 + ...abilities-data-for-QEMU-3.0.0-x86_64.patch | 837 + ...-correct-function-name-in-error-path.patch | 40 + ...a-default-dimm-out-of-hugepages-numa.patch | 207 + ...rd-hugepages-out-of-hugepages-pages3.patch | 203 + ...pages-discard-out-of-hugepages-pages.patch | 234 + ...x-TLS-handshake-failure-with-TLS-1.3.patch | 42 + ...duce-hugepages-default-1G-nodeset-2M.patch | 144 + ...rt-tests-introduce-hugepages-nodeset.patch | 106 + ...mu-Remove-disk-from-graphics-vnc-tls.patch | 72 + ...t-more-versions-for-graphics-vnc-tls.patch | 116 + ...dd-test-data-for-upcoming-qemu-3.0.0.patch | 23984 +++++++++++++++ ...case-for-empty-CDROM-with-cache-mode.patch | 85 + ...uxml2argv-add-CAPS_ARCH_LATEST-macro.patch | 99 + ...elements-from-hugepages-numa-default.patch | 208 + ...ges-numa-into-hugepages-numa-default.patch | 48 + ...es-pages-into-hugepages-numa-nodeset.patch | 184 + ...ages2-into-hugepages-numa-default-2M.patch | 146 + ...es3-into-hugepages-numa-nodeset-part.patch | 137 + ...into-hugepages-numa-nodeset-nonexist.patch | 125 + ...ges-pages5-into-hugepages-default-2M.patch | 140 + ...6-into-hugepages-default-system-size.patch | 141 + ...pages-pages7-into-pages-dimm-discard.patch | 189 + ...ges8-into-hugepages-nodeset-nonexist.patch | 85 + ...ename-hugepages-to-hugepages-default.patch | 115 + ...-security-with-specific-QEMU-version.patch | 101 + ...x-typo-generating-adapter_wwpn-field.patch | 35 + ...ossible-error-in-virCommandMassClose.patch | 47 + ...util-Don-t-overflow-in-virRandomBits.patch | 44 + ...virt-util-Fix-virCgroupGetMemoryStat.patch | 89 + ...ibvirt-util-Introduce-virBitmapUnion.patch | 149 + ...til-Introduce-virNumaNodesetToCPUset.patch | 128 + ...l-Propagate-numad-failures-correctly.patch | 63 + ...libvirt-util-Rework-virStringListAdd.patch | 145 + ...ewrite-virHostCPUCountThreadSiblings.patch | 91 + ...terfaces-to-IPv6CheckForwarding-list.patch | 82 + ...ting-automatic-cleanup-functionality.patch | 78 + ...nction-using-VIR_DEFINE_AUTOPTR_FUNC.patch | 66 + ...instead-of-VIR_FREE-for-scalar-types.patch | 1528 + ...xthop-interfaces-of-multipath-routes.patch | 81 + ...numerating-file-descriptors-to-close.patch | 62 + ...nction-using-VIR_DEFINE_AUTOPTR_FUNC.patch | 69 + ...instead-of-VIR_FREE-for-scalar-types.patch | 194 + ...ups-v2-cpuset-controller-for-threads.patch | 44 + ...o-close-fd-of-the-file-automatically.patch | 68 + ...leak-in-virFirewallDInterfaceSetZone.patch | 45 + ...ement-virCgroupV2-Set-Get-CpusetCpus.patch | 66 + ...CgroupV2-Set-Get-CpusetMemoryMigrate.patch | 64 + ...ement-virCgroupV2-Set-Get-CpusetMems.patch | 67 + ...bvirt-util-introduce-cgroup-v2-files.patch | 256 + ...til-introduce-vircgroupbackend-files.patch | 197 + ...nction-using-VIR_DEFINE_AUTOPTR_FUNC.patch | 69 + ...ted-during-review-of-commit-d40b820c.patch | 66 + ...ld-specific-stuff-into-its-own-files.patch | 480 + ...t-to-avoid-issues-with-mount-syscall.patch | 43 + ...instead-of-VIR_FREE-for-scalar-types.patch | 98 + ...-use-VIR_AUTOPTR-for-aggregate-types.patch | 277 + ...virt-util-new-virFirewallD-APIs-docs.patch | 343 + ...msghdr-arg-to-virNetlinkDumpCallback.patch | 51 + ...-committed-to-virFirewallDZoneExists.patch | 46 + ...etection-for-non-PCI-network-devices.patch | 51 + ...uce-macro-for-automatic-string-lists.patch | 94 + ...-errors-when-getting-interface-stats.patch | 55 + ...d_attr-instead-of-an-open-coded-loop.patch | 106 + ...rcgroup-improve-controller-detection.patch | 117 + ...introduce-virCgroup-Get-Set-ValueRaw.patch | 161 + ...tr-out-of-virCgroupGetValueForBlkDev.patch | 323 + ...up-into-virCgroupDetectControllersCB.patch | 105 + ...upv1-add-support-for-BFQ-blkio-files.patch | 202 + ...ircgroupv2-add-support-for-BFQ-files.patch | 211 + ...ror-out-if-enabling-controller-fails.patch | 64 + ...PU-controller-only-if-it-s-available.patch | 44 + ...y-requested-controllers-as-available.patch | 53 + ...alues-of-virCgroupV2EnableController.patch | 104 + ...ing-missing-controllers-with-systemd.patch | 80 + ...ontroller-to-create-thread-directory.patch | 42 + ...-Drop-an-unused-variable-ovs_timeout.patch | 42 + ...arbitrary-limit-on-socket_id-core_id.patch | 93 + ...mmand-use-procfs-to-learn-opened-FDs.patch | 145 + ...initialize-xml-to-avoid-random-crash.patch | 52 + ...tibleDevice-Relax-alias-change-check.patch | 55 + ...DeviceFlags-Clarify-update-semantics.patch | 50 + ...BIStability-Check-for-MTU-change-too.patch | 47 + ...ter-error-message-than-Duplicate-key.patch | 123 + ...mainObjListAddLocked-fix-double-free.patch | 64 + ...dFSType-Check-for-fuse.glusterfs-too.patch | 128 + ...redFSType-Detect-direct-mount-points.patch | 80 + ...tchInterfaceStats-Optimize-for-speed.patch | 175 + ...s-path-formatting-for-migratable-XML.patch | 80 + ...vices-Drop-confusing-part-of-comment.patch | 41 + ...roupRemove-inside-virCgroupMakeGroup.patch | 106 + ...up-Duplicate-string-before-modifying.patch | 75 + ...t-controller-detection-into-function.patch | 95 + ...ink-resolving-into-separate-function.patch | 137 + ...mount-options-matching-into-function.patch | 127 + ...t-placement-validation-into-function.patch | 102 + ...tandard-set-of-typedefs-and-use-them.patch | 72 + ...ce-virCgroupEnableMissingControllers.patch | 185 + ...oup-Introduce-virCgroupGetMemoryStat.patch | 155 + ...n-used-in-tests-into-vircgrouppriv.h.patch | 74 + ...-vircgroup-Remove-obsolete-sa_assert.patch | 40 + ...roup-Remove-pointless-bool-parameter.patch | 60 + ...Remove-unused-function-virCgroupKill.patch | 105 + ...up-Remove-virCgroupAddTaskController.patch | 76 + ...ame-structs-to-start-with-underscore.patch | 80 + ...-if-conditions-in-virCgroupMakeGroup.patch | 62 + ...pPathOfController-into-two-functions.patch | 138 + ...-function-virCgroupAddTaskController.patch | 148 + ...-function-virCgroupRemoveRecursively.patch | 80 + ...ntroller-in-virCgroupDetectPlacement.patch | 86 + ...add-support-for-hybrid-configuration.patch | 985 + ...lers-not-managed-by-systemd-on-error.patch | 77 + ...-detect-available-backend-for-cgroup.patch | 151 + ...ircgroup-extract-v1-detect-functions.patch | 426 + ...ct-virCgroupV1-Allow-Deny-AllDevices.patch | 140 + ...xtract-virCgroupV1-Allow-Deny-Device.patch | 250 + ...rCgroupV1-Set-Get-BlkioDeviceReadBps.patch | 181 + ...CgroupV1-Set-Get-BlkioDeviceReadIops.patch | 181 + ...irCgroupV1-Set-Get-BlkioDeviceWeight.patch | 208 + ...CgroupV1-Set-Get-BlkioDeviceWriteBps.patch | 181 + ...groupV1-Set-Get-BlkioDeviceWriteIops.patch | 181 + ...ract-virCgroupV1-Set-Get-BlkioWeight.patch | 150 + ...act-virCgroupV1-Set-Get-CpuCfsPeriod.patch | 142 + ...ract-virCgroupV1-Set-Get-CpuCfsQuota.patch | 168 + ...xtract-virCgroupV1-Set-Get-CpuShares.patch | 123 + ...tract-virCgroupV1-Set-Get-CpusetCpus.patch | 126 + ...CgroupV1-Set-Get-CpusetMemoryMigrate.patch | 132 + ...tract-virCgroupV1-Set-Get-CpusetMems.patch | 128 + ...act-virCgroupV1-Set-Get-FreezerState.patch | 123 + ...act-virCgroupV1-Set-Get-Memory-Limit.patch | 478 + ...vircgroup-extract-virCgroupV1AddTask.patch | 234 + ...rcgroup-extract-virCgroupV1Available.patch | 173 + ...rcgroup-extract-virCgroupV1BindMount.patch | 310 + ...cgroup-extract-virCgroupV1CopyMounts.patch | 129 + ...oup-extract-virCgroupV1CopyPlacement.patch | 163 + ...extract-virCgroupV1DetectControllers.patch | 218 + ...-extract-virCgroupV1GetAnyController.patch | 118 + ...-virCgroupV1GetBlkioIoDeviceServiced.patch | 278 + ...xtract-virCgroupV1GetBlkioIoServiced.patch | 265 + ...-extract-virCgroupV1GetCpuacct-Usage.patch | 122 + ...up-extract-virCgroupV1GetCpuacctStat.patch | 167 + ...p-extract-virCgroupV1GetMemSwapUsage.patch | 105 + ...oup-extract-virCgroupV1GetMemoryStat.patch | 228 + ...up-extract-virCgroupV1GetMemoryUsage.patch | 105 + ...oup-extract-virCgroupV1HasController.patch | 92 + ...oup-extract-virCgroupV1HasEmptyTasks.patch | 113 + ...rcgroup-extract-virCgroupV1MakeGroup.patch | 446 + ...-extract-virCgroupV1PathOfController.patch | 135 + ...-vircgroup-extract-virCgroupV1Remove.patch | 172 + ...rcgroup-extract-virCgroupV1SetMemory.patch | 129 + ...ircgroup-extract-virCgroupV1SetOwner.patch | 198 + ...up-extract-virCgroupV1StealPlacement.patch | 94 + ...oup-extract-virCgroupV1SupportsCpuBW.patch | 111 + ...ract-virCgroupV1ValidateMachineGroup.patch | 290 + ...extract-virCgroupV1ValidatePlacement.patch | 150 + .../libvirt-vircgroup-fix-MinGW-build.patch | 52 + ...in-virCgroupEnableMissingControllers.patch | 50 + ...fix-cgroups-v2-controllers-detection.patch | 128 + ...include-system-headers-only-on-linux.patch | 83 + ...up-introduce-cgroup-v1-backend-files.patch | 186 + ...rcgroup-introduce-virCgroupAddThread.patch | 126 + ...p-introduce-virCgroupKillRecursiveCB.patch | 286 + ...rcgroup-introduce-virCgroupTaskFlags.patch | 86 + ...rCgroupV2-Set-Get-BlkioDeviceReadBps.patch | 112 + ...CgroupV2-Set-Get-BlkioDeviceReadIops.patch | 112 + ...irCgroupV2-Set-Get-BlkioDeviceWeight.patch | 93 + ...CgroupV2-Set-Get-BlkioDeviceWriteBps.patch | 112 + ...groupV2-Set-Get-BlkioDeviceWriteIops.patch | 112 + ...duce-virCgroupV2-Set-Get-BlkioWeight.patch | 91 + ...uce-virCgroupV2-Set-Get-CpuCfsPeriod.patch | 116 + ...duce-virCgroupV2-Set-Get-CpuCfsQuota.patch | 94 + ...roduce-virCgroupV2-Set-Get-CpuShares.patch | 65 + ...virCgroupV2-Set-Get-MemSwapHardLimit.patch | 104 + ...-virCgroupV2-Set-Get-MemoryHardLimit.patch | 85 + ...-virCgroupV2-Set-Get-MemorySoftLimit.patch | 103 + ...rcgroup-introduce-virCgroupV2AddTask.patch | 67 + ...group-introduce-virCgroupV2Available.patch | 116 + ...group-introduce-virCgroupV2BindMount.patch | 83 + ...roup-introduce-virCgroupV2CopyMounts.patch | 49 + ...p-introduce-virCgroupV2CopyPlacement.patch | 68 + ...troduce-virCgroupV2DetectControllers.patch | 125 + ...up-introduce-virCgroupV2DetectMounts.patch | 58 + ...introduce-virCgroupV2DetectPlacement.patch | 72 + ...ntroduce-virCgroupV2GetAnyController.patch | 51 + ...-virCgroupV2GetBlkioIoDeviceServiced.patch | 106 + ...roduce-virCgroupV2GetBlkioIoServiced.patch | 107 + ...-introduce-virCgroupV2GetCpuacctStat.patch | 91 + ...introduce-virCgroupV2GetCpuacctUsage.patch | 75 + ...introduce-virCgroupV2GetMemSwapUsage.patch | 58 + ...p-introduce-virCgroupV2GetMemoryStat.patch | 117 + ...-introduce-virCgroupV2GetMemoryUsage.patch | 57 + ...p-introduce-virCgroupV2HasController.patch | 51 + ...p-introduce-virCgroupV2HasEmptyTasks.patch | 59 + ...group-introduce-virCgroupV2MakeGroup.patch | 174 + ...ntroduce-virCgroupV2PathOfController.patch | 66 + ...ircgroup-introduce-virCgroupV2Remove.patch | 62 + ...group-introduce-virCgroupV2SetMemory.patch | 71 + ...cgroup-introduce-virCgroupV2SetOwner.patch | 69 + ...-introduce-virCgroupV2StealPlacement.patch | 54 + ...p-introduce-virCgroupV2SupportsCpuBW.patch | 58 + ...duce-virCgroupV2ValidateMachineGroup.patch | 94 + ...troduce-virCgroupV2ValidatePlacement.patch | 57 + ...group-machinename-will-never-be-NULL.patch | 87 + ...vircgroup-register-cgroup-v2-backend.patch | 39 + ...ircgroup-remove-VIR_CGROUP_SUPPORTED.patch | 72 + ...rcgroup-rename-controllers-to-legacy.patch | 524 + ...upAdd.-Task-to-virCgroupAdd.-Process.patch | 222 + ...ontroller-into-virCgroupV1Controller.patch | 82 + ...upmock-add-support-to-test-cgroup-v2.patch | 253 + ...t-vircgroupmock-change-cgroup-prefix.patch | 104 + ...roupmock-cleanup-unused-cgroup-files.patch | 150 + ...oupmock-rewrite-cgroup-fopen-mocking.patch | 390 + ...rt-vircgrouptest-add-cgroup-v2-tests.patch | 83 + ...add-detect-mounts-test-for-cgroup-v2.patch | 115 + ...etect-mounts-test-for-hybrid-cgroups.patch | 125 + ...bvirt-vircgrouptest-add-hybrid-tests.patch | 90 + ...-call-virCgroupDetectMounts-directly.patch | 163 + ...ewSelf-instead-virCgroupDetectMounts.patch | 544 + ...initFakeFS-and-cleanupFakeFS-helpers.patch | 120 + ...testCgroupDetectMounts-for-cgroup-v2.patch | 137 + ...-prepare-validateCgroup-for-cgroupv2.patch | 150 + ...cgroupv1-fix-build-on-non-linux-OSes.patch | 94 + ...ircgroupv2-fix-abort-in-VIR_AUTOFREE.patch | 65 + ...rsing-multiple-values-in-single-file.patch | 105 + ...rcgroupv2-fix-setting-cpu.max-period.patch | 42 + ...CgroupV2GetCpuCfsQuota-for-max-value.patch | 39 + ...-fix-virCgroupV2ValidateMachineGroup.patch | 47 + ...ircgroupv2-store-enabled-controllers.patch | 79 + ...rate-mass-FD-closing-into-a-function.patch | 111 + ...cpuhost-Add-support-for-reading-MSRs.patch | 155 + ...s-long-as-the-while-loop-is-executed.patch | 49 + ...irt-virfile-Detect-ceph-as-shared-FS.patch | 139 + ...irfile-Rework-virFileIsSharedFixFUSE.patch | 151 + ...to-account-in-virFileIsSharedFixFUSE.patch | 187 + ...virt-virfile-added-GPFS-as-shared-fs.patch | 124 + ...libvirt-virfile-fix-cast-align-error.patch | 95 + ...t-name-prefix-for-virFileInData-test.patch | 37 + ...rt-virfiletst-Test-virFileIsSharedFS.patch | 358 + ...ke-virHostCPUGetMSR-work-only-on-x86.patch | 89 + ...ifname-in-virNetDevTapInterfaceStats.patch | 60 + ...undefined-behaviour-in-virRandomBits.patch | 40 + ...explicit-domain-for-domxml-to-native.patch | 90 + ...declaration-when-extracting-CPU-XMLs.patch | 63 + ...p-persistent-for-detach-device-alias.patch | 35 + ...me-typo-in-nwfilter-binding-undefine.patch | 39 + ...host-validate-Fix-build-on-non-Linux.patch | 45 + ...ost-validate-require-freezer-for-LXC.patch | 38 + ...roup-detection-to-use-util-vircgroup.patch | 371 + ...idate-Add-schema-for-nwfilterbinding.patch | 53 + SOURCES/symlinks | 931 + SPECS/libvirt.spec | 3468 +++ 572 files changed, 190988 insertions(+) create mode 100644 .gitignore create mode 100644 .libvirt.metadata create mode 100644 SOURCES/libvirt-Handle-copying-bitmaps-to-larger-data-buffers.patch create mode 100644 SOURCES/libvirt-PPC64-support-for-NVIDIA-V100-GPU-with-NVLink2-passthrough.patch create mode 100644 SOURCES/libvirt-RHEL-Add-rhel-machine-types-to-qemuDomainMachineNeedsFDC.patch create mode 100644 SOURCES/libvirt-RHEL-Fix-virConnectGetMaxVcpus-output.patch create mode 100644 SOURCES/libvirt-RHEL-Hack-around-changed-Broadwell-Haswell-CPUs.patch create mode 100644 SOURCES/libvirt-RHEL-network-regain-guest-network-connectivity-after-firewalld-switch-to-nftables.patch create mode 100644 SOURCES/libvirt-RHEL-qemu-Add-ability-to-set-sgio-values-for-hostdev.patch create mode 100644 SOURCES/libvirt-RHEL-qemu-Add-check-for-unpriv-sgio-for-SCSI-generic-host-device.patch create mode 100644 SOURCES/libvirt-RHEL-qemu-Fix-crash-trying-to-use-iSCSI-hostdev.patch create mode 100644 SOURCES/libvirt-RHEL-qemuCheckUnprivSGIO-use-sysfs_path-to-get-unpriv_sgio.patch create mode 100644 SOURCES/libvirt-RHEL-qemuSetUnprivSGIO-Actually-use-calculated-sysfs_path-to-set-unpriv_sgio.patch create mode 100644 SOURCES/libvirt-RHEL-virscsi-Check-device-type-before-getting-it-s-dev-node-name.patch create mode 100644 SOURCES/libvirt-RHEL-virscsi-Introduce-and-use-virSCSIDeviceGetUnprivSGIOSysfsPath.patch create mode 100644 SOURCES/libvirt-RHEL-virscsi-Support-TAPEs-in-virSCSIDeviceGetDevName.patch create mode 100644 SOURCES/libvirt-RHEL-virutil-Accept-non-block-devices-in-virGetDeviceID.patch create mode 100644 SOURCES/libvirt-Revert-RHEL-network-regain-guest-network-connectivity-after-firewalld-switch-to-nftables.patch create mode 100644 SOURCES/libvirt-Revert-Separate-out-StateAutoStart-from-StateInitialize.patch create mode 100644 SOURCES/libvirt-Revert-access-Modify-the-VIR_ERR_ACCESS_DENIED-to-include-driverName.patch create mode 100644 SOURCES/libvirt-Revert-util-vircgroup-pass-parent-cgroup-into-virCgroupDetectControllersCB.patch create mode 100644 SOURCES/libvirt-Revert-virStateDriver-Separate-AutoStart-from-Initialize.patch create mode 100644 SOURCES/libvirt-Revert-vircgroup-cleanup-controllers-not-managed-by-systemd-on-error.patch create mode 100644 SOURCES/libvirt-access-Fix-nwfilter-binding-ACL-access-API-name-generation.patch create mode 100644 SOURCES/libvirt-access-Modify-the-VIR_ERR_ACCESS_DENIED-to-include-driverName.patch create mode 100644 SOURCES/libvirt-access-Modify-the-VIR_ERR_ACCESS_DENIED-to-include-driverName_1.patch create mode 100644 SOURCES/libvirt-admin-reject-clients-unless-their-UID-matches-the-current-UID.patch create mode 100644 SOURCES/libvirt-api-disallow-virConnect-HypervisorCPU-on-read-only-connections.patch create mode 100644 SOURCES/libvirt-api-disallow-virConnectGetDomainCapabilities-on-read-only-connections.patch create mode 100644 SOURCES/libvirt-api-disallow-virDomainManagedSaveDefineXML-on-read-only-connections.patch create mode 100644 SOURCES/libvirt-api-disallow-virDomainSaveImageGetXMLDesc-on-read-only-connections.patch create mode 100644 SOURCES/libvirt-bhyve-Move-autostarting-of-domains-into-bhyveStateInitialize.patch create mode 100644 SOURCES/libvirt-conf-Add-definitions-for-uid-and-fid-PCI-address-attributes.patch create mode 100644 SOURCES/libvirt-conf-Add-validation-of-input-devices.patch create mode 100644 SOURCES/libvirt-conf-Allocate-release-uid-and-fid-in-PCI-address.patch create mode 100644 SOURCES/libvirt-conf-Expose-virDomainSCSIDriveAddressIsUsed.patch create mode 100644 SOURCES/libvirt-conf-Fix-a-error-msg-typo-in-virDomainVideoDefValidate.patch create mode 100644 SOURCES/libvirt-conf-Fix-check-for-chardev-source-path.patch create mode 100644 SOURCES/libvirt-conf-Introduce-address-caching-for-PCI-extensions.patch create mode 100644 SOURCES/libvirt-conf-Introduce-extension-flag-and-zPCI-member-for-PCI-address.patch create mode 100644 SOURCES/libvirt-conf-Introduce-new-hostdev-attribute-display.patch create mode 100644 SOURCES/libvirt-conf-Introduce-new-video-type-none.patch create mode 100644 SOURCES/libvirt-conf-Introduce-parser-formatter-for-uid-and-fid.patch create mode 100644 SOURCES/libvirt-conf-Introduce-virCPUDefCheckFeatures.patch create mode 100644 SOURCES/libvirt-conf-Introduce-virDomainDefPostParseMemtune.patch create mode 100644 SOURCES/libvirt-conf-Introduce-virDomainDefPostParseVideo-helper.patch create mode 100644 SOURCES/libvirt-conf-Introduce-virDomainGraphicsDefHasOpenGL-helper.patch create mode 100644 SOURCES/libvirt-conf-Introduce-virDomainVideoDefClear-helper.patch create mode 100644 SOURCES/libvirt-conf-Move-VFIO-AP-validation-from-post-parse-to-QEMU-validation-code.patch create mode 100644 SOURCES/libvirt-conf-Move-hugepage-XML-validation-check-out-of-qemu_command.patch create mode 100644 SOURCES/libvirt-conf-Move-hugepages-validation-out-of-XML-parser.patch create mode 100644 SOURCES/libvirt-conf-Parse-and-format-nested-hv-feature.patch create mode 100644 SOURCES/libvirt-conf-Parse-and-format-the-HTM-pSeries-feature.patch create mode 100644 SOURCES/libvirt-conf-Parse-guestfwd-channel-device-info-again.patch create mode 100644 SOURCES/libvirt-conf-Replace-error-with-cleanup-in-virDomainHostdevDefParseXMLSubsys.patch create mode 100644 SOURCES/libvirt-conf-correct-false-boot-order-error-during-domain-parse.patch create mode 100644 SOURCES/libvirt-conf-qemu-add-support-for-Hyper-V-PV-TLB-flush.patch create mode 100644 SOURCES/libvirt-conf-qemu-add-support-for-Hyper-V-frequency-MSRs.patch create mode 100644 SOURCES/libvirt-conf-qemu-add-support-for-Hyper-V-reenlightenment-notifications.patch create mode 100644 SOURCES/libvirt-conf-use-virXMLFormatElement-in-virDomainDeviceInfoFormat.patch create mode 100644 SOURCES/libvirt-configure-change-HAVE_FIREWALLD-to-WITH_FIREWALLD.patch create mode 100644 SOURCES/libvirt-configure-selectively-install-a-firewalld-libvirt-zone.patch create mode 100644 SOURCES/libvirt-cpu-Add-support-for-stibp-x86_64-feature.patch create mode 100644 SOURCES/libvirt-cpu-Don-t-access-invalid-memory-in-virCPUx86Translate.patch create mode 100644 SOURCES/libvirt-cpu-Drop-CPUID-definition-for-hv-spinlocks.patch create mode 100644 SOURCES/libvirt-cpu-Drop-KVM_-from-hyperv-feature-macros.patch create mode 100644 SOURCES/libvirt-cpu-Drop-unused-KVM-features.patch create mode 100644 SOURCES/libvirt-cpu-Introduce-virCPUDataAddFeature.patch create mode 100644 SOURCES/libvirt-cpu-allow-include-files-for-CPU-definition.patch create mode 100644 SOURCES/libvirt-cpu-fix-cleanup-when-signature-parsing-fails.patch create mode 100644 SOURCES/libvirt-cpu-push-more-parsing-logic-into-common-code.patch create mode 100644 SOURCES/libvirt-cpu-simplify-failure-cleanup-paths.patch create mode 100644 SOURCES/libvirt-cpu_conf-Introduce-virCPUDefFilterFeatures.patch create mode 100644 SOURCES/libvirt-cpu_conf-Pass-policy-to-CPU-feature-filtering-callbacks.patch create mode 100644 SOURCES/libvirt-cpu_map-Add-Cascadelake-Server-CPU-model.patch create mode 100644 SOURCES/libvirt-cpu_map-Add-Icelake-CPU-models.patch create mode 100644 SOURCES/libvirt-cpu_map-Add-TAA_NO-bit-for-IA32_ARCH_CAPABILITIES-MSR.patch create mode 100644 SOURCES/libvirt-cpu_map-Add-TSX_CTRL-bit-for-IA32_ARCH_CAPABILITIES-MSR.patch create mode 100644 SOURCES/libvirt-cpu_map-Add-features-for-Icelake-CPUs.patch create mode 100644 SOURCES/libvirt-cpu_map-Add-hex-representation-of-signatures.patch create mode 100644 SOURCES/libvirt-cpu_map-Add-more-signatures-for-Broadwell-CPU-models.patch create mode 100644 SOURCES/libvirt-cpu_map-Add-more-signatures-for-Conroe-CPU-model.patch create mode 100644 SOURCES/libvirt-cpu_map-Add-more-signatures-for-Haswell-CPU-models.patch create mode 100644 SOURCES/libvirt-cpu_map-Add-more-signatures-for-IvyBridge-CPU-models.patch create mode 100644 SOURCES/libvirt-cpu_map-Add-more-signatures-for-Nehalem-CPU-models.patch create mode 100644 SOURCES/libvirt-cpu_map-Add-more-signatures-for-Penryn-CPU-model.patch create mode 100644 SOURCES/libvirt-cpu_map-Add-more-signatures-for-SandyBridge-CPU-models.patch create mode 100644 SOURCES/libvirt-cpu_map-Add-more-signatures-for-Skylake-Client-CPU-models.patch create mode 100644 SOURCES/libvirt-cpu_map-Add-more-signatures-for-Westmere-CPU-model.patch create mode 100644 SOURCES/libvirt-cpu_map-Add-support-for-arch-capabilities-feature.patch create mode 100644 SOURCES/libvirt-cpu_map-Add-support-for-cldemote-CPU-feature.patch create mode 100644 SOURCES/libvirt-cpu_map-Define-md-clear-CPUID-bit.patch create mode 100644 SOURCES/libvirt-cpu_map-Drop-pconfig-from-Icelake-Server-CPU-model.patch create mode 100644 SOURCES/libvirt-cpu_map-Introduce-IA32_ARCH_CAPABILITIES-MSR-features.patch create mode 100644 SOURCES/libvirt-cpu_map-x86-Add-support-for-BFLOAT16-data-type.patch create mode 100644 SOURCES/libvirt-cpu_x86-Add-support-for-storing-MSR-features-in-CPU-map.patch create mode 100644 SOURCES/libvirt-cpu_x86-Add-virCPUx86DataGetSignature-for-tests.patch create mode 100644 SOURCES/libvirt-cpu_x86-Add-x86ModelCopySignatures-helper.patch create mode 100644 SOURCES/libvirt-cpu_x86-Allow-multiple-signatures-for-a-CPU-model.patch create mode 100644 SOURCES/libvirt-cpu_x86-Do-not-cache-microcode-version.patch create mode 100644 SOURCES/libvirt-cpu_x86-Fix-memory-leak-virCPUx86GetHost.patch create mode 100644 SOURCES/libvirt-cpu_x86-Fix-placement-of-CheckFeature-functions.patch create mode 100644 SOURCES/libvirt-cpu_x86-Introduce-virCPUx86DataCmp.patch create mode 100644 SOURCES/libvirt-cpu_x86-Introduce-virCPUx86DataItem-container-struct.patch create mode 100644 SOURCES/libvirt-cpu_x86-Introduce-virCPUx86FeatureFilter-MSR.patch create mode 100644 SOURCES/libvirt-cpu_x86-Log-decoded-CPU-model-and-signatures.patch create mode 100644 SOURCES/libvirt-cpu_x86-Make-sure-CPU-model-names-are-unique-in-cpu_map.patch create mode 100644 SOURCES/libvirt-cpu_x86-Make-x86cpuidAndBits-more-general.patch create mode 100644 SOURCES/libvirt-cpu_x86-Make-x86cpuidClearBits-more-general.patch create mode 100644 SOURCES/libvirt-cpu_x86-Make-x86cpuidMatch-more-general.patch create mode 100644 SOURCES/libvirt-cpu_x86-Make-x86cpuidMatchMasked-more-general.patch create mode 100644 SOURCES/libvirt-cpu_x86-Make-x86cpuidSetBits-more-general.patch create mode 100644 SOURCES/libvirt-cpu_x86-Move-CheckFeature-functions.patch create mode 100644 SOURCES/libvirt-cpu_x86-Read-CPU-features-from-IA32_ARCH_CAPABILITIES-MSR.patch create mode 100644 SOURCES/libvirt-cpu_x86-Rename-virCPUx86CPUIDSorter.patch create mode 100644 SOURCES/libvirt-cpu_x86-Rename-virCPUx86DataAddCPUID.patch create mode 100644 SOURCES/libvirt-cpu_x86-Rename-virCPUx86DataAddCPUIDInt.patch create mode 100644 SOURCES/libvirt-cpu_x86-Rename-virCPUx86DataItem-variables.patch create mode 100644 SOURCES/libvirt-cpu_x86-Rename-virCPUx86Vendor.cpuid.patch create mode 100644 SOURCES/libvirt-cpu_x86-Rename-virCPUx86VendorToCPUID.patch create mode 100644 SOURCES/libvirt-cpu_x86-Rename-x86DataCpuid.patch create mode 100644 SOURCES/libvirt-cpu_x86-Rename-x86DataCpuidNext-function.patch create mode 100644 SOURCES/libvirt-cpu_x86-Require-cpuid-within-feature-in-CPU-map.patch create mode 100644 SOURCES/libvirt-cpu_x86-Separate-ancestor-model-parsing-from-x86ModelParse.patch create mode 100644 SOURCES/libvirt-cpu_x86-Separate-feature-list-parsing-from-x86ModelParse.patch create mode 100644 SOURCES/libvirt-cpu_x86-Separate-signature-parsing-from-x86ModelParse.patch create mode 100644 SOURCES/libvirt-cpu_x86-Separate-vendor-parsing-from-x86ModelParse.patch create mode 100644 SOURCES/libvirt-cpu_x86-Simplify-x86DataAdd.patch create mode 100644 SOURCES/libvirt-cpu_x86-Store-CPU-signature-in-an-array.patch create mode 100644 SOURCES/libvirt-cpu_x86-Store-virCPUx86DataItem-content-in-union.patch create mode 100644 SOURCES/libvirt-cpu_x86-Turn-virCPUx86DataIteratorInit-into-a-function.patch create mode 100644 SOURCES/libvirt-cputest-Add-data-for-Ice-Lake-Server-CPU.patch create mode 100644 SOURCES/libvirt-cputest-Add-data-for-Intel-R-Core-TM-i7-7600U.patch create mode 100644 SOURCES/libvirt-cputest-Add-data-for-Intel-R-Core-TM-i7-8700.patch create mode 100644 SOURCES/libvirt-cputest-Add-data-for-Intel-R-Xeon-R-CPU-E3-1225-v5.patch create mode 100644 SOURCES/libvirt-cputest-Add-data-for-Intel-R-Xeon-R-CPU-E5-2630-v4.patch create mode 100644 SOURCES/libvirt-cputest-Add-data-for-Intel-R-Xeon-R-CPU-E5-2650.patch create mode 100644 SOURCES/libvirt-cputest-Add-data-for-Intel-R-Xeon-R-CPU-E7540.patch create mode 100644 SOURCES/libvirt-cputest-Add-data-for-Intel-R-Xeon-R-Platinum-8268-CPU.patch create mode 100644 SOURCES/libvirt-cputest-Add-support-for-MSR-features-to-cpu-parse.sh.patch create mode 100644 SOURCES/libvirt-cputest-Test-CPU-signatures.patch create mode 100644 SOURCES/libvirt-daemon-Register-secret-driver-before-storage-driver.patch create mode 100644 SOURCES/libvirt-docs-Drop-dev-net-tun-from-the-list-of-shared-devices.patch create mode 100644 SOURCES/libvirt-docs-Enhance-polkit-documentation-to-describe-secondary-connection.patch create mode 100644 SOURCES/libvirt-docs-Rephrase-the-mediated-devices-hostdev-section-a-bit.patch create mode 100644 SOURCES/libvirt-docs-schema-Add-missing-alias-to-vsock-device.patch create mode 100644 SOURCES/libvirt-docs-schemas-Decouple-the-virtio-options-from-each-other.patch create mode 100644 SOURCES/libvirt-domain_nwfilter-Return-early-if-net-has-no-name-in-virDomainConfNWFilterTeardownImpl.patch create mode 100644 SOURCES/libvirt-esx-storage-Fix-typo-lsilogic-lsiLogic.patch create mode 100644 SOURCES/libvirt-examples-Add-clean-traffic-gateway-into-nwfilters.patch create mode 100644 SOURCES/libvirt-internal-introduce-a-family-of-NULLSTR-macros.patch create mode 100644 SOURCES/libvirt-lib-Drop-UDEVSETTLE.patch create mode 100644 SOURCES/libvirt-locking-restrict-sockets-to-mode-0600.patch create mode 100644 SOURCES/libvirt-logging-restrict-sockets-to-mode-0600.patch create mode 100644 SOURCES/libvirt-lxc-Use-virCgroupGetMemoryStat.patch create mode 100644 SOURCES/libvirt-m4-Drop-needless-string-checks.patch create mode 100644 SOURCES/libvirt-m4-Provide-default-value-fore-UDEVADM.patch create mode 100644 SOURCES/libvirt-network-allow-configuring-firewalld-zone-for-virtual-network-bridge-device.patch create mode 100644 SOURCES/libvirt-network-explicitly-allow-icmp-icmpv6-in-libvirt-zonefile.patch create mode 100644 SOURCES/libvirt-network-set-firewalld-zone-of-bridges-to-libvirt-zone-when-appropriate.patch create mode 100644 SOURCES/libvirt-networkGetDHCPLeases-Don-t-always-report-error-if-unable-to-read-leases-file.patch create mode 100644 SOURCES/libvirt-nwfilter-Resolve-SEGV-for-NWFilter-Snoop-processing.patch create mode 100644 SOURCES/libvirt-nwfilter-fix-adding-std-MAC-and-IP-values-to-filter-binding.patch create mode 100644 SOURCES/libvirt-process-wait-longer-5-30s-on-hard-shutdown.patch create mode 100644 SOURCES/libvirt-process-wait-longer-on-kill-per-assigned-Hostdev.patch create mode 100644 SOURCES/libvirt-qemu-Add-APIs-for-translating-CPU-features.patch create mode 100644 SOURCES/libvirt-qemu-Add-capability-for-the-HTM-pSeries-feature.patch create mode 100644 SOURCES/libvirt-qemu-Add-ccw-support-for-vhost-vsock.patch create mode 100644 SOURCES/libvirt-qemu-Add-check-for-whether-KVM-nesting-is-enabled.patch create mode 100644 SOURCES/libvirt-qemu-Add-hotpluging-support-for-PCI-devices-on-S390-guests.patch create mode 100644 SOURCES/libvirt-qemu-Add-type-filter-to-qemuMonitorJSONParsePropsList.patch create mode 100644 SOURCES/libvirt-qemu-Add-zPCI-address-definition-check.patch create mode 100644 SOURCES/libvirt-qemu-Allow-creating-ppc64-guests-with-graphics-and-no-USB-mouse.patch create mode 100644 SOURCES/libvirt-qemu-Alter-qemuSetUnprivSGIO-hostdev-shareable-logic.patch create mode 100644 SOURCES/libvirt-qemu-Alter-val-usage-in-qemuSetUnprivSGIO.patch create mode 100644 SOURCES/libvirt-qemu-Auto-add-pci-root-for-s390-s390x-guests.patch create mode 100644 SOURCES/libvirt-qemu-Avoid-duplicate-resume-events-and-state-changes.patch create mode 100644 SOURCES/libvirt-qemu-Avoid-probing-non-native-binaries-all-the-time.patch create mode 100644 SOURCES/libvirt-qemu-Clarify-QEMU_CAPS_KVM.patch create mode 100644 SOURCES/libvirt-qemu-Don-t-cache-microcode-version.patch create mode 100644 SOURCES/libvirt-qemu-Don-t-check-for-dev-kvm-presence.patch create mode 100644 SOURCES/libvirt-qemu-Don-t-ignore-resume-events.patch create mode 100644 SOURCES/libvirt-qemu-Don-t-use-full-CPU-model-expansion.patch create mode 100644 SOURCES/libvirt-qemu-Don-t-use-mem-prealloc-among-with-.prealloc-yes.patch create mode 100644 SOURCES/libvirt-qemu-Drop-MSR-features-from-host-model-with-old-QEMU.patch create mode 100644 SOURCES/libvirt-qemu-Drop-QEMU_CAPS_ENABLE_KVM.patch create mode 100644 SOURCES/libvirt-qemu-Drop-cleanup-label-from-qemuProcessInitCpuAffinity.patch create mode 100644 SOURCES/libvirt-qemu-Drop-disabled-CPU-features-unknown-to-QEMU.patch create mode 100644 SOURCES/libvirt-qemu-Drop-duplicated-code-from-qemuDomainDefValidateFeatures.patch create mode 100644 SOURCES/libvirt-qemu-Drop-user-prefix-for-guestfwd-netdev.patch create mode 100644 SOURCES/libvirt-qemu-Enable-PCI-multi-bus-for-S390-guests.patch create mode 100644 SOURCES/libvirt-qemu-Exempt-video-model-none-from-getting-a-PCI-address-on-Q35.patch create mode 100644 SOURCES/libvirt-qemu-Extract-MDEV-VFIO-PCI-validation-code-into-a-separate-helper.patch create mode 100644 SOURCES/libvirt-qemu-Fetch-pr-helper-process-info-on-reconnect.patch create mode 100644 SOURCES/libvirt-qemu-Filter-non-SCSI-hostdevs-in-qemuHostdevPrepareSCSIDevices.patch create mode 100644 SOURCES/libvirt-qemu-Fix-ATTRIBUTE_NONNULL-for-qemuMonitorAddObject.patch create mode 100644 SOURCES/libvirt-qemu-Fix-KVM-features-with-QEMU-4.1.patch create mode 100644 SOURCES/libvirt-qemu-Fix-NULL-pointer-access-in-qemuProcessInitCpuAffinity.patch create mode 100644 SOURCES/libvirt-qemu-Fix-NULL-ptr-dereference-caused-by-qemuDomainDefFormatBufInternal.patch create mode 100644 SOURCES/libvirt-qemu-Fix-hyperv-features-with-QEMU-4.1.patch create mode 100644 SOURCES/libvirt-qemu-Fix-leak-in-qemuProcessInitCpuAffinity.patch create mode 100644 SOURCES/libvirt-qemu-Fix-logic-error-in-qemuSetUnprivSGIO.patch create mode 100644 SOURCES/libvirt-qemu-Fix-post-copy-migration-on-the-source.patch create mode 100644 SOURCES/libvirt-qemu-Fix-probing-of-AMD-SEV-support.patch create mode 100644 SOURCES/libvirt-qemu-Fix-qemuProcessInitCpuAffinity.patch create mode 100644 SOURCES/libvirt-qemu-Fix-setting-global_period-cputune-element.patch create mode 100644 SOURCES/libvirt-qemu-Forbid-MSR-features-with-old-QEMU.patch create mode 100644 SOURCES/libvirt-qemu-Format-nested-hv-feature-on-the-command-line.patch create mode 100644 SOURCES/libvirt-qemu-Format-the-HTM-pSeries-feature.patch create mode 100644 SOURCES/libvirt-qemu-Generate-and-use-zPCI-device-in-QEMU-command-line.patch create mode 100644 SOURCES/libvirt-qemu-Ignore-nwfilter-binding-instantiation-issues-during-reconnect.patch create mode 100644 SOURCES/libvirt-qemu-Introduce-QEMU_CAPS_MACHINE_PSERIES_CAP_NESTED_HV.patch create mode 100644 SOURCES/libvirt-qemu-Introduce-a-new-graphics-display-type-headless.patch create mode 100644 SOURCES/libvirt-qemu-Introduce-generic-qemuMonitorGetGuestCPU.patch create mode 100644 SOURCES/libvirt-qemu-Introduce-zPCI-capability.patch create mode 100644 SOURCES/libvirt-qemu-Make-qemuMonitorGetGuestCPU-usable-on-x86-only.patch create mode 100644 SOURCES/libvirt-qemu-Map-running-reason-to-resume-event-detail.patch create mode 100644 SOURCES/libvirt-qemu-Pass-running-reason-to-RESUME-event-handler.patch create mode 100644 SOURCES/libvirt-qemu-Prefer-dashes-for-hyperv-features.patch create mode 100644 SOURCES/libvirt-qemu-Probe-for-max-x86_64-cpu-type.patch create mode 100644 SOURCES/libvirt-qemu-Probe-for-unavailable-features-CPU-property.patch create mode 100644 SOURCES/libvirt-qemu-Probe-host-CPU-after-capabilities.patch create mode 100644 SOURCES/libvirt-qemu-Properly-report-VIR_DOMAIN_EVENT_RESUMED_FROM_SNAPSHOT.patch create mode 100644 SOURCES/libvirt-qemu-Remove-duplicated-qemuAgentCheckError.patch create mode 100644 SOURCES/libvirt-qemu-Remove-unused-bypassSecurityDriver-from-qemuOpenFileAs.patch create mode 100644 SOURCES/libvirt-qemu-Report-more-appropriate-running-reasons.patch create mode 100644 SOURCES/libvirt-qemu-Rework-setting-process-affinity.patch create mode 100644 SOURCES/libvirt-qemu-Set-identity-for-the-reconnect-all-thread.patch create mode 100644 SOURCES/libvirt-qemu-Set-up-EMULATOR-thread-and-cpuset.mems-before-exec-ing-qemu.patch create mode 100644 SOURCES/libvirt-qemu-Translate-feature-names-from-query-cpu-model-expansion.patch create mode 100644 SOURCES/libvirt-qemu-Translate-features-in-virQEMUCapsGetCPUFeatures.patch create mode 100644 SOURCES/libvirt-qemu-Use-tmpChr-in-qemuDomainDetachChrDevice-to-build-device-string.patch create mode 100644 SOURCES/libvirt-qemu-Wire-up-PR_MANAGER_STATUS_CHANGED-event.patch create mode 100644 SOURCES/libvirt-qemu-add-vfio-ap-capability.patch create mode 100644 SOURCES/libvirt-qemu-address-Handle-all-the-video-devices-within-a-single-loop.patch create mode 100644 SOURCES/libvirt-qemu-capabilities-Add-capability-for-werror-rerror-for-usb-device-frontend.patch create mode 100644 SOURCES/libvirt-qemu-caps-Add-vfio-pci.display-capability.patch create mode 100644 SOURCES/libvirt-qemu-caps-Don-t-try-to-ask-for-CAP_DAC_OVERRIDE-if-non-root.patch create mode 100644 SOURCES/libvirt-qemu-caps-Format-SEV-platform-data-into-qemuCaps-cache.patch create mode 100644 SOURCES/libvirt-qemu-caps-Introduce-a-capability-for-egl-headless.patch create mode 100644 SOURCES/libvirt-qemu-caps-Use-CAP_DAC_OVERRIDE-for-probing-to-avoid-permission-issues.patch create mode 100644 SOURCES/libvirt-qemu-cgroup-Expose-dev-sev-only-to-domains-that-require-SEV.patch create mode 100644 SOURCES/libvirt-qemu-command-Don-t-format-image-properties-for-empty-drive.patch create mode 100644 SOURCES/libvirt-qemu-command-Don-t-skip-readonly-and-throttling-info-for-empty-drive.patch create mode 100644 SOURCES/libvirt-qemu-command-Enable-formatting-vfio-pci.display-option-onto-cmdline.patch create mode 100644 SOURCES/libvirt-qemu-command-Move-graphics-iteration-to-its-own-function.patch create mode 100644 SOURCES/libvirt-qemu-conf-Remove-dev-sev-from-the-default-cgroup-device-acl-list.patch create mode 100644 SOURCES/libvirt-qemu-consolidate-parameters-of-qemuBuildChrChardevStr-into-flags.patch create mode 100644 SOURCES/libvirt-qemu-domain-Add-dev-sev-into-the-domain-mount-namespace-selectively.patch create mode 100644 SOURCES/libvirt-qemu-domain-Simplify-non-VFIO-memLockLimit-calculation-for-PPC64.patch create mode 100644 SOURCES/libvirt-qemu-don-t-use-chardev-FD-passing-for-vhostuser-backend.patch create mode 100644 SOURCES/libvirt-qemu-don-t-use-chardev-FD-passing-with-standalone-args.patch create mode 100644 SOURCES/libvirt-qemu-fix-UNIX-socket-chardevs-operating-in-client-mode.patch create mode 100644 SOURCES/libvirt-qemu-fix-up-permissions-for-pre-created-UNIX-sockets.patch create mode 100644 SOURCES/libvirt-qemu-hotplug-Do-not-try-to-add-secret-object-for-TLS-if-it-does-not-exist.patch create mode 100644 SOURCES/libvirt-qemu-hotplug-Don-t-access-srcPriv-when-it-s-not-allocated.patch create mode 100644 SOURCES/libvirt-qemu-hotplug-Fix-asynchronous-unplug-of-shmem.patch create mode 100644 SOURCES/libvirt-qemu-hotplug-don-t-overwrite-error-message-in-qemuDomainAttachNetDevice.patch create mode 100644 SOURCES/libvirt-qemu-hotplug-report-error-when-changing-rom-enabled-attr-for-net-iface.patch create mode 100644 SOURCES/libvirt-qemu-mdev-Use-vfio-pci-display-property-only-with-vfio-pci-mdevs.patch create mode 100644 SOURCES/libvirt-qemu-monitor-Make-qemuMonitorAddObject-more-robust-against-programming-errors.patch create mode 100644 SOURCES/libvirt-qemu-monitor-Remove-qemuMonitorJSONExtractCPUArchInfo-wrapper.patch create mode 100644 SOURCES/libvirt-qemu-monitor-Use-target-instead-of-arch-in-reply-of-query-cpus-fast.patch create mode 100644 SOURCES/libvirt-qemu-process-SEV-Assume-libDir-to-be-the-directory-to-create-files-in.patch create mode 100644 SOURCES/libvirt-qemu-process-SEV-Relabel-guest-owner-s-SEV-files-created-before-start.patch create mode 100644 SOURCES/libvirt-qemu-qemuBuildHostdevCommandLine-Use-a-helper-variable-mdevsrc.patch create mode 100644 SOURCES/libvirt-qemu-remove-chardevStdioLogd-param-from-vhostuser-code-path.patch create mode 100644 SOURCES/libvirt-qemu-require-reply-from-guest-agent-in-qemuAgentGetInterfaces.patch create mode 100644 SOURCES/libvirt-qemu-validate-Enforce-compile-time-switch-type-checking-for-videos.patch create mode 100644 SOURCES/libvirt-qemu-vfio-ap-device-support.patch create mode 100644 SOURCES/libvirt-qemu-vnc-switch-to-tls-creds-x509.patch create mode 100644 SOURCES/libvirt-qemuBuildMemoryBackendProps-Pass-priv-instead-of-its-individual-members.patch create mode 100644 SOURCES/libvirt-qemuDomainDeviceDefValidateNetwork-Check-for-range-only-if-IP-prefix-set.patch create mode 100644 SOURCES/libvirt-qemuDomainNestedJobAllowed-Allow-QEMU_JOB_NONE.patch create mode 100644 SOURCES/libvirt-qemuDomainRemoveRNGDevice-Remove-associated-chardev-too.patch create mode 100644 SOURCES/libvirt-qemuDomainSaveMemory-Don-t-enforce-dynamicOwnership.patch create mode 100644 SOURCES/libvirt-qemuDomainValidateStorageSource-Relax-PR-validation.patch create mode 100644 SOURCES/libvirt-qemuProcessBuildDestroyMemoryPathsImpl-Don-t-overwrite-error.patch create mode 100644 SOURCES/libvirt-qemuProcessStartPRDaemonHook-Try-to-set-NS-iff-domain-was-started-with-one.patch create mode 100644 SOURCES/libvirt-qemu_capabilities-Inroduce-virQEMUCapsGetCPUModelX86Data.patch create mode 100644 SOURCES/libvirt-qemu_capabilities-Introduce-virQEMUCapsGetCPUModelInfo.patch create mode 100644 SOURCES/libvirt-qemu_capabilities-Use-virQEMUCapsGetCPUModelInfo.patch create mode 100644 SOURCES/libvirt-qemu_command-Use-canonical-names-of-CPU-features.patch create mode 100644 SOURCES/libvirt-qemu_command-Use-consistent-syntax-for-CPU-features.patch create mode 100644 SOURCES/libvirt-qemu_domain-NVLink2-bridge-detection-function-for-PPC64.patch create mode 100644 SOURCES/libvirt-qemu_domain-add-a-PPC64-memLockLimit-helper.patch create mode 100644 SOURCES/libvirt-qemu_hotplug-Attach-guestfwd-using-netdev_add.patch create mode 100644 SOURCES/libvirt-qemu_hotplug-Check-for-duplicate-drive-addresses.patch create mode 100644 SOURCES/libvirt-qemu_hotplug-Detach-guestfwd-using-netdev_del.patch create mode 100644 SOURCES/libvirt-qemu_hotplug-remove-another-erroneous-qemuDomainDetachExtensionDevice-call.patch create mode 100644 SOURCES/libvirt-qemu_hotplug-remove-erroneous-call-to-qemuDomainDetachExtensionDevice.patch create mode 100644 SOURCES/libvirt-qemu_migration-Avoid-writing-to-freed-memory.patch create mode 100644 SOURCES/libvirt-qemu_monitor-Introduce-qemuMonitorJSONGetPRManagerInfo.patch create mode 100644 SOURCES/libvirt-qemu_process-Prefer-generic-qemuMonitorGetGuestCPU.patch create mode 100644 SOURCES/libvirt-qemu_security-Fully-implement-qemuSecurityDomainSetPathLabel.patch create mode 100644 SOURCES/libvirt-qemuhotplugtest-Don-t-plug-a-SCSI-disk-at-unit-7.patch create mode 100644 SOURCES/libvirt-qemuhotplugtest-Test-guestfwd-attach-and-detach.patch create mode 100644 SOURCES/libvirt-qemuxml2-test-Add-tests-for-Icelake-Server-pconfig.patch create mode 100644 SOURCES/libvirt-qemuxml2argvtest-Add-test-for-CPU-features-translation.patch create mode 100644 SOURCES/libvirt-rpc-virnetlibsshsession-update-deprecated-functions.patch create mode 100644 SOURCES/libvirt-secret-Add-check-validation-for-correct-usage-when-LookupByUUID.patch create mode 100644 SOURCES/libvirt-security-dac-Relabel-dev-sev-in-the-namespace.patch create mode 100644 SOURCES/libvirt-security-dac-also-label-listen-UNIX-sockets.patch create mode 100644 SOURCES/libvirt-selinux-Do-not-report-an-error-when-not-returning-1.patch create mode 100644 SOURCES/libvirt-src-Fix-memory-leak-in-virNWFilterBindingDispose.patch create mode 100644 SOURCES/libvirt-src-Mention-DEVICE_REMOVAL_FAILED-event-in-virDomainDetachDeviceAlias-docs.patch create mode 100644 SOURCES/libvirt-storage-Add-shrink-to-qemu-img-command-when-shrinking-vol.patch create mode 100644 SOURCES/libvirt-storage-Allow-for-inputvol-to-have-any-format-for-encryption.patch create mode 100644 SOURCES/libvirt-storage-Allow-inputvol-to-be-encrypted.patch create mode 100644 SOURCES/libvirt-storage-Remove-secretPath-from-_virStorageBackendQemuImgInfo.patch create mode 100644 SOURCES/libvirt-test-Introduce-virnetdevopenvswitchtest.patch create mode 100644 SOURCES/libvirt-tests-Add-QEMU-caps-data-for-future-4.1.0.patch create mode 100644 SOURCES/libvirt-tests-Add-capabilities-data-for-QEMU-2.11-x86_64.patch create mode 100644 SOURCES/libvirt-tests-Add-capabilities-data-for-QEMU-3.1.0-on-ppc64.patch create mode 100644 SOURCES/libvirt-tests-Add-domain-capabilities-case-for-QEMU-4.1.0.patch create mode 100644 SOURCES/libvirt-tests-Add-linux-high-ids-test.patch create mode 100644 SOURCES/libvirt-tests-Add-missing-thread_siblings_list-files.patch create mode 100644 SOURCES/libvirt-tests-Add-more-tests-to-qemucaps2xml.patch create mode 100644 SOURCES/libvirt-tests-Augment-vcgrouptest-to-add-virCgroupGetMemoryStat.patch create mode 100644 SOURCES/libvirt-tests-Follow-up-on-qemucaps2xmldata-rename.patch create mode 100644 SOURCES/libvirt-tests-Resolve-possible-overrun.patch create mode 100644 SOURCES/libvirt-tests-Reuse-qemucapabilities-data-for-qemucaps2xml.patch create mode 100644 SOURCES/libvirt-tests-Update-capabilities-data-for-QEMU-3.0.0-x86_64.patch create mode 100644 SOURCES/libvirt-tests-Use-correct-function-name-in-error-path.patch create mode 100644 SOURCES/libvirt-tests-extract-hugepages-numa-default-dimm-out-of-hugepages-numa.patch create mode 100644 SOURCES/libvirt-tests-extract-pages-discard-hugepages-out-of-hugepages-pages3.patch create mode 100644 SOURCES/libvirt-tests-extract-pages-discard-out-of-hugepages-pages.patch create mode 100644 SOURCES/libvirt-tests-fix-TLS-handshake-failure-with-TLS-1.3.patch create mode 100644 SOURCES/libvirt-tests-introduce-hugepages-default-1G-nodeset-2M.patch create mode 100644 SOURCES/libvirt-tests-introduce-hugepages-nodeset.patch create mode 100644 SOURCES/libvirt-tests-qemu-Remove-disk-from-graphics-vnc-tls.patch create mode 100644 SOURCES/libvirt-tests-qemu-test-more-versions-for-graphics-vnc-tls.patch create mode 100644 SOURCES/libvirt-tests-qemucaps-Add-test-data-for-upcoming-qemu-3.0.0.patch create mode 100644 SOURCES/libvirt-tests-qemuxml2argv-Add-test-case-for-empty-CDROM-with-cache-mode.patch create mode 100644 SOURCES/libvirt-tests-qemuxml2argv-add-CAPS_ARCH_LATEST-macro.patch create mode 100644 SOURCES/libvirt-tests-remove-unnecessary-XML-elements-from-hugepages-numa-default.patch create mode 100644 SOURCES/libvirt-tests-rename-hugepages-numa-into-hugepages-numa-default.patch create mode 100644 SOURCES/libvirt-tests-rename-hugepages-pages-into-hugepages-numa-nodeset.patch create mode 100644 SOURCES/libvirt-tests-rename-hugepages-pages2-into-hugepages-numa-default-2M.patch create mode 100644 SOURCES/libvirt-tests-rename-hugepages-pages3-into-hugepages-numa-nodeset-part.patch create mode 100644 SOURCES/libvirt-tests-rename-hugepages-pages4-into-hugepages-numa-nodeset-nonexist.patch create mode 100644 SOURCES/libvirt-tests-rename-hugepages-pages5-into-hugepages-default-2M.patch create mode 100644 SOURCES/libvirt-tests-rename-hugepages-pages6-into-hugepages-default-system-size.patch create mode 100644 SOURCES/libvirt-tests-rename-hugepages-pages7-into-pages-dimm-discard.patch create mode 100644 SOURCES/libvirt-tests-rename-hugepages-pages8-into-hugepages-nodeset-nonexist.patch create mode 100644 SOURCES/libvirt-tests-rename-hugepages-to-hugepages-default.patch create mode 100644 SOURCES/libvirt-tests-sev-Test-launch-security-with-specific-QEMU-version.patch create mode 100644 SOURCES/libvirt-tools-Fix-typo-generating-adapter_wwpn-field.patch create mode 100644 SOURCES/libvirt-util-Avoid-possible-error-in-virCommandMassClose.patch create mode 100644 SOURCES/libvirt-util-Don-t-overflow-in-virRandomBits.patch create mode 100644 SOURCES/libvirt-util-Fix-virCgroupGetMemoryStat.patch create mode 100644 SOURCES/libvirt-util-Introduce-virBitmapUnion.patch create mode 100644 SOURCES/libvirt-util-Introduce-virNumaNodesetToCPUset.patch create mode 100644 SOURCES/libvirt-util-Propagate-numad-failures-correctly.patch create mode 100644 SOURCES/libvirt-util-Rework-virStringListAdd.patch create mode 100644 SOURCES/libvirt-util-Rewrite-virHostCPUCountThreadSiblings.patch create mode 100644 SOURCES/libvirt-util-add-a-function-to-insert-new-interfaces-to-IPv6CheckForwarding-list.patch create mode 100644 SOURCES/libvirt-util-alloc-add-macros-for-implementing-automatic-cleanup-functionality.patch create mode 100644 SOURCES/libvirt-util-bitmap-define-cleanup-function-using-VIR_DEFINE_AUTOPTR_FUNC.patch create mode 100644 SOURCES/libvirt-util-cgroup-use-VIR_AUTOFREE-instead-of-VIR_FREE-for-scalar-types.patch create mode 100644 SOURCES/libvirt-util-check-accept_ra-for-all-nexthop-interfaces-of-multipath-routes.patch create mode 100644 SOURCES/libvirt-util-command-Ignore-bitmap-errors-when-enumerating-file-descriptors-to-close.patch create mode 100644 SOURCES/libvirt-util-command-define-cleanup-function-using-VIR_DEFINE_AUTOPTR_FUNC.patch create mode 100644 SOURCES/libvirt-util-command-use-VIR_AUTOFREE-instead-of-VIR_FREE-for-scalar-types.patch create mode 100644 SOURCES/libvirt-util-enable-cgroups-v2-cpuset-controller-for-threads.patch create mode 100644 SOURCES/libvirt-util-file-introduce-VIR_AUTOCLOSE-macro-to-close-fd-of-the-file-automatically.patch create mode 100644 SOURCES/libvirt-util-fix-memory-leak-in-virFirewallDInterfaceSetZone.patch create mode 100644 SOURCES/libvirt-util-implement-virCgroupV2-Set-Get-CpusetCpus.patch create mode 100644 SOURCES/libvirt-util-implement-virCgroupV2-Set-Get-CpusetMemoryMigrate.patch create mode 100644 SOURCES/libvirt-util-implement-virCgroupV2-Set-Get-CpusetMems.patch create mode 100644 SOURCES/libvirt-util-introduce-cgroup-v2-files.patch create mode 100644 SOURCES/libvirt-util-introduce-vircgroupbackend-files.patch create mode 100644 SOURCES/libvirt-util-json-define-cleanup-function-using-VIR_DEFINE_AUTOPTR_FUNC.patch create mode 100644 SOURCES/libvirt-util-make-forgotten-changes-suggested-during-review-of-commit-d40b820c.patch create mode 100644 SOURCES/libvirt-util-move-all-firewalld-specific-stuff-into-its-own-files.patch create mode 100644 SOURCES/libvirt-util-moving-type-argument-to-avoid-issues-with-mount-syscall.patch create mode 100644 SOURCES/libvirt-util-netdevopenvswitch-use-VIR_AUTOFREE-instead-of-VIR_FREE-for-scalar-types.patch create mode 100644 SOURCES/libvirt-util-netdevopenvswitch-use-VIR_AUTOPTR-for-aggregate-types.patch create mode 100644 SOURCES/libvirt-util-new-virFirewallD-APIs-docs.patch create mode 100644 SOURCES/libvirt-util-remove-const-specifier-from-nlmsghdr-arg-to-virNetlinkDumpCallback.patch create mode 100644 SOURCES/libvirt-util-remove-test-code-accidentally-committed-to-virFirewallDZoneExists.patch create mode 100644 SOURCES/libvirt-util-skip-RDMA-detection-for-non-PCI-network-devices.patch create mode 100644 SOURCES/libvirt-util-string-Introduce-macro-for-automatic-string-lists.patch create mode 100644 SOURCES/libvirt-util-suppress-unimportant-ovs-vsctl-errors-when-getting-interface-stats.patch create mode 100644 SOURCES/libvirt-util-use-nlmsg_find_attr-instead-of-an-open-coded-loop.patch create mode 100644 SOURCES/libvirt-util-vircgroup-improve-controller-detection.patch create mode 100644 SOURCES/libvirt-util-vircgroup-introduce-virCgroup-Get-Set-ValueRaw.patch create mode 100644 SOURCES/libvirt-util-vircgroup-move-virCgroupGetValueStr-out-of-virCgroupGetValueForBlkDev.patch create mode 100644 SOURCES/libvirt-util-vircgroup-pass-parent-cgroup-into-virCgroupDetectControllersCB.patch create mode 100644 SOURCES/libvirt-util-vircgroupv1-add-support-for-BFQ-blkio-files.patch create mode 100644 SOURCES/libvirt-util-vircgroupv2-add-support-for-BFQ-files.patch create mode 100644 SOURCES/libvirt-util-vircgroupv2-don-t-error-out-if-enabling-controller-fails.patch create mode 100644 SOURCES/libvirt-util-vircgroupv2-enable-CPU-controller-only-if-it-s-available.patch create mode 100644 SOURCES/libvirt-util-vircgroupv2-mark-only-requested-controllers-as-available.patch create mode 100644 SOURCES/libvirt-util-vircgroupv2-separate-return-values-of-virCgroupV2EnableController.patch create mode 100644 SOURCES/libvirt-util-vircgroupv2-stop-enabling-missing-controllers-with-systemd.patch create mode 100644 SOURCES/libvirt-util-vircgroupv2-use-any-controller-to-create-thread-directory.patch create mode 100644 SOURCES/libvirt-util-virnetdevopenvswitch-Drop-an-unused-variable-ovs_timeout.patch create mode 100644 SOURCES/libvirt-utils-Remove-arbitrary-limit-on-socket_id-core_id.patch create mode 100644 SOURCES/libvirt-virCommand-use-procfs-to-learn-opened-FDs.patch create mode 100644 SOURCES/libvirt-virDomainConfNWFilterInstantiate-initialize-xml-to-avoid-random-crash.patch create mode 100644 SOURCES/libvirt-virDomainDefCompatibleDevice-Relax-alias-change-check.patch create mode 100644 SOURCES/libvirt-virDomainDetachDeviceFlags-Clarify-update-semantics.patch create mode 100644 SOURCES/libvirt-virDomainNetDefCheckABIStability-Check-for-MTU-change-too.patch create mode 100644 SOURCES/libvirt-virDomainObjListAddLocked-Produce-better-error-message-than-Duplicate-key.patch create mode 100644 SOURCES/libvirt-virDomainObjListAddLocked-fix-double-free.patch create mode 100644 SOURCES/libvirt-virFileIsSharedFSType-Check-for-fuse.glusterfs-too.patch create mode 100644 SOURCES/libvirt-virFileIsSharedFSType-Detect-direct-mount-points.patch create mode 100644 SOURCES/libvirt-virNetDevOpenvswitchInterfaceStats-Optimize-for-speed.patch create mode 100644 SOURCES/libvirt-virStoragePRDefFormat-Suppress-path-formatting-for-migratable-XML.patch create mode 100644 SOURCES/libvirt-virWaitForDevices-Drop-confusing-part-of-comment.patch create mode 100644 SOURCES/libvirt-vircgroup-Call-virCgroupRemove-inside-virCgroupMakeGroup.patch create mode 100644 SOURCES/libvirt-vircgroup-Duplicate-string-before-modifying.patch create mode 100644 SOURCES/libvirt-vircgroup-Extract-controller-detection-into-function.patch create mode 100644 SOURCES/libvirt-vircgroup-Extract-file-link-resolving-into-separate-function.patch create mode 100644 SOURCES/libvirt-vircgroup-Extract-mount-options-matching-into-function.patch create mode 100644 SOURCES/libvirt-vircgroup-Extract-placement-validation-into-function.patch create mode 100644 SOURCES/libvirt-vircgroup-Introduce-standard-set-of-typedefs-and-use-them.patch create mode 100644 SOURCES/libvirt-vircgroup-Introduce-virCgroupEnableMissingControllers.patch create mode 100644 SOURCES/libvirt-vircgroup-Introduce-virCgroupGetMemoryStat.patch create mode 100644 SOURCES/libvirt-vircgroup-Move-function-used-in-tests-into-vircgrouppriv.h.patch create mode 100644 SOURCES/libvirt-vircgroup-Remove-obsolete-sa_assert.patch create mode 100644 SOURCES/libvirt-vircgroup-Remove-pointless-bool-parameter.patch create mode 100644 SOURCES/libvirt-vircgroup-Remove-unused-function-virCgroupKill.patch create mode 100644 SOURCES/libvirt-vircgroup-Remove-virCgroupAddTaskController.patch create mode 100644 SOURCES/libvirt-vircgroup-Rename-structs-to-start-with-underscore.patch create mode 100644 SOURCES/libvirt-vircgroup-Simplify-if-conditions-in-virCgroupMakeGroup.patch create mode 100644 SOURCES/libvirt-vircgroup-Split-virCgroupPathOfController-into-two-functions.patch create mode 100644 SOURCES/libvirt-vircgroup-Unexport-unused-function-virCgroupAddTaskController.patch create mode 100644 SOURCES/libvirt-vircgroup-Unexport-unused-function-virCgroupRemoveRecursively.patch create mode 100644 SOURCES/libvirt-vircgroup-Use-virCgroupMountOptsMatchController-in-virCgroupDetectPlacement.patch create mode 100644 SOURCES/libvirt-vircgroup-add-support-for-hybrid-configuration.patch create mode 100644 SOURCES/libvirt-vircgroup-cleanup-controllers-not-managed-by-systemd-on-error.patch create mode 100644 SOURCES/libvirt-vircgroup-detect-available-backend-for-cgroup.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-v1-detect-functions.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1-Allow-Deny-AllDevices.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1-Allow-Deny-Device.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1-Set-Get-BlkioDeviceReadBps.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1-Set-Get-BlkioDeviceReadIops.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1-Set-Get-BlkioDeviceWeight.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1-Set-Get-BlkioDeviceWriteBps.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1-Set-Get-BlkioDeviceWriteIops.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1-Set-Get-BlkioWeight.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1-Set-Get-CpuCfsPeriod.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1-Set-Get-CpuCfsQuota.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1-Set-Get-CpuShares.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1-Set-Get-CpusetCpus.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1-Set-Get-CpusetMemoryMigrate.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1-Set-Get-CpusetMems.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1-Set-Get-FreezerState.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1-Set-Get-Memory-Limit.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1AddTask.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1Available.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1BindMount.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1CopyMounts.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1CopyPlacement.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1DetectControllers.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1GetAnyController.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1GetBlkioIoDeviceServiced.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1GetBlkioIoServiced.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1GetCpuacct-Usage.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1GetCpuacctStat.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1GetMemSwapUsage.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1GetMemoryStat.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1GetMemoryUsage.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1HasController.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1HasEmptyTasks.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1MakeGroup.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1PathOfController.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1Remove.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1SetMemory.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1SetOwner.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1StealPlacement.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1SupportsCpuBW.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1ValidateMachineGroup.patch create mode 100644 SOURCES/libvirt-vircgroup-extract-virCgroupV1ValidatePlacement.patch create mode 100644 SOURCES/libvirt-vircgroup-fix-MinGW-build.patch create mode 100644 SOURCES/libvirt-vircgroup-fix-bug-in-virCgroupEnableMissingControllers.patch create mode 100644 SOURCES/libvirt-vircgroup-fix-cgroups-v2-controllers-detection.patch create mode 100644 SOURCES/libvirt-vircgroup-include-system-headers-only-on-linux.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-cgroup-v1-backend-files.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupAddThread.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupKillRecursiveCB.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupTaskFlags.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2-Set-Get-BlkioDeviceReadBps.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2-Set-Get-BlkioDeviceReadIops.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2-Set-Get-BlkioDeviceWeight.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2-Set-Get-BlkioDeviceWriteBps.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2-Set-Get-BlkioDeviceWriteIops.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2-Set-Get-BlkioWeight.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2-Set-Get-CpuCfsPeriod.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2-Set-Get-CpuCfsQuota.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2-Set-Get-CpuShares.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2-Set-Get-MemSwapHardLimit.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2-Set-Get-MemoryHardLimit.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2-Set-Get-MemorySoftLimit.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2AddTask.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2Available.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2BindMount.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2CopyMounts.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2CopyPlacement.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2DetectControllers.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2DetectMounts.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2DetectPlacement.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2GetAnyController.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2GetBlkioIoDeviceServiced.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2GetBlkioIoServiced.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2GetCpuacctStat.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2GetCpuacctUsage.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2GetMemSwapUsage.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2GetMemoryStat.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2GetMemoryUsage.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2HasController.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2HasEmptyTasks.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2MakeGroup.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2PathOfController.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2Remove.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2SetMemory.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2SetOwner.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2StealPlacement.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2SupportsCpuBW.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2ValidateMachineGroup.patch create mode 100644 SOURCES/libvirt-vircgroup-introduce-virCgroupV2ValidatePlacement.patch create mode 100644 SOURCES/libvirt-vircgroup-machinename-will-never-be-NULL.patch create mode 100644 SOURCES/libvirt-vircgroup-register-cgroup-v2-backend.patch create mode 100644 SOURCES/libvirt-vircgroup-remove-VIR_CGROUP_SUPPORTED.patch create mode 100644 SOURCES/libvirt-vircgroup-rename-controllers-to-legacy.patch create mode 100644 SOURCES/libvirt-vircgroup-rename-virCgroupAdd.-Task-to-virCgroupAdd.-Process.patch create mode 100644 SOURCES/libvirt-vircgroup-rename-virCgroupController-into-virCgroupV1Controller.patch create mode 100644 SOURCES/libvirt-vircgroupmock-add-support-to-test-cgroup-v2.patch create mode 100644 SOURCES/libvirt-vircgroupmock-change-cgroup-prefix.patch create mode 100644 SOURCES/libvirt-vircgroupmock-cleanup-unused-cgroup-files.patch create mode 100644 SOURCES/libvirt-vircgroupmock-rewrite-cgroup-fopen-mocking.patch create mode 100644 SOURCES/libvirt-vircgrouptest-add-cgroup-v2-tests.patch create mode 100644 SOURCES/libvirt-vircgrouptest-add-detect-mounts-test-for-cgroup-v2.patch create mode 100644 SOURCES/libvirt-vircgrouptest-add-detect-mounts-test-for-hybrid-cgroups.patch create mode 100644 SOURCES/libvirt-vircgrouptest-add-hybrid-tests.patch create mode 100644 SOURCES/libvirt-vircgrouptest-call-virCgroupDetectMounts-directly.patch create mode 100644 SOURCES/libvirt-vircgrouptest-call-virCgroupNewSelf-instead-virCgroupDetectMounts.patch create mode 100644 SOURCES/libvirt-vircgrouptest-introduce-initFakeFS-and-cleanupFakeFS-helpers.patch create mode 100644 SOURCES/libvirt-vircgrouptest-prepare-testCgroupDetectMounts-for-cgroup-v2.patch create mode 100644 SOURCES/libvirt-vircgrouptest-prepare-validateCgroup-for-cgroupv2.patch create mode 100644 SOURCES/libvirt-vircgroupv1-fix-build-on-non-linux-OSes.patch create mode 100644 SOURCES/libvirt-vircgroupv2-fix-abort-in-VIR_AUTOFREE.patch create mode 100644 SOURCES/libvirt-vircgroupv2-fix-parsing-multiple-values-in-single-file.patch create mode 100644 SOURCES/libvirt-vircgroupv2-fix-setting-cpu.max-period.patch create mode 100644 SOURCES/libvirt-vircgroupv2-fix-virCgroupV2GetCpuCfsQuota-for-max-value.patch create mode 100644 SOURCES/libvirt-vircgroupv2-fix-virCgroupV2ValidateMachineGroup.patch create mode 100644 SOURCES/libvirt-vircgroupv2-store-enabled-controllers.patch create mode 100644 SOURCES/libvirt-vircommand-Separate-mass-FD-closing-into-a-function.patch create mode 100644 SOURCES/libvirt-vircpuhost-Add-support-for-reading-MSRs.patch create mode 100644 SOURCES/libvirt-virdbus-Grab-a-ref-as-long-as-the-while-loop-is-executed.patch create mode 100644 SOURCES/libvirt-virfile-Detect-ceph-as-shared-FS.patch create mode 100644 SOURCES/libvirt-virfile-Rework-virFileIsSharedFixFUSE.patch create mode 100644 SOURCES/libvirt-virfile-Take-symlink-into-account-in-virFileIsSharedFixFUSE.patch create mode 100644 SOURCES/libvirt-virfile-added-GPFS-as-shared-fs.patch create mode 100644 SOURCES/libvirt-virfile-fix-cast-align-error.patch create mode 100644 SOURCES/libvirt-virfiletest-Fix-test-name-prefix-for-virFileInData-test.patch create mode 100644 SOURCES/libvirt-virfiletst-Test-virFileIsSharedFS.patch create mode 100644 SOURCES/libvirt-virhostcpu-Make-virHostCPUGetMSR-work-only-on-x86.patch create mode 100644 SOURCES/libvirt-virnetdevtap-Don-t-crash-on-ifname-in-virNetDevTapInterfaceStats.patch create mode 100644 SOURCES/libvirt-virrandom-Avoid-undefined-behaviour-in-virRandomBits.patch create mode 100644 SOURCES/libvirt-virsh-Require-explicit-domain-for-domxml-to-native.patch create mode 100644 SOURCES/libvirt-virsh-Strip-XML-declaration-when-extracting-CPU-XMLs.patch create mode 100644 SOURCES/libvirt-virsh.pod-Drop-persistent-for-detach-device-alias.patch create mode 100644 SOURCES/libvirt-virsh.pod-Fix-a-command-name-typo-in-nwfilter-binding-undefine.patch create mode 100644 SOURCES/libvirt-virt-host-validate-Fix-build-on-non-Linux.patch create mode 100644 SOURCES/libvirt-virt-host-validate-require-freezer-for-LXC.patch create mode 100644 SOURCES/libvirt-virt-host-validate-rewrite-cgroup-detection-to-use-util-vircgroup.patch create mode 100644 SOURCES/libvirt-virt-xml-validate-Add-schema-for-nwfilterbinding.patch create mode 100644 SOURCES/symlinks create mode 100644 SPECS/libvirt.spec diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..95d8dbd --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/libvirt-4.5.0.tar.xz diff --git a/.libvirt.metadata b/.libvirt.metadata new file mode 100644 index 0000000..3fedbbb --- /dev/null +++ b/.libvirt.metadata @@ -0,0 +1 @@ +5f097d246c0fba04d18ac7ec951ad56ffa1a8958 SOURCES/libvirt-4.5.0.tar.xz diff --git a/SOURCES/libvirt-Handle-copying-bitmaps-to-larger-data-buffers.patch b/SOURCES/libvirt-Handle-copying-bitmaps-to-larger-data-buffers.patch new file mode 100644 index 0000000..4f8ba04 --- /dev/null +++ b/SOURCES/libvirt-Handle-copying-bitmaps-to-larger-data-buffers.patch @@ -0,0 +1,56 @@ +From e75abae126f9fcaf1e8478f0780ecae736f7d3e1 Mon Sep 17 00:00:00 2001 +Message-Id: +From: "Allen, John" +Date: Tue, 2 Jul 2019 17:05:34 +0200 +Subject: [PATCH] Handle copying bitmaps to larger data buffers +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +If a bitmap of a shorter length than the data buffer is passed to +virBitmapToDataBuf, it will read off the end of the bitmap and copy junk +into the returned buffer. Add a check to only copy the length of the +bitmap to the buffer. + +The problem can be observed after setting a vcpu affinity using the vcpupin +command on a system with a large number of cores: + # virsh vcpupin example_domain 0 0 + # virsh vcpupin example_domain 0 + VCPU CPU Affinity + --------------------------- + 0 0,192,197-198,202 + +Signed-off-by: John Allen +(cherry picked from commit 51f9f80d350e633adf479c6a9b3c55f82ca9cbd4) + +https: //bugzilla.redhat.com/show_bug.cgi?id=1703160 +Signed-off-by: Erik Skultety +Message-Id: <1a487c4f1ba9725eb7325debeeff2861d7047890.1562079635.git.eskultet@redhat.com> +Reviewed-by: Ján Tomko +--- + src/util/virbitmap.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/src/util/virbitmap.c b/src/util/virbitmap.c +index 49e542a4e6..7df0a2d4f3 100644 +--- a/src/util/virbitmap.c ++++ b/src/util/virbitmap.c +@@ -831,11 +831,15 @@ virBitmapToDataBuf(virBitmapPtr bitmap, + unsigned char *bytes, + size_t len) + { ++ size_t nbytes = bitmap->map_len * (VIR_BITMAP_BITS_PER_UNIT / CHAR_BIT); + unsigned long *l; + size_t i, j; + + memset(bytes, 0, len); + ++ /* If bitmap and buffer differ in size, only fill to the smaller length */ ++ len = MIN(len, nbytes); ++ + /* htole64 is not provided by gnulib, so we do the conversion by hand */ + l = bitmap->map; + for (i = j = 0; i < len; i++, j++) { +-- +2.22.0 + diff --git a/SOURCES/libvirt-PPC64-support-for-NVIDIA-V100-GPU-with-NVLink2-passthrough.patch b/SOURCES/libvirt-PPC64-support-for-NVIDIA-V100-GPU-with-NVLink2-passthrough.patch new file mode 100644 index 0000000..d29a9cf --- /dev/null +++ b/SOURCES/libvirt-PPC64-support-for-NVIDIA-V100-GPU-with-NVLink2-passthrough.patch @@ -0,0 +1,183 @@ +From 5347b12008842b5c86f766e391c6f3756afbff7d Mon Sep 17 00:00:00 2001 +Message-Id: <5347b12008842b5c86f766e391c6f3756afbff7d@dist-git> +From: Daniel Henrique Barboza +Date: Fri, 3 May 2019 13:54:53 +0200 +Subject: [PATCH] PPC64 support for NVIDIA V100 GPU with NVLink2 passthrough + +The NVIDIA V100 GPU has an onboard RAM that is mapped into the +host memory and accessible as normal RAM via an NVLink2 bridge. When +passed through in a guest, QEMU puts the NVIDIA RAM window in a +non-contiguous area, above the PCI MMIO area that starts at 32TiB. +This means that the NVIDIA RAM window starts at 64TiB and go all the +way to 128TiB. + +This means that the guest might request a 64-bit window, for each PCI +Host Bridge, that goes all the way to 128TiB. However, the NVIDIA RAM +window isn't counted as regular RAM, thus this window is considered +only for the allocation of the Translation and Control Entry (TCE). +For more information about how NVLink2 support works in QEMU, +refer to the accepted implementation [1]. + +This memory layout differs from the existing VFIO case, requiring its +own formula. This patch changes the PPC64 code of +@qemuDomainGetMemLockLimitBytes to: + +- detect if we have a NVLink2 bridge being passed through to the +guest. This is done by using the @ppc64VFIODeviceIsNV2Bridge function +added in the previous patch. The existence of the NVLink2 bridge in +the guest means that we are dealing with the NVLink2 memory layout; + +- if an IBM NVLink2 bridge exists, passthroughLimit is calculated in a +different way to account for the extra memory the TCE table can alloc. +The 64TiB..128TiB window is more than enough to fit all possible +GPUs, thus the memLimit is the same regardless of passing through 1 or +multiple V100 GPUs. + +Further reading explaining the background +[1] https://lists.gnu.org/archive/html/qemu-devel/2019-03/msg03700.html +[2] https://www.redhat.com/archives/libvir-list/2019-March/msg00660.html +[3] https://www.redhat.com/archives/libvir-list/2019-April/msg00527.html + +Signed-off-by: Daniel Henrique Barboza +Reviewed-by: Erik Skultety +(cherry picked from commit 1a922648f67f56c4374d647feebf2adb9a642f96) + +https://bugzilla.redhat.com/show_bug.cgi?id=1505998 + +Conflicts: + The upstream commit relied on: + - v4.7.0-37-gb72183223f + - v4.7.0-38-ga14f597266 + which were not backported so virPCIDeviceAddressAsString had to + swapped for the former virDomainPCIAddressAsString in order to + compile. + +Signed-off-by: Erik Skultety +Message-Id: <03c00ebf46d85b0615134ef8655e67a4c909b7da.1556884443.git.eskultet@redhat.com> +Reviewed-by: Andrea Bolognani +--- + src/qemu/qemu_domain.c | 80 ++++++++++++++++++++++++++++++++---------- + 1 file changed, 61 insertions(+), 19 deletions(-) + +diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c +index a8bc618389..21f0722495 100644 +--- a/src/qemu/qemu_domain.c ++++ b/src/qemu/qemu_domain.c +@@ -9813,7 +9813,7 @@ qemuDomainUpdateCurrentMemorySize(virQEMUDriverPtr driver, + * such as '0004:04:00.0', and tells if the device is a NVLink2 + * bridge. + */ +-static ATTRIBUTE_UNUSED bool ++static bool + ppc64VFIODeviceIsNV2Bridge(const char *device) + { + const char *nvlink2Files[] = {"ibm,gpu", "ibm,nvlink", +@@ -9851,7 +9851,9 @@ getPPC64MemLockLimitBytes(virDomainDefPtr def) + unsigned long long maxMemory = 0; + unsigned long long passthroughLimit = 0; + size_t i, nPCIHostBridges = 0; ++ virPCIDeviceAddressPtr pciAddr; + bool usesVFIO = false; ++ bool nvlink2Capable = false; + + for (i = 0; i < def->ncontrollers; i++) { + virDomainControllerDefPtr cont = def->controllers[i]; +@@ -9869,7 +9871,17 @@ getPPC64MemLockLimitBytes(virDomainDefPtr def) + dev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI && + dev->source.subsys.u.pci.backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) { + usesVFIO = true; +- break; ++ ++ pciAddr = &dev->source.subsys.u.pci.addr; ++ if (virPCIDeviceAddressIsValid(pciAddr, false)) { ++ VIR_AUTOFREE(char *) pciAddrStr = NULL; ++ ++ pciAddrStr = virDomainPCIAddressAsString(pciAddr); ++ if (ppc64VFIODeviceIsNV2Bridge(pciAddrStr)) { ++ nvlink2Capable = true; ++ break; ++ } ++ } + } + } + +@@ -9896,29 +9908,59 @@ getPPC64MemLockLimitBytes(virDomainDefPtr def) + 4096 * nPCIHostBridges + + 8192; + +- /* passthroughLimit := max( 2 GiB * #PHBs, (c) +- * memory (d) +- * + memory * 1/512 * #PHBs + 8 MiB ) (e) ++ /* NVLink2 support in QEMU is a special case of the passthrough ++ * mechanics explained in the usesVFIO case below. The GPU RAM ++ * is placed with a gap after maxMemory. The current QEMU ++ * implementation puts the NVIDIA RAM above the PCI MMIO, which ++ * starts at 32TiB and is the MMIO reserved for the guest main RAM. + * +- * (c) is the pre-DDW VFIO DMA window accounting. We're allowing 2 GiB +- * rather than 1 GiB ++ * This window ends at 64TiB, and this is where the GPUs are being ++ * placed. The next available window size is at 128TiB, and ++ * 64TiB..128TiB will fit all possible NVIDIA GPUs. + * +- * (d) is the with-DDW (and memory pre-registration and related +- * features) DMA window accounting - assuming that we only account RAM +- * once, even if mapped to multiple PHBs ++ * The same assumption as the most common case applies here: ++ * the guest will request a 64-bit DMA window, per PHB, that is ++ * big enough to map all its RAM, which is now at 128TiB due ++ * to the GPUs. + * +- * (e) is the with-DDW userspace view and overhead for the 64-bit DMA +- * window. This is based a bit on expected guest behaviour, but there +- * really isn't a way to completely avoid that. We assume the guest +- * requests a 64-bit DMA window (per PHB) just big enough to map all +- * its RAM. 4 kiB page size gives the 1/512; it will be less with 64 +- * kiB pages, less still if the guest is mapped with hugepages (unlike +- * the default 32-bit DMA window, DDW windows can use large IOMMU +- * pages). 8 MiB is for second and further level overheads, like (b) */ +- if (usesVFIO) ++ * Note that the NVIDIA RAM window must be accounted for the TCE ++ * table size, but *not* for the main RAM (maxMemory). This gives ++ * us the following passthroughLimit for the NVLink2 case: ++ * ++ * passthroughLimit = maxMemory + ++ * 128TiB/512KiB * #PHBs + 8 MiB */ ++ if (nvlink2Capable) { ++ passthroughLimit = maxMemory + ++ 128 * (1ULL<<30) / 512 * nPCIHostBridges + ++ 8192; ++ } else if (usesVFIO) { ++ /* For regular (non-NVLink2 present) VFIO passthrough, the value ++ * of passthroughLimit is: ++ * ++ * passthroughLimit := max( 2 GiB * #PHBs, (c) ++ * memory (d) ++ * + memory * 1/512 * #PHBs + 8 MiB ) (e) ++ * ++ * (c) is the pre-DDW VFIO DMA window accounting. We're allowing 2 ++ * GiB rather than 1 GiB ++ * ++ * (d) is the with-DDW (and memory pre-registration and related ++ * features) DMA window accounting - assuming that we only account ++ * RAM once, even if mapped to multiple PHBs ++ * ++ * (e) is the with-DDW userspace view and overhead for the 64-bit ++ * DMA window. This is based a bit on expected guest behaviour, but ++ * there really isn't a way to completely avoid that. We assume the ++ * guest requests a 64-bit DMA window (per PHB) just big enough to ++ * map all its RAM. 4 kiB page size gives the 1/512; it will be ++ * less with 64 kiB pages, less still if the guest is mapped with ++ * hugepages (unlike the default 32-bit DMA window, DDW windows ++ * can use large IOMMU pages). 8 MiB is for second and further level ++ * overheads, like (b) */ + passthroughLimit = MAX(2 * 1024 * 1024 * nPCIHostBridges, + memory + + memory / 512 * nPCIHostBridges + 8192); ++ } + + memKB = baseLimit + passthroughLimit; + +-- +2.21.0 + diff --git a/SOURCES/libvirt-RHEL-Add-rhel-machine-types-to-qemuDomainMachineNeedsFDC.patch b/SOURCES/libvirt-RHEL-Add-rhel-machine-types-to-qemuDomainMachineNeedsFDC.patch new file mode 100644 index 0000000..a32bf30 --- /dev/null +++ b/SOURCES/libvirt-RHEL-Add-rhel-machine-types-to-qemuDomainMachineNeedsFDC.patch @@ -0,0 +1,35 @@ +From 74b69d4a7240c601fcd12c18d5e8d95d641ae922 Mon Sep 17 00:00:00 2001 +Message-Id: <74b69d4a7240c601fcd12c18d5e8d95d641ae922@dist-git> +From: =?UTF-8?q?J=C3=A1n=20Tomko?= +Date: Mon, 22 Feb 2016 12:51:51 +0100 +Subject: [PATCH] RHEL: Add rhel machine types to qemuDomainMachineNeedsFDC + +RHEL-only. + +pc-q35-rhel7.0.0 and pc-q35-rhel7.1.0 do not need an explicit +isa-fdc controller. + +https://bugzilla.redhat.com/show_bug.cgi?id=1227880 + +Signed-off-by: Jiri Denemark +--- + src/qemu/qemu_domain.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c +index 4c15d5a36a..4c2a162b85 100644 +--- a/src/qemu/qemu_domain.c ++++ b/src/qemu/qemu_domain.c +@@ -9239,6 +9239,9 @@ qemuDomainMachineNeedsFDC(const char *machine) + STRPREFIX(p, "2.2") || + STRPREFIX(p, "2.3")) + return false; ++ if (STRPREFIX(p, "rhel7.0.0") || ++ STRPREFIX(p, "rhel7.1.0")) ++ return false; + return true; + } + return false; +-- +2.18.0 + diff --git a/SOURCES/libvirt-RHEL-Fix-virConnectGetMaxVcpus-output.patch b/SOURCES/libvirt-RHEL-Fix-virConnectGetMaxVcpus-output.patch new file mode 100644 index 0000000..449b106 --- /dev/null +++ b/SOURCES/libvirt-RHEL-Fix-virConnectGetMaxVcpus-output.patch @@ -0,0 +1,46 @@ +From 72c5455c00fcec50bae3e71a6fbd6330e524be0a Mon Sep 17 00:00:00 2001 +Message-Id: <72c5455c00fcec50bae3e71a6fbd6330e524be0a@dist-git> +From: =?UTF-8?q?J=C3=A1n=20Tomko?= +Date: Mon, 27 Aug 2018 13:09:38 +0200 +Subject: [PATCH] RHEL: Fix virConnectGetMaxVcpus output +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +https://bugzilla.redhat.com/show_bug.cgi?id=1092363 + +RHEL-only. + +Ignore the maximum vcpu limit (KVM_CAP_MAX_VCPUS) on RHEL, +since RHEL QEMU treats the recommended limit (KVM_CAP_NR_VCPUS) +as the maximum, see: +https://bugzilla.redhat.com/show_bug.cgi?id=998708 + +(cherry picked from commit 7dff909fa34bdd93ad200dbffe70c0c1ee931925) +Signed-off-by: Ján Tomko + +https: //bugzilla.redhat.com/show_bug.cgi?id=1582222 +Reviewed-by: Andrea Bolognani +--- + src/util/virhostcpu.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/src/util/virhostcpu.c b/src/util/virhostcpu.c +index 1e31be5900..effe04ca3a 100644 +--- a/src/util/virhostcpu.c ++++ b/src/util/virhostcpu.c +@@ -1186,6 +1186,11 @@ virHostCPUGetKVMMaxVCPUs(void) + return -1; + } + ++/* Ignore KVM_CAP_MAX_VCPUS on RHEL - the recommended maximum ++ * is treated as a hard limit. ++ */ ++# undef KVM_CAP_MAX_VCPUS ++ + # ifdef KVM_CAP_MAX_VCPUS + /* at first try KVM_CAP_MAX_VCPUS to determine the maximum count */ + if ((ret = ioctl(fd, KVM_CHECK_EXTENSION, KVM_CAP_MAX_VCPUS)) > 0) +-- +2.18.0 + diff --git a/SOURCES/libvirt-RHEL-Hack-around-changed-Broadwell-Haswell-CPUs.patch b/SOURCES/libvirt-RHEL-Hack-around-changed-Broadwell-Haswell-CPUs.patch new file mode 100644 index 0000000..69fece3 --- /dev/null +++ b/SOURCES/libvirt-RHEL-Hack-around-changed-Broadwell-Haswell-CPUs.patch @@ -0,0 +1,165 @@ +From 498389f6b88547c352add4b209d61896a5143c00 Mon Sep 17 00:00:00 2001 +Message-Id: <498389f6b88547c352add4b209d61896a5143c00@dist-git> +From: Jiri Denemark +Date: Fri, 27 Mar 2015 12:48:40 +0100 +Subject: [PATCH] RHEL: Hack around changed Broadwell/Haswell CPUs + +RHEL-only + +Upstream tried to solve the change of Broadwell and Haswell CPUs by +removing rtm and hle features from the corresponding CPU models for new +machine types. Then they reverted this and introduced new *-noTSX models +instead. However, the original fix was backported to RHEL. + +This patch makes sure Broadwell and Haswell will always contain rtm and +hle features regardless on RHEL version or machine type used. + +https://bugzilla.redhat.com/show_bug.cgi?id=1199446 + +Signed-off-by: Jiri Denemark +--- + src/qemu/qemu_command.c | 29 +++++++++++++++++++ + tests/qemuxml2argvdata/cpu-Haswell.args | 2 +- + .../qemuxml2argvdata/cpu-host-model-cmt.args | 3 +- + tests/qemuxml2argvdata/cpu-tsc-frequency.args | 2 +- + tests/qemuxml2argvdata/q35-acpi-nouefi.args | 2 +- + tests/qemuxml2argvdata/q35-acpi-uefi.args | 2 +- + tests/qemuxml2argvdata/q35-noacpi-nouefi.args | 2 +- + 7 files changed, 36 insertions(+), 6 deletions(-) + +diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c +index 4fc3176ad3..c1eefca639 100644 +--- a/src/qemu/qemu_command.c ++++ b/src/qemu/qemu_command.c +@@ -6677,6 +6677,8 @@ qemuBuildCpuModelArgStr(virQEMUDriverPtr driver, + size_t i; + virCapsPtr caps = NULL; + virCPUDefPtr cpu = def->cpu; ++ bool hle = false; ++ bool rtm = false; + + if (!(caps = virQEMUDriverGetCapabilities(driver, false))) + goto cleanup; +@@ -6734,6 +6736,11 @@ qemuBuildCpuModelArgStr(virQEMUDriverPtr driver, + virBufferAsprintf(buf, ",vendor=%s", cpu->vendor_id); + + for (i = 0; i < cpu->nfeatures; i++) { ++ if (STREQ("rtm", cpu->features[i].name)) ++ rtm = true; ++ if (STREQ("hle", cpu->features[i].name)) ++ hle = true; ++ + switch ((virCPUFeaturePolicy) cpu->features[i].policy) { + case VIR_CPU_FEATURE_FORCE: + case VIR_CPU_FEATURE_REQUIRE: +@@ -6757,6 +6764,28 @@ qemuBuildCpuModelArgStr(virQEMUDriverPtr driver, + } + } + ++ /* Some versions of qemu-kvm in RHEL provide Broadwell and Haswell CPU ++ * models which lack rtm and hle features when used with some machine ++ * types. Let's make sure Broadwell and Haswell will always have these ++ * features. But only if the features were not explicitly mentioned in ++ * the guest CPU definition. ++ */ ++ if (STREQ_NULLABLE(cpu->model, "Broadwell") || ++ STREQ_NULLABLE(cpu->model, "Haswell")) { ++ if (!rtm) { ++ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION)) ++ virBufferAddLit(buf, ",rtm=on"); ++ else ++ virBufferAddLit(buf, ",+rtm"); ++ } ++ if (!hle) { ++ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION)) ++ virBufferAddLit(buf, ",hle=on"); ++ else ++ virBufferAddLit(buf, ",+hle"); ++ } ++ } ++ + ret = 0; + cleanup: + virObjectUnref(caps); +diff --git a/tests/qemuxml2argvdata/cpu-Haswell.args b/tests/qemuxml2argvdata/cpu-Haswell.args +index c7ce396d05..6f20359524 100644 +--- a/tests/qemuxml2argvdata/cpu-Haswell.args ++++ b/tests/qemuxml2argvdata/cpu-Haswell.args +@@ -8,7 +8,7 @@ QEMU_AUDIO_DRV=none \ + -name QEMUGuest1 \ + -S \ + -machine pc,accel=kvm,usb=off,dump-guest-core=off \ +--cpu Haswell \ ++-cpu Haswell,+rtm,+hle \ + -m 214 \ + -smp 6,sockets=6,cores=1,threads=1 \ + -uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +diff --git a/tests/qemuxml2argvdata/cpu-host-model-cmt.args b/tests/qemuxml2argvdata/cpu-host-model-cmt.args +index 8767278d11..d236aa9e09 100644 +--- a/tests/qemuxml2argvdata/cpu-host-model-cmt.args ++++ b/tests/qemuxml2argvdata/cpu-host-model-cmt.args +@@ -9,7 +9,8 @@ QEMU_AUDIO_DRV=none \ + -S \ + -machine pc,accel=tcg,usb=off,dump-guest-core=off \ + -cpu Haswell,+vme,+ds,+acpi,+ss,+ht,+tm,+pbe,+dtes64,+monitor,+ds_cpl,+vmx,\ +-+smx,+est,+tm2,+xtpr,+pdcm,+osxsave,+f16c,+rdrand,+pdpe1gb,+abm,+lahf_lm \ +++smx,+est,+tm2,+xtpr,+pdcm,+osxsave,+f16c,+rdrand,+pdpe1gb,+abm,+lahf_lm,+rtm,\ +++hle \ + -m 214 \ + -smp 6,sockets=6,cores=1,threads=1 \ + -uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +diff --git a/tests/qemuxml2argvdata/cpu-tsc-frequency.args b/tests/qemuxml2argvdata/cpu-tsc-frequency.args +index 7824dea96f..216fd43014 100644 +--- a/tests/qemuxml2argvdata/cpu-tsc-frequency.args ++++ b/tests/qemuxml2argvdata/cpu-tsc-frequency.args +@@ -10,7 +10,7 @@ QEMU_AUDIO_DRV=none \ + -machine pc,accel=kvm,usb=off,dump-guest-core=off \ + -cpu Haswell,+vme,+ds,+acpi,+ss,+ht,+tm,+pbe,+dtes64,+monitor,+ds_cpl,+vmx,\ + +smx,+est,+tm2,+xtpr,+pdcm,+osxsave,+f16c,+rdrand,+pdpe1gb,+abm,+lahf_lm,\ +-+invtsc,tsc-frequency=3504000000 \ +++invtsc,+rtm,+hle,tsc-frequency=3504000000 \ + -m 214 \ + -smp 1,sockets=1,cores=1,threads=1 \ + -uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +diff --git a/tests/qemuxml2argvdata/q35-acpi-nouefi.args b/tests/qemuxml2argvdata/q35-acpi-nouefi.args +index caef49ea16..a9375a35db 100644 +--- a/tests/qemuxml2argvdata/q35-acpi-nouefi.args ++++ b/tests/qemuxml2argvdata/q35-acpi-nouefi.args +@@ -8,7 +8,7 @@ QEMU_AUDIO_DRV=none \ + -name guest \ + -S \ + -machine q35,accel=tcg,usb=off,dump-guest-core=off \ +--cpu Haswell \ ++-cpu Haswell,+rtm,+hle \ + -m 1024 \ + -smp 1,sockets=1,cores=1,threads=1 \ + -uuid 496d7ea8-9739-544b-4ebd-ef08be936e8b \ +diff --git a/tests/qemuxml2argvdata/q35-acpi-uefi.args b/tests/qemuxml2argvdata/q35-acpi-uefi.args +index a3293aeb9d..8e3368b9e9 100644 +--- a/tests/qemuxml2argvdata/q35-acpi-uefi.args ++++ b/tests/qemuxml2argvdata/q35-acpi-uefi.args +@@ -8,7 +8,7 @@ QEMU_AUDIO_DRV=none \ + -name guest \ + -S \ + -machine q35,accel=tcg,usb=off,dump-guest-core=off \ +--cpu Haswell \ ++-cpu Haswell,+rtm,+hle \ + -drive file=/usr/share/OVMF/OVMF_CODE.fd,if=pflash,format=raw,unit=0,\ + readonly=on \ + -drive file=/var/lib/libvirt/qemu/nvram/guest_VARS.fd,if=pflash,format=raw,\ +diff --git a/tests/qemuxml2argvdata/q35-noacpi-nouefi.args b/tests/qemuxml2argvdata/q35-noacpi-nouefi.args +index fab2a6fcb0..0dd61840ef 100644 +--- a/tests/qemuxml2argvdata/q35-noacpi-nouefi.args ++++ b/tests/qemuxml2argvdata/q35-noacpi-nouefi.args +@@ -8,7 +8,7 @@ QEMU_AUDIO_DRV=none \ + -name guest \ + -S \ + -machine q35,accel=tcg,usb=off,dump-guest-core=off \ +--cpu Haswell \ ++-cpu Haswell,+rtm,+hle \ + -m 1024 \ + -smp 1,sockets=1,cores=1,threads=1 \ + -uuid 496d7ea8-9739-544b-4ebd-ef08be936e8b \ +-- +2.18.0 + diff --git a/SOURCES/libvirt-RHEL-network-regain-guest-network-connectivity-after-firewalld-switch-to-nftables.patch b/SOURCES/libvirt-RHEL-network-regain-guest-network-connectivity-after-firewalld-switch-to-nftables.patch new file mode 100644 index 0000000..081d0e9 --- /dev/null +++ b/SOURCES/libvirt-RHEL-network-regain-guest-network-connectivity-after-firewalld-switch-to-nftables.patch @@ -0,0 +1,146 @@ +From 54e270d7fb68b41002654374d395e4f260a24add Mon Sep 17 00:00:00 2001 +Message-Id: <54e270d7fb68b41002654374d395e4f260a24add@dist-git> +From: Laine Stump +Date: Mon, 15 Oct 2018 20:31:02 -0400 +Subject: [PATCH] RHEL: network: regain guest network connectivity after + firewalld switch to nftables +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This is a DOWNSTREAM ONLY patch to temporarily get back guest network +connectivity while still allowing the firewalld backend to use +nftables (which is the default with RHEL8). + +The circumstances that cause the problem: + +In the past (when both libvirt and firewalld used iptables), if either +libvirt's rules *OR* firewalld's rules accepted a packet, it would be +accepted. + +But now firewalld uses nftables for its backend, while libvirt's +firewall rules are still using iptables; iptables rules are still +processed, but at a different time during packet processing than the +firewalld nftables hooks. The result is that a packet must be accepted +by *BOTH* the libvirt iptables rules *AND* the firewalld nftable rules +in order to be accepted. + +This causes pain for two types of traffic: + +1) libvirt always adds rules to permit DNS and DHCP (and sometimes +TFTP) from guests to the host. But libvirt's bridges are in +firewalld's "default" zone (which is usually the zone called +"public"). The public zone allows ssh, but doesn't allow DNS, DHCP, or +TFTP. So guests connected to libvirt's bridges can't acquire an IP +address from DHCP, nor can they make DNS queries to the DNS server +libvirt has setup on the host. + +2) firewalld's higher level "rich rules" don't yet have the ability to +configure the acceptance of forwarded traffic (traffic that is going +somewhere beyond the host), so any traffic that needs to be forwarded +is rejected. + +libvirt can't send "direct" nftables rules (firewalld only supports +that for iptables), so we can't solve this problem by just sending +direct nftables rules instead of iptables rules. + +However, we can take advantage of a quirk in firewalld zones that have +a default policy of accept (meaning any packet that doesn't match a +specific rule in the zone will be accepted) - this default accept will +also accept forwarded traffic (not just traffic destined for the host). + +So, as a temporary solution to get all network traffic flowing, this +patch creates a new firewalld zone called "libvirt" which is setup to +include interfaces named virbr0-virbr9, and has a default policy of +accept. With this zone installed, libvirt networks that use the names +virbr0-virbr9 will have *all* their traffic accepted, both to the host +and to/from the rest of the network. + +firewalld zones can't normally be added to the runtime config of +firewalld, so we have to reload all of the permanent config for it to +be recognized. This is done with a call to "firewall-cmd --reload" +during postinstall and postuninstall. In the case that firewalld is +inactive, firewall-cmd exits without doing anything (i.e. it doesn't +start up firewalld.service if it's not already started). + +This obviously can't be a permanent solution, since it allows guests +to have access to *all* services on the host. However, it doesn't +allow QE and beta testers to test firewalld with an nftables backend +(which is important for firewalld and nftables devs) without breaking +network connectivity for libvirt managed virtual machines (so testing +of those can also take place. + +Resolves: https://bugzilla.redhat.com/1638864 + +This problem is discussed in more detail in this message thread: + +https://post-office.corp.redhat.com/mailman/private/virt-devel/2018-September/msg00145.html +https://post-office.corp.redhat.com/mailman/private/virt-devel/2018-October/msg00042.html + +and in the BZ assigned to firewalld: https://bugzilla.redhat.com/1623841 + +Signed-off-by: Laine Stump +Acked-by: Daniel P. BerrangĂ© +Reviewed-by: Jiri Denemark +--- + libvirt.spec.in | 14 ++++++++++++++ + src/network/Makefile.inc.am | 10 +++++++++- + src/network/libvirt.zone | 15 +++++++++++++++ + 3 files changed, 38 insertions(+), 1 deletion(-) + create mode 100644 src/network/libvirt.zone + +diff --git a/src/network/Makefile.inc.am b/src/network/Makefile.inc.am +index 508c8c0422..20d899e699 100644 +--- a/src/network/Makefile.inc.am ++++ b/src/network/Makefile.inc.am +@@ -87,6 +87,11 @@ install-data-network: + ( cd $(DESTDIR)$(confdir)/qemu/networks/autostart && \ + rm -f default.xml && \ + $(LN_S) ../default.xml default.xml ) ++if HAVE_FIREWALLD ++ $(MKDIR_P) "$(DESTDIR)$(prefix)/lib/firewalld/zones" ++ $(INSTALL_DATA) $(srcdir)/network/libvirt.zone \ ++ $(DESTDIR)$(prefix)/lib/firewalld/zones/libvirt.xml ++endif HAVE_FIREWALLD + + uninstall-data-network: + rm -f $(DESTDIR)$(confdir)/qemu/networks/autostart/default.xml +@@ -95,10 +100,13 @@ uninstall-data-network: + rmdir "$(DESTDIR)$(confdir)/qemu/networks" || : + rmdir "$(DESTDIR)$(localstatedir)/lib/libvirt/network" ||: + rmdir "$(DESTDIR)$(localstatedir)/run/libvirt/network" ||: ++if HAVE_FIREWALLD ++ rm -f $(DESTDIR)$(prefix)/lib/firewalld/zones/libvirt.xml ++endif HAVE_FIREWALLD + + endif WITH_NETWORK + +-EXTRA_DIST += network/default.xml ++EXTRA_DIST += network/default.xml network/libvirt.zone + + .PHONY: \ + install-data-network \ +diff --git a/src/network/libvirt.zone b/src/network/libvirt.zone +new file mode 100644 +index 0000000000..355a70b4da +--- /dev/null ++++ b/src/network/libvirt.zone +@@ -0,0 +1,15 @@ ++ ++ ++ libvirt ++ All network connections are accepted. This also permits packets to/from interfaces in the zone to be forwarded. This zone is intended to be used only by libvirt virtual networks. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +-- +2.19.1 + diff --git a/SOURCES/libvirt-RHEL-qemu-Add-ability-to-set-sgio-values-for-hostdev.patch b/SOURCES/libvirt-RHEL-qemu-Add-ability-to-set-sgio-values-for-hostdev.patch new file mode 100644 index 0000000..537e868 --- /dev/null +++ b/SOURCES/libvirt-RHEL-qemu-Add-ability-to-set-sgio-values-for-hostdev.patch @@ -0,0 +1,77 @@ +From 2d4b19613c462e876ee1327d600f5cbbb998c540 Mon Sep 17 00:00:00 2001 +Message-Id: <2d4b19613c462e876ee1327d600f5cbbb998c540@dist-git> +From: John Ferlan +Date: Mon, 17 Dec 2018 20:42:30 -0500 +Subject: [PATCH] RHEL: qemu: Add ability to set sgio values for hostdev +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +https://bugzilla.redhat.com/show_bug.cgi?id=1582424 + +RHEL-only + +Add necessary checks in order to allow setting sgio values for a scsi +host device + +Signed-off-by: John Ferlan +Signed-off-by: Jiri Denemark +(cherry picked from commit f2cf0ae7bc371c75f6c0e79192711f2b1d201b10) +Reviewed-by: Ján Tomko +--- + src/qemu/qemu_conf.c | 16 +++++++++------- + 1 file changed, 9 insertions(+), 7 deletions(-) + +diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c +index a4f545ef92..3ea9784854 100644 +--- a/src/qemu/qemu_conf.c ++++ b/src/qemu/qemu_conf.c +@@ -1633,6 +1633,7 @@ qemuSetUnprivSGIO(virDomainDeviceDefPtr dev) + virDomainDiskDefPtr disk = NULL; + virDomainHostdevDefPtr hostdev = NULL; + char *sysfs_path = NULL; ++ char *hostdev_path = NULL; + const char *path = NULL; + int val = -1; + int ret = -1; +@@ -1654,14 +1655,10 @@ qemuSetUnprivSGIO(virDomainDeviceDefPtr dev) + if (!qemuIsSharedHostdev(hostdev)) + return 0; + +- if (hostdev->source.subsys.u.scsi.sgio) { +- virReportError(VIR_ERR_INTERNAL_ERROR, "%s", +- _("'sgio' is not supported for SCSI " +- "generic device yet ")); ++ if (!(hostdev_path = qemuGetHostdevPath(hostdev))) + goto cleanup; +- } + +- return 0; ++ path = hostdev_path; + } else { + return 0; + } +@@ -1670,7 +1667,11 @@ qemuSetUnprivSGIO(virDomainDeviceDefPtr dev) + goto cleanup; + + /* By default, filter the SG_IO commands, i.e. set unpriv_sgio to 0. */ +- val = (disk->sgio == VIR_DOMAIN_DEVICE_SGIO_UNFILTERED); ++ if (dev->type == VIR_DOMAIN_DEVICE_DISK) ++ val = (disk->sgio == VIR_DOMAIN_DEVICE_SGIO_UNFILTERED); ++ else ++ val = (hostdev->source.subsys.u.scsi.sgio == ++ VIR_DOMAIN_DEVICE_SGIO_UNFILTERED); + + /* Do not do anything if unpriv_sgio is not supported by the kernel and the + * whitelist is enabled. But if requesting unfiltered access, always call +@@ -1683,6 +1684,7 @@ qemuSetUnprivSGIO(virDomainDeviceDefPtr dev) + ret = 0; + + cleanup: ++ VIR_FREE(hostdev_path); + VIR_FREE(sysfs_path); + return ret; + } +-- +2.20.1 + diff --git a/SOURCES/libvirt-RHEL-qemu-Add-check-for-unpriv-sgio-for-SCSI-generic-host-device.patch b/SOURCES/libvirt-RHEL-qemu-Add-check-for-unpriv-sgio-for-SCSI-generic-host-device.patch new file mode 100644 index 0000000..61a15f5 --- /dev/null +++ b/SOURCES/libvirt-RHEL-qemu-Add-check-for-unpriv-sgio-for-SCSI-generic-host-device.patch @@ -0,0 +1,64 @@ +From c39257f41ccb22272c6161777bf71390676bf7f0 Mon Sep 17 00:00:00 2001 +Message-Id: +From: John Ferlan +Date: Mon, 17 Dec 2018 20:42:31 -0500 +Subject: [PATCH] RHEL: qemu: Add check for unpriv sgio for SCSI generic host + device +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +https://bugzilla.redhat.com/show_bug.cgi?id=1582424 + +RHEL-only + +Check if the hostdev has set the sgio filtered/unfiltered and handle +appropriately. + +This restores functionality removed by upstream commit id 'ce346623' +to remove sgio support for the SCSI generic host device. + +Signed-off-by: John Ferlan +Signed-off-by: Jiri Denemark +(cherry picked from commit 712005bcf26190dc6fd1fe56283377987909cc4b) +Reviewed-by: Ján Tomko +--- + src/qemu/qemu_conf.c | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c +index 3ea9784854..7d15af9c0b 100644 +--- a/src/qemu/qemu_conf.c ++++ b/src/qemu/qemu_conf.c +@@ -1473,6 +1473,8 @@ qemuAddSharedHostdev(virQEMUDriverPtr driver, + { + char *dev_path = NULL; + char *key = NULL; ++ virDomainHostdevSubsysSCSIPtr scsisrc = &hostdev->source.subsys.u.scsi; ++ virDomainHostdevSubsysSCSIHostPtr scsihostsrc = &scsisrc->u.host; + int ret = -1; + + if (!qemuIsSharedHostdev(hostdev)) +@@ -1481,6 +1483,19 @@ qemuAddSharedHostdev(virQEMUDriverPtr driver, + if (!(dev_path = qemuGetHostdevPath(hostdev))) + goto cleanup; + ++ if ((ret = qemuCheckUnprivSGIO(driver->sharedDevices, dev_path, ++ scsisrc->sgio)) < 0) { ++ if (ret == -2) { ++ virReportError(VIR_ERR_OPERATION_INVALID, ++ _("sgio of shared scsi host device '%s-%u-%u-%llu' " ++ "conflicts with other active domains"), ++ scsihostsrc->adapter, scsihostsrc->bus, ++ scsihostsrc->target, scsihostsrc->unit); ++ ret = -1; ++ } ++ goto cleanup; ++ } ++ + if (!(key = qemuGetSharedDeviceKey(dev_path))) + goto cleanup; + +-- +2.20.1 + diff --git a/SOURCES/libvirt-RHEL-qemu-Fix-crash-trying-to-use-iSCSI-hostdev.patch b/SOURCES/libvirt-RHEL-qemu-Fix-crash-trying-to-use-iSCSI-hostdev.patch new file mode 100644 index 0000000..c86c563 --- /dev/null +++ b/SOURCES/libvirt-RHEL-qemu-Fix-crash-trying-to-use-iSCSI-hostdev.patch @@ -0,0 +1,45 @@ +From 11bfd4f26c090b95a100aaf056ecfa799dfce979 Mon Sep 17 00:00:00 2001 +Message-Id: <11bfd4f26c090b95a100aaf056ecfa799dfce979@dist-git> +From: John Ferlan +Date: Fri, 25 Jan 2019 12:19:12 -0500 +Subject: [PATCH] RHEL: qemu: Fix crash trying to use iSCSI hostdev +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +https://bugzilla.redhat.com/show_bug.cgi?id=1669424 +https://bugzilla.redhat.com/show_bug.cgi?id=1669966 + +RHEL-only + +Commit 861a1a4d2 moved the qemuIsSharedHostdev filter in the +HOSTDEV half of the logic to allow calling qemuGetHostdevPath; +however, that neglected to check whether the SCSI hostdev was +using the iSCSI protocol which has a different overlayed struct +format (u.iscsi vs. u.host) resulting in attempted access of +u.host when calling virSCSIDeviceGetDevName. + +Signed-off-by: John Ferlan +Reviewed-by: Ján Tomko +--- + src/qemu/qemu_conf.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c +index 768e9d8308..a81298326f 100644 +--- a/src/qemu/qemu_conf.c ++++ b/src/qemu/qemu_conf.c +@@ -1667,6 +1667,10 @@ qemuSetUnprivSGIO(virDomainDeviceDefPtr dev) + } else if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV) { + hostdev = dev->data.hostdev; + ++ if (hostdev->source.subsys.u.scsi.protocol == ++ VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI) ++ return 0; ++ + if (!(hostdev_path = qemuGetHostdevPath(hostdev))) + goto cleanup; + +-- +2.20.1 + diff --git a/SOURCES/libvirt-RHEL-qemuCheckUnprivSGIO-use-sysfs_path-to-get-unpriv_sgio.patch b/SOURCES/libvirt-RHEL-qemuCheckUnprivSGIO-use-sysfs_path-to-get-unpriv_sgio.patch new file mode 100644 index 0000000..47ae4bc --- /dev/null +++ b/SOURCES/libvirt-RHEL-qemuCheckUnprivSGIO-use-sysfs_path-to-get-unpriv_sgio.patch @@ -0,0 +1,42 @@ +From 825720316c0f63b029673f883c79a45e49e0f8ab Mon Sep 17 00:00:00 2001 +Message-Id: <825720316c0f63b029673f883c79a45e49e0f8ab@dist-git> +From: =?UTF-8?q?J=C3=A1n=20Tomko?= +Date: Fri, 6 Mar 2020 15:51:49 +0100 +Subject: [PATCH] RHEL: qemuCheckUnprivSGIO: use @sysfs_path to get unpriv_sgio +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Downstream commit 65f4ff0e2c9a968b7ec65c8d751d4055cc212628 + RHEL: qemuSetUnprivSGIO: Actually use calculated + @sysfs_path to set unpriv_sgio +removed the device_path -> sysfs_path conversion from +both virGetDeviceUnprivSGIO and virSetDeviceUnprivSGIO, +but only adjusted one of the callers. + +https://bugzilla.redhat.com/show_bug.cgi?id=1808399 + +Signed-off-by: Ján Tomko +Signed-off-by: Andrea Bolognani +Message-Id: <20200306145149.1610286-7-abologna@redhat.com> +Reviewed-by: Jiri Denemark +--- + src/qemu/qemu_conf.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c +index 5788354444..a86e340013 100644 +--- a/src/qemu/qemu_conf.c ++++ b/src/qemu/qemu_conf.c +@@ -1255,7 +1255,7 @@ qemuCheckUnprivSGIO(virHashTablePtr sharedDevices, + goto cleanup; + } + +- if (virGetDeviceUnprivSGIO(device_path, &val) < 0) ++ if (virGetDeviceUnprivSGIO(sysfs_path, &val) < 0) + goto cleanup; + + /* Error message on failure needs to be handled in caller +-- +2.25.1 + diff --git a/SOURCES/libvirt-RHEL-qemuSetUnprivSGIO-Actually-use-calculated-sysfs_path-to-set-unpriv_sgio.patch b/SOURCES/libvirt-RHEL-qemuSetUnprivSGIO-Actually-use-calculated-sysfs_path-to-set-unpriv_sgio.patch new file mode 100644 index 0000000..ee1bd1a --- /dev/null +++ b/SOURCES/libvirt-RHEL-qemuSetUnprivSGIO-Actually-use-calculated-sysfs_path-to-set-unpriv_sgio.patch @@ -0,0 +1,170 @@ +From 785d2dd780b472bf857dd962d910addd9ff7b07f Mon Sep 17 00:00:00 2001 +Message-Id: <785d2dd780b472bf857dd962d910addd9ff7b07f@dist-git> +From: Michal Privoznik +Date: Fri, 6 Mar 2020 15:51:48 +0100 +Subject: [PATCH] RHEL: qemuSetUnprivSGIO: Actually use calculated @sysfs_path + to set unpriv_sgio + +In previous commits I've attempted to make qemuSetUnprivSGIO() +construct a generic enough path for SCSI devices to set +unpriv_sgio. However, virSetDeviceUnprivSGIO() does not care +about that - it constructs the path on it's own again. This is +suboptimal in either case - we already have the path constructed. + +https://bugzilla.redhat.com/show_bug.cgi?id=1808388 + +Signed-off-by: Michal Privoznik +Signed-off-by: Andrea Bolognani +Message-Id: <20200306145149.1610286-6-abologna@redhat.com> +Reviewed-by: Jiri Denemark +--- + src/qemu/qemu_conf.c | 8 +++----- + src/util/virutil.c | 24 ++++++------------------ + src/util/virutil.h | 2 -- + 3 files changed, 9 insertions(+), 25 deletions(-) + +diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c +index 5636277888..5788354444 100644 +--- a/src/qemu/qemu_conf.c ++++ b/src/qemu/qemu_conf.c +@@ -1255,7 +1255,7 @@ qemuCheckUnprivSGIO(virHashTablePtr sharedDevices, + goto cleanup; + } + +- if (virGetDeviceUnprivSGIO(device_path, NULL, &val) < 0) ++ if (virGetDeviceUnprivSGIO(device_path, &val) < 0) + goto cleanup; + + /* Error message on failure needs to be handled in caller +@@ -1648,7 +1648,6 @@ qemuSetUnprivSGIO(virDomainDeviceDefPtr dev) + virDomainDiskDefPtr disk = NULL; + virDomainHostdevDefPtr hostdev = NULL; + char *sysfs_path = NULL; +- const char *path = NULL; + int val = 0; + int ret = -1; + +@@ -1657,13 +1656,12 @@ qemuSetUnprivSGIO(virDomainDeviceDefPtr dev) + */ + if (dev->type == VIR_DOMAIN_DEVICE_DISK) { + disk = dev->data.disk; ++ const char *path = virDomainDiskGetSource(disk); + + if (disk->device != VIR_DOMAIN_DISK_DEVICE_LUN || + !virStorageSourceIsBlockLocal(disk->src)) + return 0; + +- path = virDomainDiskGetSource(disk); +- + if (!(sysfs_path = virGetUnprivSGIOSysfsPath(path, NULL))) + goto cleanup; + +@@ -1703,7 +1701,7 @@ qemuSetUnprivSGIO(virDomainDeviceDefPtr dev) + * virSetDeviceUnprivSGIO, to report an error for unsupported unpriv_sgio. + */ + if ((virFileExists(sysfs_path) || val == 1) && +- virSetDeviceUnprivSGIO(path, NULL, val) < 0) ++ virSetDeviceUnprivSGIO(sysfs_path, val) < 0) + goto cleanup; + + ret = 0; +diff --git a/src/util/virutil.c b/src/util/virutil.c +index 2448eba073..ad2b8cb3a2 100644 +--- a/src/util/virutil.c ++++ b/src/util/virutil.c +@@ -1736,18 +1736,13 @@ virGetUnprivSGIOSysfsPath(const char *path, + + int + virSetDeviceUnprivSGIO(const char *path, +- const char *sysfs_dir, + int unpriv_sgio) + { +- char *sysfs_path = NULL; + char *val = NULL; + int ret = -1; + int rc; + +- if (!(sysfs_path = virGetUnprivSGIOSysfsPath(path, sysfs_dir))) +- return -1; +- +- if (!virFileExists(sysfs_path)) { ++ if (!virFileExists(path)) { + virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("unpriv_sgio is not supported by this kernel")); + goto cleanup; +@@ -1756,38 +1751,32 @@ virSetDeviceUnprivSGIO(const char *path, + if (virAsprintf(&val, "%d", unpriv_sgio) < 0) + goto cleanup; + +- if ((rc = virFileWriteStr(sysfs_path, val, 0)) < 0) { +- virReportSystemError(-rc, _("failed to set %s"), sysfs_path); ++ if ((rc = virFileWriteStr(path, val, 0)) < 0) { ++ virReportSystemError(-rc, _("failed to set %s"), path); + goto cleanup; + } + + ret = 0; + cleanup: +- VIR_FREE(sysfs_path); + VIR_FREE(val); + return ret; + } + + int + virGetDeviceUnprivSGIO(const char *path, +- const char *sysfs_dir, + int *unpriv_sgio) + { +- char *sysfs_path = NULL; + char *buf = NULL; + char *tmp = NULL; + int ret = -1; + +- if (!(sysfs_path = virGetUnprivSGIOSysfsPath(path, sysfs_dir))) +- return -1; +- +- if (!virFileExists(sysfs_path)) { ++ if (!virFileExists(path)) { + virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("unpriv_sgio is not supported by this kernel")); + goto cleanup; + } + +- if (virFileReadAll(sysfs_path, 1024, &buf) < 0) ++ if (virFileReadAll(path, 1024, &buf) < 0) + goto cleanup; + + if ((tmp = strchr(buf, '\n'))) +@@ -1795,13 +1784,12 @@ virGetDeviceUnprivSGIO(const char *path, + + if (virStrToLong_i(buf, NULL, 10, unpriv_sgio) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, +- _("failed to parse value of %s"), sysfs_path); ++ _("failed to parse value of %s"), path); + goto cleanup; + } + + ret = 0; + cleanup: +- VIR_FREE(sysfs_path); + VIR_FREE(buf); + return ret; + } +diff --git a/src/util/virutil.h b/src/util/virutil.h +index 1ba9635bd9..1a1313cfa3 100644 +--- a/src/util/virutil.h ++++ b/src/util/virutil.h +@@ -160,10 +160,8 @@ int virGetDeviceID(const char *path, + int *maj, + int *min); + int virSetDeviceUnprivSGIO(const char *path, +- const char *sysfs_dir, + int unpriv_sgio); + int virGetDeviceUnprivSGIO(const char *path, +- const char *sysfs_dir, + int *unpriv_sgio); + char *virGetUnprivSGIOSysfsPath(const char *path, + const char *sysfs_dir); +-- +2.25.1 + diff --git a/SOURCES/libvirt-RHEL-virscsi-Check-device-type-before-getting-it-s-dev-node-name.patch b/SOURCES/libvirt-RHEL-virscsi-Check-device-type-before-getting-it-s-dev-node-name.patch new file mode 100644 index 0000000..af68a07 --- /dev/null +++ b/SOURCES/libvirt-RHEL-virscsi-Check-device-type-before-getting-it-s-dev-node-name.patch @@ -0,0 +1,232 @@ +From 521a2285cfee3d2fdd59cb7a3270e9ef91bcc14f Mon Sep 17 00:00:00 2001 +Message-Id: <521a2285cfee3d2fdd59cb7a3270e9ef91bcc14f@dist-git> +From: Michal Privoznik +Date: Fri, 6 Mar 2020 15:51:44 +0100 +Subject: [PATCH] RHEL: virscsi: Check device type before getting it's /dev + node name + +Not all SCSI devices are block devices, therefore +/sys/bus/scsi/devices/X:X:X:X/block/ directory does not always +exist. Check if the SCSI device is a block device beforehand. + +https://bugzilla.redhat.com/show_bug.cgi?id=1808388 + +Signed-off-by: Michal Privoznik +Signed-off-by: Andrea Bolognani +Message-Id: <20200306145149.1610286-2-abologna@redhat.com> +Reviewed-by: Jiri Denemark +--- + src/util/virscsi.c | 149 ++++++++++++++++++++++++++++++--- + tests/virscsidata/0-0-0-0/type | 1 + + tests/virscsidata/1-0-0-0/type | 1 + + 3 files changed, 138 insertions(+), 13 deletions(-) + create mode 100644 tests/virscsidata/0-0-0-0/type + create mode 100644 tests/virscsidata/1-0-0-0/type + +diff --git a/src/util/virscsi.c b/src/util/virscsi.c +index b51103a86d..af908107d9 100644 +--- a/src/util/virscsi.c ++++ b/src/util/virscsi.c +@@ -56,6 +56,32 @@ struct _virUsedByInfo { + }; + typedef struct _virUsedByInfo *virUsedByInfoPtr; + ++ ++/* Keep in sync with scsi/scsi_proto.h */ ++typedef enum { ++ VIR_SCSI_DEVICE_TYPE_NONE = -1, ++ VIR_SCSI_DEVICE_TYPE_DISK = 0x00, ++ VIR_SCSI_DEVICE_TYPE_TAPE = 0x01, ++ VIR_SCSI_DEVICE_TYPE_PRINTER = 0x02, ++ VIR_SCSI_DEVICE_TYPE_PROCESSOR = 0x03, ++ VIR_SCSI_DEVICE_TYPE_WORM = 0x04, ++ VIR_SCSI_DEVICE_TYPE_ROM = 0x05, ++ VIR_SCSI_DEVICE_TYPE_SCANNER = 0x06, ++ VIR_SCSI_DEVICE_TYPE_MOD = 0x07, ++ VIR_SCSI_DEVICE_TYPE_MEDIUM_CHANGER = 0x08, ++ VIR_SCSI_DEVICE_TYPE_COMM = 0x09, ++ VIR_SCSI_DEVICE_TYPE_RAID = 0x0c, ++ VIR_SCSI_DEVICE_TYPE_ENCLOSURE = 0x0d, ++ VIR_SCSI_DEVICE_TYPE_RBC = 0x0e, ++ VIR_SCSI_DEVICE_TYPE_OSD = 0x11, ++ VIR_SCSI_DEVICE_TYPE_ZBC = 0x14, ++ VIR_SCSI_DEVICE_TYPE_WLUN = 0x1e, ++ VIR_SCSI_DEVICE_TYPE_NO_LUN = 0x7f, ++ ++ VIR_SCSI_DEVICE_TYPE_LAST, ++} virSCSIDeviceType; ++ ++ + struct _virSCSIDevice { + unsigned int adapter; + unsigned int bus; +@@ -143,6 +169,86 @@ virSCSIDeviceGetSgName(const char *sysfs_prefix, + return sg; + } + ++ ++static int ++virSCSIDeviceGetType(const char *prefix, ++ unsigned int adapter, ++ unsigned int bus, ++ unsigned int target, ++ unsigned long long unit, ++ virSCSIDeviceType *type) ++{ ++ int intType; ++ ++ if (virFileReadValueInt(&intType, ++ "%s/%d:%u:%u:%llu/type", ++ prefix, adapter, bus, target, unit) < 0) ++ return -1; ++ ++ switch (intType) { ++ case VIR_SCSI_DEVICE_TYPE_DISK: ++ case VIR_SCSI_DEVICE_TYPE_TAPE: ++ case VIR_SCSI_DEVICE_TYPE_PRINTER: ++ case VIR_SCSI_DEVICE_TYPE_PROCESSOR: ++ case VIR_SCSI_DEVICE_TYPE_WORM: ++ case VIR_SCSI_DEVICE_TYPE_ROM: ++ case VIR_SCSI_DEVICE_TYPE_SCANNER: ++ case VIR_SCSI_DEVICE_TYPE_MOD: ++ case VIR_SCSI_DEVICE_TYPE_MEDIUM_CHANGER: ++ case VIR_SCSI_DEVICE_TYPE_COMM: ++ case VIR_SCSI_DEVICE_TYPE_RAID: ++ case VIR_SCSI_DEVICE_TYPE_ENCLOSURE: ++ case VIR_SCSI_DEVICE_TYPE_RBC: ++ case VIR_SCSI_DEVICE_TYPE_OSD: ++ case VIR_SCSI_DEVICE_TYPE_ZBC: ++ case VIR_SCSI_DEVICE_TYPE_WLUN: ++ case VIR_SCSI_DEVICE_TYPE_NO_LUN: ++ *type = intType; ++ break; ++ ++ default: ++ virReportError(VIR_ERR_INTERNAL_ERROR, ++ _("unknown SCSI device type: %x"), ++ intType); ++ return -1; ++ } ++ ++ return 0; ++} ++ ++ ++static char * ++virSCSIDeviceGetDevNameBlock(const char *prefix, ++ unsigned int adapter, ++ unsigned int bus, ++ unsigned int target, ++ unsigned long long unit) ++{ ++ DIR *dir = NULL; ++ struct dirent *entry; ++ char *path = NULL; ++ char *name = NULL; ++ ++ if (virAsprintf(&path, ++ "%s/%d:%u:%u:%llu/block", ++ prefix, adapter, bus, target, unit) < 0) ++ return NULL; ++ ++ if (virDirOpen(&dir, path) < 0) ++ goto cleanup; ++ ++ while (virDirRead(dir, &entry, path) > 0) { ++ ignore_value(VIR_STRDUP(name, entry->d_name)); ++ break; ++ } ++ ++ cleanup: ++ VIR_DIR_CLOSE(dir); ++ VIR_FREE(path); ++ return name; ++} ++ ++ + /* Returns device name (e.g. "sdc") on success, or NULL + * on failure. + */ +@@ -153,35 +259,52 @@ virSCSIDeviceGetDevName(const char *sysfs_prefix, + unsigned int target, + unsigned long long unit) + { +- DIR *dir = NULL; +- struct dirent *entry; +- char *path = NULL; + char *name = NULL; + unsigned int adapter_id; ++ virSCSIDeviceType type; + const char *prefix = sysfs_prefix ? sysfs_prefix : SYSFS_SCSI_DEVICES; + + if (virSCSIDeviceGetAdapterId(adapter, &adapter_id) < 0) + return NULL; + +- if (virAsprintf(&path, +- "%s/%d:%u:%u:%llu/block", +- prefix, adapter_id, bus, target, unit) < 0) ++ if (virSCSIDeviceGetType(prefix, adapter_id, ++ bus, target, unit, &type) < 0) + return NULL; + +- if (virDirOpen(&dir, path) < 0) +- goto cleanup; ++ switch (type) { ++ case VIR_SCSI_DEVICE_TYPE_DISK: ++ name = virSCSIDeviceGetDevNameBlock(prefix, adapter_id, bus, target, unit); ++ break; + +- while (virDirRead(dir, &entry, path) > 0) { +- ignore_value(VIR_STRDUP(name, entry->d_name)); ++ case VIR_SCSI_DEVICE_TYPE_TAPE: ++ case VIR_SCSI_DEVICE_TYPE_PRINTER: ++ case VIR_SCSI_DEVICE_TYPE_PROCESSOR: ++ case VIR_SCSI_DEVICE_TYPE_WORM: ++ case VIR_SCSI_DEVICE_TYPE_ROM: ++ case VIR_SCSI_DEVICE_TYPE_SCANNER: ++ case VIR_SCSI_DEVICE_TYPE_MOD: ++ case VIR_SCSI_DEVICE_TYPE_MEDIUM_CHANGER: ++ case VIR_SCSI_DEVICE_TYPE_COMM: ++ case VIR_SCSI_DEVICE_TYPE_RAID: ++ case VIR_SCSI_DEVICE_TYPE_ENCLOSURE: ++ case VIR_SCSI_DEVICE_TYPE_RBC: ++ case VIR_SCSI_DEVICE_TYPE_OSD: ++ case VIR_SCSI_DEVICE_TYPE_ZBC: ++ case VIR_SCSI_DEVICE_TYPE_WLUN: ++ case VIR_SCSI_DEVICE_TYPE_NO_LUN: ++ case VIR_SCSI_DEVICE_TYPE_NONE: ++ case VIR_SCSI_DEVICE_TYPE_LAST: ++ default: ++ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, ++ _("unsupported SCSI device type: %x"), ++ type); + break; + } + +- cleanup: +- VIR_DIR_CLOSE(dir); +- VIR_FREE(path); + return name; + } + ++ + virSCSIDevicePtr + virSCSIDeviceNew(const char *sysfs_prefix, + const char *adapter, +diff --git a/tests/virscsidata/0-0-0-0/type b/tests/virscsidata/0-0-0-0/type +new file mode 100644 +index 0000000000..573541ac97 +--- /dev/null ++++ b/tests/virscsidata/0-0-0-0/type +@@ -0,0 +1 @@ ++0 +diff --git a/tests/virscsidata/1-0-0-0/type b/tests/virscsidata/1-0-0-0/type +new file mode 100644 +index 0000000000..573541ac97 +--- /dev/null ++++ b/tests/virscsidata/1-0-0-0/type +@@ -0,0 +1 @@ ++0 +-- +2.25.1 + diff --git a/SOURCES/libvirt-RHEL-virscsi-Introduce-and-use-virSCSIDeviceGetUnprivSGIOSysfsPath.patch b/SOURCES/libvirt-RHEL-virscsi-Introduce-and-use-virSCSIDeviceGetUnprivSGIOSysfsPath.patch new file mode 100644 index 0000000..d2d3c65 --- /dev/null +++ b/SOURCES/libvirt-RHEL-virscsi-Introduce-and-use-virSCSIDeviceGetUnprivSGIOSysfsPath.patch @@ -0,0 +1,148 @@ +From 6dfdc50564c3d2147f36c4cf6c252cad7a0e9381 Mon Sep 17 00:00:00 2001 +Message-Id: <6dfdc50564c3d2147f36c4cf6c252cad7a0e9381@dist-git> +From: Michal Privoznik +Date: Fri, 6 Mar 2020 15:51:46 +0100 +Subject: [PATCH] RHEL: virscsi: Introduce and use + virSCSIDeviceGetUnprivSGIOSysfsPath() + +When constructing a path to the 'unpriv_sgio' file of given SCSI +device we don't need to go through /dev/* and major() + minor() +path. The generated path points to +/sys/dev/block/MAJ:MIN/queue/unpriv_sgio which is wrong if the +SCSI device in question is not a block device. We can generate a +different path: /sys/bus/scsi/devices/X:X:X:X/unpriv_sgio where +the file is directly accessible regardless of the SCSI device +type. + +https://bugzilla.redhat.com/show_bug.cgi?id=1808388 + +Signed-off-by: Michal Privoznik +Signed-off-by: Andrea Bolognani +Message-Id: <20200306145149.1610286-4-abologna@redhat.com> +Reviewed-by: Jiri Denemark +--- + src/libvirt_private.syms | 1 + + src/qemu/qemu_conf.c | 19 +++++++++++-------- + src/util/virscsi.c | 21 +++++++++++++++++++++ + src/util/virscsi.h | 5 +++++ + 4 files changed, 38 insertions(+), 8 deletions(-) + +diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms +index 2ad21a68bc..5e1d73c148 100644 +--- a/src/libvirt_private.syms ++++ b/src/libvirt_private.syms +@@ -2727,6 +2727,7 @@ virSCSIDeviceGetSgName; + virSCSIDeviceGetShareable; + virSCSIDeviceGetTarget; + virSCSIDeviceGetUnit; ++virSCSIDeviceGetUnprivSGIOSysfsPath; + virSCSIDeviceIsAvailable; + virSCSIDeviceListAdd; + virSCSIDeviceListCount; +diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c +index a81298326f..5636277888 100644 +--- a/src/qemu/qemu_conf.c ++++ b/src/qemu/qemu_conf.c +@@ -1648,7 +1648,6 @@ qemuSetUnprivSGIO(virDomainDeviceDefPtr dev) + virDomainDiskDefPtr disk = NULL; + virDomainHostdevDefPtr hostdev = NULL; + char *sysfs_path = NULL; +- char *hostdev_path = NULL; + const char *path = NULL; + int val = 0; + int ret = -1; +@@ -1664,24 +1663,29 @@ qemuSetUnprivSGIO(virDomainDeviceDefPtr dev) + return 0; + + path = virDomainDiskGetSource(disk); ++ ++ if (!(sysfs_path = virGetUnprivSGIOSysfsPath(path, NULL))) ++ goto cleanup; ++ + } else if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV) { + hostdev = dev->data.hostdev; ++ virDomainHostdevSubsysSCSIPtr scsisrc = &hostdev->source.subsys.u.scsi; ++ virDomainHostdevSubsysSCSIHostPtr scsihostsrc = &scsisrc->u.host; + + if (hostdev->source.subsys.u.scsi.protocol == + VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI) + return 0; + +- if (!(hostdev_path = qemuGetHostdevPath(hostdev))) ++ if (!(sysfs_path = virSCSIDeviceGetUnprivSGIOSysfsPath(NULL, ++ scsihostsrc->adapter, ++ scsihostsrc->bus, ++ scsihostsrc->target, ++ scsihostsrc->unit))) + goto cleanup; +- +- path = hostdev_path; + } else { + return 0; + } + +- if (!(sysfs_path = virGetUnprivSGIOSysfsPath(path, NULL))) +- goto cleanup; +- + /* By default, filter the SG_IO commands, i.e. set unpriv_sgio to 0. */ + if (dev->type == VIR_DOMAIN_DEVICE_DISK) { + if (disk->sgio == VIR_DOMAIN_DEVICE_SGIO_UNFILTERED) +@@ -1705,7 +1709,6 @@ qemuSetUnprivSGIO(virDomainDeviceDefPtr dev) + ret = 0; + + cleanup: +- VIR_FREE(hostdev_path); + VIR_FREE(sysfs_path); + return ret; + } +diff --git a/src/util/virscsi.c b/src/util/virscsi.c +index 6c3fd8a562..5aab43fc88 100644 +--- a/src/util/virscsi.c ++++ b/src/util/virscsi.c +@@ -342,6 +342,27 @@ virSCSIDeviceGetDevName(const char *sysfs_prefix, + } + + ++char * ++virSCSIDeviceGetUnprivSGIOSysfsPath(const char *sysfs_prefix, ++ const char *adapter, ++ unsigned int bus, ++ unsigned int target, ++ unsigned long long unit) ++{ ++ char *path = NULL; ++ unsigned int adapter_id; ++ const char *prefix = sysfs_prefix ? sysfs_prefix : SYSFS_SCSI_DEVICES; ++ ++ if (virSCSIDeviceGetAdapterId(adapter, &adapter_id) < 0) ++ return NULL; ++ ++ ignore_value(virAsprintf(&path, ++ "%s/%d:%u:%u:%llu/unpriv_sgio", ++ prefix, adapter_id, bus, target, unit)); ++ return path; ++} ++ ++ + virSCSIDevicePtr + virSCSIDeviceNew(const char *sysfs_prefix, + const char *adapter, +diff --git a/src/util/virscsi.h b/src/util/virscsi.h +index 9f8b3ecf1e..5dea2a9f5d 100644 +--- a/src/util/virscsi.h ++++ b/src/util/virscsi.h +@@ -43,6 +43,11 @@ char *virSCSIDeviceGetDevName(const char *sysfs_prefix, + unsigned int bus, + unsigned int target, + unsigned long long unit); ++char *virSCSIDeviceGetUnprivSGIOSysfsPath(const char *sysfs_prefix, ++ const char *adapter, ++ unsigned int bus, ++ unsigned int target, ++ unsigned long long unit); + + virSCSIDevicePtr virSCSIDeviceNew(const char *sysfs_prefix, + const char *adapter, +-- +2.25.1 + diff --git a/SOURCES/libvirt-RHEL-virscsi-Support-TAPEs-in-virSCSIDeviceGetDevName.patch b/SOURCES/libvirt-RHEL-virscsi-Support-TAPEs-in-virSCSIDeviceGetDevName.patch new file mode 100644 index 0000000..f302043 --- /dev/null +++ b/SOURCES/libvirt-RHEL-virscsi-Support-TAPEs-in-virSCSIDeviceGetDevName.patch @@ -0,0 +1,219 @@ +From 41480c7a787cc776e64d2ab7b737c3e8d6a84bd2 Mon Sep 17 00:00:00 2001 +Message-Id: <41480c7a787cc776e64d2ab7b737c3e8d6a84bd2@dist-git> +From: Michal Privoznik +Date: Fri, 6 Mar 2020 15:51:45 +0100 +Subject: [PATCH] RHEL: virscsi: Support TAPEs in virSCSIDeviceGetDevName() + +If the SCSI device we want to get /dev node name for is TAPE +device we need to look at 'tape' symlink in the sysfs dir +corresponding to the device. + +https://bugzilla.redhat.com/show_bug.cgi?id=1808388 + +Signed-off-by: Michal Privoznik +Signed-off-by: Andrea Bolognani +Message-Id: <20200306145149.1610286-3-abologna@redhat.com> +Reviewed-by: Jiri Denemark +--- + src/util/virscsi.c | 37 ++++++++++++++++++++ + tests/virscsidata/2-0-0-0/model | 1 + + tests/virscsidata/2-0-0-0/scsi_tape/st0/dev | 1 + + tests/virscsidata/2-0-0-0/sg3/dev | 1 + + tests/virscsidata/2-0-0-0/tape | 1 + + tests/virscsidata/2-0-0-0/type | 1 + + tests/virscsidata/2-0-0-0/vendor | 1 + + tests/virscsidata/sg3 | 0 + tests/virscsitest.c | 38 ++++++++++++++++++--- + 9 files changed, 76 insertions(+), 5 deletions(-) + create mode 100644 tests/virscsidata/2-0-0-0/model + create mode 100644 tests/virscsidata/2-0-0-0/scsi_tape/st0/dev + create mode 100644 tests/virscsidata/2-0-0-0/sg3/dev + create mode 120000 tests/virscsidata/2-0-0-0/tape + create mode 100644 tests/virscsidata/2-0-0-0/type + create mode 100644 tests/virscsidata/2-0-0-0/vendor + create mode 100644 tests/virscsidata/sg3 + +diff --git a/src/util/virscsi.c b/src/util/virscsi.c +index af908107d9..6c3fd8a562 100644 +--- a/src/util/virscsi.c ++++ b/src/util/virscsi.c +@@ -42,6 +42,7 @@ + #include "virutil.h" + #include "virstring.h" + #include "virerror.h" ++#include "dirname.h" + + #define SYSFS_SCSI_DEVICES "/sys/bus/scsi/devices" + +@@ -249,6 +250,39 @@ virSCSIDeviceGetDevNameBlock(const char *prefix, + } + + ++static char * ++virSCSIDeviceGetDevNameTape(const char *prefix, ++ unsigned int adapter, ++ unsigned int bus, ++ unsigned int target, ++ unsigned long long unit) ++{ ++ char *path = NULL; ++ char *resolvedPath = NULL; ++ char *name = NULL; ++ ++ if (virAsprintf(&path, ++ "%s/%d:%u:%u:%llu/tape", ++ prefix, adapter, bus, target, unit) < 0) ++ return NULL; ++ ++ if (virFileReadLink(path, &resolvedPath) < 0) { ++ virReportSystemError(errno, ++ _("Unable to read link: %s"), ++ path); ++ goto cleanup; ++ } ++ ++ if (VIR_STRDUP(name, last_component(resolvedPath)) < 0) ++ goto cleanup; ++ ++ cleanup: ++ VIR_FREE(resolvedPath); ++ VIR_FREE(path); ++ return name; ++} ++ ++ + /* Returns device name (e.g. "sdc") on success, or NULL + * on failure. + */ +@@ -277,6 +311,9 @@ virSCSIDeviceGetDevName(const char *sysfs_prefix, + break; + + case VIR_SCSI_DEVICE_TYPE_TAPE: ++ name = virSCSIDeviceGetDevNameTape(prefix, adapter_id, bus, target, unit); ++ break; ++ + case VIR_SCSI_DEVICE_TYPE_PRINTER: + case VIR_SCSI_DEVICE_TYPE_PROCESSOR: + case VIR_SCSI_DEVICE_TYPE_WORM: +diff --git a/tests/virscsidata/2-0-0-0/model b/tests/virscsidata/2-0-0-0/model +new file mode 100644 +index 0000000000..d2ab4715c3 +--- /dev/null ++++ b/tests/virscsidata/2-0-0-0/model +@@ -0,0 +1 @@ ++scsi_debug +diff --git a/tests/virscsidata/2-0-0-0/scsi_tape/st0/dev b/tests/virscsidata/2-0-0-0/scsi_tape/st0/dev +new file mode 100644 +index 0000000000..3dd777e840 +--- /dev/null ++++ b/tests/virscsidata/2-0-0-0/scsi_tape/st0/dev +@@ -0,0 +1 @@ ++9:0 +diff --git a/tests/virscsidata/2-0-0-0/sg3/dev b/tests/virscsidata/2-0-0-0/sg3/dev +new file mode 100644 +index 0000000000..b369a59b3e +--- /dev/null ++++ b/tests/virscsidata/2-0-0-0/sg3/dev +@@ -0,0 +1 @@ ++21:3 +diff --git a/tests/virscsidata/2-0-0-0/tape b/tests/virscsidata/2-0-0-0/tape +new file mode 120000 +index 0000000000..6ca7f77539 +--- /dev/null ++++ b/tests/virscsidata/2-0-0-0/tape +@@ -0,0 +1 @@ ++scsi_tape/st0 +\ No newline at end of file +diff --git a/tests/virscsidata/2-0-0-0/type b/tests/virscsidata/2-0-0-0/type +new file mode 100644 +index 0000000000..d00491fd7e +--- /dev/null ++++ b/tests/virscsidata/2-0-0-0/type +@@ -0,0 +1 @@ ++1 +diff --git a/tests/virscsidata/2-0-0-0/vendor b/tests/virscsidata/2-0-0-0/vendor +new file mode 100644 +index 0000000000..9b075671ea +--- /dev/null ++++ b/tests/virscsidata/2-0-0-0/vendor +@@ -0,0 +1 @@ ++Linux +diff --git a/tests/virscsidata/sg3 b/tests/virscsidata/sg3 +new file mode 100644 +index 0000000000..e69de29bb2 +diff --git a/tests/virscsitest.c b/tests/virscsitest.c +index 1215adbfab..880fa22ca8 100644 +--- a/tests/virscsitest.c ++++ b/tests/virscsitest.c +@@ -36,18 +36,34 @@ VIR_LOG_INIT("tests.scsitest"); + static const char *abs_top_srcdir; + static char *virscsi_prefix; + ++typedef struct { ++ const char *adapter; ++ unsigned int bus; ++ unsigned int target; ++ unsigned int unit; ++ const char *expectedName; ++} testGetDevNameData; ++ + static int +-test1(const void *data ATTRIBUTE_UNUSED) ++testGetDevName(const void *opaque) + { ++ const testGetDevNameData *data = opaque; + char *name = NULL; + int ret = -1; + + if (!(name = virSCSIDeviceGetDevName(virscsi_prefix, +- "scsi_host1", 0, 0, 0))) ++ data->adapter, ++ data->bus, ++ data->target, ++ data->unit))) + return -1; + +- if (STRNEQ(name, "sdh")) ++ if (STRNEQ(name, data->expectedName)) { ++ fprintf(stderr, ++ "SCSI dev name mismatch, expected %s got %s", ++ data->expectedName, name); + goto cleanup; ++ } + + ret = 0; + cleanup: +@@ -225,7 +241,9 @@ mymain(void) + + CREATE_SYMLINK("0-0-0-0", "0:0:0:0"); + CREATE_SYMLINK("1-0-0-0", "1:0:0:0"); ++ CREATE_SYMLINK("2-0-0-0", "2:0:0:0"); + CREATE_SYMLINK("sg0", "sg0"); ++ CREATE_SYMLINK("sg3", "sg3"); + CREATE_SYMLINK("sg8", "sg8"); + + VIR_FREE(virscsi_prefix); +@@ -235,8 +253,18 @@ mymain(void) + goto cleanup; + } + +- if (virTestRun("test1", test1, NULL) < 0) +- ret = -1; ++#define TEST_GET_DEV_NAME(adapter, bus, target, unit, expectedName) \ ++ do { \ ++ testGetDevNameData data = {adapter, bus, target, unit, expectedName}; \ ++ if (virTestRun("test getDevname " expectedName, \ ++ testGetDevName, &data) < 0) \ ++ ret = -1; \ ++ } while (0) ++ ++ TEST_GET_DEV_NAME("scsi_host0", 0, 0, 0, "sda"); ++ TEST_GET_DEV_NAME("scsi_host1", 0, 0, 0, "sdh"); ++ TEST_GET_DEV_NAME("scsi_host2", 0, 0, 0, "st0"); ++ + if (virTestRun("test2", test2, NULL) < 0) + ret = -1; + +-- +2.25.1 + diff --git a/SOURCES/libvirt-RHEL-virutil-Accept-non-block-devices-in-virGetDeviceID.patch b/SOURCES/libvirt-RHEL-virutil-Accept-non-block-devices-in-virGetDeviceID.patch new file mode 100644 index 0000000..6f59819 --- /dev/null +++ b/SOURCES/libvirt-RHEL-virutil-Accept-non-block-devices-in-virGetDeviceID.patch @@ -0,0 +1,37 @@ +From f4d9b6252bd2b2b5a3c70a3869ce49a3a9e1a9cc Mon Sep 17 00:00:00 2001 +Message-Id: +From: Michal Privoznik +Date: Fri, 6 Mar 2020 15:51:47 +0100 +Subject: [PATCH] RHEL: virutil: Accept non-block devices in virGetDeviceID() + +If a caller wants to learn major or minor number for a device, +let them. There's no need to check if the device is a block +device here. + +https://bugzilla.redhat.com/show_bug.cgi?id=1808388 + +Signed-off-by: Michal Privoznik +Signed-off-by: Andrea Bolognani +Message-Id: <20200306145149.1610286-5-abologna@redhat.com> +Reviewed-by: Jiri Denemark +--- + src/util/virutil.c | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/src/util/virutil.c b/src/util/virutil.c +index cd67f54bc2..2448eba073 100644 +--- a/src/util/virutil.c ++++ b/src/util/virutil.c +@@ -1693,9 +1693,6 @@ virGetDeviceID(const char *path, int *maj, int *min) + if (stat(path, &sb) < 0) + return -errno; + +- if (!S_ISBLK(sb.st_mode)) +- return -EINVAL; +- + if (maj) + *maj = major(sb.st_rdev); + if (min) +-- +2.25.1 + diff --git a/SOURCES/libvirt-Revert-RHEL-network-regain-guest-network-connectivity-after-firewalld-switch-to-nftables.patch b/SOURCES/libvirt-Revert-RHEL-network-regain-guest-network-connectivity-after-firewalld-switch-to-nftables.patch new file mode 100644 index 0000000..600d63a --- /dev/null +++ b/SOURCES/libvirt-Revert-RHEL-network-regain-guest-network-connectivity-after-firewalld-switch-to-nftables.patch @@ -0,0 +1,84 @@ +From 195908ad66fc52643d94eca0f45e5740f25e3e78 Mon Sep 17 00:00:00 2001 +Message-Id: <195908ad66fc52643d94eca0f45e5740f25e3e78@dist-git> +From: Laine Stump +Date: Fri, 1 Feb 2019 20:29:26 -0500 +Subject: [PATCH] Revert "RHEL: network: regain guest network connectivity + after firewalld switch to nftables" +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This reverts commit 54e270d7fb68b41002654374d395e4f260a24add. + +This patch appeared in libvirt-4.5.0-11.el8 (RHEL git commit id +2fb53957). It was a downstream-only temporary fix to the networking +issues resulting from firewalld's switch to using nftables. Now that +there is a permanent fix upstream we can revert this patch and use the +upstream patches instead. + +https://bugzilla.redhat.com/1650320 + +Signed-off-by: Laine Stump +Reviewed-by: Ján Tomko +--- + libvirt.spec.in | 14 -------------- + src/network/Makefile.inc.am | 10 +--------- + src/network/libvirt.zone | 15 --------------- + 3 files changed, 1 insertion(+), 38 deletions(-) + delete mode 100644 src/network/libvirt.zone + +diff --git a/src/network/Makefile.inc.am b/src/network/Makefile.inc.am +index 20d899e699..508c8c0422 100644 +--- a/src/network/Makefile.inc.am ++++ b/src/network/Makefile.inc.am +@@ -87,11 +87,6 @@ install-data-network: + ( cd $(DESTDIR)$(confdir)/qemu/networks/autostart && \ + rm -f default.xml && \ + $(LN_S) ../default.xml default.xml ) +-if HAVE_FIREWALLD +- $(MKDIR_P) "$(DESTDIR)$(prefix)/lib/firewalld/zones" +- $(INSTALL_DATA) $(srcdir)/network/libvirt.zone \ +- $(DESTDIR)$(prefix)/lib/firewalld/zones/libvirt.xml +-endif HAVE_FIREWALLD + + uninstall-data-network: + rm -f $(DESTDIR)$(confdir)/qemu/networks/autostart/default.xml +@@ -100,13 +95,10 @@ uninstall-data-network: + rmdir "$(DESTDIR)$(confdir)/qemu/networks" || : + rmdir "$(DESTDIR)$(localstatedir)/lib/libvirt/network" ||: + rmdir "$(DESTDIR)$(localstatedir)/run/libvirt/network" ||: +-if HAVE_FIREWALLD +- rm -f $(DESTDIR)$(prefix)/lib/firewalld/zones/libvirt.xml +-endif HAVE_FIREWALLD + + endif WITH_NETWORK + +-EXTRA_DIST += network/default.xml network/libvirt.zone ++EXTRA_DIST += network/default.xml + + .PHONY: \ + install-data-network \ +diff --git a/src/network/libvirt.zone b/src/network/libvirt.zone +deleted file mode 100644 +index 355a70b4da..0000000000 +--- a/src/network/libvirt.zone ++++ /dev/null +@@ -1,15 +0,0 @@ +- +- +- libvirt +- All network connections are accepted. This also permits packets to/from interfaces in the zone to be forwarded. This zone is intended to be used only by libvirt virtual networks. +- +- +- +- +- +- +- +- +- +- +- +-- +2.20.1 + diff --git a/SOURCES/libvirt-Revert-Separate-out-StateAutoStart-from-StateInitialize.patch b/SOURCES/libvirt-Revert-Separate-out-StateAutoStart-from-StateInitialize.patch new file mode 100644 index 0000000..abec5aa --- /dev/null +++ b/SOURCES/libvirt-Revert-Separate-out-StateAutoStart-from-StateInitialize.patch @@ -0,0 +1,93 @@ +From 8069bb50b2548acd3f2176499ede205e6099c067 Mon Sep 17 00:00:00 2001 +Message-Id: <8069bb50b2548acd3f2176499ede205e6099c067@dist-git> +From: Michal Privoznik +Date: Thu, 27 Jun 2019 15:18:17 +0200 +Subject: [PATCH] Revert "Separate out StateAutoStart from StateInitialize" +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This reverts commit e4a969092bda5b3b952963fdf6658895165040b7. + +Now that drivers may call virConnectOpen() on secondary drivers, it +doesn't make much sense to have autostart separated from driver +initialization callback. In fact, it creates a problem because one +driver during its initialization might try to fetch an object from +another driver but since the object is yet to be autostarted the fetch +fails. This has been observed in reality: qemu driver performs +qemuProcessReconnect() during qemu's stateInitialize phase which may +call virDomainDiskTranslateSourcePool() which connects to the storage +driver to look up the volume. But the storage driver did not autostart +its pools yet therefore volume lookup fails and the domain is killed. + +Signed-off-by: Michal Privoznik +Reviewed-by: Ján Tomko +(cherry picked from commit 07a9c8bae8b80ef1650e6d05869cbf55c6aea837) + +https://bugzilla.redhat.com/show_bug.cgi?id=1685151 + +Signed-off-by: Michal Privoznik +Message-Id: <4ed5f8f4edd0053cc14f4bb579a945b606b36f5a.1561641375.git.mprivozn@redhat.com> +Reviewed-by: Jiri Denemark +--- + src/driver-state.h | 4 ---- + src/libvirt.c | 14 +------------- + 2 files changed, 1 insertion(+), 17 deletions(-) + +diff --git a/src/driver-state.h b/src/driver-state.h +index 1cb3e4faf3..e1e060bcc5 100644 +--- a/src/driver-state.h ++++ b/src/driver-state.h +@@ -30,9 +30,6 @@ typedef int + virStateInhibitCallback callback, + void *opaque); + +-typedef void +-(*virDrvStateAutoStart)(void); +- + typedef int + (*virDrvStateCleanup)(void); + +@@ -48,7 +45,6 @@ typedef virStateDriver *virStateDriverPtr; + struct _virStateDriver { + const char *name; + virDrvStateInitialize stateInitialize; +- virDrvStateAutoStart stateAutoStart; + virDrvStateCleanup stateCleanup; + virDrvStateReload stateReload; + virDrvStateStop stateStop; +diff --git a/src/libvirt.c b/src/libvirt.c +index 52f4dd2808..c9e5f47fd4 100644 +--- a/src/libvirt.c ++++ b/src/libvirt.c +@@ -637,11 +637,7 @@ virRegisterStateDriver(virStateDriverPtr driver) + * @callback: callback to invoke to inhibit shutdown of the daemon + * @opaque: data to pass to @callback + * +- * Initialize all virtualization drivers. Accomplished in two phases, +- * the first being state and structure initialization followed by any +- * auto start supported by the driver. This is done to ensure dependencies +- * that some drivers may have on another driver having been initialized +- * will exist, such as the storage driver's need to use the secret driver. ++ * Initialize all virtualization drivers. + * + * Returns 0 if all succeed, -1 upon any failure. + */ +@@ -669,14 +665,6 @@ virStateInitialize(bool privileged, + } + } + } +- +- for (i = 0; i < virStateDriverTabCount; i++) { +- if (virStateDriverTab[i]->stateAutoStart) { +- VIR_DEBUG("Running global auto start for %s state driver", +- virStateDriverTab[i]->name); +- virStateDriverTab[i]->stateAutoStart(); +- } +- } + return 0; + } + +-- +2.22.0 + diff --git a/SOURCES/libvirt-Revert-access-Modify-the-VIR_ERR_ACCESS_DENIED-to-include-driverName.patch b/SOURCES/libvirt-Revert-access-Modify-the-VIR_ERR_ACCESS_DENIED-to-include-driverName.patch new file mode 100644 index 0000000..546facb --- /dev/null +++ b/SOURCES/libvirt-Revert-access-Modify-the-VIR_ERR_ACCESS_DENIED-to-include-driverName.patch @@ -0,0 +1,163 @@ +From 6af885a53e425b88c7d9c123f64bbc4f8517b8a8 Mon Sep 17 00:00:00 2001 +Message-Id: <6af885a53e425b88c7d9c123f64bbc4f8517b8a8@dist-git> +From: John Ferlan +Date: Thu, 15 Nov 2018 06:43:58 -0500 +Subject: [PATCH] Revert "access: Modify the VIR_ERR_ACCESS_DENIED to include + driverName" + +https://bugzilla.redhat.com/show_bug.cgi?id=1631608 (RHEL8) +https://bugzilla.redhat.com/show_bug.cgi?id=1631606 (RHEL7) + +This reverts commit ccc72d5cbdd85f66cb737134b3be40aac1df03ef. + +Based on upstream comment to a follow-up patch, this didn't take the +right approach and the right thing to do is revert and rework. + +Signed-off-by: John Ferlan +(cherry picked from commit b08396a5feab02fb3bb595603c888ee733aa178e) +Reviewed-by: Erik Skultety +--- + src/access/viraccessmanager.c | 25 ++++++++++++------------- + src/rpc/gendispatch.pl | 2 +- + src/util/virerror.c | 4 ++-- + 3 files changed, 15 insertions(+), 16 deletions(-) + +diff --git a/src/access/viraccessmanager.c b/src/access/viraccessmanager.c +index 1dfff32b9d..e7b5bf38da 100644 +--- a/src/access/viraccessmanager.c ++++ b/src/access/viraccessmanager.c +@@ -196,12 +196,11 @@ static void virAccessManagerDispose(void *object) + * should the admin need to debug things + */ + static int +-virAccessManagerSanitizeError(int ret, +- const char *driverName) ++virAccessManagerSanitizeError(int ret) + { + if (ret < 0) { + virResetLastError(); +- virAccessError(VIR_ERR_ACCESS_DENIED, driverName, NULL); ++ virAccessError(VIR_ERR_ACCESS_DENIED, NULL); + } + + return ret; +@@ -218,7 +217,7 @@ int virAccessManagerCheckConnect(virAccessManagerPtr manager, + if (manager->drv->checkConnect) + ret = manager->drv->checkConnect(manager, driverName, perm); + +- return virAccessManagerSanitizeError(ret, driverName); ++ return virAccessManagerSanitizeError(ret); + } + + +@@ -234,7 +233,7 @@ int virAccessManagerCheckDomain(virAccessManagerPtr manager, + if (manager->drv->checkDomain) + ret = manager->drv->checkDomain(manager, driverName, domain, perm); + +- return virAccessManagerSanitizeError(ret, driverName); ++ return virAccessManagerSanitizeError(ret); + } + + int virAccessManagerCheckInterface(virAccessManagerPtr manager, +@@ -249,7 +248,7 @@ int virAccessManagerCheckInterface(virAccessManagerPtr manager, + if (manager->drv->checkInterface) + ret = manager->drv->checkInterface(manager, driverName, iface, perm); + +- return virAccessManagerSanitizeError(ret, driverName); ++ return virAccessManagerSanitizeError(ret); + } + + int virAccessManagerCheckNetwork(virAccessManagerPtr manager, +@@ -264,7 +263,7 @@ int virAccessManagerCheckNetwork(virAccessManagerPtr manager, + if (manager->drv->checkNetwork) + ret = manager->drv->checkNetwork(manager, driverName, network, perm); + +- return virAccessManagerSanitizeError(ret, driverName); ++ return virAccessManagerSanitizeError(ret); + } + + int virAccessManagerCheckNodeDevice(virAccessManagerPtr manager, +@@ -279,7 +278,7 @@ int virAccessManagerCheckNodeDevice(virAccessManagerPtr manager, + if (manager->drv->checkNodeDevice) + ret = manager->drv->checkNodeDevice(manager, driverName, nodedev, perm); + +- return virAccessManagerSanitizeError(ret, driverName); ++ return virAccessManagerSanitizeError(ret); + } + + int virAccessManagerCheckNWFilter(virAccessManagerPtr manager, +@@ -294,7 +293,7 @@ int virAccessManagerCheckNWFilter(virAccessManagerPtr manager, + if (manager->drv->checkNWFilter) + ret = manager->drv->checkNWFilter(manager, driverName, nwfilter, perm); + +- return virAccessManagerSanitizeError(ret, driverName); ++ return virAccessManagerSanitizeError(ret); + } + + int virAccessManagerCheckNWFilterBinding(virAccessManagerPtr manager, +@@ -309,7 +308,7 @@ int virAccessManagerCheckNWFilterBinding(virAccessManagerPtr manager, + if (manager->drv->checkNWFilterBinding) + ret = manager->drv->checkNWFilterBinding(manager, driverName, binding, perm); + +- return virAccessManagerSanitizeError(ret, driverName); ++ return virAccessManagerSanitizeError(ret); + } + + int virAccessManagerCheckSecret(virAccessManagerPtr manager, +@@ -324,7 +323,7 @@ int virAccessManagerCheckSecret(virAccessManagerPtr manager, + if (manager->drv->checkSecret) + ret = manager->drv->checkSecret(manager, driverName, secret, perm); + +- return virAccessManagerSanitizeError(ret, driverName); ++ return virAccessManagerSanitizeError(ret); + } + + int virAccessManagerCheckStoragePool(virAccessManagerPtr manager, +@@ -339,7 +338,7 @@ int virAccessManagerCheckStoragePool(virAccessManagerPtr manager, + if (manager->drv->checkStoragePool) + ret = manager->drv->checkStoragePool(manager, driverName, pool, perm); + +- return virAccessManagerSanitizeError(ret, driverName); ++ return virAccessManagerSanitizeError(ret); + } + + int virAccessManagerCheckStorageVol(virAccessManagerPtr manager, +@@ -355,5 +354,5 @@ int virAccessManagerCheckStorageVol(virAccessManagerPtr manager, + if (manager->drv->checkStorageVol) + ret = manager->drv->checkStorageVol(manager, driverName, pool, vol, perm); + +- return virAccessManagerSanitizeError(ret, driverName); ++ return virAccessManagerSanitizeError(ret); + } +diff --git a/src/rpc/gendispatch.pl b/src/rpc/gendispatch.pl +index f599002056..0c4648c0fb 100755 +--- a/src/rpc/gendispatch.pl ++++ b/src/rpc/gendispatch.pl +@@ -2199,7 +2199,7 @@ elsif ($mode eq "client") { + print " virObjectUnref(mgr);\n"; + if ($action eq "Ensure") { + print " if (rv == 0)\n"; +- print " virReportError(VIR_ERR_ACCESS_DENIED, conn->driver->name, NULL);\n"; ++ print " virReportError(VIR_ERR_ACCESS_DENIED, NULL);\n"; + print " return $fail;\n"; + } else { + print " virResetLastError();\n"; +diff --git a/src/util/virerror.c b/src/util/virerror.c +index 5f50fa0349..f198f27957 100644 +--- a/src/util/virerror.c ++++ b/src/util/virerror.c +@@ -1439,9 +1439,9 @@ virErrorMsg(virErrorNumber error, const char *info) + break; + case VIR_ERR_ACCESS_DENIED: + if (info == NULL) +- errmsg = _("access denied from '%s'"); ++ errmsg = _("access denied"); + else +- errmsg = _("access denied from '%s': %s"); ++ errmsg = _("access denied: %s"); + break; + case VIR_ERR_DBUS_SERVICE: + if (info == NULL) +-- +2.19.2 + diff --git a/SOURCES/libvirt-Revert-util-vircgroup-pass-parent-cgroup-into-virCgroupDetectControllersCB.patch b/SOURCES/libvirt-Revert-util-vircgroup-pass-parent-cgroup-into-virCgroupDetectControllersCB.patch new file mode 100644 index 0000000..796cc2e --- /dev/null +++ b/SOURCES/libvirt-Revert-util-vircgroup-pass-parent-cgroup-into-virCgroupDetectControllersCB.patch @@ -0,0 +1,108 @@ +From 2395bf301cf76ffa863a3c2e125d52345cfbf6b5 Mon Sep 17 00:00:00 2001 +Message-Id: <2395bf301cf76ffa863a3c2e125d52345cfbf6b5@dist-git> +From: Pavel Hrdina +Date: Mon, 1 Jul 2019 17:08:23 +0200 +Subject: [PATCH] Revert "util: vircgroup: pass parent cgroup into + virCgroupDetectControllersCB" +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This reverts commit 7bca1c9bdc85247446129f856e27c80a32819e17. + +As it turns out it's not a good idea on systemd hosts. The root +cgroup can have all controllers enabled but they don't have to be +enabled for sub-cgroups. + +Signed-off-by: Pavel Hrdina +Reviewed-by: Ján Tomko +(cherry picked from commit d117431143d5b6dcfc8fae4a6b3fae23881d0937) + +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1689297 + +Signed-off-by: Pavel Hrdina +Message-Id: <754b0ac5a0f1bd21e79eaeb71f6d2ab811446168.1561993100.git.phrdina@redhat.com> +Reviewed-by: Ján Tomko +--- + src/util/vircgroup.c | 2 +- + src/util/vircgroupbackend.h | 3 +-- + src/util/vircgroupv1.c | 3 +-- + src/util/vircgroupv2.c | 17 ++++++----------- + 4 files changed, 9 insertions(+), 16 deletions(-) + +diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c +index ff2a0b75b5..a7fb595bce 100644 +--- a/src/util/vircgroup.c ++++ b/src/util/vircgroup.c +@@ -412,7 +412,7 @@ virCgroupDetect(virCgroupPtr group, + + for (i = 0; i < VIR_CGROUP_BACKEND_TYPE_LAST; i++) { + if (group->backends[i]) { +- int rc = group->backends[i]->detectControllers(group, controllers, parent); ++ int rc = group->backends[i]->detectControllers(group, controllers); + if (rc < 0) + return -1; + controllersAvailable |= rc; +diff --git a/src/util/vircgroupbackend.h b/src/util/vircgroupbackend.h +index 05af118ec1..a825dc4be7 100644 +--- a/src/util/vircgroupbackend.h ++++ b/src/util/vircgroupbackend.h +@@ -96,8 +96,7 @@ typedef char * + + typedef int + (*virCgroupDetectControllersCB)(virCgroupPtr group, +- int controllers, +- virCgroupPtr parent); ++ int controllers); + + typedef bool + (*virCgroupHasControllerCB)(virCgroupPtr cgroup, +diff --git a/src/util/vircgroupv1.c b/src/util/vircgroupv1.c +index 5b218c7f78..58bd20d636 100644 +--- a/src/util/vircgroupv1.c ++++ b/src/util/vircgroupv1.c +@@ -419,8 +419,7 @@ virCgroupV1StealPlacement(virCgroupPtr group) + + static int + virCgroupV1DetectControllers(virCgroupPtr group, +- int controllers, +- virCgroupPtr parent ATTRIBUTE_UNUSED) ++ int controllers) + { + size_t i; + size_t j; +diff --git a/src/util/vircgroupv2.c b/src/util/vircgroupv2.c +index bdeab397a3..b0ed889cc8 100644 +--- a/src/util/vircgroupv2.c ++++ b/src/util/vircgroupv2.c +@@ -285,21 +285,16 @@ virCgroupV2ParseControllersFile(virCgroupPtr group) + + static int + virCgroupV2DetectControllers(virCgroupPtr group, +- int controllers, +- virCgroupPtr parent) ++ int controllers) + { + size_t i; + +- if (parent) { +- group->unified.controllers = parent->unified.controllers; +- } else { +- if (virCgroupV2ParseControllersFile(group) < 0) +- return -1; ++ if (virCgroupV2ParseControllersFile(group) < 0) ++ return -1; + +- /* In cgroup v2 there is no cpuacct controller, the cpu.stat file always +- * exists with usage stats. */ +- group->unified.controllers |= 1 << VIR_CGROUP_CONTROLLER_CPUACCT; +- } ++ /* In cgroup v2 there is no cpuacct controller, the cpu.stat file always ++ * exists with usage stats. */ ++ group->unified.controllers |= 1 << VIR_CGROUP_CONTROLLER_CPUACCT; + + if (controllers >= 0) + group->unified.controllers &= controllers; +-- +2.22.0 + diff --git a/SOURCES/libvirt-Revert-virStateDriver-Separate-AutoStart-from-Initialize.patch b/SOURCES/libvirt-Revert-virStateDriver-Separate-AutoStart-from-Initialize.patch new file mode 100644 index 0000000..45fdd94 --- /dev/null +++ b/SOURCES/libvirt-Revert-virStateDriver-Separate-AutoStart-from-Initialize.patch @@ -0,0 +1,295 @@ +From 799c9dd37390878a54be303b3e3e27445049bf2b Mon Sep 17 00:00:00 2001 +Message-Id: <799c9dd37390878a54be303b3e3e27445049bf2b@dist-git> +From: Michal Privoznik +Date: Thu, 27 Jun 2019 15:18:16 +0200 +Subject: [PATCH] Revert "virStateDriver - Separate AutoStart from Initialize" +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This reverts commit cefb97fb815c81fc882da752f45effd23bcb9b4b. + +The stateAutoStart callback will be removed in the next commit. +Therefore move autostarting of domains, networks and storage +pools back into stateInitialize callbacks. + +Signed-off-by: Michal Privoznik +Reviewed-by: Ján Tomko +(cherry picked from commit fc380c2e018ae15347d4c281a7e74896c48cac4a) + +https://bugzilla.redhat.com/show_bug.cgi?id=1685151 + +The difference to the upstream commit is uml driver change. In +upstream, the uml driver was dropped, but it's still kept around +in downstream. + +Signed-off-by: Michal Privoznik +Message-Id: +Reviewed-by: Jiri Denemark +--- + src/libxl/libxl_driver.c | 14 +++----------- + src/lxc/lxc_driver.c | 16 ++-------------- + src/network/bridge_driver.c | 22 ++++------------------ + src/qemu/qemu_driver.c | 17 ++--------------- + src/storage/storage_driver.c | 19 ++----------------- + src/uml/uml_driver.c | 17 ++--------------- + 6 files changed, 15 insertions(+), 90 deletions(-) + +diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c +index 5a5e792957..99bb010af4 100644 +--- a/src/libxl/libxl_driver.c ++++ b/src/libxl/libxl_driver.c +@@ -773,6 +773,9 @@ libxlStateInitialize(bool privileged, + NULL, NULL) < 0) + goto error; + ++ virDomainObjListForEach(libxl_driver->domains, libxlAutostartDomain, ++ libxl_driver); ++ + virDomainObjListForEach(libxl_driver->domains, libxlDomainManagedSaveLoad, + libxl_driver); + +@@ -784,16 +787,6 @@ libxlStateInitialize(bool privileged, + return -1; + } + +-static void +-libxlStateAutoStart(void) +-{ +- if (!libxl_driver) +- return; +- +- virDomainObjListForEach(libxl_driver->domains, libxlAutostartDomain, +- libxl_driver); +-} +- + static int + libxlStateReload(void) + { +@@ -6479,7 +6472,6 @@ static virConnectDriver libxlConnectDriver = { + static virStateDriver libxlStateDriver = { + .name = "LIBXL", + .stateInitialize = libxlStateInitialize, +- .stateAutoStart = libxlStateAutoStart, + .stateCleanup = libxlStateCleanup, + .stateReload = libxlStateReload, + }; +diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c +index f9794e0655..527fa72083 100644 +--- a/src/lxc/lxc_driver.c ++++ b/src/lxc/lxc_driver.c +@@ -1646,6 +1646,8 @@ static int lxcStateInitialize(bool privileged, + NULL, NULL) < 0) + goto cleanup; + ++ virLXCProcessAutostartAll(lxc_driver); ++ + virObjectUnref(caps); + return 0; + +@@ -1655,19 +1657,6 @@ static int lxcStateInitialize(bool privileged, + return -1; + } + +-/** +- * lxcStateAutoStart: +- * +- * Function to autostart the LXC daemons +- */ +-static void lxcStateAutoStart(void) +-{ +- if (!lxc_driver) +- return; +- +- virLXCProcessAutostartAll(lxc_driver); +-} +- + static void lxcNotifyLoadDomain(virDomainObjPtr vm, int newVM, void *opaque) + { + virLXCDriverPtr driver = opaque; +@@ -5550,7 +5539,6 @@ static virConnectDriver lxcConnectDriver = { + static virStateDriver lxcStateDriver = { + .name = LXC_DRIVER_NAME, + .stateInitialize = lxcStateInitialize, +- .stateAutoStart = lxcStateAutoStart, + .stateCleanup = lxcStateCleanup, + .stateReload = lxcStateReload, + }; +diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c +index d153a8cdb6..a60d7db685 100644 +--- a/src/network/bridge_driver.c ++++ b/src/network/bridge_driver.c +@@ -755,6 +755,10 @@ networkStateInitialize(bool privileged, + networkReloadFirewallRules(network_driver); + networkRefreshDaemons(network_driver); + ++ virNetworkObjListForEach(network_driver->networks, ++ networkAutostartConfig, ++ network_driver); ++ + network_driver->networkEventState = virObjectEventStateNew(); + + #ifdef WITH_FIREWALLD +@@ -794,23 +798,6 @@ networkStateInitialize(bool privileged, + } + + +-/** +- * networkStateAutoStart: +- * +- * Function to AutoStart the bridge configs +- */ +-static void +-networkStateAutoStart(void) +-{ +- if (!network_driver) +- return; +- +- virNetworkObjListForEach(network_driver->networks, +- networkAutostartConfig, +- network_driver); +-} +- +- + /** + * networkStateReload: + * +@@ -5616,7 +5603,6 @@ static virConnectDriver networkConnectDriver = { + static virStateDriver networkStateDriver = { + .name = "bridge", + .stateInitialize = networkStateInitialize, +- .stateAutoStart = networkStateAutoStart, + .stateCleanup = networkStateCleanup, + .stateReload = networkStateReload, + }; +diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c +index 2da87992fd..056d324a62 100644 +--- a/src/qemu/qemu_driver.c ++++ b/src/qemu/qemu_driver.c +@@ -911,6 +911,8 @@ qemuStateInitialize(bool privileged, + + qemuProcessReconnectAll(qemu_driver); + ++ qemuAutostartDomains(qemu_driver); ++ + return 0; + + error: +@@ -921,20 +923,6 @@ qemuStateInitialize(bool privileged, + return -1; + } + +-/** +- * qemuStateAutoStart: +- * +- * Function to auto start the QEMU daemons +- */ +-static void +-qemuStateAutoStart(void) +-{ +- if (!qemu_driver) +- return; +- +- qemuAutostartDomains(qemu_driver); +-} +- + static void qemuNotifyLoadDomain(virDomainObjPtr vm, int newVM, void *opaque) + { + virQEMUDriverPtr driver = opaque; +@@ -21846,7 +21834,6 @@ static virConnectDriver qemuConnectDriver = { + static virStateDriver qemuStateDriver = { + .name = QEMU_DRIVER_NAME, + .stateInitialize = qemuStateInitialize, +- .stateAutoStart = qemuStateAutoStart, + .stateCleanup = qemuStateCleanup, + .stateReload = qemuStateReload, + .stateStop = qemuStateStop, +diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c +index 254818e308..f61fb074e6 100644 +--- a/src/storage/storage_driver.c ++++ b/src/storage/storage_driver.c +@@ -291,6 +291,8 @@ storageStateInitialize(bool privileged, + + storagePoolUpdateAllState(); + ++ storageDriverAutostart(); ++ + driver->storageEventState = virObjectEventStateNew(); + + storageDriverUnlock(); +@@ -307,22 +309,6 @@ storageStateInitialize(bool privileged, + goto cleanup; + } + +-/** +- * storageStateAutoStart: +- * +- * Function to auto start the storage driver +- */ +-static void +-storageStateAutoStart(void) +-{ +- if (!driver) +- return; +- +- storageDriverLock(); +- storageDriverAutostart(); +- storageDriverUnlock(); +-} +- + /** + * storageStateReload: + * +@@ -2843,7 +2829,6 @@ static virConnectDriver storageConnectDriver = { + static virStateDriver stateDriver = { + .name = "storage", + .stateInitialize = storageStateInitialize, +- .stateAutoStart = storageStateAutoStart, + .stateCleanup = storageStateCleanup, + .stateReload = storageStateReload, + }; +diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c +index c77988f01e..296adf55d1 100644 +--- a/src/uml/uml_driver.c ++++ b/src/uml/uml_driver.c +@@ -575,6 +575,8 @@ umlStateInitialize(bool privileged, + + umlDriverUnlock(uml_driver); + ++ umlAutostartConfigs(uml_driver); ++ + VIR_FREE(userdir); + + return 0; +@@ -590,20 +592,6 @@ umlStateInitialize(bool privileged, + return -1; + } + +-/** +- * umlStateAutoStart: +- * +- * Function to autostart the Uml daemons +- */ +-static void +-umlStateAutoStart(void) +-{ +- if (!uml_driver) +- return; +- +- umlAutostartConfigs(uml_driver); +-} +- + static void umlNotifyLoadDomain(virDomainObjPtr vm, int newVM, void *opaque) + { + struct uml_driver *driver = opaque; +@@ -2826,7 +2814,6 @@ static virConnectDriver umlConnectDriver = { + static virStateDriver umlStateDriver = { + .name = "UML", + .stateInitialize = umlStateInitialize, +- .stateAutoStart = umlStateAutoStart, + .stateCleanup = umlStateCleanup, + .stateReload = umlStateReload, + }; +-- +2.22.0 + diff --git a/SOURCES/libvirt-Revert-vircgroup-cleanup-controllers-not-managed-by-systemd-on-error.patch b/SOURCES/libvirt-Revert-vircgroup-cleanup-controllers-not-managed-by-systemd-on-error.patch new file mode 100644 index 0000000..44f72a9 --- /dev/null +++ b/SOURCES/libvirt-Revert-vircgroup-cleanup-controllers-not-managed-by-systemd-on-error.patch @@ -0,0 +1,83 @@ +From ddea95c1c2e32c6454c89aa83d78b26a83564cd4 Mon Sep 17 00:00:00 2001 +Message-Id: +From: Pavel Hrdina +Date: Mon, 1 Jul 2019 17:07:11 +0200 +Subject: [PATCH] Revert "vircgroup: cleanup controllers not managed by systemd + on error" +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This reverts commit 1602aa28f820ada66f707cef3e536e8572fbda1e. + +There is no need to call virCgroupRemove() nor virCgroupFree() if +virCgroupEnableMissingControllers() fails because it will not modify +'group' at all. + +The cleanup of directories is done in virCgroupMakeGroup(). + +Reviewed-by: John Ferlan +Reviewed-by: Fabiano FidĂŞncio +Reviewed-by: Marc Hartmayer +Signed-off-by: Pavel Hrdina +(cherry picked from commit 199eee6aae7af3d813fbe98660c7e0fa1a8ae7b7) + +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1689297 + +Signed-off-by: Pavel Hrdina +Message-Id: <53288dd310e0305ac3179693e64684eb8b3a31ab.1561993100.git.phrdina@redhat.com> +Reviewed-by: Ján Tomko +--- + src/util/vircgroup.c | 25 ++++++++++--------------- + 1 file changed, 10 insertions(+), 15 deletions(-) + +diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c +index a376b9b89a..7ec1399bc6 100644 +--- a/src/util/vircgroup.c ++++ b/src/util/vircgroup.c +@@ -1059,7 +1059,6 @@ virCgroupNewMachineSystemd(const char *name, + int rv; + virCgroupPtr init; + VIR_AUTOFREE(char *) path = NULL; +- virErrorPtr saved = NULL; + + VIR_DEBUG("Trying to setup machine '%s' via systemd", name); + if ((rv = virSystemdCreateMachine(name, +@@ -1092,24 +1091,20 @@ virCgroupNewMachineSystemd(const char *name, + + if (virCgroupEnableMissingControllers(path, pidleader, + controllers, group) < 0) { +- goto error; ++ return -1; + } + +- if (virCgroupAddProcess(*group, pidleader) < 0) +- goto error; ++ if (virCgroupAddProcess(*group, pidleader) < 0) { ++ virErrorPtr saved = virSaveLastError(); ++ virCgroupRemove(*group); ++ virCgroupFree(group); ++ if (saved) { ++ virSetError(saved); ++ virFreeError(saved); ++ } ++ } + + return 0; +- +- error: +- saved = virSaveLastError(); +- virCgroupRemove(*group); +- virCgroupFree(group); +- if (saved) { +- virSetError(saved); +- virFreeError(saved); +- } +- +- return -1; + } + + +-- +2.22.0 + diff --git a/SOURCES/libvirt-access-Fix-nwfilter-binding-ACL-access-API-name-generation.patch b/SOURCES/libvirt-access-Fix-nwfilter-binding-ACL-access-API-name-generation.patch new file mode 100644 index 0000000..4b53a50 --- /dev/null +++ b/SOURCES/libvirt-access-Fix-nwfilter-binding-ACL-access-API-name-generation.patch @@ -0,0 +1,60 @@ +From 254da75ea1a9c2cade909534153f444bb8981c2a Mon Sep 17 00:00:00 2001 +Message-Id: <254da75ea1a9c2cade909534153f444bb8981c2a@dist-git> +From: John Ferlan +Date: Mon, 27 Aug 2018 08:27:47 -0400 +Subject: [PATCH] access: Fix nwfilter-binding ACL access API name generation +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +https://bugzilla.redhat.com/show_bug.cgi?id=1611320 + +Generation of the ACL API policy is a "automated process" +based on this perl script which "worked" with the changes to +add nwfilter binding API's because they had the "nwfilter" +prefix; however, the generated output name was incorrect +based on the remote protocol algorithm which expected to +generate names such as 'nwfilter-binding.action' instead +of 'nwfilter.binding-action'. + +This effectively changes src/access/org.libvirt.api.policy entries: + + org.libvirt.api.nwfilter.binding-create ==> + org.libvirt.api.nwfilter-binding.create + + org.libvirt.api.nwfilter.binding-delete ==> + org.libvirt.api.nwfilter-binding.delete + + org.libvirt.api.nwfilter.binding-getattr ==> + org.libvirt.api.nwfilter-binding.getattr + + org.libvirt.api.nwfilter.binding-read ==> + org.libvirt.api.nwfilter-binding.read + +Signed-off-by: John Ferlan +Reviewed-by: Daniel P. BerrangĂ© +(cherry picked from commit 6ef65e3c96d5d1f16a16daca83b81b818d461e64) +https: //bugzilla.redhat.com/show_bug.cgi?id=1622540 +Reviewed-by: Erik Skultety +--- + src/access/genpolkit.pl | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/src/access/genpolkit.pl b/src/access/genpolkit.pl +index 968cb8c55c..e074c90eb6 100755 +--- a/src/access/genpolkit.pl ++++ b/src/access/genpolkit.pl +@@ -22,8 +22,8 @@ use warnings; + + my @objects = ( + "CONNECT", "DOMAIN", "INTERFACE", +- "NETWORK","NODE_DEVICE", "NWFILTER", +- "SECRET", "STORAGE_POOL", "STORAGE_VOL", ++ "NETWORK","NODE_DEVICE", "NWFILTER_BINDING", "NWFILTER", ++ "SECRET", "STORAGE_POOL", "STORAGE_VOL", + ); + + my $objects = join ("|", @objects); +-- +2.18.0 + diff --git a/SOURCES/libvirt-access-Modify-the-VIR_ERR_ACCESS_DENIED-to-include-driverName.patch b/SOURCES/libvirt-access-Modify-the-VIR_ERR_ACCESS_DENIED-to-include-driverName.patch new file mode 100644 index 0000000..a47583c --- /dev/null +++ b/SOURCES/libvirt-access-Modify-the-VIR_ERR_ACCESS_DENIED-to-include-driverName.patch @@ -0,0 +1,173 @@ +From 85750b0466aa3719d3d2447abaab2e87db92f552 Mon Sep 17 00:00:00 2001 +Message-Id: <85750b0466aa3719d3d2447abaab2e87db92f552@dist-git> +From: John Ferlan +Date: Mon, 5 Nov 2018 07:48:37 -0500 +Subject: [PATCH] access: Modify the VIR_ERR_ACCESS_DENIED to include + driverName + +https://bugzilla.redhat.com/show_bug.cgi?id=1631608 (RHEL 8.0) +https://bugzilla.redhat.com/show_bug.cgi?id=1631606 (RHEL 7.7) + +Changes made to manage and utilize a secondary connection +driver to APIs outside the scope of the primary connection +driver have resulted in some confusion processing polkit rules +since the simple "access denied" error message doesn't provide +enough of a clue when combined with the "authentication failed: +access denied by policy" as to which connection driver refused +or failed the ACL check. + +In order to provide some context, let's modify the existing +"access denied" error returne from the various vir*EnsureACL +API's to provide the connection driver name that is causing +the failure. This should provide the context for writing the +polkit rules that would allow access via the driver. + +Signed-off-by: John Ferlan +ACKed-by: Michal Privoznik +(cherry picked from commit ccc72d5cbdd85f66cb737134b3be40aac1df03ef) +Reviewed-by: Jiri Denemark +--- + src/access/viraccessmanager.c | 25 +++++++++++++------------ + src/rpc/gendispatch.pl | 2 +- + src/util/virerror.c | 4 ++-- + 3 files changed, 16 insertions(+), 15 deletions(-) + +diff --git a/src/access/viraccessmanager.c b/src/access/viraccessmanager.c +index e7b5bf38da..1dfff32b9d 100644 +--- a/src/access/viraccessmanager.c ++++ b/src/access/viraccessmanager.c +@@ -196,11 +196,12 @@ static void virAccessManagerDispose(void *object) + * should the admin need to debug things + */ + static int +-virAccessManagerSanitizeError(int ret) ++virAccessManagerSanitizeError(int ret, ++ const char *driverName) + { + if (ret < 0) { + virResetLastError(); +- virAccessError(VIR_ERR_ACCESS_DENIED, NULL); ++ virAccessError(VIR_ERR_ACCESS_DENIED, driverName, NULL); + } + + return ret; +@@ -217,7 +218,7 @@ int virAccessManagerCheckConnect(virAccessManagerPtr manager, + if (manager->drv->checkConnect) + ret = manager->drv->checkConnect(manager, driverName, perm); + +- return virAccessManagerSanitizeError(ret); ++ return virAccessManagerSanitizeError(ret, driverName); + } + + +@@ -233,7 +234,7 @@ int virAccessManagerCheckDomain(virAccessManagerPtr manager, + if (manager->drv->checkDomain) + ret = manager->drv->checkDomain(manager, driverName, domain, perm); + +- return virAccessManagerSanitizeError(ret); ++ return virAccessManagerSanitizeError(ret, driverName); + } + + int virAccessManagerCheckInterface(virAccessManagerPtr manager, +@@ -248,7 +249,7 @@ int virAccessManagerCheckInterface(virAccessManagerPtr manager, + if (manager->drv->checkInterface) + ret = manager->drv->checkInterface(manager, driverName, iface, perm); + +- return virAccessManagerSanitizeError(ret); ++ return virAccessManagerSanitizeError(ret, driverName); + } + + int virAccessManagerCheckNetwork(virAccessManagerPtr manager, +@@ -263,7 +264,7 @@ int virAccessManagerCheckNetwork(virAccessManagerPtr manager, + if (manager->drv->checkNetwork) + ret = manager->drv->checkNetwork(manager, driverName, network, perm); + +- return virAccessManagerSanitizeError(ret); ++ return virAccessManagerSanitizeError(ret, driverName); + } + + int virAccessManagerCheckNodeDevice(virAccessManagerPtr manager, +@@ -278,7 +279,7 @@ int virAccessManagerCheckNodeDevice(virAccessManagerPtr manager, + if (manager->drv->checkNodeDevice) + ret = manager->drv->checkNodeDevice(manager, driverName, nodedev, perm); + +- return virAccessManagerSanitizeError(ret); ++ return virAccessManagerSanitizeError(ret, driverName); + } + + int virAccessManagerCheckNWFilter(virAccessManagerPtr manager, +@@ -293,7 +294,7 @@ int virAccessManagerCheckNWFilter(virAccessManagerPtr manager, + if (manager->drv->checkNWFilter) + ret = manager->drv->checkNWFilter(manager, driverName, nwfilter, perm); + +- return virAccessManagerSanitizeError(ret); ++ return virAccessManagerSanitizeError(ret, driverName); + } + + int virAccessManagerCheckNWFilterBinding(virAccessManagerPtr manager, +@@ -308,7 +309,7 @@ int virAccessManagerCheckNWFilterBinding(virAccessManagerPtr manager, + if (manager->drv->checkNWFilterBinding) + ret = manager->drv->checkNWFilterBinding(manager, driverName, binding, perm); + +- return virAccessManagerSanitizeError(ret); ++ return virAccessManagerSanitizeError(ret, driverName); + } + + int virAccessManagerCheckSecret(virAccessManagerPtr manager, +@@ -323,7 +324,7 @@ int virAccessManagerCheckSecret(virAccessManagerPtr manager, + if (manager->drv->checkSecret) + ret = manager->drv->checkSecret(manager, driverName, secret, perm); + +- return virAccessManagerSanitizeError(ret); ++ return virAccessManagerSanitizeError(ret, driverName); + } + + int virAccessManagerCheckStoragePool(virAccessManagerPtr manager, +@@ -338,7 +339,7 @@ int virAccessManagerCheckStoragePool(virAccessManagerPtr manager, + if (manager->drv->checkStoragePool) + ret = manager->drv->checkStoragePool(manager, driverName, pool, perm); + +- return virAccessManagerSanitizeError(ret); ++ return virAccessManagerSanitizeError(ret, driverName); + } + + int virAccessManagerCheckStorageVol(virAccessManagerPtr manager, +@@ -354,5 +355,5 @@ int virAccessManagerCheckStorageVol(virAccessManagerPtr manager, + if (manager->drv->checkStorageVol) + ret = manager->drv->checkStorageVol(manager, driverName, pool, vol, perm); + +- return virAccessManagerSanitizeError(ret); ++ return virAccessManagerSanitizeError(ret, driverName); + } +diff --git a/src/rpc/gendispatch.pl b/src/rpc/gendispatch.pl +index 0c4648c0fb..f599002056 100755 +--- a/src/rpc/gendispatch.pl ++++ b/src/rpc/gendispatch.pl +@@ -2199,7 +2199,7 @@ elsif ($mode eq "client") { + print " virObjectUnref(mgr);\n"; + if ($action eq "Ensure") { + print " if (rv == 0)\n"; +- print " virReportError(VIR_ERR_ACCESS_DENIED, NULL);\n"; ++ print " virReportError(VIR_ERR_ACCESS_DENIED, conn->driver->name, NULL);\n"; + print " return $fail;\n"; + } else { + print " virResetLastError();\n"; +diff --git a/src/util/virerror.c b/src/util/virerror.c +index f198f27957..5f50fa0349 100644 +--- a/src/util/virerror.c ++++ b/src/util/virerror.c +@@ -1439,9 +1439,9 @@ virErrorMsg(virErrorNumber error, const char *info) + break; + case VIR_ERR_ACCESS_DENIED: + if (info == NULL) +- errmsg = _("access denied"); ++ errmsg = _("access denied from '%s'"); + else +- errmsg = _("access denied: %s"); ++ errmsg = _("access denied from '%s': %s"); + break; + case VIR_ERR_DBUS_SERVICE: + if (info == NULL) +-- +2.19.1 + diff --git a/SOURCES/libvirt-access-Modify-the-VIR_ERR_ACCESS_DENIED-to-include-driverName_1.patch b/SOURCES/libvirt-access-Modify-the-VIR_ERR_ACCESS_DENIED-to-include-driverName_1.patch new file mode 100644 index 0000000..dc0cb0a --- /dev/null +++ b/SOURCES/libvirt-access-Modify-the-VIR_ERR_ACCESS_DENIED-to-include-driverName_1.patch @@ -0,0 +1,159 @@ +From 541a154e0f98604f63cb22356287dfa3858748c9 Mon Sep 17 00:00:00 2001 +Message-Id: <541a154e0f98604f63cb22356287dfa3858748c9@dist-git> +From: John Ferlan +Date: Thu, 15 Nov 2018 06:43:59 -0500 +Subject: [PATCH] access: Modify the VIR_ERR_ACCESS_DENIED to include + driverName + +https://bugzilla.redhat.com/show_bug.cgi?id=1631608 (RHEL8) +https://bugzilla.redhat.com/show_bug.cgi?id=1631606 (RHEL7) + +Changes made to manage and utilize a secondary connection +driver to APIs outside the scope of the primary connection +driver have resulted in some confusion processing polkit rules +since the simple "access denied" error message doesn't provide +enough of a clue when combined with the "authentication failed: +access denied by policy" as to which connection driver refused +or failed the ACL check. + +In order to provide some context, let's modify the existing +"access denied" error returned from the various vir*EnsureACL +API's to provide the connection driver name that is causing +the failure. This should provide the context for writing the +polkit rules that would allow access via the driver, but yet +still adhere to the virAccessManagerSanitizeError commentary +regarding not telling the user why access was denied. + +Signed-off-by: John Ferlan +(cherry picked from commit 605496be609e153526fcdd3e98df8cf5244bc8fa) +Reviewed-by: Erik Skultety +--- + src/access/viraccessmanager.c | 26 ++++++++++++++------------ + src/rpc/gendispatch.pl | 3 ++- + 2 files changed, 16 insertions(+), 13 deletions(-) + +diff --git a/src/access/viraccessmanager.c b/src/access/viraccessmanager.c +index e7b5bf38da..f5d62604cf 100644 +--- a/src/access/viraccessmanager.c ++++ b/src/access/viraccessmanager.c +@@ -196,11 +196,13 @@ static void virAccessManagerDispose(void *object) + * should the admin need to debug things + */ + static int +-virAccessManagerSanitizeError(int ret) ++virAccessManagerSanitizeError(int ret, ++ const char *driverName) + { + if (ret < 0) { + virResetLastError(); +- virAccessError(VIR_ERR_ACCESS_DENIED, NULL); ++ virAccessError(VIR_ERR_ACCESS_DENIED, ++ _("'%s' denied access"), driverName); + } + + return ret; +@@ -217,7 +219,7 @@ int virAccessManagerCheckConnect(virAccessManagerPtr manager, + if (manager->drv->checkConnect) + ret = manager->drv->checkConnect(manager, driverName, perm); + +- return virAccessManagerSanitizeError(ret); ++ return virAccessManagerSanitizeError(ret, driverName); + } + + +@@ -233,7 +235,7 @@ int virAccessManagerCheckDomain(virAccessManagerPtr manager, + if (manager->drv->checkDomain) + ret = manager->drv->checkDomain(manager, driverName, domain, perm); + +- return virAccessManagerSanitizeError(ret); ++ return virAccessManagerSanitizeError(ret, driverName); + } + + int virAccessManagerCheckInterface(virAccessManagerPtr manager, +@@ -248,7 +250,7 @@ int virAccessManagerCheckInterface(virAccessManagerPtr manager, + if (manager->drv->checkInterface) + ret = manager->drv->checkInterface(manager, driverName, iface, perm); + +- return virAccessManagerSanitizeError(ret); ++ return virAccessManagerSanitizeError(ret, driverName); + } + + int virAccessManagerCheckNetwork(virAccessManagerPtr manager, +@@ -263,7 +265,7 @@ int virAccessManagerCheckNetwork(virAccessManagerPtr manager, + if (manager->drv->checkNetwork) + ret = manager->drv->checkNetwork(manager, driverName, network, perm); + +- return virAccessManagerSanitizeError(ret); ++ return virAccessManagerSanitizeError(ret, driverName); + } + + int virAccessManagerCheckNodeDevice(virAccessManagerPtr manager, +@@ -278,7 +280,7 @@ int virAccessManagerCheckNodeDevice(virAccessManagerPtr manager, + if (manager->drv->checkNodeDevice) + ret = manager->drv->checkNodeDevice(manager, driverName, nodedev, perm); + +- return virAccessManagerSanitizeError(ret); ++ return virAccessManagerSanitizeError(ret, driverName); + } + + int virAccessManagerCheckNWFilter(virAccessManagerPtr manager, +@@ -293,7 +295,7 @@ int virAccessManagerCheckNWFilter(virAccessManagerPtr manager, + if (manager->drv->checkNWFilter) + ret = manager->drv->checkNWFilter(manager, driverName, nwfilter, perm); + +- return virAccessManagerSanitizeError(ret); ++ return virAccessManagerSanitizeError(ret, driverName); + } + + int virAccessManagerCheckNWFilterBinding(virAccessManagerPtr manager, +@@ -308,7 +310,7 @@ int virAccessManagerCheckNWFilterBinding(virAccessManagerPtr manager, + if (manager->drv->checkNWFilterBinding) + ret = manager->drv->checkNWFilterBinding(manager, driverName, binding, perm); + +- return virAccessManagerSanitizeError(ret); ++ return virAccessManagerSanitizeError(ret, driverName); + } + + int virAccessManagerCheckSecret(virAccessManagerPtr manager, +@@ -323,7 +325,7 @@ int virAccessManagerCheckSecret(virAccessManagerPtr manager, + if (manager->drv->checkSecret) + ret = manager->drv->checkSecret(manager, driverName, secret, perm); + +- return virAccessManagerSanitizeError(ret); ++ return virAccessManagerSanitizeError(ret, driverName); + } + + int virAccessManagerCheckStoragePool(virAccessManagerPtr manager, +@@ -338,7 +340,7 @@ int virAccessManagerCheckStoragePool(virAccessManagerPtr manager, + if (manager->drv->checkStoragePool) + ret = manager->drv->checkStoragePool(manager, driverName, pool, perm); + +- return virAccessManagerSanitizeError(ret); ++ return virAccessManagerSanitizeError(ret, driverName); + } + + int virAccessManagerCheckStorageVol(virAccessManagerPtr manager, +@@ -354,5 +356,5 @@ int virAccessManagerCheckStorageVol(virAccessManagerPtr manager, + if (manager->drv->checkStorageVol) + ret = manager->drv->checkStorageVol(manager, driverName, pool, vol, perm); + +- return virAccessManagerSanitizeError(ret); ++ return virAccessManagerSanitizeError(ret, driverName); + } +diff --git a/src/rpc/gendispatch.pl b/src/rpc/gendispatch.pl +index 0c4648c0fb..a8b9f5aeca 100755 +--- a/src/rpc/gendispatch.pl ++++ b/src/rpc/gendispatch.pl +@@ -2199,7 +2199,8 @@ elsif ($mode eq "client") { + print " virObjectUnref(mgr);\n"; + if ($action eq "Ensure") { + print " if (rv == 0)\n"; +- print " virReportError(VIR_ERR_ACCESS_DENIED, NULL);\n"; ++ print " virReportError(VIR_ERR_ACCESS_DENIED,\n"; ++ print" _(\"'%s' denied access\"), conn->driver->name);\n"; + print " return $fail;\n"; + } else { + print " virResetLastError();\n"; +-- +2.19.2 + diff --git a/SOURCES/libvirt-admin-reject-clients-unless-their-UID-matches-the-current-UID.patch b/SOURCES/libvirt-admin-reject-clients-unless-their-UID-matches-the-current-UID.patch new file mode 100644 index 0000000..a6c1113 --- /dev/null +++ b/SOURCES/libvirt-admin-reject-clients-unless-their-UID-matches-the-current-UID.patch @@ -0,0 +1,61 @@ +From 3eaa16967f0546c5d1596bb6c36767cbe01040b9 Mon Sep 17 00:00:00 2001 +Message-Id: <3eaa16967f0546c5d1596bb6c36767cbe01040b9@dist-git> +From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= +Date: Wed, 15 May 2019 21:40:56 +0100 +Subject: [PATCH] admin: reject clients unless their UID matches the current + UID +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The admin protocol RPC messages are only intended for use by the user +running the daemon. As such they should not be allowed for any client +UID that does not match the server UID. + +Fixes CVE-2019-10132 + +Reviewed-by: Ján Tomko +Signed-off-by: Daniel P. BerrangĂ© +(cherry picked from commit 96f41cd765c9e525fe28ee5abbfbf4a79b3720c7) +Reviewed-by: Jiri Denemark +Message-Id: <20190515204058.28077-2-berrange@redhat.com> +--- + src/admin/admin_server_dispatch.c | 22 ++++++++++++++++++++++ + 1 file changed, 22 insertions(+) + +diff --git a/src/admin/admin_server_dispatch.c b/src/admin/admin_server_dispatch.c +index b78ff902c0..9f25813ae3 100644 +--- a/src/admin/admin_server_dispatch.c ++++ b/src/admin/admin_server_dispatch.c +@@ -66,6 +66,28 @@ remoteAdmClientNew(virNetServerClientPtr client ATTRIBUTE_UNUSED, + void *opaque) + { + struct daemonAdmClientPrivate *priv; ++ uid_t clientuid; ++ gid_t clientgid; ++ pid_t clientpid; ++ unsigned long long timestamp; ++ ++ if (virNetServerClientGetUNIXIdentity(client, ++ &clientuid, ++ &clientgid, ++ &clientpid, ++ ×tamp) < 0) ++ return NULL; ++ ++ VIR_DEBUG("New client pid %lld uid %lld", ++ (long long)clientpid, ++ (long long)clientuid); ++ ++ if (geteuid() != clientuid) { ++ virReportRestrictedError(_("Disallowing client %lld with uid %lld"), ++ (long long)clientpid, ++ (long long)clientuid); ++ return NULL; ++ } + + if (VIR_ALLOC(priv) < 0) + return NULL; +-- +2.22.0 + diff --git a/SOURCES/libvirt-api-disallow-virConnect-HypervisorCPU-on-read-only-connections.patch b/SOURCES/libvirt-api-disallow-virConnect-HypervisorCPU-on-read-only-connections.patch new file mode 100644 index 0000000..70eecbc --- /dev/null +++ b/SOURCES/libvirt-api-disallow-virConnect-HypervisorCPU-on-read-only-connections.patch @@ -0,0 +1,46 @@ +From bab30af2d83e27d9141545cb9dcff51924e52b4d Mon Sep 17 00:00:00 2001 +Message-Id: +From: =?UTF-8?q?J=C3=A1n=20Tomko?= +Date: Tue, 18 Jun 2019 13:30:02 +0200 +Subject: [PATCH] api: disallow virConnect*HypervisorCPU on read-only + connections +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +These APIs can be used to execute arbitrary emulators. +Forbid them on read-only connections. + +Fixes: CVE-2019-10168 +Signed-off-by: Ján Tomko +Reviewed-by: Daniel P. BerrangĂ© +Signed-off-by: Ján Tomko +Message-Id: <470651092e7d6a4ba5875cf8885fd3714d5ea189.1560857354.git.jtomko@redhat.com> +Reviewed-by: Jiri Denemark +--- + src/libvirt-host.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/src/libvirt-host.c b/src/libvirt-host.c +index e20d6ee250..2978825d22 100644 +--- a/src/libvirt-host.c ++++ b/src/libvirt-host.c +@@ -1041,6 +1041,7 @@ virConnectCompareHypervisorCPU(virConnectPtr conn, + + virCheckConnectReturn(conn, VIR_CPU_COMPARE_ERROR); + virCheckNonNullArgGoto(xmlCPU, error); ++ virCheckReadOnlyGoto(conn->flags, error); + + if (conn->driver->connectCompareHypervisorCPU) { + int ret; +@@ -1234,6 +1235,7 @@ virConnectBaselineHypervisorCPU(virConnectPtr conn, + + virCheckConnectReturn(conn, NULL); + virCheckNonNullArgGoto(xmlCPUs, error); ++ virCheckReadOnlyGoto(conn->flags, error); + + if (conn->driver->connectBaselineHypervisorCPU) { + char *cpu; +-- +2.22.0 + diff --git a/SOURCES/libvirt-api-disallow-virConnectGetDomainCapabilities-on-read-only-connections.patch b/SOURCES/libvirt-api-disallow-virConnectGetDomainCapabilities-on-read-only-connections.patch new file mode 100644 index 0000000..6815a55 --- /dev/null +++ b/SOURCES/libvirt-api-disallow-virConnectGetDomainCapabilities-on-read-only-connections.patch @@ -0,0 +1,38 @@ +From 2b0e20b240848c84932aa549e8ec2b6e0a5646fa Mon Sep 17 00:00:00 2001 +Message-Id: <2b0e20b240848c84932aa549e8ec2b6e0a5646fa@dist-git> +From: =?UTF-8?q?J=C3=A1n=20Tomko?= +Date: Tue, 18 Jun 2019 13:30:01 +0200 +Subject: [PATCH] api: disallow virConnectGetDomainCapabilities on read-only + connections +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This API can be used to execute arbitrary emulators. +Forbid it on read-only connections. + +Fixes: CVE-2019-10167 +Signed-off-by: Ján Tomko +Reviewed-by: Daniel P. BerrangĂ© +Signed-off-by: Ján Tomko +Message-Id: +Reviewed-by: Jiri Denemark +--- + src/libvirt-domain.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c +index 3855dfe0dd..a1c913bd86 100644 +--- a/src/libvirt-domain.c ++++ b/src/libvirt-domain.c +@@ -11279,6 +11279,7 @@ virConnectGetDomainCapabilities(virConnectPtr conn, + virResetLastError(); + + virCheckConnectReturn(conn, NULL); ++ virCheckReadOnlyGoto(conn->flags, error); + + if (conn->driver->connectGetDomainCapabilities) { + char *ret; +-- +2.22.0 + diff --git a/SOURCES/libvirt-api-disallow-virDomainManagedSaveDefineXML-on-read-only-connections.patch b/SOURCES/libvirt-api-disallow-virDomainManagedSaveDefineXML-on-read-only-connections.patch new file mode 100644 index 0000000..c02b5b9 --- /dev/null +++ b/SOURCES/libvirt-api-disallow-virDomainManagedSaveDefineXML-on-read-only-connections.patch @@ -0,0 +1,40 @@ +From 0673d5b707d68562732b78c89fe339e8558f8496 Mon Sep 17 00:00:00 2001 +Message-Id: <0673d5b707d68562732b78c89fe339e8558f8496@dist-git> +From: =?UTF-8?q?J=C3=A1n=20Tomko?= +Date: Tue, 18 Jun 2019 13:30:00 +0200 +Subject: [PATCH] api: disallow virDomainManagedSaveDefineXML on read-only + connections +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The virDomainManagedSaveDefineXML can be used to alter the domain's +config used for managedsave or even execute arbitrary emulator binaries. +Forbid it on read-only connections. + +Fixes: CVE-2019-10166 +Reported-by: Matthias Gerstner +Signed-off-by: Ján Tomko +Reviewed-by: Daniel P. BerrangĂ© +Signed-off-by: Ján Tomko +Message-Id: <352bf5e963a6482d426f97b0ef36ca019e69280b.1560857354.git.jtomko@redhat.com> +Reviewed-by: Jiri Denemark +--- + src/libvirt-domain.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c +index 0ba85b9360..3855dfe0dd 100644 +--- a/src/libvirt-domain.c ++++ b/src/libvirt-domain.c +@@ -9487,6 +9487,7 @@ virDomainManagedSaveDefineXML(virDomainPtr domain, const char *dxml, + + virCheckDomainReturn(domain, -1); + conn = domain->conn; ++ virCheckReadOnlyGoto(conn->flags, error); + + if (conn->driver->domainManagedSaveDefineXML) { + int ret; +-- +2.22.0 + diff --git a/SOURCES/libvirt-api-disallow-virDomainSaveImageGetXMLDesc-on-read-only-connections.patch b/SOURCES/libvirt-api-disallow-virDomainSaveImageGetXMLDesc-on-read-only-connections.patch new file mode 100644 index 0000000..f2ec040 --- /dev/null +++ b/SOURCES/libvirt-api-disallow-virDomainSaveImageGetXMLDesc-on-read-only-connections.patch @@ -0,0 +1,98 @@ +From 8533d820c378ae31176922703b7368f586a59bc0 Mon Sep 17 00:00:00 2001 +Message-Id: <8533d820c378ae31176922703b7368f586a59bc0@dist-git> +From: =?UTF-8?q?J=C3=A1n=20Tomko?= +Date: Tue, 18 Jun 2019 13:29:59 +0200 +Subject: [PATCH] api: disallow virDomainSaveImageGetXMLDesc on read-only + connections +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The virDomainSaveImageGetXMLDesc API is taking a path parameter, +which can point to any path on the system. This file will then be +read and parsed by libvirtd running with root privileges. + +Forbid it on read-only connections. + +Fixes: CVE-2019-10161 +Reported-by: Matthias Gerstner +Signed-off-by: Ján Tomko +Reviewed-by: Daniel P. BerrangĂ© +Signed-off-by: Ján Tomko + +Conflicts: + src/libvirt-domain.c + src/remote/remote_protocol.x + +Upstream commit 12a51f372 which introduced the VIR_DOMAIN_SAVE_IMAGE_XML_SECURE +alias for VIR_DOMAIN_XML_SECURE is not backported. +Just skip the commit since we now disallow the whole API on read-only +connections, regardless of the flag. +Message-Id: <4c14d609cd7b548459b9ef2f59728fa5c5e38268.1560857354.git.jtomko@redhat.com> + +Reviewed-by: Jiri Denemark +--- + src/libvirt-domain.c | 11 ++--------- + src/qemu/qemu_driver.c | 2 +- + src/remote/remote_protocol.x | 3 +-- + 3 files changed, 4 insertions(+), 12 deletions(-) + +diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c +index ad0ded9ee3..0ba85b9360 100644 +--- a/src/libvirt-domain.c ++++ b/src/libvirt-domain.c +@@ -1073,9 +1073,7 @@ virDomainRestoreFlags(virConnectPtr conn, const char *from, const char *dxml, + * previously by virDomainSave() or virDomainSaveFlags(). + * + * No security-sensitive data will be included unless @flags contains +- * VIR_DOMAIN_XML_SECURE; this flag is rejected on read-only +- * connections. For this API, @flags should not contain either +- * VIR_DOMAIN_XML_INACTIVE or VIR_DOMAIN_XML_UPDATE_CPU. ++ * VIR_DOMAIN_XML_SECURE. + * + * Returns a 0 terminated UTF-8 encoded XML instance, or NULL in case of + * error. The caller must free() the returned value. +@@ -1091,12 +1089,7 @@ virDomainSaveImageGetXMLDesc(virConnectPtr conn, const char *file, + + virCheckConnectReturn(conn, NULL); + virCheckNonNullArgGoto(file, error); +- +- if ((conn->flags & VIR_CONNECT_RO) && (flags & VIR_DOMAIN_XML_SECURE)) { +- virReportError(VIR_ERR_OPERATION_DENIED, "%s", +- _("virDomainSaveImageGetXMLDesc with secure flag")); +- goto error; +- } ++ virCheckReadOnlyGoto(conn->flags, error); + + if (conn->driver->domainSaveImageGetXMLDesc) { + char *ret; +diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c +index 88c08f88ee..2da87992fd 100644 +--- a/src/qemu/qemu_driver.c ++++ b/src/qemu/qemu_driver.c +@@ -6786,7 +6786,7 @@ qemuDomainSaveImageGetXMLDesc(virConnectPtr conn, const char *path, + if (fd < 0) + goto cleanup; + +- if (virDomainSaveImageGetXMLDescEnsureACL(conn, def, flags) < 0) ++ if (virDomainSaveImageGetXMLDescEnsureACL(conn, def) < 0) + goto cleanup; + + ret = qemuDomainDefFormatXML(driver, def, flags); +diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x +index 28c8febabd..52b92334fa 100644 +--- a/src/remote/remote_protocol.x ++++ b/src/remote/remote_protocol.x +@@ -5226,8 +5226,7 @@ enum remote_procedure { + /** + * @generate: both + * @priority: high +- * @acl: domain:read +- * @acl: domain:read_secure:VIR_DOMAIN_XML_SECURE ++ * @acl: domain:write + */ + REMOTE_PROC_DOMAIN_SAVE_IMAGE_GET_XML_DESC = 235, + +-- +2.22.0 + diff --git a/SOURCES/libvirt-bhyve-Move-autostarting-of-domains-into-bhyveStateInitialize.patch b/SOURCES/libvirt-bhyve-Move-autostarting-of-domains-into-bhyveStateInitialize.patch new file mode 100644 index 0000000..2f0f16b --- /dev/null +++ b/SOURCES/libvirt-bhyve-Move-autostarting-of-domains-into-bhyveStateInitialize.patch @@ -0,0 +1,65 @@ +From a26ad1b57617abc4de8a0d13716b898d311ee01e Mon Sep 17 00:00:00 2001 +Message-Id: +From: Michal Privoznik +Date: Thu, 27 Jun 2019 15:18:15 +0200 +Subject: [PATCH] bhyve: Move autostarting of domains into bhyveStateInitialize +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The stateAutoStart callback will go away shortly. Therefore, move +the autostart call into state initialize callback. + +Signed-off-by: Michal Privoznik +Reviewed-by: Ján Tomko +(cherry picked from commit 31c3c35c940010a793fea8351751bb04fab1a6d4) + +https://bugzilla.redhat.com/show_bug.cgi?id=1685151 + +Signed-off-by: Michal Privoznik +Message-Id: <1a93e2bef531c11190c652fcfb73b568ee73e487.1561641375.git.mprivozn@redhat.com> +Reviewed-by: Jiri Denemark +--- + src/bhyve/bhyve_driver.c | 12 ++---------- + 1 file changed, 2 insertions(+), 10 deletions(-) + +diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c +index 9284b51783..ec016ecc0c 100644 +--- a/src/bhyve/bhyve_driver.c ++++ b/src/bhyve/bhyve_driver.c +@@ -1270,6 +1270,8 @@ bhyveStateInitialize(bool privileged, + + virBhyveProcessReconnectAll(bhyve_driver); + ++ bhyveAutostartDomains(bhyve_driver); ++ + return 0; + + cleanup: +@@ -1297,15 +1299,6 @@ bhyveDriverGetGrubCaps(virConnectPtr conn) + return 0; + } + +-static void +-bhyveStateAutoStart(void) +-{ +- if (!bhyve_driver) +- return; +- +- bhyveAutostartDomains(bhyve_driver); +-} +- + static int + bhyveConnectGetMaxVcpus(virConnectPtr conn, + const char *type) +@@ -1713,7 +1706,6 @@ static virConnectDriver bhyveConnectDriver = { + static virStateDriver bhyveStateDriver = { + .name = "bhyve", + .stateInitialize = bhyveStateInitialize, +- .stateAutoStart = bhyveStateAutoStart, + .stateCleanup = bhyveStateCleanup, + }; + +-- +2.22.0 + diff --git a/SOURCES/libvirt-conf-Add-definitions-for-uid-and-fid-PCI-address-attributes.patch b/SOURCES/libvirt-conf-Add-definitions-for-uid-and-fid-PCI-address-attributes.patch new file mode 100644 index 0000000..17eb235 --- /dev/null +++ b/SOURCES/libvirt-conf-Add-definitions-for-uid-and-fid-PCI-address-attributes.patch @@ -0,0 +1,67 @@ +From dd083516c7057ee50e59290643634156daf0773b Mon Sep 17 00:00:00 2001 +Message-Id: +From: Yi Min Zhao +Date: Mon, 8 Apr 2019 10:57:18 +0200 +Subject: [PATCH] conf: Add definitions for 'uid' and 'fid' PCI address + attributes +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Add zPCI definitions in preparation of extending the PCI address +with parameters uid (user-defined identifier) and fid (PCI function +identifier). + +Signed-off-by: Yi Min Zhao +Reviewed-by: Boris Fiuczynski +Reviewed-by: Stefan Zimmermann +Reviewed-by: Bjoern Walk +Reviewed-by: Ján Tomko +Reviewed-by: Andrea Bolognani + +(cherry-picked from commit 30522c78c11d9ff6c6c177dfca4a0da8057095fe) + +https://bugzilla.redhat.com/show_bug.cgi?id=1508149 + +Signed-off-by: Andrea Bolognani +Message-Id: <20190408085732.28684-2-abologna@redhat.com> +Reviewed-by: Laine Stump +Reviewed-by: Ján Tomko +--- + cfg.mk | 1 + + src/util/virpci.h | 7 +++++++ + 2 files changed, 8 insertions(+) + +diff --git a/cfg.mk b/cfg.mk +index e3e94bf6f0..7fd2b1dcb6 100644 +--- a/cfg.mk ++++ b/cfg.mk +@@ -472,6 +472,7 @@ sc_prohibit_canonicalize_file_name: + # Insist on correct types for [pug]id. + sc_correct_id_types: + @prohibit='\<(int|long) *[pug]id\>' \ ++ exclude='exempt from syntax-check' \ + halt='use pid_t for pid, uid_t for uid, gid_t for gid' \ + $(_sc_search_regexp) + +diff --git a/src/util/virpci.h b/src/util/virpci.h +index 794b7e59db..01df652b86 100644 +--- a/src/util/virpci.h ++++ b/src/util/virpci.h +@@ -36,6 +36,13 @@ typedef virPCIDeviceAddress *virPCIDeviceAddressPtr; + typedef struct _virPCIDeviceList virPCIDeviceList; + typedef virPCIDeviceList *virPCIDeviceListPtr; + ++typedef struct _virZPCIDeviceAddress virZPCIDeviceAddress; ++typedef virZPCIDeviceAddress *virZPCIDeviceAddressPtr; ++struct _virZPCIDeviceAddress { ++ unsigned int uid; /* exempt from syntax-check */ ++ unsigned int fid; ++}; ++ + struct _virPCIDeviceAddress { + unsigned int domain; + unsigned int bus; +-- +2.22.0 + diff --git a/SOURCES/libvirt-conf-Add-validation-of-input-devices.patch b/SOURCES/libvirt-conf-Add-validation-of-input-devices.patch new file mode 100644 index 0000000..5f9dbbb --- /dev/null +++ b/SOURCES/libvirt-conf-Add-validation-of-input-devices.patch @@ -0,0 +1,76 @@ +From c2afbedc310ac1a65a5ee96c8fa4103e926483c4 Mon Sep 17 00:00:00 2001 +Message-Id: +From: Han Han +Date: Tue, 28 Aug 2018 10:30:51 +0200 +Subject: [PATCH] conf: Add validation of input devices +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +https://bugzilla.redhat.com/show_bug.cgi?id=1591151 + +Add function virDomainInputDefValidate to validate input devices. +Make sure evdev attribute of source element is not used by mouse, +keyboard, and tablet input device. + +Signed-off-by: Han Han +Reviewed-by: John Ferlan +(cherry picked from commit deb057fd364cb57614c6dea7b05c247231f9ae4f) +Signed-off-by: Ján Tomko + +https: //bugzilla.redhat.com/show_bug.cgi?id=1591240 +Reviewed-by: Andrea Bolognani +--- + src/conf/domain_conf.c | 27 ++++++++++++++++++++++++++- + 1 file changed, 26 insertions(+), 1 deletion(-) + +diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c +index 51a79ad8b1..16e52d149d 100644 +--- a/src/conf/domain_conf.c ++++ b/src/conf/domain_conf.c +@@ -5760,6 +5760,29 @@ virDomainVsockDefValidate(const virDomainVsockDef *vsock) + return 0; + } + ++static int ++virDomainInputDefValidate(const virDomainInputDef *input) ++{ ++ switch ((virDomainInputType) input->type) { ++ case VIR_DOMAIN_INPUT_TYPE_MOUSE: ++ case VIR_DOMAIN_INPUT_TYPE_TABLET: ++ case VIR_DOMAIN_INPUT_TYPE_KBD: ++ case VIR_DOMAIN_INPUT_TYPE_LAST: ++ if (input->source.evdev) { ++ virReportError(VIR_ERR_XML_ERROR, "%s", ++ _("setting source evdev path only supported for " ++ "passthrough input devices")); ++ return -1; ++ } ++ break; ++ ++ case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH: ++ break; ++ } ++ ++ return 0; ++} ++ + + static int + virDomainDeviceDefValidateInternal(const virDomainDeviceDef *dev, +@@ -5799,9 +5822,11 @@ virDomainDeviceDefValidateInternal(const virDomainDeviceDef *dev, + case VIR_DOMAIN_DEVICE_VSOCK: + return virDomainVsockDefValidate(dev->data.vsock); + ++ case VIR_DOMAIN_DEVICE_INPUT: ++ return virDomainInputDefValidate(dev->data.input); ++ + case VIR_DOMAIN_DEVICE_LEASE: + case VIR_DOMAIN_DEVICE_FS: +- case VIR_DOMAIN_DEVICE_INPUT: + case VIR_DOMAIN_DEVICE_SOUND: + case VIR_DOMAIN_DEVICE_WATCHDOG: + case VIR_DOMAIN_DEVICE_GRAPHICS: +-- +2.18.0 + diff --git a/SOURCES/libvirt-conf-Allocate-release-uid-and-fid-in-PCI-address.patch b/SOURCES/libvirt-conf-Allocate-release-uid-and-fid-in-PCI-address.patch new file mode 100644 index 0000000..d99def9 --- /dev/null +++ b/SOURCES/libvirt-conf-Allocate-release-uid-and-fid-in-PCI-address.patch @@ -0,0 +1,527 @@ +From 87e3a5f2f797c79516a560ddc224074c834ef528 Mon Sep 17 00:00:00 2001 +Message-Id: <87e3a5f2f797c79516a560ddc224074c834ef528@dist-git> +From: Yi Min Zhao +Date: Mon, 8 Apr 2019 10:57:27 +0200 +Subject: [PATCH] conf: Allocate/release 'uid' and 'fid' in PCI address +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This patch adds new functions for reservation, assignment and release +to handle the uid/fid. If the uid/fid is defined in the domain XML, +they will be reserved directly in the collecting phase. If any of them +is not defined, we will find out an available value for them from the +zPCI address hashtable, and reserve them. For the hotplug case there +might not be a zPCI definition. So allocate and reserve uid/fid the +case. Assign if needed and reserve uid/fid for the defined case. + +Signed-off-by: Yi Min Zhao +Reviewed-by: Bjoern Walk +Reviewed-by: Boris Fiuczynski +Reviewed-by: Andrea Bolognani + +(cherry picked from commit f183b87fc1dbcc6446ac3c1cef9cdd345b9725fb) + +https://bugzilla.redhat.com/show_bug.cgi?id=1508149 + +Conflicts: + + * src/libvirt_private.syms + + several symbols are not present in the list + - missing 9ad119f4db5, ab3f781a10c, edeef779585, b899726faa5 + + * src/qemu/qemu_domain_address.c + + the old name for virDeviceInfoPCIAddressIsPresent() is used + - missing 76151a53a100 + +Signed-off-by: Andrea Bolognani +Message-Id: <20190408085732.28684-11-abologna@redhat.com> +Reviewed-by: Laine Stump +Reviewed-by: Ján Tomko +--- + src/conf/device_conf.c | 16 +++ + src/conf/device_conf.h | 3 + + src/conf/domain_addr.c | 244 +++++++++++++++++++++++++++++++++ + src/conf/domain_addr.h | 12 ++ + src/libvirt_private.syms | 5 + + src/qemu/qemu_domain_address.c | 59 +++++++- + 6 files changed, 338 insertions(+), 1 deletion(-) + +diff --git a/src/conf/device_conf.c b/src/conf/device_conf.c +index cadac32603..76370d30a2 100644 +--- a/src/conf/device_conf.c ++++ b/src/conf/device_conf.c +@@ -28,6 +28,7 @@ + #include "viruuid.h" + #include "virbuffer.h" + #include "device_conf.h" ++#include "domain_addr.h" + #include "virstring.h" + + #define VIR_FROM_THIS VIR_FROM_DEVICE +@@ -230,6 +231,21 @@ int virPCIDeviceAddressIsValid(virPCIDeviceAddressPtr addr, + } + + ++bool ++virDeviceInfoPCIAddressExtensionIsWanted(const virDomainDeviceInfo *info) ++{ ++ return (info->addr.pci.extFlags & VIR_PCI_ADDRESS_EXTENSION_ZPCI) && ++ virZPCIDeviceAddressIsEmpty(&info->addr.pci.zpci); ++} ++ ++bool ++virDeviceInfoPCIAddressExtensionIsPresent(const virDomainDeviceInfo *info) ++{ ++ return (info->addr.pci.extFlags & VIR_PCI_ADDRESS_EXTENSION_ZPCI) && ++ !virZPCIDeviceAddressIsEmpty(&info->addr.pci.zpci); ++} ++ ++ + int + virPCIDeviceAddressParseXML(xmlNodePtr node, + virPCIDeviceAddressPtr addr) +diff --git a/src/conf/device_conf.h b/src/conf/device_conf.h +index c79066ec02..6bef2f093a 100644 +--- a/src/conf/device_conf.h ++++ b/src/conf/device_conf.h +@@ -214,6 +214,9 @@ virDeviceInfoPCIAddressPresent(const virDomainDeviceInfo *info) + !virPCIDeviceAddressIsEmpty(&info->addr.pci); + } + ++bool virDeviceInfoPCIAddressExtensionIsWanted(const virDomainDeviceInfo *info); ++bool virDeviceInfoPCIAddressExtensionIsPresent(const virDomainDeviceInfo *info); ++ + int virPCIDeviceAddressParseXML(xmlNodePtr node, + virPCIDeviceAddressPtr addr); + +diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c +index 9e0a0fdf95..a58910c394 100644 +--- a/src/conf/domain_addr.c ++++ b/src/conf/domain_addr.c +@@ -33,6 +33,238 @@ + + VIR_LOG_INIT("conf.domain_addr"); + ++static int ++virDomainZPCIAddressReserveId(virHashTablePtr set, ++ unsigned int id, ++ const char *name) ++{ ++ if (virHashLookup(set, &id)) { ++ virReportError(VIR_ERR_INTERNAL_ERROR, ++ _("zPCI %s %o is already reserved"), ++ name, id); ++ return -1; ++ } ++ ++ if (virHashAddEntry(set, &id, (void*)1) < 0) { ++ virReportError(VIR_ERR_INTERNAL_ERROR, ++ _("Failed to reserve %s %o"), ++ name, id); ++ return -1; ++ } ++ ++ return 0; ++} ++ ++ ++static int ++virDomainZPCIAddressReserveUid(virHashTablePtr set, ++ virZPCIDeviceAddressPtr addr) ++{ ++ return virDomainZPCIAddressReserveId(set, addr->uid, "uid"); ++} ++ ++ ++static int ++virDomainZPCIAddressReserveFid(virHashTablePtr set, ++ virZPCIDeviceAddressPtr addr) ++{ ++ return virDomainZPCIAddressReserveId(set, addr->fid, "fid"); ++} ++ ++ ++static int ++virDomainZPCIAddressAssignId(virHashTablePtr set, ++ unsigned int *id, ++ unsigned int min, ++ unsigned int max, ++ const char *name) ++{ ++ while (virHashLookup(set, &min)) { ++ if (min == max) { ++ virReportError(VIR_ERR_INTERNAL_ERROR, ++ _("There is no more free %s."), ++ name); ++ return -1; ++ } ++ ++min; ++ } ++ *id = min; ++ ++ return 0; ++} ++ ++ ++static int ++virDomainZPCIAddressAssignUid(virHashTablePtr set, ++ virZPCIDeviceAddressPtr addr) ++{ ++ return virDomainZPCIAddressAssignId(set, &addr->uid, 1, ++ VIR_DOMAIN_DEVICE_ZPCI_MAX_UID, "uid"); ++} ++ ++ ++static int ++virDomainZPCIAddressAssignFid(virHashTablePtr set, ++ virZPCIDeviceAddressPtr addr) ++{ ++ return virDomainZPCIAddressAssignId(set, &addr->fid, 0, ++ VIR_DOMAIN_DEVICE_ZPCI_MAX_FID, "fid"); ++} ++ ++ ++static void ++virDomainZPCIAddressReleaseId(virHashTablePtr set, ++ unsigned int *id, ++ const char *name) ++{ ++ if (virHashRemoveEntry(set, id) < 0) { ++ virReportError(VIR_ERR_INTERNAL_ERROR, ++ _("Release %s %o failed"), ++ name, *id); ++ } ++ ++ *id = 0; ++} ++ ++ ++static void ++virDomainZPCIAddressReleaseUid(virHashTablePtr set, ++ virZPCIDeviceAddressPtr addr) ++{ ++ virDomainZPCIAddressReleaseId(set, &addr->uid, "uid"); ++} ++ ++ ++static void ++virDomainZPCIAddressReleaseFid(virHashTablePtr set, ++ virZPCIDeviceAddressPtr addr) ++{ ++ virDomainZPCIAddressReleaseId(set, &addr->fid, "fid"); ++} ++ ++ ++static void ++virDomainZPCIAddressReleaseIds(virDomainZPCIAddressIdsPtr zpciIds, ++ virZPCIDeviceAddressPtr addr) ++{ ++ if (!zpciIds || virZPCIDeviceAddressIsEmpty(addr)) ++ return; ++ ++ virDomainZPCIAddressReleaseUid(zpciIds->uids, addr); ++ ++ virDomainZPCIAddressReleaseFid(zpciIds->fids, addr); ++} ++ ++ ++static int ++virDomainZPCIAddressReserveNextUid(virHashTablePtr uids, ++ virZPCIDeviceAddressPtr zpci) ++{ ++ if (virDomainZPCIAddressAssignUid(uids, zpci) < 0) ++ return -1; ++ ++ if (virDomainZPCIAddressReserveUid(uids, zpci) < 0) ++ return -1; ++ ++ return 0; ++} ++ ++ ++static int ++virDomainZPCIAddressReserveNextFid(virHashTablePtr fids, ++ virZPCIDeviceAddressPtr zpci) ++{ ++ if (virDomainZPCIAddressAssignFid(fids, zpci) < 0) ++ return -1; ++ ++ if (virDomainZPCIAddressReserveFid(fids, zpci) < 0) ++ return -1; ++ ++ return 0; ++} ++ ++ ++static int ++virDomainZPCIAddressReserveAddr(virDomainZPCIAddressIdsPtr zpciIds, ++ virZPCIDeviceAddressPtr addr) ++{ ++ if (virDomainZPCIAddressReserveUid(zpciIds->uids, addr) < 0) ++ return -1; ++ ++ if (virDomainZPCIAddressReserveFid(zpciIds->fids, addr) < 0) { ++ virDomainZPCIAddressReleaseUid(zpciIds->uids, addr); ++ return -1; ++ } ++ ++ return 0; ++} ++ ++ ++static int ++virDomainZPCIAddressReserveNextAddr(virDomainZPCIAddressIdsPtr zpciIds, ++ virZPCIDeviceAddressPtr addr) ++{ ++ if (virDomainZPCIAddressReserveNextUid(zpciIds->uids, addr) < 0) ++ return -1; ++ ++ if (virDomainZPCIAddressReserveNextFid(zpciIds->fids, addr) < 0) { ++ virDomainZPCIAddressReleaseUid(zpciIds->uids, addr); ++ return -1; ++ } ++ ++ return 0; ++} ++ ++ ++int ++virDomainPCIAddressExtensionReserveAddr(virDomainPCIAddressSetPtr addrs, ++ virPCIDeviceAddressPtr addr) ++{ ++ if (addr->extFlags & VIR_PCI_ADDRESS_EXTENSION_ZPCI) { ++ /* Reserve uid/fid to ZPCI device which has defined uid/fid ++ * in the domain. ++ */ ++ return virDomainZPCIAddressReserveAddr(addrs->zpciIds, &addr->zpci); ++ } ++ ++ return 0; ++} ++ ++ ++int ++virDomainPCIAddressExtensionReserveNextAddr(virDomainPCIAddressSetPtr addrs, ++ virPCIDeviceAddressPtr addr) ++{ ++ if (addr->extFlags & VIR_PCI_ADDRESS_EXTENSION_ZPCI) { ++ virZPCIDeviceAddress zpci = { 0 }; ++ ++ if (virDomainZPCIAddressReserveNextAddr(addrs->zpciIds, &zpci) < 0) ++ return -1; ++ ++ if (!addrs->dryRun) ++ addr->zpci = zpci; ++ } ++ ++ return 0; ++} ++ ++static int ++virDomainPCIAddressExtensionEnsureAddr(virDomainPCIAddressSetPtr addrs, ++ virPCIDeviceAddressPtr addr) ++{ ++ if (addr->extFlags & VIR_PCI_ADDRESS_EXTENSION_ZPCI) { ++ virZPCIDeviceAddressPtr zpci = &addr->zpci; ++ ++ if (virZPCIDeviceAddressIsEmpty(zpci)) ++ return virDomainZPCIAddressReserveNextAddr(addrs->zpciIds, zpci); ++ else ++ return virDomainZPCIAddressReserveAddr(addrs->zpciIds, zpci); ++ } ++ ++ return 0; ++} ++ ++ + virDomainPCIConnectFlags + virDomainPCIControllerModelToConnectType(virDomainControllerModelPCI model) + { +@@ -729,12 +961,24 @@ virDomainPCIAddressEnsureAddr(virDomainPCIAddressSetPtr addrs, + ret = virDomainPCIAddressReserveNextAddr(addrs, dev, flags, -1); + } + ++ dev->addr.pci.extFlags = dev->pciAddrExtFlags; ++ ret = virDomainPCIAddressExtensionEnsureAddr(addrs, &dev->addr.pci); ++ + cleanup: + VIR_FREE(addrStr); + return ret; + } + + ++void ++virDomainPCIAddressExtensionReleaseAddr(virDomainPCIAddressSetPtr addrs, ++ virPCIDeviceAddressPtr addr) ++{ ++ if (addr->extFlags & VIR_PCI_ADDRESS_EXTENSION_ZPCI) ++ virDomainZPCIAddressReleaseIds(addrs->zpciIds, &addr->zpci); ++} ++ ++ + void + virDomainPCIAddressReleaseAddr(virDomainPCIAddressSetPtr addrs, + virPCIDeviceAddressPtr addr) +diff --git a/src/conf/domain_addr.h b/src/conf/domain_addr.h +index b01e6b9d20..e5ce4868d5 100644 +--- a/src/conf/domain_addr.h ++++ b/src/conf/domain_addr.h +@@ -166,6 +166,14 @@ bool virDomainPCIAddressSlotInUse(virDomainPCIAddressSetPtr addrs, + virPCIDeviceAddressPtr addr) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); + ++int virDomainPCIAddressExtensionReserveAddr(virDomainPCIAddressSetPtr addrs, ++ virPCIDeviceAddressPtr addr) ++ ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); ++ ++int virDomainPCIAddressExtensionReserveNextAddr(virDomainPCIAddressSetPtr addrs, ++ virPCIDeviceAddressPtr addr) ++ ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); ++ + int virDomainPCIAddressReserveAddr(virDomainPCIAddressSetPtr addrs, + virPCIDeviceAddressPtr addr, + virDomainPCIConnectFlags flags, +@@ -187,6 +195,10 @@ void virDomainPCIAddressReleaseAddr(virDomainPCIAddressSetPtr addrs, + virPCIDeviceAddressPtr addr) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); + ++void virDomainPCIAddressExtensionReleaseAddr(virDomainPCIAddressSetPtr addrs, ++ virPCIDeviceAddressPtr addr) ++ ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); ++ + void virDomainPCIAddressSetAllMulti(virDomainDefPtr def) + ATTRIBUTE_NONNULL(1); + +diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms +index b2a2a1f265..ee7625b0f3 100644 +--- a/src/libvirt_private.syms ++++ b/src/libvirt_private.syms +@@ -93,6 +93,8 @@ virCPUModeTypeToString; + + + # conf/device_conf.h ++virDeviceInfoPCIAddressExtensionIsPresent; ++virDeviceInfoPCIAddressExtensionIsWanted; + virDomainDeviceInfoAddressIsEqual; + virDomainDeviceInfoCopy; + virInterfaceLinkFormat; +@@ -114,6 +116,9 @@ virDomainPCIAddressAsString; + virDomainPCIAddressBusIsFullyReserved; + virDomainPCIAddressBusSetModel; + virDomainPCIAddressEnsureAddr; ++virDomainPCIAddressExtensionReleaseAddr; ++virDomainPCIAddressExtensionReserveAddr; ++virDomainPCIAddressExtensionReserveNextAddr; + virDomainPCIAddressReleaseAddr; + virDomainPCIAddressReserveAddr; + virDomainPCIAddressReserveNextAddr; +diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c +index ba870d56b1..8338241cba 100644 +--- a/src/qemu/qemu_domain_address.c ++++ b/src/qemu/qemu_domain_address.c +@@ -1405,6 +1405,24 @@ qemuDomainPCIAddressReserveNextAddr(virDomainPCIAddressSetPtr addrs, + } + + ++static int ++qemuDomainAssignPCIAddressExtension(virDomainDefPtr def ATTRIBUTE_UNUSED, ++ virDomainDeviceDefPtr device ATTRIBUTE_UNUSED, ++ virDomainDeviceInfoPtr info, ++ void *opaque) ++{ ++ virDomainPCIAddressSetPtr addrs = opaque; ++ virPCIDeviceAddressPtr addr = &info->addr.pci; ++ ++ if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) ++ addr->extFlags = info->pciAddrExtFlags; ++ ++ if (virDeviceInfoPCIAddressExtensionIsWanted(info)) ++ return virDomainPCIAddressExtensionReserveNextAddr(addrs, addr); ++ ++ return 0; ++} ++ + static int + qemuDomainCollectPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED, + virDomainDeviceDefPtr device, +@@ -1498,6 +1516,31 @@ qemuDomainCollectPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED, + return ret; + } + ++static int ++qemuDomainCollectPCIAddressExtension(virDomainDefPtr def ATTRIBUTE_UNUSED, ++ virDomainDeviceDefPtr device, ++ virDomainDeviceInfoPtr info, ++ void *opaque) ++{ ++ virDomainPCIAddressSetPtr addrs = opaque; ++ virPCIDeviceAddressPtr addr = &info->addr.pci; ++ ++ if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) ++ addr->extFlags = info->pciAddrExtFlags; ++ ++ if (!virDeviceInfoPCIAddressExtensionIsPresent(info) || ++ ((device->type == VIR_DOMAIN_DEVICE_HOSTDEV) && ++ (device->data.hostdev->parent.type != VIR_DOMAIN_DEVICE_NONE))) { ++ /* If a hostdev has a parent, its info will be a part of the ++ * parent, and will have its address collected during the scan ++ * of the parent's device type. ++ */ ++ return 0; ++ } ++ ++ return virDomainPCIAddressExtensionReserveAddr(addrs, addr); ++} ++ + static virDomainPCIAddressSetPtr + qemuDomainPCIAddressSetCreate(virDomainDefPtr def, + virQEMUCapsPtr qemuCaps, +@@ -1589,6 +1632,12 @@ qemuDomainPCIAddressSetCreate(virDomainDefPtr def, + if (virDomainDeviceInfoIterate(def, qemuDomainCollectPCIAddress, addrs) < 0) + goto error; + ++ if (virDomainDeviceInfoIterate(def, ++ qemuDomainCollectPCIAddressExtension, ++ addrs) < 0) { ++ goto error; ++ } ++ + return addrs; + + error: +@@ -2590,6 +2639,9 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, + if (qemuDomainAssignDevicePCISlots(def, qemuCaps, addrs) < 0) + goto cleanup; + ++ if (virDomainDeviceInfoIterate(def, qemuDomainAssignPCIAddressExtension, addrs) < 0) ++ goto cleanup; ++ + /* Only for *new* domains with pcie-root (and no other + * manually specified PCI controllers in the definition): If, + * after assigning addresses/reserving slots for all devices, +@@ -2684,6 +2736,9 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, + if (qemuDomainAssignDevicePCISlots(def, qemuCaps, addrs) < 0) + goto cleanup; + ++ if (virDomainDeviceInfoIterate(def, qemuDomainAssignPCIAddressExtension, addrs) < 0) ++ goto cleanup; ++ + /* set multi attribute for devices at function 0 of + * any slot that has multiple functions in use + */ +@@ -3143,8 +3198,10 @@ qemuDomainReleaseDeviceAddress(virDomainObjPtr vm, + if (!devstr) + devstr = info->alias; + +- if (virDeviceInfoPCIAddressPresent(info)) ++ if (virDeviceInfoPCIAddressPresent(info)) { + virDomainPCIAddressReleaseAddr(priv->pciaddrs, &info->addr.pci); ++ virDomainPCIAddressExtensionReleaseAddr(priv->pciaddrs, &info->addr.pci); ++ } + + if (virDomainUSBAddressRelease(priv->usbaddrs, info) < 0) + VIR_WARN("Unable to release USB address on %s", NULLSTR(devstr)); +-- +2.22.0 + diff --git a/SOURCES/libvirt-conf-Expose-virDomainSCSIDriveAddressIsUsed.patch b/SOURCES/libvirt-conf-Expose-virDomainSCSIDriveAddressIsUsed.patch new file mode 100644 index 0000000..9d79b6a --- /dev/null +++ b/SOURCES/libvirt-conf-Expose-virDomainSCSIDriveAddressIsUsed.patch @@ -0,0 +1,69 @@ +From 2e3774564235a185a2cc4b7a22c17de17498db68 Mon Sep 17 00:00:00 2001 +Message-Id: <2e3774564235a185a2cc4b7a22c17de17498db68@dist-git> +From: Michal Privoznik +Date: Thu, 18 Apr 2019 19:36:31 +0200 +Subject: [PATCH] conf: Expose virDomainSCSIDriveAddressIsUsed + +RHEl-7.7: https://bugzilla.redhat.com/show_bug.cgi?id=1692296 +RHEL-8.1.0: https://bugzilla.redhat.com/show_bug.cgi?id=1692354 + +This function checks if given drive address is already present in +passed domain definition. Expose the function as it will be used +shortly. + +Signed-off-by: Michal Privoznik +Tested-by: Daniel Henrique Barboza +Reviewed-by: Jim Fehlig +(cherry picked from commit 89237d534f0fe950d06a2081089154160c6c2224) +Signed-off-by: Michal Privoznik +Message-Id: +Reviewed-by: Jiri Denemark +--- + src/conf/domain_conf.c | 2 +- + src/conf/domain_conf.h | 4 ++++ + src/libvirt_private.syms | 1 + + 3 files changed, 6 insertions(+), 1 deletion(-) + +diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c +index d431441f62..e62f78471c 100644 +--- a/src/conf/domain_conf.c ++++ b/src/conf/domain_conf.c +@@ -4404,7 +4404,7 @@ virDomainDriveAddressIsUsedByHostdev(const virDomainDef *def, + * Return true if the SCSI drive address is already in use, false + * otherwise. + */ +-static bool ++bool + virDomainSCSIDriveAddressIsUsed(const virDomainDef *def, + const virDomainDeviceDriveAddress *addr) + { +diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h +index f05fca284f..dbccf2cf24 100644 +--- a/src/conf/domain_conf.h ++++ b/src/conf/domain_conf.h +@@ -2789,6 +2789,10 @@ virDomainXMLNamespacePtr + virDomainXMLOptionGetNamespace(virDomainXMLOptionPtr xmlopt) + ATTRIBUTE_NONNULL(1); + ++bool ++virDomainSCSIDriveAddressIsUsed(const virDomainDef *def, ++ const virDomainDeviceDriveAddress *addr); ++ + int virDomainDefPostParse(virDomainDefPtr def, + virCapsPtr caps, + unsigned int parseFlags, +diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms +index 624151056a..df27ac4b3a 100644 +--- a/src/libvirt_private.syms ++++ b/src/libvirt_private.syms +@@ -520,6 +520,7 @@ virDomainRunningReasonTypeToString; + virDomainSaveConfig; + virDomainSaveStatus; + virDomainSaveXML; ++virDomainSCSIDriveAddressIsUsed; + virDomainSeclabelTypeFromString; + virDomainSeclabelTypeToString; + virDomainShmemDefEquals; +-- +2.21.0 + diff --git a/SOURCES/libvirt-conf-Fix-a-error-msg-typo-in-virDomainVideoDefValidate.patch b/SOURCES/libvirt-conf-Fix-a-error-msg-typo-in-virDomainVideoDefValidate.patch new file mode 100644 index 0000000..c848359 --- /dev/null +++ b/SOURCES/libvirt-conf-Fix-a-error-msg-typo-in-virDomainVideoDefValidate.patch @@ -0,0 +1,35 @@ +From b1c91c78451c59b0ebe3aafa17eef764e69be28c Mon Sep 17 00:00:00 2001 +Message-Id: +From: Han Han +Date: Tue, 31 Jul 2018 10:42:27 +0200 +Subject: [PATCH] conf: Fix a error msg typo in virDomainVideoDefValidate + +https://bugzilla.redhat.com/show_bug.cgi?id=1607825 + +Introduced by commit d48813e8. + +Signed-off-by: Han Han +Reviewed-by: Erik Skultety +(cherry picked from commit d1c4480390da7243e37daee37f8a40cb439a6a7c) +Signed-off-by: Erik Skultety +Reviewed-by: Jiri Denemark +--- + src/conf/domain_conf.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c +index 23288aa01b..a05aad056d 100644 +--- a/src/conf/domain_conf.c ++++ b/src/conf/domain_conf.c +@@ -5697,7 +5697,7 @@ virDomainVideoDefValidate(const virDomainVideoDef *video, + if (def->videos[i]->type == VIR_DOMAIN_VIDEO_TYPE_NONE && + def->nvideos > 1) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", +- _("a '%s' video type must be the only video device " ++ _("a 'none' video type must be the only video device " + "defined for the domain")); + return -1; + } +-- +2.18.0 + diff --git a/SOURCES/libvirt-conf-Fix-check-for-chardev-source-path.patch b/SOURCES/libvirt-conf-Fix-check-for-chardev-source-path.patch new file mode 100644 index 0000000..6aa4fef --- /dev/null +++ b/SOURCES/libvirt-conf-Fix-check-for-chardev-source-path.patch @@ -0,0 +1,113 @@ +From 27213f01f9320cf0fec49980f78a100e64025ba4 Mon Sep 17 00:00:00 2001 +Message-Id: <27213f01f9320cf0fec49980f78a100e64025ba4@dist-git> +From: Andrea Bolognani +Date: Fri, 7 Sep 2018 17:53:32 +0200 +Subject: [PATCH] conf: Fix check for chardev source path +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Attempting to use a chardev definition like + + + + + +correctly results in an error being reported, since the source +path - a required piece of information - is missing; however, +the very similar + + + + + +was happily accepted by libvirt, only to result in libvirtd +crashing as soon as the guest was started. + +The issue was caused by checking the chardev's targetType +against whitelisted values from virDomainChrChannelTargetType +without first checking the chardev's deviceType to make sure +it is actually a channel, for which the check makes sense, +rather than a different type of chardev. + +The only reason this wasn't spotted earlier is that the +whitelisted values just so happen to correspond to USB and +PCI serial devices and Xen and UML consoles respectively, +all of which are fairly uncommon. + +https://bugzilla.redhat.com/show_bug.cgi?id=1609720 + +Signed-off-by: Andrea Bolognani +Reviewed-by: Ján Tomko +(cherry picked from commit 614193fac67445a7e92bf620ffef726ed1bd6f07) + +https://bugzilla.redhat.com/show_bug.cgi?id=1609723 + +Signed-off-by: Andrea Bolognani +Reviewed-by: Erik Skultety +--- + src/conf/domain_conf.c | 11 +++++++---- + .../serial-unix-missing-source.xml | 15 +++++++++++++++ + tests/qemuxml2argvtest.c | 1 + + 3 files changed, 23 insertions(+), 4 deletions(-) + create mode 100644 tests/qemuxml2argvdata/serial-unix-missing-source.xml + +diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c +index a881b43b51..240b33f28c 100644 +--- a/src/conf/domain_conf.c ++++ b/src/conf/domain_conf.c +@@ -5523,11 +5523,14 @@ virDomainChrSourceDefValidate(const virDomainChrSourceDef *def, + break; + + case VIR_DOMAIN_CHR_TYPE_UNIX: +- /* path can be auto generated */ ++ /* The source path can be auto generated for certain specific ++ * types of channels, but in most cases we should report an ++ * error if the user didn't provide it */ + if (!def->data.nix.path && +- (!chr_def || +- (chr_def->targetType != VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_XEN && +- chr_def->targetType != VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO))) { ++ !(chr_def && ++ chr_def->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL && ++ (chr_def->targetType == VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_XEN || ++ chr_def->targetType == VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO))) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Missing source path attribute for char device")); + return -1; +diff --git a/tests/qemuxml2argvdata/serial-unix-missing-source.xml b/tests/qemuxml2argvdata/serial-unix-missing-source.xml +new file mode 100644 +index 0000000000..1e1221f12d +--- /dev/null ++++ b/tests/qemuxml2argvdata/serial-unix-missing-source.xml +@@ -0,0 +1,15 @@ ++ ++ guest ++ c7a5fdbd-edaf-9455-926a-d65c16db1809 ++ 1048576 ++ 1 ++ ++ hvm ++ ++ ++ /usr/bin/qemu-system-aarch64 ++ ++ ++ ++ ++ +diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c +index 608a2b6ce3..ebe9c8a131 100644 +--- a/tests/qemuxml2argvtest.c ++++ b/tests/qemuxml2argvtest.c +@@ -1363,6 +1363,7 @@ mymain(void) + DO_TEST("serial-unix-chardev", + QEMU_CAPS_DEVICE_ISA_SERIAL); + DO_TEST_CAPS_LATEST("serial-unix-chardev"); ++ DO_TEST_PARSE_ERROR("serial-unix-missing-source", NONE); + DO_TEST("serial-tcp-chardev", + QEMU_CAPS_DEVICE_ISA_SERIAL); + DO_TEST("serial-udp-chardev", +-- +2.19.1 + diff --git a/SOURCES/libvirt-conf-Introduce-address-caching-for-PCI-extensions.patch b/SOURCES/libvirt-conf-Introduce-address-caching-for-PCI-extensions.patch new file mode 100644 index 0000000..a186a21 --- /dev/null +++ b/SOURCES/libvirt-conf-Introduce-address-caching-for-PCI-extensions.patch @@ -0,0 +1,241 @@ +From 7888472ef1d57d992995a16dc7c9ba0fe18562a8 Mon Sep 17 00:00:00 2001 +Message-Id: <7888472ef1d57d992995a16dc7c9ba0fe18562a8@dist-git> +From: Yi Min Zhao +Date: Mon, 8 Apr 2019 10:57:22 +0200 +Subject: [PATCH] conf: Introduce address caching for PCI extensions +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This patch provides a caching mechanism for the device address +extensions uid and fid on S390. For efficient sparse address allocation, +we introduce two hash tables for uid/fid which hold the address set +information per domain. Also in order to improve performance of +searching available value, we introduce our own callbacks for the two +hashtables. In this way, uid/fid is saved in hash key and hash value +could be any non-NULL pointer due to no operation on hash value. That is +also the reason why we don't introduce hash value free callback. + +Signed-off-by: Yi Min Zhao +Reviewed-by: Boris Fiuczynski +Reviewed-by: Bjoern Walk +Reviewed-by: Ján Tomko +Reviewed-by: Andrea Bolognani + +(cherry picked from commit 28831e1f1ec001882e907f03f7618f7c00ebc98d) + +https://bugzilla.redhat.com/show_bug.cgi?id=1508149 + +Conflicts: + + * src/conf/domain_addr.h + + context + - missing b72183223f3b + +Signed-off-by: Andrea Bolognani +Message-Id: <20190408085732.28684-6-abologna@redhat.com> +Reviewed-by: Laine Stump +Reviewed-by: Ján Tomko +--- + src/bhyve/bhyve_device.c | 3 +- + src/conf/domain_addr.c | 93 +++++++++++++++++++++++++++++++++- + src/conf/domain_addr.h | 10 +++- + src/qemu/qemu_domain_address.c | 6 ++- + 4 files changed, 108 insertions(+), 4 deletions(-) + +diff --git a/src/bhyve/bhyve_device.c b/src/bhyve/bhyve_device.c +index 03aa6c93bd..8f0862b0b6 100644 +--- a/src/bhyve/bhyve_device.c ++++ b/src/bhyve/bhyve_device.c +@@ -71,7 +71,8 @@ bhyveDomainPCIAddressSetCreate(virDomainDefPtr def, unsigned int nbuses) + { + virDomainPCIAddressSetPtr addrs; + +- if ((addrs = virDomainPCIAddressSetAlloc(nbuses)) == NULL) ++ if ((addrs = virDomainPCIAddressSetAlloc(nbuses, ++ VIR_PCI_ADDRESS_EXTENSION_NONE)) == NULL) + return NULL; + + if (virDomainPCIAddressBusSetModel(&addrs->buses[0], +diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c +index 39f22b82eb..3e33549c3d 100644 +--- a/src/conf/domain_addr.c ++++ b/src/conf/domain_addr.c +@@ -27,6 +27,7 @@ + #include "virlog.h" + #include "virstring.h" + #include "domain_addr.h" ++#include "virhashcode.h" + + #define VIR_FROM_THIS VIR_FROM_DOMAIN + +@@ -741,8 +742,93 @@ virDomainPCIAddressReleaseAddr(virDomainPCIAddressSetPtr addrs, + addrs->buses[addr->bus].slot[addr->slot].functions &= ~(1 << addr->function); + } + ++ ++static uint32_t ++virZPCIAddrKeyCode(const void *name, ++ uint32_t seed) ++{ ++ unsigned int value = *((unsigned int *)name); ++ return virHashCodeGen(&value, sizeof(value), seed); ++} ++ ++ ++static bool ++virZPCIAddrKeyEqual(const void *namea, ++ const void *nameb) ++{ ++ return *((unsigned int *)namea) == *((unsigned int *)nameb); ++} ++ ++ ++static void * ++virZPCIAddrKeyCopy(const void *name) ++{ ++ unsigned int *copy; ++ ++ if (VIR_ALLOC(copy) < 0) ++ return NULL; ++ ++ *copy = *((unsigned int *)name); ++ return (void *)copy; ++} ++ ++ ++static void ++virZPCIAddrKeyFree(void *name) ++{ ++ VIR_FREE(name); ++} ++ ++ ++static void ++virDomainPCIAddressSetExtensionFree(virDomainPCIAddressSetPtr addrs) ++{ ++ if (!addrs || !addrs->zpciIds) ++ return; ++ ++ virHashFree(addrs->zpciIds->uids); ++ virHashFree(addrs->zpciIds->fids); ++ VIR_FREE(addrs->zpciIds); ++} ++ ++ ++static int ++virDomainPCIAddressSetExtensionAlloc(virDomainPCIAddressSetPtr addrs, ++ virPCIDeviceAddressExtensionFlags extFlags) ++{ ++ if (extFlags & VIR_PCI_ADDRESS_EXTENSION_ZPCI) { ++ if (addrs->zpciIds) ++ return 0; ++ ++ if (VIR_ALLOC(addrs->zpciIds) < 0) ++ return -1; ++ ++ if (!(addrs->zpciIds->uids = virHashCreateFull(10, NULL, ++ virZPCIAddrKeyCode, ++ virZPCIAddrKeyEqual, ++ virZPCIAddrKeyCopy, ++ virZPCIAddrKeyFree))) ++ goto error; ++ ++ if (!(addrs->zpciIds->fids = virHashCreateFull(10, NULL, ++ virZPCIAddrKeyCode, ++ virZPCIAddrKeyEqual, ++ virZPCIAddrKeyCopy, ++ virZPCIAddrKeyFree))) ++ goto error; ++ } ++ ++ return 0; ++ ++ error: ++ virDomainPCIAddressSetExtensionFree(addrs); ++ return -1; ++} ++ ++ + virDomainPCIAddressSetPtr +-virDomainPCIAddressSetAlloc(unsigned int nbuses) ++virDomainPCIAddressSetAlloc(unsigned int nbuses, ++ virPCIDeviceAddressExtensionFlags extFlags) + { + virDomainPCIAddressSetPtr addrs; + +@@ -753,6 +839,10 @@ virDomainPCIAddressSetAlloc(unsigned int nbuses) + goto error; + + addrs->nbuses = nbuses; ++ ++ if (virDomainPCIAddressSetExtensionAlloc(addrs, extFlags) < 0) ++ goto error; ++ + return addrs; + + error: +@@ -767,6 +857,7 @@ virDomainPCIAddressSetFree(virDomainPCIAddressSetPtr addrs) + if (!addrs) + return; + ++ virDomainPCIAddressSetExtensionFree(addrs); + VIR_FREE(addrs->buses); + VIR_FREE(addrs); + } +diff --git a/src/conf/domain_addr.h b/src/conf/domain_addr.h +index fd06008e26..b01e6b9d20 100644 +--- a/src/conf/domain_addr.h ++++ b/src/conf/domain_addr.h +@@ -116,6 +116,12 @@ typedef struct { + } virDomainPCIAddressBus; + typedef virDomainPCIAddressBus *virDomainPCIAddressBusPtr; + ++typedef struct { ++ virHashTablePtr uids; ++ virHashTablePtr fids; ++} virDomainZPCIAddressIds; ++typedef virDomainZPCIAddressIds *virDomainZPCIAddressIdsPtr; ++ + struct _virDomainPCIAddressSet { + virDomainPCIAddressBus *buses; + size_t nbuses; +@@ -125,6 +131,7 @@ struct _virDomainPCIAddressSet { + bool areMultipleRootsSupported; + /* If true, the guest can use the pcie-to-pci-bridge controller */ + bool isPCIeToPCIBridgeSupported; ++ virDomainZPCIAddressIdsPtr zpciIds; + }; + typedef struct _virDomainPCIAddressSet virDomainPCIAddressSet; + typedef virDomainPCIAddressSet *virDomainPCIAddressSetPtr; +@@ -132,7 +139,8 @@ typedef virDomainPCIAddressSet *virDomainPCIAddressSetPtr; + char *virDomainPCIAddressAsString(virPCIDeviceAddressPtr addr) + ATTRIBUTE_NONNULL(1); + +-virDomainPCIAddressSetPtr virDomainPCIAddressSetAlloc(unsigned int nbuses); ++virDomainPCIAddressSetPtr virDomainPCIAddressSetAlloc(unsigned int nbuses, ++ virPCIDeviceAddressExtensionFlags extFlags); + + void virDomainPCIAddressSetFree(virDomainPCIAddressSetPtr addrs); + +diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c +index 3d01d14b46..ba870d56b1 100644 +--- a/src/qemu/qemu_domain_address.c ++++ b/src/qemu/qemu_domain_address.c +@@ -1508,8 +1508,12 @@ qemuDomainPCIAddressSetCreate(virDomainDefPtr def, + size_t i; + bool hasPCIeRoot = false; + virDomainControllerModelPCI defaultModel; ++ virPCIDeviceAddressExtensionFlags extFlags = VIR_PCI_ADDRESS_EXTENSION_NONE; + +- if ((addrs = virDomainPCIAddressSetAlloc(nbuses)) == NULL) ++ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_ZPCI)) ++ extFlags |= VIR_PCI_ADDRESS_EXTENSION_ZPCI; ++ ++ if ((addrs = virDomainPCIAddressSetAlloc(nbuses, extFlags)) == NULL) + return NULL; + + addrs->dryRun = dryRun; +-- +2.22.0 + diff --git a/SOURCES/libvirt-conf-Introduce-extension-flag-and-zPCI-member-for-PCI-address.patch b/SOURCES/libvirt-conf-Introduce-extension-flag-and-zPCI-member-for-PCI-address.patch new file mode 100644 index 0000000..3093f57 --- /dev/null +++ b/SOURCES/libvirt-conf-Introduce-extension-flag-and-zPCI-member-for-PCI-address.patch @@ -0,0 +1,283 @@ +From 050eb598af9291f385998cb1127d5bdf83305501 Mon Sep 17 00:00:00 2001 +Message-Id: <050eb598af9291f385998cb1127d5bdf83305501@dist-git> +From: Yi Min Zhao +Date: Mon, 8 Apr 2019 10:57:21 +0200 +Subject: [PATCH] conf: Introduce extension flag and zPCI member for PCI + address +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This patch introduces PCI address extension flag for virDomainDeviceInfo +and virPCIDeviceAddress. The extension flag in virDomainDeviceInfo is +used internally during calculating PCI extension flag. The one in +virPCIDeviceAddress is the duplicate to indicate extension address is +being used. Currently only zPCI extension address is introduced to deal +with 'uid' and 'fid' on the S390 platform. + +Signed-off-by: Yi Min Zhao +Reviewed-by: Boris Fiuczynski +Reviewed-by: Ján Tomko +Reviewed-by: Andrea Bolognani + +(cherry picked from commit 478e5f90fd4c0c0a8c1b3a8e19b9cae93ed78a4e) + +https://bugzilla.redhat.com/show_bug.cgi?id=1508149 + +Conflicts: + + * src/qemu/qemu_domain_address.c + + context + - missing db98a426a640 + +Signed-off-by: Andrea Bolognani +Message-Id: <20190408085732.28684-5-abologna@redhat.com> +Reviewed-by: Laine Stump +Reviewed-by: Ján Tomko +--- + src/conf/device_conf.h | 4 + + src/conf/domain_addr.h | 5 ++ + src/qemu/qemu_domain_address.c | 140 ++++++++++++++++++++++++++++++++- + src/util/virpci.h | 2 + + 4 files changed, 149 insertions(+), 2 deletions(-) + +diff --git a/src/conf/device_conf.h b/src/conf/device_conf.h +index a31ce9c376..c79066ec02 100644 +--- a/src/conf/device_conf.h ++++ b/src/conf/device_conf.h +@@ -164,6 +164,10 @@ struct _virDomainDeviceInfo { + * assignment, never saved and never reported. + */ + int pciConnectFlags; /* enum virDomainPCIConnectFlags */ ++ /* pciAddrExtFlags is only used internally to calculate PCI ++ * address extension flags during address assignment. ++ */ ++ int pciAddrExtFlags; /* enum virDomainPCIAddressExtensionFlags */ + char *loadparm; + + /* PCI devices will only be automatically placed on a PCI bus +diff --git a/src/conf/domain_addr.h b/src/conf/domain_addr.h +index 3236b7d6de..fd06008e26 100644 +--- a/src/conf/domain_addr.h ++++ b/src/conf/domain_addr.h +@@ -29,6 +29,11 @@ + # define VIR_PCI_ADDRESS_SLOT_LAST 31 + # define VIR_PCI_ADDRESS_FUNCTION_LAST 7 + ++typedef enum { ++ VIR_PCI_ADDRESS_EXTENSION_NONE = 0, /* no extension */ ++ VIR_PCI_ADDRESS_EXTENSION_ZPCI = 1 << 0, /* zPCI support */ ++} virPCIDeviceAddressExtensionFlags; ++ + typedef enum { + VIR_PCI_CONNECT_HOTPLUGGABLE = 1 << 0, /* is hotplug needed/supported */ + +diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c +index 79d2b9f9c4..3d01d14b46 100644 +--- a/src/qemu/qemu_domain_address.c ++++ b/src/qemu/qemu_domain_address.c +@@ -511,6 +511,64 @@ qemuDomainAssignARMVirtioMMIOAddresses(virDomainDefPtr def, + } + + ++static bool ++qemuDomainDeviceSupportZPCI(virDomainDeviceDefPtr device) ++{ ++ switch ((virDomainDeviceType)device->type) { ++ case VIR_DOMAIN_DEVICE_CHR: ++ return false; ++ ++ case VIR_DOMAIN_DEVICE_CONTROLLER: ++ case VIR_DOMAIN_DEVICE_DISK: ++ case VIR_DOMAIN_DEVICE_LEASE: ++ case VIR_DOMAIN_DEVICE_FS: ++ case VIR_DOMAIN_DEVICE_NET: ++ case VIR_DOMAIN_DEVICE_INPUT: ++ case VIR_DOMAIN_DEVICE_SOUND: ++ case VIR_DOMAIN_DEVICE_VIDEO: ++ case VIR_DOMAIN_DEVICE_HOSTDEV: ++ case VIR_DOMAIN_DEVICE_WATCHDOG: ++ case VIR_DOMAIN_DEVICE_GRAPHICS: ++ case VIR_DOMAIN_DEVICE_HUB: ++ case VIR_DOMAIN_DEVICE_REDIRDEV: ++ case VIR_DOMAIN_DEVICE_SMARTCARD: ++ case VIR_DOMAIN_DEVICE_MEMBALLOON: ++ case VIR_DOMAIN_DEVICE_NVRAM: ++ case VIR_DOMAIN_DEVICE_RNG: ++ case VIR_DOMAIN_DEVICE_SHMEM: ++ case VIR_DOMAIN_DEVICE_TPM: ++ case VIR_DOMAIN_DEVICE_PANIC: ++ case VIR_DOMAIN_DEVICE_MEMORY: ++ case VIR_DOMAIN_DEVICE_IOMMU: ++ case VIR_DOMAIN_DEVICE_VSOCK: ++ break; ++ ++ case VIR_DOMAIN_DEVICE_NONE: ++ case VIR_DOMAIN_DEVICE_LAST: ++ default: ++ virReportEnumRangeError(virDomainDeviceType, device->type); ++ return false; ++ } ++ ++ return true; ++} ++ ++ ++static virPCIDeviceAddressExtensionFlags ++qemuDomainDeviceCalculatePCIAddressExtensionFlags(virQEMUCapsPtr qemuCaps, ++ virDomainDeviceDefPtr dev) ++{ ++ virPCIDeviceAddressExtensionFlags extFlags = 0; ++ ++ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_ZPCI) && ++ qemuDomainDeviceSupportZPCI(dev)) { ++ extFlags |= VIR_PCI_ADDRESS_EXTENSION_ZPCI; ++ } ++ ++ return extFlags; ++} ++ ++ + /** + * qemuDomainDeviceCalculatePCIConnectFlags: + * +@@ -993,6 +1051,56 @@ qemuDomainFillAllPCIConnectFlags(virDomainDefPtr def, + } + + ++/** ++ * qemuDomainFillDevicePCIExtensionFlagsIter: ++ * ++ * @def: the entire DomainDef ++ * @dev: The device to be checked ++ * @info: virDomainDeviceInfo within the device ++ * @opaque: qemu capabilities ++ * ++ * Sets the pciAddressExtFlags for a single device's info. Has properly ++ * formatted arguments to be called by virDomainDeviceInfoIterate(). ++ * ++ * Always returns 0 - there is no failure. ++ */ ++static int ++qemuDomainFillDevicePCIExtensionFlagsIter(virDomainDefPtr def ATTRIBUTE_UNUSED, ++ virDomainDeviceDefPtr dev, ++ virDomainDeviceInfoPtr info, ++ void *opaque) ++{ ++ virQEMUCapsPtr qemuCaps = opaque; ++ ++ info->pciAddrExtFlags = ++ qemuDomainDeviceCalculatePCIAddressExtensionFlags(qemuCaps, dev); ++ ++ return 0; ++} ++ ++ ++/** ++ * qemuDomainFillAllPCIExtensionFlags: ++ * ++ * @def: the entire DomainDef ++ * @qemuCaps: as you'd expect ++ * ++ * Set the info->pciAddressExtFlags for all devices in the domain. ++ * ++ * Returns 0 on success or -1 on failure (the only possibility of ++ * failure would be some internal problem with ++ * virDomainDeviceInfoIterate()) ++ */ ++static int ++qemuDomainFillAllPCIExtensionFlags(virDomainDefPtr def, ++ virQEMUCapsPtr qemuCaps) ++{ ++ return virDomainDeviceInfoIterate(def, ++ qemuDomainFillDevicePCIExtensionFlagsIter, ++ qemuCaps); ++} ++ ++ + /** + * qemuDomainFindUnusedIsolationGroupIter: + * @def: domain definition +@@ -1267,6 +1375,27 @@ qemuDomainFillDevicePCIConnectFlags(virDomainDefPtr def, + } + + ++/** ++ * qemuDomainFillDevicePCIExtensionFlags: ++ * ++ * @dev: The device to be checked ++ * @info: virDomainDeviceInfo within the device ++ * @qemuCaps: as you'd expect ++ * ++ * Set the info->pciAddressExtFlags for a single device. ++ * ++ * No return value. ++ */ ++static void ++qemuDomainFillDevicePCIExtensionFlags(virDomainDeviceDefPtr dev, ++ virDomainDeviceInfoPtr info, ++ virQEMUCapsPtr qemuCaps) ++{ ++ info->pciAddrExtFlags = ++ qemuDomainDeviceCalculatePCIAddressExtensionFlags(qemuCaps, dev); ++} ++ ++ + static int + qemuDomainPCIAddressReserveNextAddr(virDomainPCIAddressSetPtr addrs, + virDomainDeviceInfoPtr dev) +@@ -2400,6 +2529,9 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, + if (qemuDomainFillAllPCIConnectFlags(def, qemuCaps, driver) < 0) + goto cleanup; + ++ if (qemuDomainFillAllPCIExtensionFlags(def, qemuCaps) < 0) ++ goto cleanup; ++ + if (qemuDomainSetupIsolationGroups(def) < 0) + goto cleanup; + +@@ -2435,7 +2567,8 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, + */ + virDomainDeviceInfo info = { + .pciConnectFlags = (VIR_PCI_CONNECT_HOTPLUGGABLE | +- VIR_PCI_CONNECT_TYPE_PCI_DEVICE) ++ VIR_PCI_CONNECT_TYPE_PCI_DEVICE), ++ .pciAddrExtFlags = VIR_PCI_ADDRESS_EXTENSION_NONE + }; + bool buses_reserved = true; + +@@ -2472,7 +2605,8 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, + qemuDomainHasPCIeRoot(def)) { + virDomainDeviceInfo info = { + .pciConnectFlags = (VIR_PCI_CONNECT_HOTPLUGGABLE | +- VIR_PCI_CONNECT_TYPE_PCIE_DEVICE) ++ VIR_PCI_CONNECT_TYPE_PCIE_DEVICE), ++ .pciAddrExtFlags = VIR_PCI_ADDRESS_EXTENSION_NONE + }; + + /* if there isn't an empty pcie-root-port, this will +@@ -2989,6 +3123,8 @@ qemuDomainEnsurePCIAddress(virDomainObjPtr obj, + + qemuDomainFillDevicePCIConnectFlags(obj->def, dev, priv->qemuCaps, driver); + ++ qemuDomainFillDevicePCIExtensionFlags(dev, info, priv->qemuCaps); ++ + return virDomainPCIAddressEnsureAddr(priv->pciaddrs, info, + info->pciConnectFlags); + } +diff --git a/src/util/virpci.h b/src/util/virpci.h +index 01df652b86..b366d7d9c3 100644 +--- a/src/util/virpci.h ++++ b/src/util/virpci.h +@@ -49,6 +49,8 @@ struct _virPCIDeviceAddress { + unsigned int slot; + unsigned int function; + int multi; /* virTristateSwitch */ ++ int extFlags; /* enum virPCIDeviceAddressExtensionFlags */ ++ virZPCIDeviceAddress zpci; + }; + + typedef enum { +-- +2.22.0 + diff --git a/SOURCES/libvirt-conf-Introduce-new-hostdev-attribute-display.patch b/SOURCES/libvirt-conf-Introduce-new-hostdev-attribute-display.patch new file mode 100644 index 0000000..2dc0045 --- /dev/null +++ b/SOURCES/libvirt-conf-Introduce-new-hostdev-attribute-display.patch @@ -0,0 +1,416 @@ +From 5ad0f7cc1b2444ee9355229316fb008919d22c71 Mon Sep 17 00:00:00 2001 +Message-Id: <5ad0f7cc1b2444ee9355229316fb008919d22c71@dist-git> +From: Erik Skultety +Date: Thu, 19 Jul 2018 15:04:02 +0200 +Subject: [PATCH] conf: Introduce new attribute 'display' +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +QEMU 2.12 introduced a new type of display for mediated devices using +vfio-pci backend which allows a mediated device to be used as a VGA +compatible device as an alternative to an emulated video device. QEMU +exposes this feature via a vfio device property 'display' with supported +values 'on/off/auto' (libvirt will default to 'off'). + +This patch adds the necessary bits to domain config handling in order to +expose this feature. Since there's no convenient way for libvirt to come +up with usable defaults for the display setting, simply because libvirt +is not able to figure out which of the display implementations - dma-buf +which requires OpenGL support vs vfio regions which doesn't need OpenGL +(works with OpenGL enabled too) - the underlying mdev uses. + +Reviewed-by: Ján Tomko +Signed-off-by: Erik Skultety +(cherry picked from commit d54e45b6edd7623e488a19e30bc4148a21fa8b03) + +https://bugzilla.redhat.com/show_bug.cgi?id=1475770 +Signed-off-by: Erik Skultety +Reviewed-by: Ján Tomko +--- + docs/formatdomain.html.in | 20 +++- + docs/schemas/domaincommon.rng | 5 + + src/conf/domain_conf.c | 19 +++- + src/conf/domain_conf.h | 1 + + src/qemu/qemu_domain.c | 98 ++++++++++++++++++- + .../qemuxml2argvdata/hostdev-mdev-display.xml | 39 ++++++++ + .../hostdev-mdev-display.xml | 47 +++++++++ + tests/qemuxml2xmltest.c | 1 + + 8 files changed, 222 insertions(+), 8 deletions(-) + create mode 100644 tests/qemuxml2argvdata/hostdev-mdev-display.xml + create mode 100644 tests/qemuxml2xmloutdata/hostdev-mdev-display.xml + +diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in +index 9dd22554ad..3554c3dc30 100644 +--- a/docs/formatdomain.html.in ++++ b/docs/formatdomain.html.in +@@ -4510,9 +4510,23 @@ + guest. Currently, model='vfio-pci' and + model='vfio-ccw' (Since 4.4.0) + is supported. Refer MDEV to create +- a mediated device on the host. There are also some implications on the +- usage of guest's address type depending on the model +- attribute, see the address element below. ++ a mediated device on the host. ++ Since 4.6.0 (QEMU 2.12) an optional ++ display attribute may be used to enable or disable ++ support for an accelerated remote desktop backed by a mediated ++ device (such as NVIDIA vGPU or Intel GVT-g) as an alternative to ++ emulated video devices. This attribute ++ is limited to model='vfio-pci' only. Supported values ++ are either on or off (default is 'off'). ++ It is required to use a ++ graphical framebuffer in order to ++ use this attribute, currently only supported with VNC, Spice and ++ egl-headless graphics devices. ++

++ Note: There are also some implications on the usage of guest's ++ address type depending on the model attribute, ++ see the address element below. ++

+ + +

+diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng +index 157726752c..be8430ab22 100644 +--- a/docs/schemas/domaincommon.rng ++++ b/docs/schemas/domaincommon.rng +@@ -4579,6 +4579,11 @@ + vfio-ccw + + ++ ++ ++ ++ ++ + + + +diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c +index 72086f9e86..830c298158 100644 +--- a/src/conf/domain_conf.c ++++ b/src/conf/domain_conf.c +@@ -7656,6 +7656,7 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node, + char *rawio = NULL; + char *backendStr = NULL; + char *model = NULL; ++ char *display = NULL; + int backend; + int ret = -1; + virDomainHostdevSubsysPCIPtr pcisrc = &def->source.subsys.u.pci; +@@ -7675,6 +7676,7 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node, + sgio = virXMLPropString(node, "sgio"); + rawio = virXMLPropString(node, "rawio"); + model = virXMLPropString(node, "model"); ++ display = virXMLPropString(node, "display"); + + /* @type is passed in from the caller rather than read from the + * xml document, because it is specified in different places for +@@ -7762,6 +7764,15 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node, + model); + goto cleanup; + } ++ ++ if (display && ++ (mdevsrc->display = virTristateSwitchTypeFromString(display)) <= 0) { ++ virReportError(VIR_ERR_XML_ERROR, ++ _("unknown value '%s' for attribute " ++ "'display'"), ++ display); ++ goto cleanup; ++ } + } + + switch (def->source.subsys.type) { +@@ -7815,6 +7826,7 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node, + VIR_FREE(rawio); + VIR_FREE(backendStr); + VIR_FREE(model); ++ VIR_FREE(display); + return ret; + } + +@@ -26568,9 +26580,14 @@ virDomainHostdevDefFormat(virBufferPtr buf, + virTristateBoolTypeToString(scsisrc->rawio)); + } + +- if (def->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV) ++ if (def->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV) { + virBufferAsprintf(buf, " model='%s'", + virMediatedDeviceModelTypeToString(mdevsrc->model)); ++ if (mdevsrc->display != VIR_TRISTATE_SWITCH_ABSENT) ++ virBufferAsprintf(buf, " display='%s'", ++ virTristateSwitchTypeToString(mdevsrc->display)); ++ } ++ + } + virBufferAddLit(buf, ">\n"); + virBufferAdjustIndent(buf, 2); +diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h +index 3deda1d978..8ca9558ceb 100644 +--- a/src/conf/domain_conf.h ++++ b/src/conf/domain_conf.h +@@ -382,6 +382,7 @@ typedef struct _virDomainHostdevSubsysMediatedDev virDomainHostdevSubsysMediated + typedef virDomainHostdevSubsysMediatedDev *virDomainHostdevSubsysMediatedDevPtr; + struct _virDomainHostdevSubsysMediatedDev { + int model; /* enum virMediatedDeviceModelType */ ++ int display; /* virTristateSwitch */ + char uuidstr[VIR_UUID_STRING_BUFLEN]; /* mediated device's uuid string */ + }; + +diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c +index 9498594857..5337f1ce55 100644 +--- a/src/qemu/qemu_domain.c ++++ b/src/qemu/qemu_domain.c +@@ -4451,9 +4451,48 @@ qemuDomainDeviceDefValidateNetwork(const virDomainNetDef *net) + + + static int +-qemuDomainDeviceDefValidateHostdev(const virDomainHostdevDef *hostdev, +- const virDomainDef *def) ++qemuDomainMdevDefValidate(const virDomainHostdevSubsysMediatedDev *mdevsrc, ++ const virDomainDef *def, ++ virQEMUCapsPtr qemuCaps) + { ++ if (mdevsrc->display == VIR_TRISTATE_SWITCH_ABSENT) ++ return 0; ++ ++ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VFIO_PCI_DISPLAY)) { ++ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", ++ _("display property of device vfio-pci is " ++ "not supported by this version of QEMU")); ++ return -1; ++ } ++ ++ if (mdevsrc->model != VIR_MDEV_MODEL_TYPE_VFIO_PCI) { ++ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", ++ _(" attribute 'display' is only supported" ++ " with model='vfio-pci'")); ++ ++ return -1; ++ } ++ ++ if (mdevsrc->display == VIR_TRISTATE_SWITCH_ON) { ++ if (def->ngraphics == 0) { ++ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", ++ _("graphics device is needed for attribute value " ++ "'display=on' in ")); ++ return -1; ++ } ++ } ++ ++ return 0; ++} ++ ++ ++static int ++qemuDomainDeviceDefValidateHostdev(const virDomainHostdevDef *hostdev, ++ const virDomainDef *def, ++ virQEMUCapsPtr qemuCaps) ++{ ++ const virDomainHostdevSubsysMediatedDev *mdevsrc; ++ + /* forbid capabilities mode hostdev in this kind of hypervisor */ + if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_CAPABILITIES) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, +@@ -4463,6 +4502,24 @@ qemuDomainDeviceDefValidateHostdev(const virDomainHostdevDef *hostdev, + return -1; + } + ++ if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) { ++ switch ((virDomainHostdevSubsysType) hostdev->source.subsys.type) { ++ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: ++ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: ++ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI: ++ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST: ++ break; ++ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV: ++ mdevsrc = &hostdev->source.subsys.u.mdev; ++ return qemuDomainMdevDefValidate(mdevsrc, def, qemuCaps); ++ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: ++ default: ++ virReportEnumRangeError(virDomainHostdevSubsysType, ++ hostdev->source.subsys.type); ++ return -1; ++ } ++ } ++ + return 0; + } + +@@ -5595,7 +5652,8 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDef *dev, + break; + + case VIR_DOMAIN_DEVICE_HOSTDEV: +- ret = qemuDomainDeviceDefValidateHostdev(dev->data.hostdev, def); ++ ret = qemuDomainDeviceDefValidateHostdev(dev->data.hostdev, def, ++ qemuCaps); + break; + + case VIR_DOMAIN_DEVICE_VIDEO: +@@ -6205,6 +6263,35 @@ qemuDomainVsockDefPostParse(virDomainVsockDefPtr vsock) + } + + ++static int ++qemuDomainHostdevDefMdevPostParse(virDomainHostdevSubsysMediatedDevPtr mdevsrc, ++ virQEMUCapsPtr qemuCaps) ++{ ++ /* QEMU 2.12 added support for vfio-pci display type, we default to ++ * 'display=off' to stay safe from future changes */ ++ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_VFIO_PCI_DISPLAY) && ++ mdevsrc->display == VIR_TRISTATE_SWITCH_ABSENT) ++ mdevsrc->display = VIR_TRISTATE_SWITCH_OFF; ++ ++ return 0; ++} ++ ++ ++static int ++qemuDomainHostdevDefPostParse(virDomainHostdevDefPtr hostdev, ++ virQEMUCapsPtr qemuCaps) ++{ ++ virDomainHostdevSubsysPtr subsys = &hostdev->source.subsys; ++ ++ if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS && ++ hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV && ++ qemuDomainHostdevDefMdevPostParse(&subsys->u.mdev, qemuCaps) < 0) ++ return -1; ++ ++ return 0; ++} ++ ++ + static int + qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, + const virDomainDef *def, +@@ -6255,11 +6342,14 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, + ret = qemuDomainVsockDefPostParse(dev->data.vsock); + break; + ++ case VIR_DOMAIN_DEVICE_HOSTDEV: ++ ret = qemuDomainHostdevDefPostParse(dev->data.hostdev, qemuCaps); ++ break; ++ + case VIR_DOMAIN_DEVICE_LEASE: + case VIR_DOMAIN_DEVICE_FS: + case VIR_DOMAIN_DEVICE_INPUT: + case VIR_DOMAIN_DEVICE_SOUND: +- case VIR_DOMAIN_DEVICE_HOSTDEV: + case VIR_DOMAIN_DEVICE_WATCHDOG: + case VIR_DOMAIN_DEVICE_GRAPHICS: + case VIR_DOMAIN_DEVICE_HUB: +diff --git a/tests/qemuxml2argvdata/hostdev-mdev-display.xml b/tests/qemuxml2argvdata/hostdev-mdev-display.xml +new file mode 100644 +index 0000000000..f37e08e1b9 +--- /dev/null ++++ b/tests/qemuxml2argvdata/hostdev-mdev-display.xml +@@ -0,0 +1,39 @@ ++ ++ QEMUGuest2 ++ c7a5fdbd-edaf-9455-926a-d65c16db1809 ++ 219136 ++ 219136 ++ 1 ++ ++ hvm ++ ++ ++ ++ destroy ++ restart ++ destroy ++ ++ /usr/bin/qemu-system-i686 ++ ++ ++ ++ ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++ ++ ++ ++ ++ ++ +diff --git a/tests/qemuxml2xmloutdata/hostdev-mdev-display.xml b/tests/qemuxml2xmloutdata/hostdev-mdev-display.xml +new file mode 100644 +index 0000000000..94c11b1199 +--- /dev/null ++++ b/tests/qemuxml2xmloutdata/hostdev-mdev-display.xml +@@ -0,0 +1,47 @@ ++ ++ QEMUGuest2 ++ c7a5fdbd-edaf-9455-926a-d65c16db1809 ++ 219136 ++ 219136 ++ 1 ++ ++ hvm ++ ++ ++ ++ destroy ++ restart ++ destroy ++ ++ /usr/bin/qemu-system-i686 ++ ++ ++ ++ ++
++ ++ ++
++ ++ ++ ++
++ ++ ++ ++ ++ ++ ++