From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54247) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YZy6R-0002We-Rf for qemu-devel@nongnu.org; Mon, 23 Mar 2015 04:52:56 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YZy6N-00055Z-S9 for qemu-devel@nongnu.org; Mon, 23 Mar 2015 04:52:55 -0400 Received: from victor.provo.novell.com ([137.65.250.26]:35077 helo=prv3-mh.provo.novell.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YZy6N-00055H-Ld for qemu-devel@nongnu.org; Mon, 23 Mar 2015 04:52:51 -0400 Message-ID: <550FD448.2090906@novell.com> Date: Mon, 23 Mar 2015 16:52:24 +0800 From: Lin Ma MIME-Version: 1.0 References: <1426824898-9936-1-git-send-email-lma@suse.com> <20150320111726.3727f305@nial.brq.redhat.com> In-Reply-To: <20150320111726.3727f305@nial.brq.redhat.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Subject: Re: [Qemu-devel] [PATCH] object_del: Prevent removing an in-use memory backend object List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Igor Mammedov Cc: pbonzini@redhat.com, qemu-devel@nongnu.org 在 2015年03月20日 18:17, Igor Mammedov 写道: > On Fri, 20 Mar 2015 12:14:58 +0800 > Lin Ma wrote: > >> 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 outputs an error msg. >> >> Signed-off-by: Lin Ma >> --- >> qmp.c | 14 ++++++++++++++ >> 1 file changed, 14 insertions(+) >> >> diff --git a/qmp.c b/qmp.c >> index c479e77..0086e2d 100644 >> --- a/qmp.c >> +++ b/qmp.c >> @@ -704,6 +704,7 @@ void qmp_object_del(const char *id, Error **errp) >> { >> Object *container; >> Object *obj; >> + const char *typename; >> >> container = container_get(object_get_root(), "/objects"); >> obj = object_resolve_path_component(container, id); >> @@ -711,6 +712,19 @@ void qmp_object_del(const char *id, Error **errp) >> error_setg(errp, "object id not found"); >> return; >> } >> + >> + typename = object_class_get_name(object_class_get_parent(\ >> + object_get_class(OBJECT(obj)))); >> + if (strcmp(typename, TYPE_MEMORY_BACKEND) == 0 ) { >> + MemoryRegion *mr; >> + mr = host_memory_backend_get_memory(MEMORY_BACKEND(obj), errp); >> + if (memory_region_is_mapped(mr)) { >> + char *path = object_get_canonical_path_component(obj); >> + error_setg(errp, "memdev %s is in used.", path); >> + g_free(path); >> + return; >> + } >> + } > How about making it more generic? > i.e > if (!obj_class->can_be_deleted(obj)) > error out > >> object_unparent(obj); >> } >> > That makes sense, I couldn't agree more. I am going to drop this patch and separate it to 2 patches. One for adding generic can_be_deleted callback, The other for adding impl in hostmem-ram.c and hostmem-file.c thanks, Lin