> -----Original Message----- > From: Bie, Tiwei > Sent: Thursday, September 26, 2019 1:32 PM > To: Liu, Yong <yong....@intel.com> > Cc: maxime.coque...@redhat.com; Wang, Zhihong <zhihong.w...@intel.com>; > step...@networkplumber.org; gavin...@arm.com; dev@dpdk.org > Subject: Re: [PATCH v3 13/15] vhost: cache address translation result > > On Thu, Sep 26, 2019 at 01:13:27AM +0800, Marvin Liu wrote: > > Cache address translation result and use it in next translation. Due > > to limited regions are supported, buffers are most likely in same > > region when doing data transmission. > > > > Signed-off-by: Marvin Liu <yong....@intel.com> > > > > diff --git a/lib/librte_vhost/rte_vhost.h b/lib/librte_vhost/rte_vhost.h > > index 7fb172912..d90235cd6 100644 > > --- a/lib/librte_vhost/rte_vhost.h > > +++ b/lib/librte_vhost/rte_vhost.h > > @@ -91,10 +91,18 @@ struct rte_vhost_mem_region { > > int fd; > > }; > > > > +struct rte_vhost_mem_region_cache { > > + uint64_t guest_phys_addr; > > + uint64_t guest_phys_addr_end; > > + int64_t host_user_addr_offset; > > + uint64_t size; > > +}; > > + > > /** > > * Memory structure includes region and mapping information. > > */ > > struct rte_vhost_memory { > > + struct rte_vhost_mem_region_cache cache_region; > > This breaks ABI. > Got, will remove it as no clear performance gain with this patch.
> > uint32_t nregions; > > struct rte_vhost_mem_region regions[]; > > }; > > @@ -232,11 +240,30 @@ rte_vhost_va_from_guest_pa(struct rte_vhost_memory > *mem, > > struct rte_vhost_mem_region *r; > > uint32_t i; > > > > + struct rte_vhost_mem_region_cache *r_cache; > > + /* check with cached region */ > > + r_cache = &mem->cache_region; > > + if (likely(gpa >= r_cache->guest_phys_addr && gpa < > > + r_cache->guest_phys_addr_end)) { > > + if (unlikely(*len > r_cache->guest_phys_addr_end - gpa)) > > + *len = r_cache->guest_phys_addr_end - gpa; > > + > > + return gpa - r_cache->host_user_addr_offset; > > + } > > Does this help a lot in performance? > We can implement this caching for builtin backend first. > Tiwei, It won’t help too much in performance as region number will be 1 at most of times. Will remove cache function in next version. Thanks, Marvin > > > + > > + > > for (i = 0; i < mem->nregions; i++) { > > r = &mem->regions[i]; > > if (gpa >= r->guest_phys_addr && > > gpa < r->guest_phys_addr + r->size) { > > > > + r_cache->guest_phys_addr = r->guest_phys_addr; > > + r_cache->guest_phys_addr_end = r->guest_phys_addr + > > + r->size; > > + r_cache->size = r->size; > > + r_cache->host_user_addr_offset = r->guest_phys_addr - > > + r->host_user_addr; > > + > > if (unlikely(*len > r->guest_phys_addr + r->size - gpa)) > > *len = r->guest_phys_addr + r->size - gpa; > > > > -- > > 2.17.1 > >