On Mon, Jun 18, 2018 at 8:53 PM, Dariusz Stojaczyk < dariuszx.stojac...@intel.com> wrote:
> Since secondary process' address space is highly dictated > by the primary process' mappings, it doesn't make much > sense to use base-virtaddr for secondary processes. > > This patch is intended to fix PCI resource mapping > in secondary processes using the same base-virtaddr > as their primary processes. PCI uses the end of the hugepage > memory area to map all resources. [pci_find_max_end_va()] > It works for primary processes, but can't be mapped 1:1 > by secondary ones, as the same addresses are currently always > occupied by shadow memseg lists, which were created with > eal_get_virtual_area(NULL, ...). > > Should not be better to handle these allocations being aware about the problem for secondary processes? I do not know exactly what are the (other) reasons behind base-virtaddr, but it turns out NFP requires this to be used when DPDK apps executed by non-root users. I'm working on a RFC for handling our specific case, that could also be required for other devices, and this change would make the NFP unusable for the secondary processes. > ``` > PRIMARY PROCESS > 0x6e00e00000 388K rw-s- fbarray_memseg-2048k-1-3 > 0x6e01000000 16777216K r---- [ anon ] > 0x7201000000 16K rw-s- resource0 > > SECONDARY PROCESS > 0x6e00e00000 388K rw-s- fbarray_memseg-2048k-1-3 > 0x6e01000000 16777216K r---- [ anon ] > 0x7201000000 4K rw-s- fbarray_memseg-1048576k-0-0_203213 > ``` > > Fixes: 524e43c2ad9a ("mem: prepare memseg lists for multiprocess sync") > Cc: anatoly.bura...@intel.com > Cc: sta...@dpdk.org > > Signed-off-by: Dariusz Stojaczyk <dariuszx.stojac...@intel.com> > --- > lib/librte_eal/common/eal_common_memory.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/lib/librte_eal/common/eal_common_memory.c > b/lib/librte_eal/common/eal_common_memory.c > index 53d9b51..6c47e11 100644 > --- a/lib/librte_eal/common/eal_common_memory.c > +++ b/lib/librte_eal/common/eal_common_memory.c > @@ -56,7 +56,8 @@ eal_get_virtual_area(void *requested_addr, size_t *size, > allow_shrink = (flags & EAL_VIRTUAL_AREA_ALLOW_SHRINK) > 0; > unmap = (flags & EAL_VIRTUAL_AREA_UNMAP) > 0; > > - if (next_baseaddr == NULL && internal_config.base_virtaddr != 0) > + if (next_baseaddr == NULL && internal_config.base_virtaddr != 0 && > + rte_eal_process_type() == RTE_PROC_PRIMARY) > next_baseaddr = (void *) internal_config.base_virtaddr; > > if (requested_addr == NULL && next_baseaddr) { > -- > 2.7.4 > >