63 lines
1.5 KiB
C
63 lines
1.5 KiB
C
![]() |
/*
|
||
|
* vhost shadow virtqueue
|
||
|
*
|
||
|
* SPDX-FileCopyrightText: Red Hat, Inc. 2021
|
||
|
* SPDX-FileContributor: Author: Eugenio Pérez <eperezma@redhat.com>
|
||
|
*
|
||
|
* 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);
|
||
|
}
|