mem: warn user when running without NUMA support

Message ID 72f990b04219f319b2922570a7ca7b9ce93e0aae.1550851129.git.anatoly.burakov@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Thomas Monjalon
Headers
Series mem: warn user when running without NUMA support |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation fail Compilation issues
ci/Performance-Testing fail build patch failure

Commit Message

Burakov, Anatoly Feb. 22, 2019, 3:59 p.m. UTC
  Running in non-legacy mode on a NUMA-enabled system without libnuma
is unsupported, so explicitly print out a warning when trying to
do so.

Running in legacy mode without libnuma is still supported whether or
not we are running with libnuma support enabled, so also fix init to
allow that scenario.

Cc: stable@dpdk.org

Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
---
 lib/librte_eal/linuxapp/eal/eal_memalloc.c |  3 +++
 lib/librte_eal/linuxapp/eal/eal_memory.c   | 14 ++++++++++++--
 2 files changed, 15 insertions(+), 2 deletions(-)
  

Comments

Thomas Monjalon March 27, 2019, 10:31 a.m. UTC | #1
22/02/2019 16:59, Anatoly Burakov:
> Running in non-legacy mode on a NUMA-enabled system without libnuma
> is unsupported, so explicitly print out a warning when trying to
> do so.
> 
> Running in legacy mode without libnuma is still supported whether or
> not we are running with libnuma support enabled, so also fix init to
> allow that scenario.
> 
> Cc: stable@dpdk.org
> 
> Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
> ---
> --- a/lib/librte_eal/linuxapp/eal/eal_memory.c
> +++ b/lib/librte_eal/linuxapp/eal/eal_memory.c
> @@ -50,6 +50,7 @@
>  #include "eal_internal_cfg.h"
>  #include "eal_filesystem.h"
>  #include "eal_hugepages.h"
> +#include "eal_options.h"

I'm seeing this error:

lib/librte_eal/common/eal_options.h:74:28: error:
array type has incomplete element type ‘struct option’
 extern const struct option eal_long_options[];
  
Burakov, Anatoly March 27, 2019, 11:52 a.m. UTC | #2
On 27-Mar-19 10:31 AM, Thomas Monjalon wrote:
> 22/02/2019 16:59, Anatoly Burakov:
>> Running in non-legacy mode on a NUMA-enabled system without libnuma
>> is unsupported, so explicitly print out a warning when trying to
>> do so.
>>
>> Running in legacy mode without libnuma is still supported whether or
>> not we are running with libnuma support enabled, so also fix init to
>> allow that scenario.
>>
>> Cc: stable@dpdk.org
>>
>> Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
>> ---
>> --- a/lib/librte_eal/linuxapp/eal/eal_memory.c
>> +++ b/lib/librte_eal/linuxapp/eal/eal_memory.c
>> @@ -50,6 +50,7 @@
>>   #include "eal_internal_cfg.h"
>>   #include "eal_filesystem.h"
>>   #include "eal_hugepages.h"
>> +#include "eal_options.h"
> 
> I'm seeing this error:
> 
> lib/librte_eal/common/eal_options.h:74:28: error:
> array type has incomplete element type ‘struct option’
>   extern const struct option eal_long_options[];
> 

Yes, i've been meaning to resubmit but it fell through the cracks. I'll 
do a v2 ASAP.
  

Patch

diff --git a/lib/librte_eal/linuxapp/eal/eal_memalloc.c b/lib/librte_eal/linuxapp/eal/eal_memalloc.c
index b6fb183db..4e83a1a19 100644
--- a/lib/librte_eal/linuxapp/eal/eal_memalloc.c
+++ b/lib/librte_eal/linuxapp/eal/eal_memalloc.c
@@ -725,6 +725,9 @@  alloc_seg(struct rte_memseg *ms, void *addr, int socket_id,
 			__func__, socket_id, cur_socket_id);
 		goto mapped;
 	}
+#else
+	if (rte_socket_count() > 1)
+		RTE_LOG(DEBUG, EAL, "%s(): not checking hugepage NUMA node.\n");
 #endif
 
 	ms->addr = addr;
diff --git a/lib/librte_eal/linuxapp/eal/eal_memory.c b/lib/librte_eal/linuxapp/eal/eal_memory.c
index 1b96b576e..e5a0e57ff 100644
--- a/lib/librte_eal/linuxapp/eal/eal_memory.c
+++ b/lib/librte_eal/linuxapp/eal/eal_memory.c
@@ -50,6 +50,7 @@ 
 #include "eal_internal_cfg.h"
 #include "eal_filesystem.h"
 #include "eal_hugepages.h"
+#include "eal_options.h"
 
 #define PFN_MASK_SIZE	8
 
@@ -2088,7 +2089,8 @@  memseg_primary_init_32(void)
 		socket_id = rte_socket_id_by_idx(i);
 
 #ifndef RTE_EAL_NUMA_AWARE_HUGEPAGES
-		if (socket_id > 0)
+		/* we can still sort pages by socket in legacy mode */
+		if (!internal_config.legacy_mem && socket_id > 0)
 			break;
 #endif
 
@@ -2269,7 +2271,8 @@  memseg_primary_init(void)
 			int socket_id = rte_socket_id_by_idx(i);
 
 #ifndef RTE_EAL_NUMA_AWARE_HUGEPAGES
-			if (socket_id > 0)
+			/* we can still sort pages by socket in legacy mode */
+			if (!internal_config.legacy_mem && socket_id > 0)
 				break;
 #endif
 			memtypes[cur_type].page_sz = hugepage_sz;
@@ -2428,6 +2431,13 @@  rte_eal_memseg_init(void)
 	} else {
 		RTE_LOG(ERR, EAL, "Cannot get current resource limits\n");
 	}
+#ifndef RTE_EAL_NUMA_AWARE_HUGEPAGES
+	if (!internal_config.legacy_mem && rte_socket_count() > 1) {
+		RTE_LOG(WARNING, EAL, "DPDK is running on a NUMA system, but is compiled without NUMA support.\n");
+		RTE_LOG(WARNING, EAL, "This will have adverse consequences for performance and usability.\n");
+		RTE_LOG(WARNING, EAL, "Please use --"OPT_LEGACY_MEM" option, or recompile with NUMA support.\n");
+	}
+#endif
 
 	return rte_eal_process_type() == RTE_PROC_PRIMARY ?
 #ifndef RTE_ARCH_64