[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC PATCH v1 14/26] kvm: vmi: allow only one instance of the introspect
From: |
Adalbert Lazăr |
Subject: |
[RFC PATCH v1 14/26] kvm: vmi: allow only one instance of the introspection object |
Date: |
Wed, 15 Apr 2020 03:59:26 +0300 |
Because only one introspection tool must introspect a VM at a given time,
we block the completion of the second instance.
Signed-off-by: Adalbert Lazăr <address@hidden>
---
accel/kvm/vmi.c | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/accel/kvm/vmi.c b/accel/kvm/vmi.c
index 2ce8a60565..54c56c6e13 100644
--- a/accel/kvm/vmi.c
+++ b/accel/kvm/vmi.c
@@ -52,10 +52,18 @@ typedef struct VMIntrospection {
bool kvmi_hooked;
} VMIntrospection;
+typedef struct VMIntrospectionClass {
+ ObjectClass parent_class;
+ uint32_t instance_counter;
+ VMIntrospection *uniq;
+} VMIntrospectionClass;
+
#define TYPE_VM_INTROSPECTION "introspection"
#define VM_INTROSPECTION(obj) \
OBJECT_CHECK(VMIntrospection, (obj), TYPE_VM_INTROSPECTION)
+#define VM_INTROSPECTION_CLASS(class) \
+ OBJECT_CLASS_CHECK(VMIntrospectionClass, (class), TYPE_VM_INTROSPECTION)
static Error *vm_introspection_init(VMIntrospection *i);
@@ -81,8 +89,14 @@ static void update_vm_start_time(VMIntrospection *i)
static void complete(UserCreatable *uc, Error **errp)
{
+ VMIntrospectionClass *ic = VM_INTROSPECTION_CLASS(OBJECT(uc)->class);
VMIntrospection *i = VM_INTROSPECTION(uc);
+ if (ic->instance_counter > 1) {
+ error_setg(errp, "VMI: only one introspection object can be created");
+ return;
+ }
+
if (!i->chardevid) {
error_setg(errp, "VMI: chardev is not set");
return;
@@ -106,6 +120,8 @@ static void complete(UserCreatable *uc, Error **errp)
i->init_error = NULL;
return;
}
+
+ ic->uniq = i;
}
static void prop_set_chardev(Object *obj, const char *value, Error **errp)
@@ -168,8 +184,11 @@ static void class_init(ObjectClass *oc, void *data)
static void instance_init(Object *obj)
{
+ VMIntrospectionClass *ic = VM_INTROSPECTION_CLASS(obj->class);
VMIntrospection *i = VM_INTROSPECTION(obj);
+ ic->instance_counter++;
+
i->sock_fd = -1;
i->created_from_command_line = (qdev_hotplug == false);
@@ -234,6 +253,7 @@ static void cancel_handshake_timer(VMIntrospection *i)
static void instance_finalize(Object *obj)
{
+ VMIntrospectionClass *ic = VM_INTROSPECTION_CLASS(obj->class);
VMIntrospection *i = VM_INTROSPECTION(obj);
g_free(i->chardevid);
@@ -248,12 +268,18 @@ static void instance_finalize(Object *obj)
}
error_free(i->init_error);
+
+ ic->instance_counter--;
+ if (!ic->instance_counter) {
+ ic->uniq = NULL;
+ }
}
static const TypeInfo info = {
.name = TYPE_VM_INTROSPECTION,
.parent = TYPE_OBJECT,
.class_init = class_init,
+ .class_size = sizeof(VMIntrospectionClass),
.instance_size = sizeof(VMIntrospection),
.instance_finalize = instance_finalize,
.instance_init = instance_init,
- [RFC PATCH v1 07/26] linux-headers: update with VM introspection interface, (continued)
- [RFC PATCH v1 07/26] linux-headers: update with VM introspection interface, Adalbert Lazăr, 2020/04/14
- [RFC PATCH v1 05/26] char-socket: add 'fd' property, Adalbert Lazăr, 2020/04/14
- [RFC PATCH v1 13/26] kvm: vmi: block the object destruction if the chardev is connected, Adalbert Lazăr, 2020/04/14
- [RFC PATCH v1 09/26] kvm: introduce the VM introspection object, Adalbert Lazăr, 2020/04/14
- [RFC PATCH v1 02/26] char-socket: allow vsock parameters (cid, port), Adalbert Lazăr, 2020/04/14
- [RFC PATCH v1 01/26] chardev: tcp: allow to change the reconnect timer, Adalbert Lazăr, 2020/04/14
- [RFC PATCH v1 14/26] kvm: vmi: allow only one instance of the introspection object,
Adalbert Lazăr <=
- [RFC PATCH v1 11/26] kvm: vmi: add 'handshake_timeout' property, Adalbert Lazăr, 2020/04/14
- [RFC PATCH v1 15/26] kvm: vmi: reconnect the socket on reset, Adalbert Lazăr, 2020/04/14
- [RFC PATCH v1 19/26] kvm: vmi: intercept force-reset, Adalbert Lazăr, 2020/04/14
- [RFC PATCH v1 22/26] kvm: vmi: add 'async_unhook' property, Adalbert Lazăr, 2020/04/14
- [RFC PATCH v1 17/26] kvm: vmi: add 'unhook_timeout' property, Adalbert Lazăr, 2020/04/14
- [RFC PATCH v1 24/26] kvm: vmi: add 'unhook_on_shutdown' property, Adalbert Lazăr, 2020/04/14
- [RFC PATCH v1 12/26] kvm: vmi: add 'key' property, Adalbert Lazăr, 2020/04/14
- [RFC PATCH v1 21/26] kvm: vmi: postpone the OK response from qmp_stop(), Adalbert Lazăr, 2020/04/14
- [RFC PATCH v1 18/26] kvm: vmi: store/restore 'vm_start_time' on migrate/snapshot, Adalbert Lazăr, 2020/04/14
- [RFC PATCH v1 23/26] kvm: vmi: intercept shutdown, Adalbert Lazăr, 2020/04/14