* [Qemu-devel] [PATCH v6 1/2] qom: Add can_be_deleted callback to UserCreatableClass
2015-03-30 8:36 [Qemu-devel] [PATCH v6 0/2] Add generic can_be_deleted to UserCreatableClass Lin Ma
@ 2015-03-30 8:36 ` Lin Ma
2015-03-31 10:48 ` Andreas Färber
2015-03-30 8:36 ` [Qemu-devel] [PATCH v6 2/2] hostmem: Prevent removing an in-use memory backend Lin Ma
` (2 subsequent siblings)
3 siblings, 1 reply; 7+ messages in thread
From: Lin Ma @ 2015-03-30 8:36 UTC (permalink / raw)
To: imammedo, afaerber, peter.crosthwaite, pbonzini; +Cc: qemu-devel, Lin Ma
If backends implement the can_be_deleted and it returns false,
Then the qmp_object_del won't delete the given backends.
Signed-off-by: Lin Ma <lma@suse.com>
---
include/qom/object_interfaces.h | 13 +++++++++++++
qmp.c | 5 +++++
qom/object_interfaces.c | 12 ++++++++++++
3 files changed, 30 insertions(+)
diff --git a/include/qom/object_interfaces.h b/include/qom/object_interfaces.h
index b792283..283ae0d 100644
--- a/include/qom/object_interfaces.h
+++ b/include/qom/object_interfaces.h
@@ -25,6 +25,8 @@ typedef struct UserCreatable {
* UserCreatableClass:
* @parent_class: the base class
* @complete: callback to be called after @obj's properties are set.
+ * @can_be_deleted: callback to be called before an object is removed
+ * to check if @obj can be removed safely.
*
* Interface is designed to work with -object/object-add/object_add
* commands.
@@ -47,6 +49,7 @@ typedef struct UserCreatableClass {
/* <public> */
void (*complete)(UserCreatable *uc, Error **errp);
+ bool (*can_be_deleted)(UserCreatable *uc, Error **errp);
} UserCreatableClass;
/**
@@ -59,4 +62,14 @@ typedef struct UserCreatableClass {
* nothing.
*/
void user_creatable_complete(Object *obj, Error **errp);
+
+/**
+ * user_creatable_can_be_deleted:
+ * @uc: the object whose can_be_deleted() method is called if implemented
+ * @errp: if an error occurs, a pointer to an area to store the error
+ *
+ * Wrapper to call can_be_deleted() method if one of types it's inherited
+ * from implements USER_CREATABLE interface.
+ */
+bool user_creatable_can_be_deleted(UserCreatable *uc, Error **errp);
#endif
diff --git a/qmp.c b/qmp.c
index c479e77..e6c7050 100644
--- a/qmp.c
+++ b/qmp.c
@@ -711,6 +711,11 @@ void qmp_object_del(const char *id, Error **errp)
error_setg(errp, "object id not found");
return;
}
+
+ if (!user_creatable_can_be_deleted(USER_CREATABLE(obj), errp)) {
+ error_setg(errp, "%s is in use, can not be deleted", id);
+ return;
+ }
object_unparent(obj);
}
diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c
index 6360818..a66cd60 100644
--- a/qom/object_interfaces.c
+++ b/qom/object_interfaces.c
@@ -18,6 +18,18 @@ void user_creatable_complete(Object *obj, Error **errp)
}
}
+bool user_creatable_can_be_deleted(UserCreatable *uc, Error **errp)
+{
+
+ UserCreatableClass *ucc = USER_CREATABLE_GET_CLASS(uc);
+
+ if (ucc->can_be_deleted) {
+ return ucc->can_be_deleted(uc, errp);
+ } else {
+ return true;
+ }
+}
+
static void register_types(void)
{
static const TypeInfo uc_interface_info = {
--
2.1.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH v6 1/2] qom: Add can_be_deleted callback to UserCreatableClass
2015-03-30 8:36 ` [Qemu-devel] [PATCH v6 1/2] qom: Add can_be_deleted callback " Lin Ma
@ 2015-03-31 10:48 ` Andreas Färber
2015-03-31 10:51 ` Paolo Bonzini
0 siblings, 1 reply; 7+ messages in thread
From: Andreas Färber @ 2015-03-31 10:48 UTC (permalink / raw)
To: Lin Ma, imammedo, peter.crosthwaite, pbonzini; +Cc: qemu-devel
Am 30.03.2015 um 10:36 schrieb Lin Ma:
> If backends implement the can_be_deleted and it returns false,
> Then the qmp_object_del won't delete the given backends.
>
> Signed-off-by: Lin Ma <lma@suse.com>
> ---
> include/qom/object_interfaces.h | 13 +++++++++++++
> qmp.c | 5 +++++
> qom/object_interfaces.c | 12 ++++++++++++
> 3 files changed, 30 insertions(+)
Fine with me,
Reviewed-by: Andreas Färber <afaerber@suse.de>
I'm expecting this will go through Paolo's or QMP tree.
Andreas
--
SUSE Linux GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Felix Imendörffer, Jane Smithard, Jennifer Guild, Dilip Upmanyu,
Graham Norton; HRB 21284 (AG Nürnberg)
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH v6 1/2] qom: Add can_be_deleted callback to UserCreatableClass
2015-03-31 10:48 ` Andreas Färber
@ 2015-03-31 10:51 ` Paolo Bonzini
0 siblings, 0 replies; 7+ messages in thread
From: Paolo Bonzini @ 2015-03-31 10:51 UTC (permalink / raw)
To: Andreas Färber, Lin Ma, imammedo, peter.crosthwaite; +Cc: qemu-devel
On 31/03/2015 12:48, Andreas Färber wrote:
> Am 30.03.2015 um 10:36 schrieb Lin Ma:
>> If backends implement the can_be_deleted and it returns false,
>> Then the qmp_object_del won't delete the given backends.
>>
>> Signed-off-by: Lin Ma <lma@suse.com>
>> ---
>> include/qom/object_interfaces.h | 13 +++++++++++++
>> qmp.c | 5 +++++
>> qom/object_interfaces.c | 12 ++++++++++++
>> 3 files changed, 30 insertions(+)
>
> Fine with me,
>
> Reviewed-by: Andreas Färber <afaerber@suse.de>
>
> I'm expecting this will go through Paolo's or QMP tree.
Yes, I'm waiting for some reviews on the ioport patches, otherwise I'll
send the pull request after -rc2 (don't want to send out unreviewed
patches hours before we ship it).
Paolo
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Qemu-devel] [PATCH v6 2/2] hostmem: Prevent removing an in-use memory backend
2015-03-30 8:36 [Qemu-devel] [PATCH v6 0/2] Add generic can_be_deleted to UserCreatableClass Lin Ma
2015-03-30 8:36 ` [Qemu-devel] [PATCH v6 1/2] qom: Add can_be_deleted callback " Lin Ma
@ 2015-03-30 8:36 ` Lin Ma
2015-03-30 8:50 ` [Qemu-devel] [PATCH v6 0/2] Add generic can_be_deleted to UserCreatableClass Paolo Bonzini
2015-03-30 12:06 ` Igor Mammedov
3 siblings, 0 replies; 7+ messages in thread
From: Lin Ma @ 2015-03-30 8:36 UTC (permalink / raw)
To: imammedo, afaerber, peter.crosthwaite, pbonzini; +Cc: qemu-devel, Lin Ma
showing a memory device whose memdev is removed leads an assert:
(qemu) object_add memory-backend-ram,id=ram0,size=128M
(qemu) device_add pc-dimm,id=d0,memdev=ram0
(qemu) object_del ram0
(qemu) info memory-devices
**
ERROR:qom/object.c:1274:object_get_canonical_path_component:\
assertion failed: (obj->parent != NULL)
Aborted
The patch prevents removing an in-use mem backend and error out.
Signed-off-by: Lin Ma <lma@suse.com>
---
backends/hostmem.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/backends/hostmem.c b/backends/hostmem.c
index 99e8f99..b7b6cf8 100644
--- a/backends/hostmem.c
+++ b/backends/hostmem.c
@@ -335,12 +335,26 @@ host_memory_backend_memory_complete(UserCreatable *uc, Error **errp)
}
}
+static bool
+host_memory_backend_can_be_deleted(UserCreatable *uc, Error **errp)
+{
+ MemoryRegion *mr;
+
+ mr = host_memory_backend_get_memory(MEMORY_BACKEND(uc), errp);
+ if (memory_region_is_mapped(mr)) {
+ return false;
+ } else {
+ return true;
+ }
+}
+
static void
host_memory_backend_class_init(ObjectClass *oc, void *data)
{
UserCreatableClass *ucc = USER_CREATABLE_CLASS(oc);
ucc->complete = host_memory_backend_memory_complete;
+ ucc->can_be_deleted = host_memory_backend_can_be_deleted;
}
static const TypeInfo host_memory_backend_info = {
--
2.1.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH v6 0/2] Add generic can_be_deleted to UserCreatableClass.
2015-03-30 8:36 [Qemu-devel] [PATCH v6 0/2] Add generic can_be_deleted to UserCreatableClass Lin Ma
2015-03-30 8:36 ` [Qemu-devel] [PATCH v6 1/2] qom: Add can_be_deleted callback " Lin Ma
2015-03-30 8:36 ` [Qemu-devel] [PATCH v6 2/2] hostmem: Prevent removing an in-use memory backend Lin Ma
@ 2015-03-30 8:50 ` Paolo Bonzini
2015-03-30 12:06 ` Igor Mammedov
3 siblings, 0 replies; 7+ messages in thread
From: Paolo Bonzini @ 2015-03-30 8:50 UTC (permalink / raw)
To: Lin Ma, imammedo, afaerber, peter.crosthwaite; +Cc: qemu-devel
On 30/03/2015 10:36, Lin Ma wrote:
> The patchset adds a generic can_be_deleted callback to UserCreatableClass.
> It prevents removing a usercreatable object if the callback returns false.
>
> Backends could implement the callback if it shoudn't be removed while it's
> in use.
>
> Thank Peter Crosthwaite, Paolo Bonzini, Andreas Färber and Igor Mammedov for
> helping review.
>
>
> ChangeLog:
> V6:
> Change prototype of user_creatable_can_be_deleted.
> from bool user_creatable_can_be_deleted(Object *obj, Error **errp)
> to bool user_creatable_can_be_deleted(UserCreatable *uc, Error **errp)
>
> V5:
> Use specific caster instead of dynamic cast in user_creatable_can_be_deleted.
>
> V4:
> Add function user_creatable_can_be_deleted to wrapper can_be_deleted method.
> Remove some unnecessary code.
>
> V3:
> Move the callback to the correct place: UserCreatableClass.
> Move the backend callback implementation to hostmem.c.
>
> V2:
> Make it generic, add the can_be_deleted callback to TypeInfo and TypeImpl.
> Implement the callback in hostmem-file.c and hostmem-ram.c.
>
> V1:
> Initial version, hard coded in object_del to prevent removing an in-use
> host memory backend.
>
>
> Lin Ma (2):
> qom: Add can_be_deleted callback to UserCreatableClass
> hostmem: Prevent removing an in-use memory backend
>
> backends/hostmem.c | 14 ++++++++++++++
> include/qom/object_interfaces.h | 13 +++++++++++++
> qmp.c | 5 +++++
> qom/object_interfaces.c | 12 ++++++++++++
> 4 files changed, 44 insertions(+)
>
Thanks, looks good for 2.3.
Paolo
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH v6 0/2] Add generic can_be_deleted to UserCreatableClass.
2015-03-30 8:36 [Qemu-devel] [PATCH v6 0/2] Add generic can_be_deleted to UserCreatableClass Lin Ma
` (2 preceding siblings ...)
2015-03-30 8:50 ` [Qemu-devel] [PATCH v6 0/2] Add generic can_be_deleted to UserCreatableClass Paolo Bonzini
@ 2015-03-30 12:06 ` Igor Mammedov
3 siblings, 0 replies; 7+ messages in thread
From: Igor Mammedov @ 2015-03-30 12:06 UTC (permalink / raw)
To: Lin Ma; +Cc: pbonzini, peter.crosthwaite, afaerber, qemu-devel
On Mon, 30 Mar 2015 16:36:27 +0800
Lin Ma <lma@suse.com> wrote:
Paolo,
Could you take it through your tree for 2.3, pls?
> The patchset adds a generic can_be_deleted callback to UserCreatableClass.
> It prevents removing a usercreatable object if the callback returns false.
>
> Backends could implement the callback if it shoudn't be removed while it's
> in use.
>
> Thank Peter Crosthwaite, Paolo Bonzini, Andreas Färber and Igor Mammedov for
> helping review.
>
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
>
> ChangeLog:
> V6:
> Change prototype of user_creatable_can_be_deleted.
> from bool user_creatable_can_be_deleted(Object *obj, Error **errp)
> to bool user_creatable_can_be_deleted(UserCreatable *uc, Error **errp)
>
> V5:
> Use specific caster instead of dynamic cast in user_creatable_can_be_deleted.
>
> V4:
> Add function user_creatable_can_be_deleted to wrapper can_be_deleted method.
> Remove some unnecessary code.
>
> V3:
> Move the callback to the correct place: UserCreatableClass.
> Move the backend callback implementation to hostmem.c.
>
> V2:
> Make it generic, add the can_be_deleted callback to TypeInfo and TypeImpl.
> Implement the callback in hostmem-file.c and hostmem-ram.c.
>
> V1:
> Initial version, hard coded in object_del to prevent removing an in-use
> host memory backend.
>
>
> Lin Ma (2):
> qom: Add can_be_deleted callback to UserCreatableClass
> hostmem: Prevent removing an in-use memory backend
>
> backends/hostmem.c | 14 ++++++++++++++
> include/qom/object_interfaces.h | 13 +++++++++++++
> qmp.c | 5 +++++
> qom/object_interfaces.c | 12 ++++++++++++
> 4 files changed, 44 insertions(+)
>
^ permalink raw reply [flat|nested] 7+ messages in thread