From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48293) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WQa5N-0008ER-Aq for qemu-devel@nongnu.org; Thu, 20 Mar 2014 06:20:33 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WQa5I-0007XY-W9 for qemu-devel@nongnu.org; Thu, 20 Mar 2014 06:20:29 -0400 Sender: Paolo Bonzini Message-ID: <532AC0D9.1050304@redhat.com> Date: Thu, 20 Mar 2014 11:20:09 +0100 From: Paolo Bonzini MIME-Version: 1.0 References: <1394603550-11556-1-git-send-email-aik@ozlabs.ru> <1394603550-11556-2-git-send-email-aik@ozlabs.ru> In-Reply-To: <1394603550-11556-2-git-send-email-aik@ozlabs.ru> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v5 01/11] memory: Sanity check that no listeners remain on a destroyed AddressSpace List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Alexey Kardashevskiy , Alex Williamson Cc: David Gibson , qemu-ppc@nongnu.org, Alexander Graf , qemu-devel@nongnu.org Il 12/03/2014 06:52, Alexey Kardashevskiy ha scritto: > From: David Gibson > > At the moment, most AddressSpace objects last as long as the guest system > in practice, but that could well change in future. In addition, for VFIO > we will be introducing some private per-AdressSpace information, which must > be disposed of before the AddressSpace itself is destroyed. > > To reduce the chances of subtle bugs in this area, this patch adds > asssertions to ensure that when an AddressSpace is destroyed, there are no > remaining MemoryListeners using that AS as a filter. > > Signed-off-by: David Gibson > Signed-off-by: Alexey Kardashevskiy > --- > memory.c | 7 +++++++ > 1 file changed, 7 insertions(+) > > diff --git a/memory.c b/memory.c > index 3f1df23..678661e 100644 > --- a/memory.c > +++ b/memory.c > @@ -1722,12 +1722,19 @@ void address_space_init(AddressSpace *as, MemoryRegion *root, const char *name) > > void address_space_destroy(AddressSpace *as) > { > + MemoryListener *listener; > + > /* Flush out anything from MemoryListeners listening in on this */ > memory_region_transaction_begin(); > as->root = NULL; > memory_region_transaction_commit(); > QTAILQ_REMOVE(&address_spaces, as, address_spaces_link); > address_space_destroy_dispatch(as); > + > + QTAILQ_FOREACH(listener, &memory_listeners, link) { > + assert(listener->address_space_filter != as); > + } > + > flatview_unref(as->current_map); > g_free(as->name); > g_free(as->ioeventfds); > Reviewed-by: Paolo Bonzini An alternative is to add a count of listeners to the address space and assert that it is 0. Paolo