> -----Original Message-----
> From: Burakov, Anatoly [mailto:anatoly.bura...@intel.com]
> Sent: Friday, July 24, 2020 9:25 PM
> To: wangyunjian <wangyunj...@huawei.com>; dev@dpdk.org;
> david.march...@redhat.com
> Cc: Lilijun (Jerry) <jerry.lili...@huawei.com>; xudingke
> <xudin...@huawei.com>; sta...@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v2] eal/linux: do not create user mem map
> repeatedly when it exists
> 
> On 23-Jul-20 3:48 PM, wangyunjian wrote:
> > From: Yunjian Wang <wangyunj...@huawei.com>
> >
> > Currently, we will create new user mem map entry for the same memory
> > segment, but in fact it has already been added to the user mem maps.
> > It's not necessary to create it twice.
> >
> > To resolve the issue, add support to remove the same entry in the
> > function compact_user_maps().
> >
> > Fixes: 0cbce3a167f1 ("vfio: skip DMA map failure if already mapped")
> > Cc: sta...@dpdk.org
> >
> > Signed-off-by: Yunjian Wang <wangyunj...@huawei.com>
> > ---
> > v2:
> > * Remove the same entry in the function compact_user_maps()
> > ---
> >   lib/librte_eal/linux/eal_vfio.c | 5 +++++
> >   1 file changed, 5 insertions(+)
> >
> > diff --git a/lib/librte_eal/linux/eal_vfio.c 
> > b/lib/librte_eal/linux/eal_vfio.c
> > index abb12a354..df99307b7 100644
> > --- a/lib/librte_eal/linux/eal_vfio.c
> > +++ b/lib/librte_eal/linux/eal_vfio.c
> > @@ -167,6 +167,10 @@ adjust_map(struct user_mem_map *src, struct
> user_mem_map *end,
> >   static int
> >   merge_map(struct user_mem_map *left, struct user_mem_map *right)
> >   {
> > +   /* merge the same maps into one */
> > +   if (memcmp(left, right, sizeof(struct user_mem_map)) == 0)
> > +           goto out;
> > +
> 
> merge_map looks for adjacent maps only, but does not handle maps that
> are wholly contained within one another ("the same map" also matches
> this definition). wouldn't it be better to check for that instead of
> *just* handling identical maps?

What about using the initial implementation?
We don't create new user mem map entry for the same memory segment.

@@ -1828,6 +1828,13 @@  container_dma_map(struct vfio_config *vfio_cfg, 
uint64_t vaddr, uint64_t iova,
                ret = -1;
                goto out;
        }
+
+       /* we don't need create new user mem map entry
+        * for the same memory segment.
+        */
+       if (errno == EBUSY || errno == EEXIST)
+               goto out;
+
        /* create new user mem map entry */
        new_map = &user_mem_maps->maps[user_mem_maps->n_maps++];
        new_map->addr = vaddr;

Thanks,
Yunjian
> 
> >     if (left->addr + left->len != right->addr)
> >             return 0;
> >     if (left->iova + left->len != right->iova)
> > @@ -174,6 +178,7 @@ merge_map(struct user_mem_map *left, struct
> user_mem_map *right)
> >
> >     left->len += right->len;
> >
> > +out:
> >     memset(right, 0, sizeof(*right));
> >
> >     return 1;
> >
> 
> 
> --
> Thanks,
> Anatoly

Reply via email to