mbox

[v3,00/10] Windows basic memory management

Message ID 20200414194426.1640704-1-dmitry.kozliuk@gmail.com (mailing list archive)
Headers

Message

Dmitry Kozlyuk April 14, 2020, 7:44 p.m. UTC
  Note: no changes in cover letter since v2.

This patchset implements basic MM with the following features:

* Hugepages are dynamically allocated in user-mode.
* Only 2MB hugepages are supported.
* IOVA is always PA, obtained through kernel-mode driver.
* No 32-bit support (presumably not demanded).
* Ni multi-process support (it is forcefully disabled).
* No-huge mode for testing with IOVA unavailable.


The first commit introduces a new kernel-mode driver, virt2phys.
It translates user-mode virtual addresses into physical addresses.
On Windows community call 2020-04-01 it was decided this driver can be
used for now, later netUIO may pick up its code/interface or not.


New EAL public functions for memory mapping are introduced
to mitigate OS differences in DPDK libraries and applications:

* rte_mem_map
* rte_mem_unmap
* rte_mem_lock

To support common MM routines, internal wrappers for low-level
memory reservation and file management are introduced. These changes
affect Linux and FreeBSD EAL. Shared code is placed unded /unix/
subdirectory (suggested by Thomas).

Also, entire <sys/queue.h> is imported from FreeBSD, replacing existing
partial import. There is already a license exception for this file.


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

Perhaps this should be left as-is until Windows MM evolves into having
some specific requirements for these parts.


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).

---

v3:

    * Fix Linux build on and aarch64 and 32-bit x86 (reported by CI).
    * Fix logic and error handling while allocating segments.
    * Fix Unix rte_mem_map(): return NULL on failure.
    * Fix some checkpatch.sh issues:
        * Do not return positive errno, use DWORD for GetLastError().
        * Make dpdk-kmods source files non-executable.
    * Improve GSG for Windows Server (suggested by Ranjit Menon).

v2:

    * Rebase on ToT. Move all new code shared between Linux and FreeBSD
      to /unix/ subdirectory, also factor out some existing code there.
    * Improve description of Clang issue with rte_page_sizes on Windows.
      Restore -fstrict-enum for EAL. Check running, not target compiler.
    * Use EAL prefix for private facilities instead if RTE.
    * Improve documentation comments for new functions.
    * Remove co-installer for virt2phys. Add a typecast for clarity.
    * Document virt2phys in user guide, improve its own README.
    * Explicitly and forcefully disable multi-process.

Dmitry Kozlyuk (9):
  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: extract common code for memseg list initialization
  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           |   84 ++
 lib/librte_eal/common/eal_common_fbarray.c    |   57 +-
 lib/librte_eal/common/eal_common_memory.c     |  104 +-
 lib/librte_eal/common/eal_private.h           |  134 +-
 lib/librte_eal/common/malloc_heap.c           |    1 +
 lib/librte_eal/common/meson.build             |    9 +
 lib/librte_eal/freebsd/eal_memory.c           |   55 +-
 lib/librte_eal/include/rte_memory.h           |   74 ++
 lib/librte_eal/linux/eal_memory.c             |   68 +-
 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/unix/eal.c                     |   47 +
 lib/librte_eal/unix/eal_memory.c              |  113 ++
 lib/librte_eal/unix/meson.build               |    7 +
 lib/librte_eal/windows/eal.c                  |  160 +++
 lib/librte_eal/windows/eal_hugepages.c        |  108 ++
 lib/librte_eal/windows/eal_lcore.c            |  187 ++-
 lib/librte_eal/windows/eal_memalloc.c         |  418 ++++++
 lib/librte_eal/windows/eal_memory.c           | 1141 +++++++++++++++++
 lib/librte_eal/windows/eal_mp.c               |  103 ++
 lib/librte_eal/windows/eal_thread.c           |    1 +
 lib/librte_eal/windows/eal_windows.h          |  129 ++
 lib/librte_eal/windows/include/meson.build    |    2 +
 lib/librte_eal/windows/include/pthread.h      |    2 +
 lib/librte_eal/windows/include/rte_os.h       |   48 +-
 .../windows/include/rte_virt2phys.h           |   34 +
 lib/librte_eal/windows/include/rte_windows.h  |   43 +
 lib/librte_eal/windows/include/sys/queue.h    |  663 +++++++++-
 lib/librte_eal/windows/include/unistd.h       |    3 +
 lib/librte_eal/windows/meson.build            |    6 +
 34 files changed, 3611 insertions(+), 350 deletions(-)
 create mode 100644 doc/guides/windows_gsg/run_apps.rst
 create mode 100644 lib/librte_eal/unix/eal.c
 create mode 100644 lib/librte_eal/unix/eal_memory.c
 create mode 100644 lib/librte_eal/unix/meson.build
 create mode 100644 lib/librte_eal/windows/eal_hugepages.c
 create mode 100644 lib/librte_eal/windows/eal_memalloc.c
 create mode 100644 lib/librte_eal/windows/eal_memory.c
 create mode 100644 lib/librte_eal/windows/eal_mp.c
 create mode 100644 lib/librte_eal/windows/eal_windows.h
 create mode 100644 lib/librte_eal/windows/include/rte_virt2phys.h
 create mode 100644 lib/librte_eal/windows/include/rte_windows.h