From: Stefano Stabellini <sstabellini@kernel.org>
To: stefanha@gmail.com
Cc: stefanha@redhat.com, peter.maydell@linaro.org,
sstabellini@kernel.org, anthony.perard@citrix.com,
xen-devel@lists.xenproject.org, qemu-devel@nongnu.org,
Juergen Gross <jgross@suse.com>
Subject: [Qemu-devel] [PULL 4/5] xen: create qdev for each backend device
Date: Tue, 22 Nov 2016 10:46:08 -0800 [thread overview]
Message-ID: <1479840369-19503-4-git-send-email-sstabellini@kernel.org> (raw)
In-Reply-To: <1479840369-19503-1-git-send-email-sstabellini@kernel.org>
From: Juergen Gross <jgross@suse.com>
Create a qdev plugged to the xen-sysbus for each new backend device.
This device can be used as a parent for all needed devices of that
backend. The id of the new device will be "xen-<type>-<dev>" with
<type> being the xen backend type (e.g. "qdisk") and <dev> the xen
backend number of the type under which it is to be found in xenstore.
Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
Signed-off-by: Stefano Stabellini <sstabellini@kernel.org>
---
hw/xen/xen_backend.c | 47 ++++++++++++++++++++++++++++++++++++++++++++
hw/xen/xen_pvdev.c | 4 +++-
include/hw/xen/xen_backend.h | 4 ++++
include/hw/xen/xen_pvdev.h | 1 +
4 files changed, 55 insertions(+), 1 deletion(-)
diff --git a/hw/xen/xen_backend.c b/hw/xen/xen_backend.c
index 5ad3caa..d119004 100644
--- a/hw/xen/xen_backend.c
+++ b/hw/xen/xen_backend.c
@@ -27,11 +27,13 @@
#include "hw/hw.h"
#include "hw/sysbus.h"
+#include "hw/boards.h"
#include "sysemu/char.h"
#include "qemu/log.h"
#include "qapi/error.h"
#include "hw/xen/xen_backend.h"
#include "hw/xen/xen_pvdev.h"
+#include "monitor/qdev.h"
#include <xen/grant_table.h>
@@ -121,6 +123,12 @@ static struct XenDevice *xen_be_get_xendev(const char *type, int dom, int dev,
/* init new xendev */
xendev = g_malloc0(ops->size);
+ object_initialize(&xendev->qdev, ops->size, TYPE_XENBACKEND);
+ qdev_set_parent_bus(&xendev->qdev, xen_sysbus);
+ qdev_set_id(&xendev->qdev, g_strdup_printf("xen-%s-%d", type, dev));
+ qdev_init_nofail(&xendev->qdev);
+ object_unref(OBJECT(&xendev->qdev));
+
xendev->type = type;
xendev->dom = dom;
xendev->dev = dev;
@@ -541,6 +549,15 @@ err:
return -1;
}
+static void xen_set_dynamic_sysbus(void)
+{
+ Object *machine = qdev_get_machine();
+ ObjectClass *oc = object_get_class(machine);
+ MachineClass *mc = MACHINE_CLASS(oc);
+
+ mc->has_dynamic_sysbus = true;
+}
+
int xen_be_register(const char *type, struct XenDevOps *ops)
{
char path[50];
@@ -562,6 +579,8 @@ int xen_be_register(const char *type, struct XenDevOps *ops)
void xen_be_register_common(void)
{
+ xen_set_dynamic_sysbus();
+
xen_be_register("console", &xen_console_ops);
xen_be_register("vkbd", &xen_kbdmouse_ops);
xen_be_register("qdisk", &xen_blkdev_ops);
@@ -588,9 +607,36 @@ int xen_be_bind_evtchn(struct XenDevice *xendev)
}
+static Property xendev_properties[] = {
+ DEFINE_PROP_END_OF_LIST(),
+};
+
+static void xendev_class_init(ObjectClass *klass, void *data)
+{
+ DeviceClass *dc = DEVICE_CLASS(klass);
+
+ dc->props = xendev_properties;
+ set_bit(DEVICE_CATEGORY_MISC, dc->categories);
+}
+
+static const TypeInfo xendev_type_info = {
+ .name = TYPE_XENBACKEND,
+ .parent = TYPE_XENSYSDEV,
+ .class_init = xendev_class_init,
+ .instance_size = sizeof(struct XenDevice),
+};
+
+static void xen_sysbus_class_init(ObjectClass *klass, void *data)
+{
+ HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(klass);
+
+ hc->unplug = qdev_simple_device_unplug_cb;
+}
+
static const TypeInfo xensysbus_info = {
.name = TYPE_XENSYSBUS,
.parent = TYPE_BUS,
+ .class_init = xen_sysbus_class_init,
.interfaces = (InterfaceInfo[]) {
{ TYPE_HOTPLUG_HANDLER },
{ }
@@ -627,6 +673,7 @@ static void xenbe_register_types(void)
{
type_register_static(&xensysbus_info);
type_register_static(&xensysdev_info);
+ type_register_static(&xendev_type_info);
}
type_init(xenbe_register_types)
diff --git a/hw/xen/xen_pvdev.c b/hw/xen/xen_pvdev.c
index 5212bc6..aed783e 100644
--- a/hw/xen/xen_pvdev.c
+++ b/hw/xen/xen_pvdev.c
@@ -19,6 +19,7 @@
#include "qemu/osdep.h"
#include "qemu/log.h"
+#include "hw/qdev-core.h"
#include "hw/xen/xen_backend.h"
#include "hw/xen/xen_pvdev.h"
@@ -307,7 +308,8 @@ void xen_pv_del_xendev(struct XenDevice *xendev)
}
QTAILQ_REMOVE(&xendevs, xendev, next);
- g_free(xendev);
+
+ qdev_unplug(&xendev->qdev, NULL);
}
void xen_pv_insert_xendev(struct XenDevice *xendev)
diff --git a/include/hw/xen/xen_backend.h b/include/hw/xen/xen_backend.h
index 38f730e..4f4799a 100644
--- a/include/hw/xen/xen_backend.h
+++ b/include/hw/xen/xen_backend.h
@@ -8,6 +8,10 @@
#define TYPE_XENSYSDEV "xen-sysdev"
#define TYPE_XENSYSBUS "xen-sysbus"
+#define TYPE_XENBACKEND "xen-backend"
+
+#define XENBACKEND_DEVICE(obj) \
+ OBJECT_CHECK(XenDevice, (obj), TYPE_XENBACKEND)
/* variables */
extern xc_interface *xen_xc;
diff --git a/include/hw/xen/xen_pvdev.h b/include/hw/xen/xen_pvdev.h
index 083f0a9..d473e9b 100644
--- a/include/hw/xen/xen_pvdev.h
+++ b/include/hw/xen/xen_pvdev.h
@@ -29,6 +29,7 @@ struct XenDevOps {
};
struct XenDevice {
+ DeviceState qdev;
const char *type;
int dom;
int dev;
--
1.9.1
next prev parent reply other threads:[~2016-11-22 18:46 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-11-22 18:45 [Qemu-devel] [PULL 0/5] xen-20161122-tag Stefano Stabellini
2016-11-22 18:46 ` [Qemu-devel] [PULL 1/5] xen: fix ioreq handling Stefano Stabellini
2016-11-22 18:46 ` [Qemu-devel] [PULL 2/5] xen: add an own bus for xen backend devices Stefano Stabellini
2016-11-22 18:46 ` [Qemu-devel] [PULL 3/5] qdev: add function qdev_set_id() Stefano Stabellini
2016-11-22 18:46 ` Stefano Stabellini [this message]
2016-11-22 18:46 ` [Qemu-devel] [PULL 5/5] xen: attach pvusb usb bus to backend qdev Stefano Stabellini
2016-11-22 19:31 ` [Qemu-devel] [PULL 0/5] xen-20161122-tag Stefan Hajnoczi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1479840369-19503-4-git-send-email-sstabellini@kernel.org \
--to=sstabellini@kernel.org \
--cc=anthony.perard@citrix.com \
--cc=jgross@suse.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@gmail.com \
--cc=stefanha@redhat.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).