mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 16:53:55 -06:00
virtio,pci: features, cleanups
vdpa:
shadow vq vlan support
net migration with cvq
cxl:
support emulating 4 HDM decoders
serial number extended capability
virtio:
hared dma-buf
Fixes, cleanups all over the place.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
-----BEGIN PGP SIGNATURE-----
iQFDBAABCAAtFiEEXQn9CHHI+FuUyooNKB8NuNKNVGkFAmUd4/YPHG1zdEByZWRo
YXQuY29tAAoJECgfDbjSjVRpyM8H/02cRbJcQOjYt7j68zPW6GaDXxBI/UmdWDyG
15LZZbGNOPjyjNd3Vz1M7stQ5rhoKcgo/RdI+0E60a78svgW5JvpXoXR3pksc3Dx
v28B/akXwHUErYFSZQ+2VHNc8OhCd0v2ehxZxbwPEAYIOAj3hcCIVoPGXTnKJmAJ
imr5hjH0wZUc0+xdsmn8Vfdv5NTzpwfVObbGiMZejeJsaoh0y6Rt8RANBMY67KQD
S7/HPlVuDYf/y43t4ZEHNYuV9RaCdZZYlLWwV1scdKaYcofgmtJOKbOdCjHRXgj+
004Afb3rggIoCfnCzOFzhGx+MLDtLjvEn2N4oLEWCLi+k/3huaA=
=GAvH
-----END PGP SIGNATURE-----
Merge tag 'for_upstream' of https://git.kernel.org/pub/scm/virt/kvm/mst/qemu into staging
virtio,pci: features, cleanups
vdpa:
shadow vq vlan support
net migration with cvq
cxl:
support emulating 4 HDM decoders
serial number extended capability
virtio:
hared dma-buf
Fixes, cleanups all over the place.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
* tag 'for_upstream' of https://git.kernel.org/pub/scm/virt/kvm/mst/qemu: (53 commits)
libvhost-user: handle shared_object msg
vhost-user: add shared_object msg
hw/display: introduce virtio-dmabuf
util/uuid: add a hash function
virtio: remove unused next argument from virtqueue_split_read_next_desc()
virtio: remove unnecessary thread fence while reading next descriptor
virtio: use shadow_avail_idx while checking number of heads
libvhost-user.c: add assertion to vu_message_read_default
pcie_sriov: unregister_vfs(): fix error path
hw/i386/pc: improve physical address space bound check for 32-bit x86 systems
amd_iommu: Fix APIC address check
vdpa net: follow VirtIO initialization properly at cvq isolation probing
vdpa net: stop probing if cannot set features
vdpa net: fix error message setting virtio status
hw/pci-bridge/cxl-upstream: Add serial number extended capability support
hw/cxl: Support 4 HDM decoders at all levels of topology
hw/cxl: Fix and use same calculation for HDM decoder block size everywhere
hw/cxl: Add utility functions decoder interleave ways and target count.
hw/cxl: Push cxl_decoder_count_enc() and cxl_decode_ig() into .c
vdpa net: zero vhost_vdpa iova_tree pointer at cleanup
...
Conflicts:
hw/core/machine.c
Context conflict with commit 314e0a84cd
("hw/core: remove needless
includes") because it removed an adjacent #include.
This commit is contained in:
commit
2f3913f4b2
71 changed files with 2025 additions and 450 deletions
|
@ -2080,7 +2080,6 @@ int main(int argc, char *argv[])
|
|||
test_acpi_piix4_no_acpi_pci_hotplug);
|
||||
qtest_add_func("acpi/piix4/ipmi", test_acpi_piix4_tcg_ipmi);
|
||||
qtest_add_func("acpi/piix4/cpuhp", test_acpi_piix4_tcg_cphp);
|
||||
qtest_add_func("acpi/piix4/memhp", test_acpi_piix4_tcg_memhp);
|
||||
qtest_add_func("acpi/piix4/numamem", test_acpi_piix4_tcg_numamem);
|
||||
qtest_add_func("acpi/piix4/nosmm", test_acpi_piix4_tcg_nosmm);
|
||||
qtest_add_func("acpi/piix4/smm-compat",
|
||||
|
@ -2088,9 +2087,15 @@ int main(int argc, char *argv[])
|
|||
qtest_add_func("acpi/piix4/smm-compat-nosmm",
|
||||
test_acpi_piix4_tcg_smm_compat_nosmm);
|
||||
qtest_add_func("acpi/piix4/nohpet", test_acpi_piix4_tcg_nohpet);
|
||||
qtest_add_func("acpi/piix4/dimmpxm", test_acpi_piix4_tcg_dimm_pxm);
|
||||
qtest_add_func("acpi/piix4/acpihmat",
|
||||
test_acpi_piix4_tcg_acpi_hmat);
|
||||
|
||||
/* i386 does not support memory hotplug */
|
||||
if (strcmp(arch, "i386")) {
|
||||
qtest_add_func("acpi/piix4/memhp", test_acpi_piix4_tcg_memhp);
|
||||
qtest_add_func("acpi/piix4/dimmpxm",
|
||||
test_acpi_piix4_tcg_dimm_pxm);
|
||||
qtest_add_func("acpi/piix4/acpihmat",
|
||||
test_acpi_piix4_tcg_acpi_hmat);
|
||||
}
|
||||
#ifdef CONFIG_POSIX
|
||||
qtest_add_func("acpi/piix4/acpierst", test_acpi_piix4_acpi_erst);
|
||||
#endif
|
||||
|
@ -2108,11 +2113,9 @@ int main(int argc, char *argv[])
|
|||
test_acpi_q35_tcg_no_acpi_hotplug);
|
||||
qtest_add_func("acpi/q35/multif-bridge",
|
||||
test_acpi_q35_multif_bridge);
|
||||
qtest_add_func("acpi/q35/mmio64", test_acpi_q35_tcg_mmio64);
|
||||
qtest_add_func("acpi/q35/ipmi", test_acpi_q35_tcg_ipmi);
|
||||
qtest_add_func("acpi/q35/smbus/ipmi", test_acpi_q35_tcg_smbus_ipmi);
|
||||
qtest_add_func("acpi/q35/cpuhp", test_acpi_q35_tcg_cphp);
|
||||
qtest_add_func("acpi/q35/memhp", test_acpi_q35_tcg_memhp);
|
||||
qtest_add_func("acpi/q35/numamem", test_acpi_q35_tcg_numamem);
|
||||
qtest_add_func("acpi/q35/nosmm", test_acpi_q35_tcg_nosmm);
|
||||
qtest_add_func("acpi/q35/smm-compat",
|
||||
|
@ -2120,10 +2123,17 @@ int main(int argc, char *argv[])
|
|||
qtest_add_func("acpi/q35/smm-compat-nosmm",
|
||||
test_acpi_q35_tcg_smm_compat_nosmm);
|
||||
qtest_add_func("acpi/q35/nohpet", test_acpi_q35_tcg_nohpet);
|
||||
qtest_add_func("acpi/q35/dimmpxm", test_acpi_q35_tcg_dimm_pxm);
|
||||
qtest_add_func("acpi/q35/acpihmat", test_acpi_q35_tcg_acpi_hmat);
|
||||
qtest_add_func("acpi/q35/acpihmat-noinitiator",
|
||||
test_acpi_q35_tcg_acpi_hmat_noinitiator);
|
||||
|
||||
/* i386 does not support memory hotplug */
|
||||
if (strcmp(arch, "i386")) {
|
||||
qtest_add_func("acpi/q35/memhp", test_acpi_q35_tcg_memhp);
|
||||
qtest_add_func("acpi/q35/dimmpxm", test_acpi_q35_tcg_dimm_pxm);
|
||||
qtest_add_func("acpi/q35/acpihmat",
|
||||
test_acpi_q35_tcg_acpi_hmat);
|
||||
qtest_add_func("acpi/q35/mmio64", test_acpi_q35_tcg_mmio64);
|
||||
}
|
||||
#ifdef CONFIG_POSIX
|
||||
qtest_add_func("acpi/q35/acpierst", test_acpi_q35_acpi_erst);
|
||||
#endif
|
||||
|
|
|
@ -568,7 +568,7 @@ int main(int argc, char **argv)
|
|||
qtest_add_data_func("/numa/mon/cpus/partial", args, test_mon_partial);
|
||||
qtest_add_data_func("/numa/qmp/cpus/query-cpus", args, test_query_cpus);
|
||||
|
||||
if (!strcmp(arch, "i386") || !strcmp(arch, "x86_64")) {
|
||||
if (!strcmp(arch, "x86_64")) {
|
||||
qtest_add_data_func("/numa/pc/cpu/explicit", args, pc_numa_cpu);
|
||||
qtest_add_data_func("/numa/pc/dynamic/cpu", args, pc_dynamic_cpu_cfg);
|
||||
qtest_add_data_func("/numa/pc/hmat/build", args, pc_hmat_build_cfg);
|
||||
|
@ -576,6 +576,11 @@ int main(int argc, char **argv)
|
|||
qtest_add_data_func("/numa/pc/hmat/erange", args, pc_hmat_erange_cfg);
|
||||
}
|
||||
|
||||
if (!strcmp(arch, "i386")) {
|
||||
qtest_add_data_func("/numa/pc/cpu/explicit", args, pc_numa_cpu);
|
||||
qtest_add_data_func("/numa/pc/dynamic/cpu", args, pc_dynamic_cpu_cfg);
|
||||
}
|
||||
|
||||
if (!strcmp(arch, "ppc64")) {
|
||||
qtest_add_data_func("/numa/spapr/cpu/explicit", args, spapr_numa_cpu);
|
||||
}
|
||||
|
|
|
@ -50,6 +50,7 @@ tests = {
|
|||
'test-qapi-util': [],
|
||||
'test-interval-tree': [],
|
||||
'test-xs-node': [qom],
|
||||
'test-virtio-dmabuf': [meson.project_source_root() / 'hw/display/virtio-dmabuf.c'],
|
||||
}
|
||||
|
||||
if have_system or have_tools
|
||||
|
|
|
@ -171,6 +171,32 @@ static void test_uuid_unparse_strdup(void)
|
|||
}
|
||||
}
|
||||
|
||||
static void test_uuid_hash(void)
|
||||
{
|
||||
QemuUUID uuid;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 100; i++) {
|
||||
qemu_uuid_generate(&uuid);
|
||||
/* Obtain the UUID hash */
|
||||
uint32_t hash_a = qemu_uuid_hash(&uuid);
|
||||
int data_idx = g_random_int_range(0, 15);
|
||||
/* Change a single random byte of the UUID */
|
||||
if (uuid.data[data_idx] < 0xFF) {
|
||||
uuid.data[data_idx]++;
|
||||
} else {
|
||||
uuid.data[data_idx]--;
|
||||
}
|
||||
/* Obtain the UUID hash again */
|
||||
uint32_t hash_b = qemu_uuid_hash(&uuid);
|
||||
/*
|
||||
* Both hashes shall be different (avoid collision)
|
||||
* for any change in the UUID fields
|
||||
*/
|
||||
g_assert_cmpint(hash_a, !=, hash_b);
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
g_test_init(&argc, &argv, NULL);
|
||||
|
@ -179,6 +205,7 @@ int main(int argc, char **argv)
|
|||
g_test_add_func("/uuid/parse", test_uuid_parse);
|
||||
g_test_add_func("/uuid/unparse", test_uuid_unparse);
|
||||
g_test_add_func("/uuid/unparse_strdup", test_uuid_unparse_strdup);
|
||||
g_test_add_func("/uuid/hash", test_uuid_hash);
|
||||
|
||||
return g_test_run();
|
||||
}
|
||||
|
|
137
tests/unit/test-virtio-dmabuf.c
Normal file
137
tests/unit/test-virtio-dmabuf.c
Normal file
|
@ -0,0 +1,137 @@
|
|||
/*
|
||||
* QEMU tests for shared dma-buf API
|
||||
*
|
||||
* Copyright (c) 2023 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "hw/virtio/virtio-dmabuf.h"
|
||||
|
||||
|
||||
static void test_add_remove_resources(void)
|
||||
{
|
||||
QemuUUID uuid;
|
||||
int i, dmabuf_fd;
|
||||
|
||||
for (i = 0; i < 100; ++i) {
|
||||
qemu_uuid_generate(&uuid);
|
||||
dmabuf_fd = g_random_int_range(3, 500);
|
||||
/* Add a new resource */
|
||||
g_assert(virtio_add_dmabuf(&uuid, dmabuf_fd));
|
||||
g_assert_cmpint(virtio_lookup_dmabuf(&uuid), ==, dmabuf_fd);
|
||||
/* Remove the resource */
|
||||
g_assert(virtio_remove_resource(&uuid));
|
||||
/* Resource is not found anymore */
|
||||
g_assert_cmpint(virtio_lookup_dmabuf(&uuid), ==, -1);
|
||||
}
|
||||
}
|
||||
|
||||
static void test_add_remove_dev(void)
|
||||
{
|
||||
QemuUUID uuid;
|
||||
struct vhost_dev *dev = g_new0(struct vhost_dev, 1);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 100; ++i) {
|
||||
qemu_uuid_generate(&uuid);
|
||||
virtio_add_vhost_device(&uuid, dev);
|
||||
/* vhost device is found */
|
||||
g_assert(virtio_lookup_vhost_device(&uuid) != NULL);
|
||||
/* Remove the vhost device */
|
||||
g_assert(virtio_remove_resource(&uuid));
|
||||
/* vhost device is not found anymore */
|
||||
g_assert(virtio_lookup_vhost_device(&uuid) == NULL);
|
||||
}
|
||||
g_free(dev);
|
||||
}
|
||||
|
||||
static void test_remove_invalid_resource(void)
|
||||
{
|
||||
QemuUUID uuid;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 20; ++i) {
|
||||
qemu_uuid_generate(&uuid);
|
||||
g_assert_cmpint(virtio_lookup_dmabuf(&uuid), ==, -1);
|
||||
/* Removing a resource that does not exist returns false */
|
||||
g_assert_false(virtio_remove_resource(&uuid));
|
||||
}
|
||||
}
|
||||
|
||||
static void test_add_invalid_resource(void)
|
||||
{
|
||||
QemuUUID uuid;
|
||||
struct vhost_dev *dev = NULL;
|
||||
int i, dmabuf_fd = -2, alt_dmabuf = 2;
|
||||
|
||||
for (i = 0; i < 20; ++i) {
|
||||
qemu_uuid_generate(&uuid);
|
||||
/* Add a new resource with invalid (negative) resource fd */
|
||||
g_assert_false(virtio_add_dmabuf(&uuid, dmabuf_fd));
|
||||
/* Resource is not found */
|
||||
g_assert_cmpint(virtio_lookup_dmabuf(&uuid), ==, -1);
|
||||
/* Add a new vhost device with invalid (NULL) pointer */
|
||||
g_assert_false(virtio_add_vhost_device(&uuid, dev));
|
||||
/* vhost device is not found */
|
||||
g_assert(virtio_lookup_vhost_device(&uuid) == NULL);
|
||||
}
|
||||
|
||||
for (i = 0; i < 20; ++i) {
|
||||
/* Add a valid resource */
|
||||
qemu_uuid_generate(&uuid);
|
||||
dmabuf_fd = g_random_int_range(3, 500);
|
||||
g_assert(virtio_add_dmabuf(&uuid, dmabuf_fd));
|
||||
g_assert_cmpint(virtio_lookup_dmabuf(&uuid), ==, dmabuf_fd);
|
||||
/* Add a new resource with repeated uuid returns false */
|
||||
g_assert_false(virtio_add_dmabuf(&uuid, alt_dmabuf));
|
||||
/* The value for the uuid key is not replaced */
|
||||
g_assert_cmpint(virtio_lookup_dmabuf(&uuid), ==, dmabuf_fd);
|
||||
}
|
||||
}
|
||||
|
||||
static void test_free_resources(void)
|
||||
{
|
||||
QemuUUID uuids[20];
|
||||
int i, dmabuf_fd;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(uuids); ++i) {
|
||||
qemu_uuid_generate(&uuids[i]);
|
||||
dmabuf_fd = g_random_int_range(3, 500);
|
||||
g_assert(virtio_add_dmabuf(&uuids[i], dmabuf_fd));
|
||||
g_assert_cmpint(virtio_lookup_dmabuf(&uuids[i]), ==, dmabuf_fd);
|
||||
}
|
||||
virtio_free_resources();
|
||||
for (i = 0; i < ARRAY_SIZE(uuids); ++i) {
|
||||
/* None of the resources is found after free'd */
|
||||
g_assert_cmpint(virtio_lookup_dmabuf(&uuids[i]), ==, -1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
g_test_init(&argc, &argv, NULL);
|
||||
g_test_add_func("/virtio-dmabuf/add_rm_res", test_add_remove_resources);
|
||||
g_test_add_func("/virtio-dmabuf/add_rm_dev", test_add_remove_dev);
|
||||
g_test_add_func("/virtio-dmabuf/rm_invalid_res",
|
||||
test_remove_invalid_resource);
|
||||
g_test_add_func("/virtio-dmabuf/add_invalid_res",
|
||||
test_add_invalid_resource);
|
||||
g_test_add_func("/virtio-dmabuf/free_res", test_free_resources);
|
||||
|
||||
return g_test_run();
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue