On Tue, Aug 23, 2016 at 03:25:33PM +0200, Maxime Coquelin wrote: > > > On 08/23/2016 02:32 PM, Yuanhan Liu wrote: > >>>+ > >>>> >+ /* FIXME */ > >>>> >+ RTE_LOG(INFO, VHOST_CONFIG, ":: %u ::\n", pre_read); > >>> For my information, what is the purpose of pre_read? > >Again, I put a FIXME here, but I forgot to add some explanation. > > > >Here is the thing: the read will make sure the kernel populate the > >corresponding PTE entry, so that rte_mem_virt2phy() will return proper > >physical address, otherwise, invalid value is returned. > > > >I can't simply do the read but do not actually reference/consume it. > >Otherwise, the compiler will treat it as some noops and remove it. > > > >An ugly RTE_LOG will make sure the read operation is not eliminated. > >I'm seeking a more proper way to achieve that. Maybe I can add a new > >field in virtio_net structure and store it there. > > > >Or, do you have better ideas? > > This behavior is pretty twisted, no?
I have to say, yes, kind of. > Shouldn't be rte_mem_virt2phy() role to ensure returning a valid value? Not exactly. I think rte_mem_virt2phy() is more likely to fetch the physical address of huge pages. And for those huge pages, EAL makes sure they will be populated: it used to do a zero memset before to achieve that. Since 5ce3ace1de45 ("eal: remove unnecessary hugepage zero-filling"), it uses MAP_POPULATE option instead. So, thank you that you just remind me of the MAP_POPULATE option. I just had a quick try, it worked like a charm :) --yliu > I have no better idea for now, but I will think about it. > > Regards, > Maxime