1*faefdba8SAlbert Esteve /*
2*faefdba8SAlbert Esteve * QEMU tests for shared dma-buf API
3*faefdba8SAlbert Esteve *
4*faefdba8SAlbert Esteve * Copyright (c) 2023 Red Hat, Inc.
5*faefdba8SAlbert Esteve *
6*faefdba8SAlbert Esteve * This library is free software; you can redistribute it and/or
7*faefdba8SAlbert Esteve * modify it under the terms of the GNU Lesser General Public
8*faefdba8SAlbert Esteve * License as published by the Free Software Foundation; either
9*faefdba8SAlbert Esteve * version 2.1 of the License, or (at your option) any later version.
10*faefdba8SAlbert Esteve *
11*faefdba8SAlbert Esteve * This library is distributed in the hope that it will be useful,
12*faefdba8SAlbert Esteve * but WITHOUT ANY WARRANTY; without even the implied warranty of
13*faefdba8SAlbert Esteve * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14*faefdba8SAlbert Esteve * Lesser General Public License for more details.
15*faefdba8SAlbert Esteve *
16*faefdba8SAlbert Esteve * You should have received a copy of the GNU Lesser General Public
17*faefdba8SAlbert Esteve * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18*faefdba8SAlbert Esteve *
19*faefdba8SAlbert Esteve */
20*faefdba8SAlbert Esteve
21*faefdba8SAlbert Esteve #include "qemu/osdep.h"
22*faefdba8SAlbert Esteve #include "hw/virtio/virtio-dmabuf.h"
23*faefdba8SAlbert Esteve
24*faefdba8SAlbert Esteve
test_add_remove_resources(void)25*faefdba8SAlbert Esteve static void test_add_remove_resources(void)
26*faefdba8SAlbert Esteve {
27*faefdba8SAlbert Esteve QemuUUID uuid;
28*faefdba8SAlbert Esteve int i, dmabuf_fd;
29*faefdba8SAlbert Esteve
30*faefdba8SAlbert Esteve for (i = 0; i < 100; ++i) {
31*faefdba8SAlbert Esteve qemu_uuid_generate(&uuid);
32*faefdba8SAlbert Esteve dmabuf_fd = g_random_int_range(3, 500);
33*faefdba8SAlbert Esteve /* Add a new resource */
34*faefdba8SAlbert Esteve g_assert(virtio_add_dmabuf(&uuid, dmabuf_fd));
35*faefdba8SAlbert Esteve g_assert_cmpint(virtio_lookup_dmabuf(&uuid), ==, dmabuf_fd);
36*faefdba8SAlbert Esteve /* Remove the resource */
37*faefdba8SAlbert Esteve g_assert(virtio_remove_resource(&uuid));
38*faefdba8SAlbert Esteve /* Resource is not found anymore */
39*faefdba8SAlbert Esteve g_assert_cmpint(virtio_lookup_dmabuf(&uuid), ==, -1);
40*faefdba8SAlbert Esteve }
41*faefdba8SAlbert Esteve }
42*faefdba8SAlbert Esteve
test_add_remove_dev(void)43*faefdba8SAlbert Esteve static void test_add_remove_dev(void)
44*faefdba8SAlbert Esteve {
45*faefdba8SAlbert Esteve QemuUUID uuid;
46*faefdba8SAlbert Esteve struct vhost_dev *dev = g_new0(struct vhost_dev, 1);
47*faefdba8SAlbert Esteve int i;
48*faefdba8SAlbert Esteve
49*faefdba8SAlbert Esteve for (i = 0; i < 100; ++i) {
50*faefdba8SAlbert Esteve qemu_uuid_generate(&uuid);
51*faefdba8SAlbert Esteve virtio_add_vhost_device(&uuid, dev);
52*faefdba8SAlbert Esteve /* vhost device is found */
53*faefdba8SAlbert Esteve g_assert(virtio_lookup_vhost_device(&uuid) != NULL);
54*faefdba8SAlbert Esteve /* Remove the vhost device */
55*faefdba8SAlbert Esteve g_assert(virtio_remove_resource(&uuid));
56*faefdba8SAlbert Esteve /* vhost device is not found anymore */
57*faefdba8SAlbert Esteve g_assert(virtio_lookup_vhost_device(&uuid) == NULL);
58*faefdba8SAlbert Esteve }
59*faefdba8SAlbert Esteve g_free(dev);
60*faefdba8SAlbert Esteve }
61*faefdba8SAlbert Esteve
test_remove_invalid_resource(void)62*faefdba8SAlbert Esteve static void test_remove_invalid_resource(void)
63*faefdba8SAlbert Esteve {
64*faefdba8SAlbert Esteve QemuUUID uuid;
65*faefdba8SAlbert Esteve int i;
66*faefdba8SAlbert Esteve
67*faefdba8SAlbert Esteve for (i = 0; i < 20; ++i) {
68*faefdba8SAlbert Esteve qemu_uuid_generate(&uuid);
69*faefdba8SAlbert Esteve g_assert_cmpint(virtio_lookup_dmabuf(&uuid), ==, -1);
70*faefdba8SAlbert Esteve /* Removing a resource that does not exist returns false */
71*faefdba8SAlbert Esteve g_assert_false(virtio_remove_resource(&uuid));
72*faefdba8SAlbert Esteve }
73*faefdba8SAlbert Esteve }
74*faefdba8SAlbert Esteve
test_add_invalid_resource(void)75*faefdba8SAlbert Esteve static void test_add_invalid_resource(void)
76*faefdba8SAlbert Esteve {
77*faefdba8SAlbert Esteve QemuUUID uuid;
78*faefdba8SAlbert Esteve struct vhost_dev *dev = NULL;
79*faefdba8SAlbert Esteve int i, dmabuf_fd = -2, alt_dmabuf = 2;
80*faefdba8SAlbert Esteve
81*faefdba8SAlbert Esteve for (i = 0; i < 20; ++i) {
82*faefdba8SAlbert Esteve qemu_uuid_generate(&uuid);
83*faefdba8SAlbert Esteve /* Add a new resource with invalid (negative) resource fd */
84*faefdba8SAlbert Esteve g_assert_false(virtio_add_dmabuf(&uuid, dmabuf_fd));
85*faefdba8SAlbert Esteve /* Resource is not found */
86*faefdba8SAlbert Esteve g_assert_cmpint(virtio_lookup_dmabuf(&uuid), ==, -1);
87*faefdba8SAlbert Esteve /* Add a new vhost device with invalid (NULL) pointer */
88*faefdba8SAlbert Esteve g_assert_false(virtio_add_vhost_device(&uuid, dev));
89*faefdba8SAlbert Esteve /* vhost device is not found */
90*faefdba8SAlbert Esteve g_assert(virtio_lookup_vhost_device(&uuid) == NULL);
91*faefdba8SAlbert Esteve }
92*faefdba8SAlbert Esteve
93*faefdba8SAlbert Esteve for (i = 0; i < 20; ++i) {
94*faefdba8SAlbert Esteve /* Add a valid resource */
95*faefdba8SAlbert Esteve qemu_uuid_generate(&uuid);
96*faefdba8SAlbert Esteve dmabuf_fd = g_random_int_range(3, 500);
97*faefdba8SAlbert Esteve g_assert(virtio_add_dmabuf(&uuid, dmabuf_fd));
98*faefdba8SAlbert Esteve g_assert_cmpint(virtio_lookup_dmabuf(&uuid), ==, dmabuf_fd);
99*faefdba8SAlbert Esteve /* Add a new resource with repeated uuid returns false */
100*faefdba8SAlbert Esteve g_assert_false(virtio_add_dmabuf(&uuid, alt_dmabuf));
101*faefdba8SAlbert Esteve /* The value for the uuid key is not replaced */
102*faefdba8SAlbert Esteve g_assert_cmpint(virtio_lookup_dmabuf(&uuid), ==, dmabuf_fd);
103*faefdba8SAlbert Esteve }
104*faefdba8SAlbert Esteve }
105*faefdba8SAlbert Esteve
test_free_resources(void)106*faefdba8SAlbert Esteve static void test_free_resources(void)
107*faefdba8SAlbert Esteve {
108*faefdba8SAlbert Esteve QemuUUID uuids[20];
109*faefdba8SAlbert Esteve int i, dmabuf_fd;
110*faefdba8SAlbert Esteve
111*faefdba8SAlbert Esteve for (i = 0; i < ARRAY_SIZE(uuids); ++i) {
112*faefdba8SAlbert Esteve qemu_uuid_generate(&uuids[i]);
113*faefdba8SAlbert Esteve dmabuf_fd = g_random_int_range(3, 500);
114*faefdba8SAlbert Esteve g_assert(virtio_add_dmabuf(&uuids[i], dmabuf_fd));
115*faefdba8SAlbert Esteve g_assert_cmpint(virtio_lookup_dmabuf(&uuids[i]), ==, dmabuf_fd);
116*faefdba8SAlbert Esteve }
117*faefdba8SAlbert Esteve virtio_free_resources();
118*faefdba8SAlbert Esteve for (i = 0; i < ARRAY_SIZE(uuids); ++i) {
119*faefdba8SAlbert Esteve /* None of the resources is found after free'd */
120*faefdba8SAlbert Esteve g_assert_cmpint(virtio_lookup_dmabuf(&uuids[i]), ==, -1);
121*faefdba8SAlbert Esteve }
122*faefdba8SAlbert Esteve
123*faefdba8SAlbert Esteve }
124*faefdba8SAlbert Esteve
main(int argc,char ** argv)125*faefdba8SAlbert Esteve int main(int argc, char **argv)
126*faefdba8SAlbert Esteve {
127*faefdba8SAlbert Esteve g_test_init(&argc, &argv, NULL);
128*faefdba8SAlbert Esteve g_test_add_func("/virtio-dmabuf/add_rm_res", test_add_remove_resources);
129*faefdba8SAlbert Esteve g_test_add_func("/virtio-dmabuf/add_rm_dev", test_add_remove_dev);
130*faefdba8SAlbert Esteve g_test_add_func("/virtio-dmabuf/rm_invalid_res",
131*faefdba8SAlbert Esteve test_remove_invalid_resource);
132*faefdba8SAlbert Esteve g_test_add_func("/virtio-dmabuf/add_invalid_res",
133*faefdba8SAlbert Esteve test_add_invalid_resource);
134*faefdba8SAlbert Esteve g_test_add_func("/virtio-dmabuf/free_res", test_free_resources);
135*faefdba8SAlbert Esteve
136*faefdba8SAlbert Esteve return g_test_run();
137*faefdba8SAlbert Esteve }
138