[v2] mem: limit use of address hint

Message ID 20190331084348.4740-1-shahafs@mellanox.com (mailing list archive)
State Accepted, archived
Delegated to: Thomas Monjalon
Headers
Series [v2] mem: limit use of address hint |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/intel-Performance-Testing success Performance Testing PASS
ci/mellanox-Performance-Testing fail Performance Testing issues
ci/Intel-compilation success Compilation OK

Commit Message

Shahaf Shuler March 31, 2019, 8:43 a.m. UTC
  patch[1] added an address hint as starting address for 64 bit systems in
case an explicit base virtual address was not set by the user.

The justification for such hint was to help devices that work in VA
mode and has a address range limitation to work smoothly with the eal
memory subsystem.

While the base address value selected may work fine for the eal
initialization, it easily breaks when trying to register external memory
using rte_extmem_register API.

Trying to register anonymous memory on RH x86_64 machine took several
minutes, during them the function eal_get_virtual_area repeatedly
scanned for a good VA candidate.

The attempt to guess which VA address will be free for mapping will
always result in not portable, error prone code:
* different application may use different libraries along w/ DPDK. One
  can never guess which library was called first and how much virtual
  memory it consumed.
* external memory can be registered at any time in the application run
  time.

In order not to break the existing secondary process design, this patch
only limits the max number of tries that will be done with the
address hint.
When the number of tries exceeds the threshold the code
will use the suggested address from kernel.

Fixes: 1df21702873d ("mem: use address hint for mapping hugepages")
Cc: stable@dpdk.org
Cc: alejandro.lucero@netronome.com

[1] commit 1df21702873d ("mem: use address hint for mapping hugepages")

Signed-off-by: Shahaf Shuler <shahafs@mellanox.com>
---

On v2:
 * instead of a complete remove of the hint limit the number of tries we allow.
---
 lib/librte_eal/common/eal_common_memory.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)
  

Comments

Anatoly Burakov April 2, 2019, 4:13 p.m. UTC | #1
On 31-Mar-19 9:43 AM, Shahaf Shuler wrote:
> patch[1] added an address hint as starting address for 64 bit systems in
> case an explicit base virtual address was not set by the user.
> 
> The justification for such hint was to help devices that work in VA
> mode and has a address range limitation to work smoothly with the eal
> memory subsystem.
> 
> While the base address value selected may work fine for the eal
> initialization, it easily breaks when trying to register external memory
> using rte_extmem_register API.
> 
> Trying to register anonymous memory on RH x86_64 machine took several
> minutes, during them the function eal_get_virtual_area repeatedly
> scanned for a good VA candidate.
> 
> The attempt to guess which VA address will be free for mapping will
> always result in not portable, error prone code:
> * different application may use different libraries along w/ DPDK. One
>    can never guess which library was called first and how much virtual
>    memory it consumed.
> * external memory can be registered at any time in the application run
>    time.
> 
> In order not to break the existing secondary process design, this patch
> only limits the max number of tries that will be done with the
> address hint.
> When the number of tries exceeds the threshold the code
> will use the suggested address from kernel.
> 
> Fixes: 1df21702873d ("mem: use address hint for mapping hugepages")
> Cc: stable@dpdk.org
> Cc: alejandro.lucero@netronome.com
> 
> [1] commit 1df21702873d ("mem: use address hint for mapping hugepages")
> 
> Signed-off-by: Shahaf Shuler <shahafs@mellanox.com>
> ---
> 
> On v2:
>   * instead of a complete remove of the hint limit the number of tries we allow.
> ---

LGTM

Tested-by: Anatoly Burakov <anatoly.burakov@intel.com>

We can always increase the number of tries later :)
  
Alejandro Lucero April 2, 2019, 5:23 p.m. UTC | #2
On Tue, Apr 2, 2019 at 5:13 PM Burakov, Anatoly <anatoly.burakov@intel.com>
wrote:

> On 31-Mar-19 9:43 AM, Shahaf Shuler wrote:
> > patch[1] added an address hint as starting address for 64 bit systems in
> > case an explicit base virtual address was not set by the user.
> >
> > The justification for such hint was to help devices that work in VA
> > mode and has a address range limitation to work smoothly with the eal
> > memory subsystem.
> >
> > While the base address value selected may work fine for the eal
> > initialization, it easily breaks when trying to register external memory
> > using rte_extmem_register API.
> >
> > Trying to register anonymous memory on RH x86_64 machine took several
> > minutes, during them the function eal_get_virtual_area repeatedly
> > scanned for a good VA candidate.
> >
> > The attempt to guess which VA address will be free for mapping will
> > always result in not portable, error prone code:
> > * different application may use different libraries along w/ DPDK. One
> >    can never guess which library was called first and how much virtual
> >    memory it consumed.
> > * external memory can be registered at any time in the application run
> >    time.
> >
> > In order not to break the existing secondary process design, this patch
> > only limits the max number of tries that will be done with the
> > address hint.
> > When the number of tries exceeds the threshold the code
> > will use the suggested address from kernel.
> >
> > Fixes: 1df21702873d ("mem: use address hint for mapping hugepages")
> > Cc: stable@dpdk.org
> > Cc: alejandro.lucero@netronome.com
> >
> > [1] commit 1df21702873d ("mem: use address hint for mapping hugepages")
> >
> > Signed-off-by: Shahaf Shuler <shahafs@mellanox.com>
> > ---
> >
> > On v2:
> >   * instead of a complete remove of the hint limit the number of tries
> we allow.
> > ---
>
> LGTM
>
> Tested-by: Anatoly Burakov <anatoly.burakov@intel.com>
>
> We can always increase the number of tries later :)
>
>
This is also fine for me.
If the map address is not within the supported range by a device with
addressing limitations, the device will not be used.
Not sure how this is likely to happen, but I guess if it is become a
problem, another solution should be implemented.

Acked-by: Alejandro Lucero <alejandro.lucero@netronome.com>



> --
> Thanks,
> Anatoly
>
  
Thomas Monjalon April 3, 2019, 5:22 p.m. UTC | #3
02/04/2019 19:23, Alejandro Lucero:
> On Tue, Apr 2, 2019 at 5:13 PM Burakov, Anatoly <anatoly.burakov@intel.com>
> wrote:
> > On 31-Mar-19 9:43 AM, Shahaf Shuler wrote:
> > > patch[1] added an address hint as starting address for 64 bit systems in
> > > case an explicit base virtual address was not set by the user.
> > >
> > > The justification for such hint was to help devices that work in VA
> > > mode and has a address range limitation to work smoothly with the eal
> > > memory subsystem.
> > >
> > > While the base address value selected may work fine for the eal
> > > initialization, it easily breaks when trying to register external memory
> > > using rte_extmem_register API.
> > >
> > > Trying to register anonymous memory on RH x86_64 machine took several
> > > minutes, during them the function eal_get_virtual_area repeatedly
> > > scanned for a good VA candidate.
> > >
> > > The attempt to guess which VA address will be free for mapping will
> > > always result in not portable, error prone code:
> > > * different application may use different libraries along w/ DPDK. One
> > >    can never guess which library was called first and how much virtual
> > >    memory it consumed.
> > > * external memory can be registered at any time in the application run
> > >    time.
> > >
> > > In order not to break the existing secondary process design, this patch
> > > only limits the max number of tries that will be done with the
> > > address hint.
> > > When the number of tries exceeds the threshold the code
> > > will use the suggested address from kernel.
> > >
> > > Fixes: 1df21702873d ("mem: use address hint for mapping hugepages")
> > > Cc: stable@dpdk.org
> > > Cc: alejandro.lucero@netronome.com
> > >
> > > [1] commit 1df21702873d ("mem: use address hint for mapping hugepages")
> > >
> > > Signed-off-by: Shahaf Shuler <shahafs@mellanox.com>
> > > ---
> > >
> > > On v2:
> > >   * instead of a complete remove of the hint limit the number of tries
> > we allow.
> > > ---
> >
> > LGTM
> >
> > Tested-by: Anatoly Burakov <anatoly.burakov@intel.com>
> >
> > We can always increase the number of tries later :)
> >
> This is also fine for me.
> If the map address is not within the supported range by a device with
> addressing limitations, the device will not be used.
> Not sure how this is likely to happen, but I guess if it is become a
> problem, another solution should be implemented.
> 
> Acked-by: Alejandro Lucero <alejandro.lucero@netronome.com>

Applied, thanks
  

Patch

diff --git a/lib/librte_eal/common/eal_common_memory.c b/lib/librte_eal/common/eal_common_memory.c
index c9da69b164..5ae8d0124d 100644
--- a/lib/librte_eal/common/eal_common_memory.c
+++ b/lib/librte_eal/common/eal_common_memory.c
@@ -56,6 +56,7 @@  static uint64_t system_page_sz;
 static uint64_t baseaddr = 0x100000000;
 #endif
 
+#define MAX_MMAP_WITH_DEFINED_ADDR_TRIES 5
 void *
 eal_get_virtual_area(void *requested_addr, size_t *size,
 		size_t page_sz, int flags, int mmap_flags)
@@ -63,6 +64,7 @@  eal_get_virtual_area(void *requested_addr, size_t *size,
 	bool addr_is_hint, allow_shrink, unmap, no_align;
 	uint64_t map_sz;
 	void *mapped_addr, *aligned_addr;
+	uint8_t try = 0;
 
 	if (system_page_sz == 0)
 		system_page_sz = sysconf(_SC_PAGESIZE);
@@ -118,11 +120,14 @@  eal_get_virtual_area(void *requested_addr, size_t *size,
 
 		if (mapped_addr != MAP_FAILED && addr_is_hint &&
 		    mapped_addr != requested_addr) {
-			/* hint was not used. Try with another offset */
-			munmap(mapped_addr, map_sz);
-			mapped_addr = MAP_FAILED;
+			try++;
 			next_baseaddr = RTE_PTR_ADD(next_baseaddr, page_sz);
-			requested_addr = next_baseaddr;
+			if (try <= MAX_MMAP_WITH_DEFINED_ADDR_TRIES) {
+				/* hint was not used. Try with another offset */
+				munmap(mapped_addr, map_sz);
+				mapped_addr = MAP_FAILED;
+				requested_addr = next_baseaddr;
+			}
 		}
 	} while ((allow_shrink || addr_is_hint) &&
 		 mapped_addr == MAP_FAILED && *size > 0);