Hi Eric, > -----Original Message----- > From: Auger Eric [mailto:eric.au...@redhat.com] > Sent: Monday, July 31, 2017 6:38 PM > To: Peter Xu <pet...@redhat.com>; Bharat Bhushan > <bharat.bhus...@nxp.com> > Cc: w...@redhat.com; peter.mayd...@linaro.org; kevin.t...@intel.com; > drjo...@redhat.com; m...@redhat.com; jean-philippe.bruc...@arm.com; > t...@semihalf.com; will.dea...@arm.com; qemu-devel@nongnu.org; > alex.william...@redhat.com; qemu-...@nongnu.org; > marc.zyng...@arm.com; robin.mur...@arm.com; > christoffer.d...@linaro.org; eric.auger....@gmail.com > Subject: Re: [Qemu-devel] [RFC v2 6/8] virtio-iommu: Implement the > translation and commands > > Hi Peter, Bharat, > > On 17/07/2017 03:28, Peter Xu wrote: > > On Fri, Jul 14, 2017 at 06:40:34AM +0000, Bharat Bhushan wrote: > >> Hi Peter, > >> > >>> -----Original Message----- > >>> From: Peter Xu [mailto:pet...@redhat.com] > >>> Sent: Friday, July 14, 2017 7:48 AM > >>> To: Eric Auger <eric.au...@redhat.com> > >>> Cc: eric.auger....@gmail.com; peter.mayd...@linaro.org; > >>> alex.william...@redhat.com; m...@redhat.com; qemu- > a...@nongnu.org; > >>> qemu-devel@nongnu.org; jean-philippe.bruc...@arm.com; > >>> w...@redhat.com; kevin.t...@intel.com; Bharat Bhushan > >>> <bharat.bhus...@nxp.com>; marc.zyng...@arm.com; > t...@semihalf.com; > >>> will.dea...@arm.com; drjo...@redhat.com; robin.mur...@arm.com; > >>> christoffer.d...@linaro.org > >>> Subject: Re: [Qemu-devel] [RFC v2 6/8] virtio-iommu: Implement the > >>> translation and commands > >>> > >>> On Wed, Jun 07, 2017 at 06:01:25PM +0200, Eric Auger wrote: > >>>> This patch adds the actual implementation for the translation > >>>> routine and the virtio-iommu commands. > >>>> > >>>> Signed-off-by: Eric Auger <eric.au...@redhat.com> > >>> > >>> [...] > >>> > >>>> static int virtio_iommu_attach(VirtIOIOMMU *s, > >>>> struct virtio_iommu_req_attach > >>>> *req) @@ -95,10 +135,34 @@ static int > virtio_iommu_attach(VirtIOIOMMU *s, > >>>> uint32_t asid = le32_to_cpu(req->address_space); > >>>> uint32_t devid = le32_to_cpu(req->device); > >>>> uint32_t reserved = le32_to_cpu(req->reserved); > >>>> + viommu_as *as; > >>>> + viommu_dev *dev; > >>>> > >>>> trace_virtio_iommu_attach(asid, devid, reserved); > >>>> > >>>> - return VIRTIO_IOMMU_S_UNSUPP; > >>>> + dev = g_tree_lookup(s->devices, GUINT_TO_POINTER(devid)); > >>>> + if (dev) { > >>>> + return -1; > >>>> + } > >>>> + > >>>> + as = g_tree_lookup(s->address_spaces, > GUINT_TO_POINTER(asid)); > >>>> + if (!as) { > >>>> + as = g_malloc0(sizeof(*as)); > >>>> + as->id = asid; > >>>> + as->mappings = > g_tree_new_full((GCompareDataFunc)interval_cmp, > >>>> + NULL, NULL, > >>>> (GDestroyNotify)g_free); > >>>> + g_tree_insert(s->address_spaces, GUINT_TO_POINTER(asid), as); > >>>> + trace_virtio_iommu_new_asid(asid); > >>>> + } > >>>> + > >>>> + dev = g_malloc0(sizeof(*dev)); > >>>> + dev->as = as; > >>>> + dev->id = devid; > >>>> + as->nr_devices++; > >>>> + trace_virtio_iommu_new_devid(devid); > >>>> + g_tree_insert(s->devices, GUINT_TO_POINTER(devid), dev); > >>> > >>> Here do we need to record something like a refcount for address space? > >>> Since... > >> > >> We are using "nr_devices" as number of devices attached to an > >> address-space > >> > >>> > >>>> + > >>>> + return VIRTIO_IOMMU_S_OK; > >>>> } > >>>> > >>>> static int virtio_iommu_detach(VirtIOIOMMU *s, @@ -106,10 +170,13 > >>>> @@ static int virtio_iommu_detach(VirtIOIOMMU *s, { > >>>> uint32_t devid = le32_to_cpu(req->device); > >>>> uint32_t reserved = le32_to_cpu(req->reserved); > >>>> + int ret; > >>>> > >>>> trace_virtio_iommu_detach(devid, reserved); > >>>> > >>>> - return VIRTIO_IOMMU_S_UNSUPP; > >>>> + ret = g_tree_remove(s->devices, GUINT_TO_POINTER(devid)); > >>> > >>> ... here when detach, imho we should check the refcount: if there is > >>> no device using specific address space, we should release the > >>> address space as well. > >>> > >>> Otherwise there would have no way to destroy an address space? > >> > >> > >> Here if nr_devices == 0 then release the address space, is that ok? > >> > >> This is how I implemented as part of VFIO integration over this patch > series. > >> "[RFC PATCH 2/2] virtio-iommu: vfio integration with virtio-iommu" > > glib provides g_tree_ref/g_tree_unref. I think the most elegant is to use > g_tree_ref when adding a device and decrementing when removing a > device, as suggested by Peter. > > "if the reference count drops to 0, all keys and values will be destroyed (if > destroy functions were specified) and all memory allocated by tree will be > released." > > That way we should be able to remove nr_devices from viommu_as > > Bharat, if this breaks your implementation I will let you re-introduce > nr_devices as part of the VFIO patch.
We need to unmap() everything in physical-iommu when last device is detached, seems like g_tree_ref/unref() does not give any handle for this. I will go ahead with adding nr_devices with VFIO integration patches. Thanks -Bharat > > Thanks > > Eric > > > > Sorry I didn't read that when posting. It is what I mean. Thanks, > >