* [Qemu-devel] [PATCH v3 0/2] Add generic can_be_deleted to UserCreatableClass. @ 2015-03-26 17:07 Lin Ma 2015-03-26 17:07 ` [Qemu-devel] [PATCH v3 1/2] qom: Add can_be_deleted callback " Lin Ma 2015-03-26 17:07 ` [Qemu-devel] [PATCH v3 2/2] hostmem: Prevent removing an in-use memory backend object Lin Ma 0 siblings, 2 replies; 4+ messages in thread From: Lin Ma @ 2015-03-26 17:07 UTC (permalink / raw) To: imammedo, afaerber, peter.crosthwaite, pbonzini; +Cc: qemu-devel, Lin Ma 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: 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 object backends/hostmem.c | 14 ++++++++++++++ include/qom/object_interfaces.h | 3 +++ qmp.c | 13 +++++++++++++ 3 files changed, 30 insertions(+) -- 2.1.4 ^ permalink raw reply [flat|nested] 4+ messages in thread
* [Qemu-devel] [PATCH v3 1/2] qom: Add can_be_deleted callback to UserCreatableClass 2015-03-26 17:07 [Qemu-devel] [PATCH v3 0/2] Add generic can_be_deleted to UserCreatableClass Lin Ma @ 2015-03-26 17:07 ` Lin Ma 2015-03-26 20:34 ` Paolo Bonzini 2015-03-26 17:07 ` [Qemu-devel] [PATCH v3 2/2] hostmem: Prevent removing an in-use memory backend object Lin Ma 1 sibling, 1 reply; 4+ messages in thread From: Lin Ma @ 2015-03-26 17:07 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 | 3 +++ qmp.c | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/include/qom/object_interfaces.h b/include/qom/object_interfaces.h index b792283..19b66f1 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; /** diff --git a/qmp.c b/qmp.c index c479e77..a9156d6 100644 --- a/qmp.c +++ b/qmp.c @@ -711,6 +711,19 @@ void qmp_object_del(const char *id, Error **errp) error_setg(errp, "object id not found"); return; } + + UserCreatableClass *ucc; + UserCreatable *uc = + (UserCreatable *)object_dynamic_cast(obj, TYPE_USER_CREATABLE); + ucc = USER_CREATABLE_GET_CLASS(uc); + if (ucc->can_be_deleted) { + if (!ucc->can_be_deleted(uc, errp)) { + char *path = object_get_canonical_path_component(obj); + error_setg(errp, "%s is in used, can not be deleted", path); + g_free(path); + return; + } + } object_unparent(obj); } -- 2.1.4 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [Qemu-devel] [PATCH v3 1/2] qom: Add can_be_deleted callback to UserCreatableClass 2015-03-26 17:07 ` [Qemu-devel] [PATCH v3 1/2] qom: Add can_be_deleted callback " Lin Ma @ 2015-03-26 20:34 ` Paolo Bonzini 0 siblings, 0 replies; 4+ messages in thread From: Paolo Bonzini @ 2015-03-26 20:34 UTC (permalink / raw) To: Lin Ma, imammedo, afaerber, peter.crosthwaite; +Cc: qemu-devel On 26/03/2015 18:07, Lin Ma wrote: > 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 | 3 +++ > qmp.c | 13 +++++++++++++ > 2 files changed, 16 insertions(+) > > diff --git a/include/qom/object_interfaces.h b/include/qom/object_interfaces.h > index b792283..19b66f1 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; > > /** > diff --git a/qmp.c b/qmp.c > index c479e77..a9156d6 100644 > --- a/qmp.c > +++ b/qmp.c > @@ -711,6 +711,19 @@ void qmp_object_del(const char *id, Error **errp) > error_setg(errp, "object id not found"); > return; > } > + > + UserCreatableClass *ucc; > + UserCreatable *uc = > + (UserCreatable *)object_dynamic_cast(obj, TYPE_USER_CREATABLE); > + ucc = USER_CREATABLE_GET_CLASS(uc); > + if (ucc->can_be_deleted) { > + if (!ucc->can_be_deleted(uc, errp)) { Please add a function user_creatable_can_be_deleted(UserCreatable *uc) that does the call (and returns true if the field is NULL. > + char *path = object_get_canonical_path_component(obj); > + error_setg(errp, "%s is in used, can not be deleted", path); You can use id directly, no need to call object_get_canonical_path_component. > + g_free(path); > + return; > + } Thanks, Paolo > + } > object_unparent(obj); > } > > ^ permalink raw reply [flat|nested] 4+ messages in thread
* [Qemu-devel] [PATCH v3 2/2] hostmem: Prevent removing an in-use memory backend object 2015-03-26 17:07 [Qemu-devel] [PATCH v3 0/2] Add generic can_be_deleted to UserCreatableClass Lin Ma 2015-03-26 17:07 ` [Qemu-devel] [PATCH v3 1/2] qom: Add can_be_deleted callback " Lin Ma @ 2015-03-26 17:07 ` Lin Ma 1 sibling, 0 replies; 4+ messages in thread From: Lin Ma @ 2015-03-26 17:07 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..dbf94a9 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] 4+ messages in thread
end of thread, other threads:[~2015-03-26 20:35 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-03-26 17:07 [Qemu-devel] [PATCH v3 0/2] Add generic can_be_deleted to UserCreatableClass Lin Ma 2015-03-26 17:07 ` [Qemu-devel] [PATCH v3 1/2] qom: Add can_be_deleted callback " Lin Ma 2015-03-26 20:34 ` Paolo Bonzini 2015-03-26 17:07 ` [Qemu-devel] [PATCH v3 2/2] hostmem: Prevent removing an in-use memory backend object Lin Ma
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).