xref: /openbmc/qemu/tests/unit/test-virtio-dmabuf.c (revision 2f3913f4b2ad74baeb5a6f1d36efbd9ecdf1057d)
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