hw/virtio: derive vhost-user-input from vhost-user-base

This patch derives vhost-user-input from vhost-user-base class, so make
the input stub as a simpler boilerplate wrapper.

With the refactoring, vhost-user-input adds the property 'chardev', this
leads to conflict with the vhost-user-input-pci adds the same property.
To resolve the error, remove the duplicate property from
vhost-user-input-pci.

Signed-off-by: Leo Yan <leo.yan@linaro.org>
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Message-Id: <20231120043721.50555-5-leo.yan@linaro.org>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20240104210945.1223134-12-alex.bennee@linaro.org>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
Leo Yan 2024-01-04 21:09:45 +00:00 committed by Michael S. Tsirkin
parent 87c7fb7819
commit bad38726e9
3 changed files with 21 additions and 102 deletions

View File

@ -30,9 +30,6 @@ static void vhost_user_input_pci_instance_init(Object *obj)
virtio_instance_init_common(obj, &dev->vhi, sizeof(dev->vhi), virtio_instance_init_common(obj, &dev->vhi, sizeof(dev->vhi),
TYPE_VHOST_USER_INPUT); TYPE_VHOST_USER_INPUT);
object_property_add_alias(obj, "chardev",
OBJECT(&dev->vhi), "chardev");
} }
static const VirtioPCIDeviceTypeInfo vhost_user_input_pci_info = { static const VirtioPCIDeviceTypeInfo vhost_user_input_pci_info = {

View File

@ -5,83 +5,25 @@
*/ */
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "qemu/error-report.h"
#include "qapi/error.h"
#include "hw/virtio/virtio-input.h" #include "hw/virtio/virtio-input.h"
static int vhost_input_config_change(struct vhost_dev *dev) static Property vinput_properties[] = {
{ DEFINE_PROP_CHR("chardev", VHostUserBase, chardev),
error_report("vhost-user-input: unhandled backend config change"); DEFINE_PROP_END_OF_LIST(),
return -1;
}
static const VhostDevConfigOps config_ops = {
.vhost_dev_config_notifier = vhost_input_config_change,
}; };
static void vhost_input_realize(DeviceState *dev, Error **errp) static void vinput_realize(DeviceState *dev, Error **errp)
{ {
VHostUserInput *vhi = VHOST_USER_INPUT(dev); VHostUserBase *vub = VHOST_USER_BASE(dev);
VirtIOInput *vinput = VIRTIO_INPUT(dev); VHostUserBaseClass *vubc = VHOST_USER_BASE_GET_CLASS(dev);
VirtIODevice *vdev = VIRTIO_DEVICE(dev);
vhost_dev_set_config_notifier(&vhi->vhost->dev, &config_ops); /* Fixed for input device */
vinput->cfg_size = sizeof_field(virtio_input_config, u); vub->virtio_id = VIRTIO_ID_INPUT;
if (vhost_user_backend_dev_init(vhi->vhost, vdev, 2, errp) == -1) { vub->num_vqs = 2;
return; vub->vq_size = 4;
} vub->config_size = sizeof(virtio_input_config);
}
static void vhost_input_change_active(VirtIOInput *vinput) vubc->parent_realize(dev, errp);
{
VHostUserInput *vhi = VHOST_USER_INPUT(vinput);
if (vinput->active) {
vhost_user_backend_start(vhi->vhost);
} else {
vhost_user_backend_stop(vhi->vhost);
}
}
static void vhost_input_get_config(VirtIODevice *vdev, uint8_t *config_data)
{
VirtIOInput *vinput = VIRTIO_INPUT(vdev);
VHostUserInput *vhi = VHOST_USER_INPUT(vdev);
Error *local_err = NULL;
int ret;
memset(config_data, 0, vinput->cfg_size);
ret = vhost_dev_get_config(&vhi->vhost->dev, config_data, vinput->cfg_size,
&local_err);
if (ret) {
error_report_err(local_err);
return;
}
}
static void vhost_input_set_config(VirtIODevice *vdev,
const uint8_t *config_data)
{
VHostUserInput *vhi = VHOST_USER_INPUT(vdev);
int ret;
ret = vhost_dev_set_config(&vhi->vhost->dev, config_data,
0, sizeof(virtio_input_config),
VHOST_SET_CONFIG_TYPE_FRONTEND);
if (ret) {
error_report("vhost-user-input: set device config space failed");
return;
}
virtio_notify_config(vdev);
}
static struct vhost_dev *vhost_input_get_vhost(VirtIODevice *vdev)
{
VHostUserInput *vhi = VHOST_USER_INPUT(vdev);
return &vhi->vhost->dev;
} }
static const VMStateDescription vmstate_vhost_input = { static const VMStateDescription vmstate_vhost_input = {
@ -91,40 +33,20 @@ static const VMStateDescription vmstate_vhost_input = {
static void vhost_input_class_init(ObjectClass *klass, void *data) static void vhost_input_class_init(ObjectClass *klass, void *data)
{ {
VirtIOInputClass *vic = VIRTIO_INPUT_CLASS(klass); VHostUserBaseClass *vubc = VHOST_USER_BASE_CLASS(klass);
VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass);
DeviceClass *dc = DEVICE_CLASS(klass); DeviceClass *dc = DEVICE_CLASS(klass);
dc->vmsd = &vmstate_vhost_input; dc->vmsd = &vmstate_vhost_input;
vdc->get_config = vhost_input_get_config; device_class_set_props(dc, vinput_properties);
vdc->set_config = vhost_input_set_config; device_class_set_parent_realize(dc, vinput_realize,
vdc->get_vhost = vhost_input_get_vhost; &vubc->parent_realize);
vic->realize = vhost_input_realize; set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
vic->change_active = vhost_input_change_active;
}
static void vhost_input_init(Object *obj)
{
VHostUserInput *vhi = VHOST_USER_INPUT(obj);
vhi->vhost = VHOST_USER_BACKEND(object_new(TYPE_VHOST_USER_BACKEND));
object_property_add_alias(obj, "chardev",
OBJECT(vhi->vhost), "chardev");
}
static void vhost_input_finalize(Object *obj)
{
VHostUserInput *vhi = VHOST_USER_INPUT(obj);
object_unref(OBJECT(vhi->vhost));
} }
static const TypeInfo vhost_input_info = { static const TypeInfo vhost_input_info = {
.name = TYPE_VHOST_USER_INPUT, .name = TYPE_VHOST_USER_INPUT,
.parent = TYPE_VIRTIO_INPUT, .parent = TYPE_VHOST_USER_BASE,
.instance_size = sizeof(VHostUserInput), .instance_size = sizeof(VHostUserInput),
.instance_init = vhost_input_init,
.instance_finalize = vhost_input_finalize,
.class_init = vhost_input_class_init, .class_init = vhost_input_class_init,
}; };

View File

@ -1,6 +1,8 @@
#ifndef QEMU_VIRTIO_INPUT_H #ifndef QEMU_VIRTIO_INPUT_H
#define QEMU_VIRTIO_INPUT_H #define QEMU_VIRTIO_INPUT_H
#include "hw/virtio/vhost-user.h"
#include "hw/virtio/vhost-user-base.h"
#include "ui/input.h" #include "ui/input.h"
#include "sysemu/vhost-user-backend.h" #include "sysemu/vhost-user-backend.h"
@ -97,9 +99,7 @@ struct VirtIOInputHost {
}; };
struct VHostUserInput { struct VHostUserInput {
VirtIOInput parent_obj; VHostUserBase parent_obj;
VhostUserBackend *vhost;
}; };
void virtio_input_send(VirtIOInput *vinput, virtio_input_event *event); void virtio_input_send(VirtIOInput *vinput, virtio_input_event *event);