xref: /qemu/hw/virtio/vhost-shadow-virtqueue.c (revision 10857ec0ad5d201d524d20b477da1cf3f7f4a3b0)
1*10857ec0SEugenio Pérez /*
2*10857ec0SEugenio Pérez  * vhost shadow virtqueue
3*10857ec0SEugenio Pérez  *
4*10857ec0SEugenio Pérez  * SPDX-FileCopyrightText: Red Hat, Inc. 2021
5*10857ec0SEugenio Pérez  * SPDX-FileContributor: Author: Eugenio Pérez <eperezma@redhat.com>
6*10857ec0SEugenio Pérez  *
7*10857ec0SEugenio Pérez  * SPDX-License-Identifier: GPL-2.0-or-later
8*10857ec0SEugenio Pérez  */
9*10857ec0SEugenio Pérez 
10*10857ec0SEugenio Pérez #include "qemu/osdep.h"
11*10857ec0SEugenio Pérez #include "hw/virtio/vhost-shadow-virtqueue.h"
12*10857ec0SEugenio Pérez 
13*10857ec0SEugenio Pérez #include "qemu/error-report.h"
14*10857ec0SEugenio Pérez 
15*10857ec0SEugenio Pérez /**
16*10857ec0SEugenio Pérez  * Creates vhost shadow virtqueue, and instructs the vhost device to use the
17*10857ec0SEugenio Pérez  * shadow methods and file descriptors.
18*10857ec0SEugenio Pérez  *
19*10857ec0SEugenio Pérez  * Returns the new virtqueue or NULL.
20*10857ec0SEugenio Pérez  *
21*10857ec0SEugenio Pérez  * In case of error, reason is reported through error_report.
22*10857ec0SEugenio Pérez  */
23*10857ec0SEugenio Pérez VhostShadowVirtqueue *vhost_svq_new(void)
24*10857ec0SEugenio Pérez {
25*10857ec0SEugenio Pérez     g_autofree VhostShadowVirtqueue *svq = g_new0(VhostShadowVirtqueue, 1);
26*10857ec0SEugenio Pérez     int r;
27*10857ec0SEugenio Pérez 
28*10857ec0SEugenio Pérez     r = event_notifier_init(&svq->hdev_kick, 0);
29*10857ec0SEugenio Pérez     if (r != 0) {
30*10857ec0SEugenio Pérez         error_report("Couldn't create kick event notifier: %s (%d)",
31*10857ec0SEugenio Pérez                      g_strerror(errno), errno);
32*10857ec0SEugenio Pérez         goto err_init_hdev_kick;
33*10857ec0SEugenio Pérez     }
34*10857ec0SEugenio Pérez 
35*10857ec0SEugenio Pérez     r = event_notifier_init(&svq->hdev_call, 0);
36*10857ec0SEugenio Pérez     if (r != 0) {
37*10857ec0SEugenio Pérez         error_report("Couldn't create call event notifier: %s (%d)",
38*10857ec0SEugenio Pérez                      g_strerror(errno), errno);
39*10857ec0SEugenio Pérez         goto err_init_hdev_call;
40*10857ec0SEugenio Pérez     }
41*10857ec0SEugenio Pérez 
42*10857ec0SEugenio Pérez     return g_steal_pointer(&svq);
43*10857ec0SEugenio Pérez 
44*10857ec0SEugenio Pérez err_init_hdev_call:
45*10857ec0SEugenio Pérez     event_notifier_cleanup(&svq->hdev_kick);
46*10857ec0SEugenio Pérez 
47*10857ec0SEugenio Pérez err_init_hdev_kick:
48*10857ec0SEugenio Pérez     return NULL;
49*10857ec0SEugenio Pérez }
50*10857ec0SEugenio Pérez 
51*10857ec0SEugenio Pérez /**
52*10857ec0SEugenio Pérez  * Free the resources of the shadow virtqueue.
53*10857ec0SEugenio Pérez  *
54*10857ec0SEugenio Pérez  * @pvq: gpointer to SVQ so it can be used by autofree functions.
55*10857ec0SEugenio Pérez  */
56*10857ec0SEugenio Pérez void vhost_svq_free(gpointer pvq)
57*10857ec0SEugenio Pérez {
58*10857ec0SEugenio Pérez     VhostShadowVirtqueue *vq = pvq;
59*10857ec0SEugenio Pérez     event_notifier_cleanup(&vq->hdev_kick);
60*10857ec0SEugenio Pérez     event_notifier_cleanup(&vq->hdev_call);
61*10857ec0SEugenio Pérez     g_free(vq);
62*10857ec0SEugenio Pérez }
63