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