From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54340) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZAjd2-0004Dn-U1 for qemu-devel@nongnu.org; Thu, 02 Jul 2015 14:54:33 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZAjcv-0001Jf-BS for qemu-devel@nongnu.org; Thu, 02 Jul 2015 14:54:32 -0400 Received: from andromeda.dapyr.net ([206.212.254.10]:37144) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZAjcv-0001GL-7e for qemu-devel@nongnu.org; Thu, 02 Jul 2015 14:54:25 -0400 Date: Thu, 2 Jul 2015 14:54:10 -0400 From: Konrad Rzeszutek Wilk Message-ID: <20150702185410.GA14197@andromeda.dapyr.net> References: <1435611725-15161-1-git-send-email-konrad.wilk@oracle.com> <1435611725-15161-7-git-send-email-konrad.wilk@oracle.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: Subject: Re: [Qemu-devel] [Xen-devel] [PATCH RFC 1 6/8] xen/pt: Make xen_pt_unregister_device idempotent List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Stefano Stabellini Cc: xen-devel@lists.xenproject.org, qemu-devel@nongnu.org, Konrad Rzeszutek Wilk > > @@ -858,15 +863,20 @@ static void xen_pt_unregister_device(PCIDevice *d) > > machine_irq, errno); > > } > > } > > + s->machine_irq = 0; > > } > > > > /* delete all emulated config registers */ > > xen_pt_config_delete(s); > > > > - memory_listener_unregister(&s->memory_listener); > > - memory_listener_unregister(&s->io_listener); > > - > > - xen_host_pci_device_put(&s->real_device); > > + if (s->listener_set) { > > + memory_listener_unregister(&s->memory_listener); > > + memory_listener_unregister(&s->io_listener); > > + s->listener_set = false; > > If you call QTAILQ_INIT on memory_listener and io_listener, then you > simply check on QTAILQ_EMPTY and remove listener_set. No dice. For that to work they need to be QTAIL_HEAD while they are of QTAILQ_ENTRY. That is, the include/exec/memory.h: struct MemoryListener { ... AddressSpace *address_space_filter; QTAILQ_ENTRY(MemoryListener) link; } And the QTAILQ_EMPTY checks for '>tqh_first' while the QTAILQ_ENTRY only defines two pointers: tqe_next and tqe_prev.