[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 3/7] util: make a copy of iova_tree_remove_parameter
From: |
Eugenio Perez Martin |
Subject: |
Re: [PATCH 3/7] util: make a copy of iova_tree_remove_parameter |
Date: |
Tue, 23 Aug 2022 11:55:16 +0200 |
On Tue, Aug 23, 2022 at 8:18 AM Jason Wang <jasowang@redhat.com> wrote:
>
>
> 在 2022/8/20 00:53, Eugenio Pérez 写道:
> > It's convenient to call iova_tree_remove from a map returned from
> > iova_tree_find or iova_tree_find_iova.
>
>
> The looks like a hint of the defect of current API.
>
>
> > With the current code this is not
> > possible, since we will free it, and then we will try to search for it
> > again.
> >
> > Fix it making a copy of the argument. Not applying a fixes tag, since
> > there is no use like that at the moment.
> >
> > Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
> > ---
> > util/iova-tree.c | 4 +++-
> > 1 file changed, 3 insertions(+), 1 deletion(-)
> >
> > diff --git a/util/iova-tree.c b/util/iova-tree.c
> > index fee530a579..713e3edd7b 100644
> > --- a/util/iova-tree.c
> > +++ b/util/iova-tree.c
> > @@ -166,9 +166,11 @@ void iova_tree_foreach(IOVATree *tree,
> > iova_tree_iterator iterator)
> >
> > void iova_tree_remove(IOVATree *tree, const DMAMap *map)
> > {
> > + /* Just in case caller is calling iova_tree_remove from a result of
> > find */
> > + const DMAMap needle = *map;
>
>
> Then let's simply make iova_tree_remove() accept const DMAMap instead of
> the pointer to it.
>
Do you mean to accept DMAMap by value, isn't it? (no need for const it
then, isn't it?).
>
> > const DMAMap *overlap;
> >
> > - while ((overlap = iova_tree_find(tree, map))) {
> > + while ((overlap = iova_tree_find(tree, &needle))) {
> > g_tree_remove(tree->tree, overlap);
> > }
>
>
> So we had following in iova_tree_insert():
>
> /* We don't allow to insert range that overlaps with existings */
> if (iova_tree_find(tree, map)) {
> return IOVA_ERR_OVERLAP;
> }
>
> I wonder how overlap can happen?
>
I don't get this part. The problem is that iova_tree_find returns a
pointer to an internal structure, there is no need to insert multiple
times overlapping maps.
Thanks!
- [PATCH 0/7] vDPA shadow virtqueue iova tree fixes., Eugenio Pérez, 2022/08/19
- [PATCH 2/7] vdpa: do not save failed dma maps in SVQ iova tree, Eugenio Pérez, 2022/08/19
- [PATCH 5/7] vdpa: Make SVQ vring unmapping return void, Eugenio Pérez, 2022/08/19
- [PATCH 7/7] vdpa: Use ring hwaddr at vhost_vdpa_svq_unmap_ring, Eugenio Pérez, 2022/08/19
- [PATCH 6/7] vhost: Always store new kick fd on vhost_svq_set_svq_kick_fd, Eugenio Pérez, 2022/08/19
- [PATCH 3/7] util: make a copy of iova_tree_remove_parameter, Eugenio Pérez, 2022/08/19
- [PATCH 1/7] vdpa: Skip the maps not in the iova tree, Eugenio Pérez, 2022/08/19
- [PATCH 4/7] vdpa: Remove SVQ vring from iova_tree at shutdown, Eugenio Pérez, 2022/08/19