/* * vhost shadow virtqueue * * SPDX-FileCopyrightText: Red Hat, Inc. 2021 * SPDX-FileContributor: Author: Eugenio Pérez * * SPDX-License-Identifier: GPL-2.0-or-later */ #include "qemu/osdep.h" #include "hw/virtio/vhost-shadow-virtqueue.h" #include "qemu/error-report.h" /** * Creates vhost shadow virtqueue, and instructs the vhost device to use the * shadow methods and file descriptors. * * Returns the new virtqueue or NULL. * * In case of error, reason is reported through error_report. */ VhostShadowVirtqueue *vhost_svq_new(void) { g_autofree VhostShadowVirtqueue *svq = g_new0(VhostShadowVirtqueue, 1); int r; r = event_notifier_init(&svq->hdev_kick, 0); if (r != 0) { error_report("Couldn't create kick event notifier: %s (%d)", g_strerror(errno), errno); goto err_init_hdev_kick; } r = event_notifier_init(&svq->hdev_call, 0); if (r != 0) { error_report("Couldn't create call event notifier: %s (%d)", g_strerror(errno), errno); goto err_init_hdev_call; } return g_steal_pointer(&svq); err_init_hdev_call: event_notifier_cleanup(&svq->hdev_kick); err_init_hdev_kick: return NULL; } /** * Free the resources of the shadow virtqueue. * * @pvq: gpointer to SVQ so it can be used by autofree functions. */ void vhost_svq_free(gpointer pvq) { VhostShadowVirtqueue *vq = pvq; event_notifier_cleanup(&vq->hdev_kick); event_notifier_cleanup(&vq->hdev_call); g_free(vq); }