First, thanks for your suggestions. When using the MAP_FIXED flag, mmap will return an MMAP_FAILED if 0xf0000000000000 is not available.
In this case, I want mmap to return an address near 0xf0000000000000. I will submit v2. On Fri, Aug 10, 2018, 01:03 Stephen Hemminger <step...@networkplumber.org> wrote: > Thanks for the patch, there are some minor style/cleanups that > could be done. > > > #if defined(RTE_ARCH_X86) > > Isn't this going to apply to 64 bit only? > > > +/* > > + * Try to detect whether the system uses 5-level page table. > > + */ > > +static bool > > +system_uses_PML5(void) > > +{ > > + void *page_4k, *mask = (void *)0xf0000000000000; > > Magic constants expressed like this seem wrong. Why not use > shift to make it obvious. > > Also, you are assuming a particular layout of memory on > Linux which might be problematic. Plus if there is already > some memory in use there, it won't work. > > > + page_4k = mmap(mask, 4096, PROT_READ | PROT_WRITE, > > + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); > > Since you are probing maybe MAP_FIXED is what you want. > > > + > > + if (page_4k == (void *) -1) > > + return false; > Use MMAP_FAILED here. > > > + munmap(page_4k, 4096); > > + > > + if ((unsigned long)page_4k & (unsigned long)mask) > > + return true; > > + return false; > > Wouldn't this work the same for what you expect? > return page_4k == mask; > > I.e you expect kernel to put page where you want. >