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),
TYPE_VHOST_USER_INPUT);
object_property_add_alias(obj, "chardev",
OBJECT(&dev->vhi), "chardev");
}
static const VirtioPCIDeviceTypeInfo vhost_user_input_pci_info = {

View File

@ -5,83 +5,25 @@
*/
#include "qemu/osdep.h"
#include "qemu/error-report.h"
#include "qapi/error.h"
#include "hw/virtio/virtio-input.h"
static int vhost_input_config_change(struct vhost_dev *dev)
{
error_report("vhost-user-input: unhandled backend config change");
return -1;
}
static const VhostDevConfigOps config_ops = {
.vhost_dev_config_notifier = vhost_input_config_change,
static Property vinput_properties[] = {
DEFINE_PROP_CHR("chardev", VHostUserBase, chardev),
DEFINE_PROP_END_OF_LIST(),
};
static void vhost_input_realize(DeviceState *dev, Error **errp)
static void vinput_realize(DeviceState *dev, Error **errp)
{
VHostUserInput *vhi = VHOST_USER_INPUT(dev);
VirtIOInput *vinput = VIRTIO_INPUT(dev);
VirtIODevice *vdev = VIRTIO_DEVICE(dev);
VHostUserBase *vub = VHOST_USER_BASE(dev);
VHostUserBaseClass *vubc = VHOST_USER_BASE_GET_CLASS(dev);
vhost_dev_set_config_notifier(&vhi->vhost->dev, &config_ops);
vinput->cfg_size = sizeof_field(virtio_input_config, u);
if (vhost_user_backend_dev_init(vhi->vhost, vdev, 2, errp) == -1) {
return;
}
}
/* Fixed for input device */
vub->virtio_id = VIRTIO_ID_INPUT;
vub->num_vqs = 2;
vub->vq_size = 4;
vub->config_size = sizeof(virtio_input_config);
static void vhost_input_change_active(VirtIOInput *vinput)
{
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;
vubc->parent_realize(dev, errp);
}
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)
{
VirtIOInputClass *vic = VIRTIO_INPUT_CLASS(klass);
VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass);
VHostUserBaseClass *vubc = VHOST_USER_BASE_CLASS(klass);
DeviceClass *dc = DEVICE_CLASS(klass);
dc->vmsd = &vmstate_vhost_input;
vdc->get_config = vhost_input_get_config;
vdc->set_config = vhost_input_set_config;
vdc->get_vhost = vhost_input_get_vhost;
vic->realize = vhost_input_realize;
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));
device_class_set_props(dc, vinput_properties);
device_class_set_parent_realize(dc, vinput_realize,
&vubc->parent_realize);
set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
}
static const TypeInfo vhost_input_info = {
.name = TYPE_VHOST_USER_INPUT,
.parent = TYPE_VIRTIO_INPUT,
.parent = TYPE_VHOST_USER_BASE,
.instance_size = sizeof(VHostUserInput),
.instance_init = vhost_input_init,
.instance_finalize = vhost_input_finalize,
.class_init = vhost_input_class_init,
};

View File

@ -1,6 +1,8 @@
#ifndef 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 "sysemu/vhost-user-backend.h"
@ -97,9 +99,7 @@ struct VirtIOInputHost {
};
struct VHostUserInput {
VirtIOInput parent_obj;
VhostUserBackend *vhost;
VHostUserBase parent_obj;
};
void virtio_input_send(VirtIOInput *vinput, virtio_input_event *event);