On Wed, 13 May 2020 12:25:10 +0000
Fady Bader <f...@mellanox.com> wrote:
[snip]
> > 
> > I meant the code of the application that calls
> > rte_mempool_create(). Or is it one of the DPDK test applications?  
> 
> I got it from dpdk\app\test\test_mempool
> 
> Line 496:
> /* create a mempool (without cache) */
> mp_nocache = rte_mempool_create("test_nocache", MEMPOOL_SIZE,
>       MEMPOOL_ELT_SIZE, 0, 0,
>       NULL, NULL,
>       my_obj_init, NULL,
>       SOCKET_ID_ANY, 0);
>

For building this code you must have enabled librte_ring,
librte_mempool, and drivers/mempool, and I assume you build test code
without librte_cmdline somehow. This are nontrivial changes, so I can't
be sure to reproduce them exactly. Can you please share a complete
patch?

Meanwhile, I observe a similar issue where rte_mempool_create() fails
to allocate memory and hangs when compiled with Clang, succeeds with
native MinGW, but still hangs with cross MinGW. I'm investigating it.

Testing patch follows, the snippet added is in
examples/helloworld/main.

---

diff --git a/config/meson.build b/config/meson.build
index b6d84687f..018726f75 100644
--- a/config/meson.build
+++ b/config/meson.build
@@ -117,7 +117,7 @@ if not is_windows
 endif
 
 # use pthreads if available for the platform
-if not is_ms_linker
+if cc.find_library('pthread', required: false).found()
        add_project_link_arguments('-pthread', language: 'c')
        dpdk_extra_ldflags += '-pthread'
 endif
diff --git a/drivers/meson.build b/drivers/meson.build
index dc293b270..ee565bc19 100644
--- a/drivers/meson.build
+++ b/drivers/meson.build
@@ -2,8 +2,8 @@
 # Copyright(c) 2017-2019 Intel Corporation
 
 if is_windows
-       subdir_done()
-endif
+       dpdk_driver_classes = ['mempool']
+else
 
 # Defines the order in which the drivers are buit.
 dpdk_driver_classes = ['common',
@@ -16,7 +16,7 @@ dpdk_driver_classes = ['common',
               'vdpa',    # depends on common, bus and mempool.
               'event',   # depends on common, bus, mempool and net.
               'baseband'] # depends on common and bus.
-
+endif
 disabled_drivers = run_command(list_dir_globs, get_option('disable_drivers'),
                ).stdout().split()
 
@@ -78,13 +78,13 @@ foreach class:dpdk_driver_classes
                        shared_deps = ext_deps
                        static_deps = ext_deps
                        foreach d:deps
-                               if not is_variable('shared_rte_' + d)
+                               if not is_variable('static_rte_' + d)
                                        build = false
                                        reason = 'Missing internal dependency, 
"@0@"'.format(d)
                                        message('Disabling @1@ [@2@]: missing 
internal dependency "@0@"'
                                                        .format(d, name, 
'drivers/' + drv_path))
                                else
-                                       shared_deps += 
[get_variable('shared_rte_' + d)]
+                                       # shared_deps += 
[get_variable('shared_rte_' + d)]
                                        static_deps += 
[get_variable('static_rte_' + d)]
                                endif
                        endforeach
@@ -110,6 +110,7 @@ foreach class:dpdk_driver_classes
 
                        dpdk_extra_ldflags += pkgconfig_extra_libs
 
+                       if host_machine.system() != 'windows'
                        # generate pmdinfo sources by building a temporary
                        # lib and then running pmdinfogen on the contents of
                        # that lib. The final lib reuses the object files and
@@ -126,7 +127,7 @@ foreach class:dpdk_driver_classes
                                                '@OUTPUT@', pmdinfogen],
                                        output: out_filename,
                                        depends: [pmdinfogen, tmp_lib])
-
+                       endif
                        version_map = '@0@/@1@/@2@_version.map'.format(
                                        meson.current_source_dir(),
                                        drv_path, lib_name)
@@ -178,31 +179,31 @@ foreach class:dpdk_driver_classes
                                        output: lib_name + '.sym_chk')
                        endif
 
-                       shared_lib = shared_library(lib_name,
-                               sources,
-                               objects: objs,
-                               include_directories: includes,
-                               dependencies: shared_deps,
-                               c_args: cflags,
-                               link_args: lk_args,
-                               link_depends: lk_deps,
-                               version: lib_version,
-                               soversion: so_version,
-                               install: true,
-                               install_dir: driver_install_path)
-
-                       # create a dependency object and add it to the global 
dictionary so
-                       # testpmd or other built-in apps can find it if 
necessary
-                       shared_dep = declare_dependency(link_with: shared_lib,
-                                       include_directories: includes,
-                                       dependencies: shared_deps)
+                       # shared_lib = shared_library(lib_name,
+                       #       sources,
+                       #       objects: objs,
+                       #       include_directories: includes,
+                       #       dependencies: shared_deps,
+                       #       c_args: cflags,
+                       #       link_args: lk_args,
+                       #       link_depends: lk_deps,
+                       #       version: lib_version,
+                       #       soversion: so_version,
+                       #       install: true,
+                       #       install_dir: driver_install_path)
+
+                       # # create a dependency object and add it to the global 
dictionary so
+                       # # testpmd or other built-in apps can find it if 
necessary
+                       # shared_dep = declare_dependency(link_with: shared_lib,
+                       #               include_directories: includes,
+                       #               dependencies: shared_deps)
                        static_dep = declare_dependency(link_with: static_lib,
                                        include_directories: includes,
                                        dependencies: static_deps)
 
                        dpdk_drivers += static_lib
 
-                       set_variable('shared_@0@'.format(lib_name), shared_dep)
+                       # set_variable('shared_@0@'.format(lib_name), 
shared_dep)
                        set_variable('static_@0@'.format(lib_name), static_dep)
                        dependency_name = ''.join(lib_name.split('rte_'))
                        message('drivers/@0@: Defining dependency "@1@"'.format(
diff --git a/examples/helloworld/main.c b/examples/helloworld/main.c
index 968045f1b..cf895c840 100644
--- a/examples/helloworld/main.c
+++ b/examples/helloworld/main.c
@@ -14,6 +14,8 @@
 #include <rte_per_lcore.h>
 #include <rte_lcore.h>
 #include <rte_debug.h>
+#include <rte_mempool.h>
+#include <rte_errno.h>
 
 static int
 lcore_hello(__rte_unused void *arg)
@@ -29,11 +31,30 @@ main(int argc, char **argv)
 {
        int ret;
        unsigned lcore_id;
+       struct rte_mempool *pool;
+
+       rte_log_set_level(RTE_LOGTYPE_EAL, RTE_LOG_DEBUG);
 
        ret = rte_eal_init(argc, argv);
        if (ret < 0)
                rte_panic("Cannot init EAL\n");
 
+       pool = rte_mempool_create(
+               "test_mempool",
+               (1 << 18) - 1,
+               (1 << 12),
+               1 << 9,
+               0,
+               NULL, NULL, NULL, NULL,
+               SOCKET_ID_ANY,
+               0);
+       if (!pool) {
+               RTE_LOG(ERR, USER1, "cannot create mempool: %d\n", rte_errno);
+               return EXIT_FAILURE;
+       }
+
+       rte_mempool_free(pool);
+
        /* call lcore_hello() on every slave lcore */
        RTE_LCORE_FOREACH_SLAVE(lcore_id) {
                rte_eal_remote_launch(lcore_hello, NULL, lcore_id);
diff --git a/examples/meson.build b/examples/meson.build
index 3b540012f..407322dec 100644
--- a/examples/meson.build
+++ b/examples/meson.build
@@ -83,7 +83,7 @@ foreach example: examples
        includes = [include_directories(example)]
        deps = ['eal', 'mempool', 'net', 'mbuf', 'ethdev', 'cmdline']
        if is_windows
-               deps = ['eal'] # only supported lib on Windows currently
+               deps = ['eal', 'mempool', 'ring'] # only supported lib on 
Windows currently
        endif
        subdir(example)
 
diff --git a/lib/librte_mempool/rte_mempool.c b/lib/librte_mempool/rte_mempool.c
index 0bde995b5..017eebba5 100644
--- a/lib/librte_mempool/rte_mempool.c
+++ b/lib/librte_mempool/rte_mempool.c
@@ -12,7 +12,6 @@
 #include <inttypes.h>
 #include <errno.h>
 #include <sys/queue.h>
-#include <sys/mman.h>
 
 #include <rte_common.h>
 #include <rte_log.h>
@@ -148,7 +147,7 @@ get_min_page_size(int socket_id)
 
        rte_memseg_list_walk(find_min_pagesz, &wa);
 
-       return wa.min == SIZE_MAX ? (size_t) getpagesize() : wa.min;
+       return wa.min == SIZE_MAX ? (size_t) rte_get_page_size() : wa.min;
 }
 
 
@@ -526,7 +525,7 @@ rte_mempool_get_page_size(struct rte_mempool *mp, size_t 
*pg_sz)
        else if (rte_eal_has_hugepages() || alloc_in_ext_mem)
                *pg_sz = get_min_page_size(mp->socket_id);
        else
-               *pg_sz = getpagesize();
+               *pg_sz = rte_get_page_size();
 
        rte_mempool_trace_get_page_size(mp, *pg_sz);
        return 0;
@@ -686,7 +685,7 @@ get_anon_size(const struct rte_mempool *mp)
        size_t min_chunk_size;
        size_t align;
 
-       pg_sz = getpagesize();
+       pg_sz = rte_get_page_size();
        pg_shift = rte_bsf32(pg_sz);
        size = rte_mempool_ops_calc_mem_size(mp, mp->size, pg_shift,
                                             &min_chunk_size, &align);
@@ -710,7 +709,7 @@ rte_mempool_memchunk_anon_free(struct rte_mempool_memhdr 
*memhdr,
        if (size < 0)
                return;
 
-       munmap(opaque, size);
+       rte_mem_unmap(opaque, size);
 }
 
 /* populate the mempool with an anonymous mapping */
@@ -740,20 +739,20 @@ rte_mempool_populate_anon(struct rte_mempool *mp)
        }
 
        /* get chunk of virtually continuous memory */
-       addr = mmap(NULL, size, PROT_READ | PROT_WRITE,
-               MAP_SHARED | MAP_ANONYMOUS, -1, 0);
-       if (addr == MAP_FAILED) {
-               rte_errno = errno;
+       addr = rte_mem_map(NULL, size, RTE_PROT_READ | RTE_PROT_WRITE,
+               RTE_MAP_SHARED | RTE_MAP_ANONYMOUS, -1, 0);
+       if (addr == NULL) {
                return 0;
        }
        /* can't use MMAP_LOCKED, it does not exist on BSD */
-       if (mlock(addr, size) < 0) {
-               rte_errno = errno;
-               munmap(addr, size);
+       if (rte_mem_lock(addr, size) < 0) {
+               ret = rte_errno;
+               rte_mem_unmap(addr, size);
+               rte_errno = ret;
                return 0;
        }
 
-       ret = rte_mempool_populate_virt(mp, addr, size, getpagesize(),
+       ret = rte_mempool_populate_virt(mp, addr, size, rte_get_page_size(),
                rte_mempool_memchunk_anon_free, addr);
        if (ret == 0) /* should not happen */
                ret = -ENOBUFS;
diff --git a/lib/meson.build b/lib/meson.build
index d190d84ef..77da5216f 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -36,7 +36,12 @@ libraries = [
        'flow_classify', 'bpf', 'graph', 'node']
 
 if is_windows
-       libraries = ['kvargs','eal'] # only supported libraries for windows
+       libraries = [
+               'kvargs',
+               'eal',
+               'ring',
+               'mempool',
+               ]
 endif
 
 default_cflags = machine_args
@@ -56,6 +61,7 @@ foreach l:libraries
        use_function_versioning = false
        sources = []
        headers = []
+       headers_compat = {}
        includes = []
        cflags = default_cflags
        objs = [] # other object files to link against, used e.g. for
@@ -77,11 +83,11 @@ foreach l:libraries
                shared_deps = ext_deps
                static_deps = ext_deps
                foreach d:deps
-                       if not is_variable('shared_rte_' + d)
+                       if not is_variable('static_rte_' + d)
                                error('Missing internal dependency "@0@" for 
@1@ [@2@]'
                                                .format(d, name, 'lib/' + 
dir_name))
                        endif
-                       shared_deps += [get_variable('shared_rte_' + d)]
+                       # shared_deps += [get_variable('shared_rte_' + d)]
                        static_deps += [get_variable('static_rte_' + d)]
                endforeach
        endif
@@ -94,6 +100,12 @@ foreach l:libraries
                dpdk_conf.set('RTE_LIBRTE_' + name.to_upper(), 1)
                install_headers(headers)
 
+               if is_windows and (name == 'eal')
+                       foreach dir, header : headers_compat
+                               install_headers(header, subdir: dir)
+                       endforeach
+               endif
+
                libname = 'rte_' + name
                includes += include_directories(dir_name)
 
@@ -171,29 +183,29 @@ foreach l:libraries
                                        output: name + '.sym_chk')
                        endif
 
-                       shared_lib = shared_library(libname,
-                                       sources,
-                                       objects: objs,
-                                       c_args: cflags,
-                                       dependencies: shared_deps,
-                                       include_directories: includes,
-                                       link_args: lk_args,
-                                       link_depends: lk_deps,
-                                       version: lib_version,
-                                       soversion: so_version,
-                                       install: true)
-                       shared_dep = declare_dependency(link_with: shared_lib,
-                                       include_directories: includes,
-                                       dependencies: shared_deps)
-
-                       dpdk_libraries = [shared_lib] + dpdk_libraries
+                       # shared_lib = shared_library(libname,
+                       #               sources,
+                       #               objects: objs,
+                       #               c_args: cflags,
+                       #               dependencies: shared_deps,
+                       #               include_directories: includes,
+                       #               link_args: lk_args,
+                       #               link_depends: lk_deps,
+                       #               version: lib_version,
+                       #               soversion: so_version,
+                       #               install: true)
+                       # shared_dep = declare_dependency(link_with: shared_lib,
+                       #               include_directories: includes,
+                       #               dependencies: shared_deps)
+
+                       # dpdk_libraries = [shared_lib] + dpdk_libraries
                        dpdk_static_libraries = [static_lib] + 
dpdk_static_libraries
                        if libname == 'rte_node'
                                dpdk_graph_nodes = [static_lib]
                        endif
                endif # sources.length() > 0
 
-               set_variable('shared_rte_' + name, shared_dep)
+               # set_variable('shared_rte_' + name, shared_dep)
                set_variable('static_rte_' + name, static_dep)
                message('lib/@0@: Defining dependency "@1@"'.format(
                                dir_name, name))


--
Dmitry Kozlyuk

Reply via email to