[dpdk-dev] [RFC PATCH 0/9] Windows basic memory management

Dmitry Kozlyuk dmitry.kozliuk at gmail.com
Mon Mar 30 06:10:17 CEST 2020


This RFC implements basic MM with the following features:

* Hugepages are dynamically allocated in user-mode.
* IOVA is always PA, obtained through kernel-mode driver.
* No 32-bit support (presumably not demanded).
* No multi-process support. Note that without --in-memory EAL MM
  will create files in current working (runtime) directory.
* No-huge mode for testing with no IOVA available. IOVA could be obtained
  using Address Windowing Extensions, but it is doubtfully demanded.

Roadmap for Windows [1] proposes that memory management (MM) should be
implemented in basic and advanced stages:

1. Basic MM must be sufficient for core libraries and network PMDs:
2. Advanced MM could address features missing from basic stage.

Advanced memory management discussion is out of scope of this RFC.
Windows community calls suggest is will be focused on security and IOMMU
support. I will post a separate thread with background and suggestions.
Cc'ing Dmitry Malloy (MESHCHANINOV) nevertheless.

Because netUIO is not yet committed to dpdk-kmods, the first commit
introduces a new simple driver, virt2phys. It will almost certainly
become a part of netUIO once it is available for patches. Until then, it
must be installed according to documentation provided with the patch.
User-mode code locates the driver interface by GUID, so transition from
virt2phys to netUIO should not require changes to DPDK.

Hugepages allocation on Windows requires some privilege setup. Please
refer to documentation provided in the "initialize hugepage info" patch.

New EAL public functions for memory mapping are introduced. Their
implementation for Linux and FreeBSD is identical. The upcoming patch series
reorganizing EAL directories will help fixing that [2].

Windows MM duplicates quite a lot of code from Linux EAL:

* eal_memalloc_alloc_seg_bulk
* eal_memalloc_free_seg_bulk
* calc_num_pages_per_socket
* rte_eal_hugepage_init

Need input if it should be left as-is to evolve independently, or some
"common to memory hot-plug" code should be factored out. This
duplication may be reduced naturally when advanced MM is implemented.

Notes on checkpatch warnings:

* No space after comma / no space before closing parent in macros---
  definitely a false-positive, unclear how to suppress this.

* Issues from imported BSD code---probably should be ignored?

* Checkpatch is not run against dpdk-kmods (Windows drivers).

[1]: http://core.dpdk.org/roadmap/windows/
[2]: https://patchwork.dpdk.org/project/dpdk/list/?series=9070

Dmitry Kozlyuk (8):
  eal/windows: do not expose private EAL facilities
  eal/windows: improve CPU and NUMA node detection
  eal/windows: initialize hugepage info
  eal: introduce internal wrappers for file operations
  eal: introduce memory management wrappers
  eal/windows: fix rte_page_sizes with Clang on Windows
  eal/windows: replace sys/queue.h with a complete one from FreeBSD
  eal/windows: implement basic memory management

 config/meson.build                            |   12 +-
 doc/guides/windows_gsg/build_dpdk.rst         |   20 -
 doc/guides/windows_gsg/index.rst              |    1 +
 doc/guides/windows_gsg/run_apps.rst           |   47 +
 lib/librte_eal/common/eal_common_fbarray.c    |   57 +-
 lib/librte_eal/common/eal_common_memory.c     |   50 +-
 lib/librte_eal/common/eal_private.h           |  116 +-
 lib/librte_eal/common/include/rte_memory.h    |   69 +
 lib/librte_eal/common/malloc_heap.c           |    1 +
 lib/librte_eal/freebsd/eal/eal.c              |   40 +
 lib/librte_eal/freebsd/eal/eal_memory.c       |  118 +-
 lib/librte_eal/linux/eal/eal.c                |   40 +
 lib/librte_eal/linux/eal/eal_memory.c         |  117 ++
 lib/librte_eal/meson.build                    |    4 +
 lib/librte_eal/rte_eal_exports.def            |  119 ++
 lib/librte_eal/rte_eal_version.map            |    4 +
 lib/librte_eal/windows/eal/eal.c              |  152 +++
 lib/librte_eal/windows/eal/eal_hugepages.c    |  108 ++
 lib/librte_eal/windows/eal/eal_lcore.c        |  187 ++-
 lib/librte_eal/windows/eal/eal_memalloc.c     |  423 ++++++
 lib/librte_eal/windows/eal/eal_memory.c       | 1166 +++++++++++++++++
 lib/librte_eal/windows/eal/eal_mp.c           |  103 ++
 lib/librte_eal/windows/eal/eal_thread.c       |    1 +
 lib/librte_eal/windows/eal/eal_windows.h      |  113 ++
 lib/librte_eal/windows/eal/include/pthread.h  |    2 +
 lib/librte_eal/windows/eal/include/rte_os.h   |   48 +-
 .../windows/eal/include/rte_virt2phys.h       |   34 +
 .../windows/eal/include/rte_windows.h         |   43 +
 .../windows/eal/include/sys/queue.h           |  663 +++++++++-
 lib/librte_eal/windows/eal/include/unistd.h   |    3 +
 lib/librte_eal/windows/eal/meson.build        |   15 +
 31 files changed, 3626 insertions(+), 250 deletions(-)
 create mode 100644 doc/guides/windows_gsg/run_apps.rst
 create mode 100644 lib/librte_eal/windows/eal/eal_hugepages.c
 create mode 100644 lib/librte_eal/windows/eal/eal_memalloc.c
 create mode 100644 lib/librte_eal/windows/eal/eal_memory.c
 create mode 100644 lib/librte_eal/windows/eal/eal_mp.c
 create mode 100644 lib/librte_eal/windows/eal/eal_windows.h
 create mode 100644 lib/librte_eal/windows/eal/include/rte_virt2phys.h
 create mode 100644 lib/librte_eal/windows/eal/include/rte_windows.h

-- 
2.25.1



More information about the dev mailing list