* [dpdk-dev] [PATCH 0/2] Support librte_pci on Windows
@ 2020-03-17 0:48 Pallavi Kadam
2020-03-17 0:48 ` [dpdk-dev] [PATCH 1/2] eal: mman implementation for windows Pallavi Kadam
2020-03-17 0:48 ` [dpdk-dev] [PATCH 2/2] build: add module definitions and pci lib support Pallavi Kadam
0 siblings, 2 replies; 5+ messages in thread
From: Pallavi Kadam @ 2020-03-17 0:48 UTC (permalink / raw)
To: dev, thomas; +Cc: ranjit.menon, talshn, pallavi.kadam
Includes Windows specific EAL changes and meson changes to support
pci lib on Windows.
Added mman.c and mman.h to support common code.
These files are under MIT license and need exception.
note: license/exceptions.txt will be modified once exception is approved.
Pallavi Kadam (2):
eal: mman implementation for windows
build: add module definitions and pci lib support
lib/librte_eal/rte_eal_exports.def | 2 +
lib/librte_eal/windows/eal/include/sys/mman.h | 84 ++++++++
lib/librte_eal/windows/eal/meson.build | 1 +
lib/librte_eal/windows/eal/mman.c | 181 ++++++++++++++++++
lib/meson.build | 2 +-
5 files changed, 269 insertions(+), 1 deletion(-)
create mode 100644 lib/librte_eal/windows/eal/include/sys/mman.h
create mode 100644 lib/librte_eal/windows/eal/mman.c
--
2.18.0.windows.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* [dpdk-dev] [PATCH 1/2] eal: mman implementation for windows
2020-03-17 0:48 [dpdk-dev] [PATCH 0/2] Support librte_pci on Windows Pallavi Kadam
@ 2020-03-17 0:48 ` Pallavi Kadam
2020-03-17 0:48 ` [dpdk-dev] [PATCH 2/2] build: add module definitions and pci lib support Pallavi Kadam
1 sibling, 0 replies; 5+ messages in thread
From: Pallavi Kadam @ 2020-03-17 0:48 UTC (permalink / raw)
To: dev, thomas; +Cc: ranjit.menon, talshn, pallavi.kadam
Adding sys/mman.h and mman.c on Windows for supporting
common code.
This implementation has MIT licensing.
https://github.com/witwall/mman-win32
Signed-off-by: Pallavi Kadam <pallavi.kadam@intel.com>
Reviewed-by: Ranjit Menon <ranjit.menon@intel.com>
---
lib/librte_eal/windows/eal/include/sys/mman.h | 84 ++++++++
lib/librte_eal/windows/eal/meson.build | 1 +
lib/librte_eal/windows/eal/mman.c | 181 ++++++++++++++++++
3 files changed, 266 insertions(+)
create mode 100644 lib/librte_eal/windows/eal/include/sys/mman.h
create mode 100644 lib/librte_eal/windows/eal/mman.c
diff --git a/lib/librte_eal/windows/eal/include/sys/mman.h b/lib/librte_eal/windows/eal/include/sys/mman.h
new file mode 100644
index 000000000..281302717
--- /dev/null
+++ b/lib/librte_eal/windows/eal/include/sys/mman.h
@@ -0,0 +1,84 @@
+/* SPDX-License-Identifier: MIT
+ */
+/*
+ * sys/mman.h
+ * mman-win32
+ */
+
+#ifndef _SYS_MMAN_H_
+#define _SYS_MMAN_H_
+
+/* Allow use of features specific to Windows XP or later.
+ */
+#ifndef _WIN32_WINNT
+/* Change this to the appropriate value to target other versions of Windows.
+ */
+#define _WIN32_WINNT 0x0501
+#endif
+
+/* All the headers include this file. */
+#ifndef _MSC_VER
+#include <_mingw.h>
+#endif
+
+#if defined(MMAN_LIBRARY_DLL)
+/* Windows shared libraries (DLL) must be declared export when building the lib
+ * and import when building the application which links against the library.
+ */
+#if defined(MMAN_LIBRARY)
+#define MMANSHARED_EXPORT __declspec(dllexport)
+#else
+#define MMANSHARED_EXPORT __declspec(dllimport)
+#endif /* MMAN_LIBRARY */
+#else
+/* Static libraries do not require a __declspec attribute.*/
+#define MMANSHARED_EXPORT
+#endif /* MMAN_LIBRARY_DLL */
+
+/* Determine offset type */
+#include <stdint.h>
+#if defined(_WIN64)
+typedef int64_t OffsetType;
+#else
+typedef uint32_t OffsetType;
+#endif
+
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define PROT_NONE 0
+#define PROT_READ 1
+#define PROT_WRITE 2
+#define PROT_EXEC 4
+
+#define MAP_FILE 0
+#define MAP_SHARED 1
+#define MAP_PRIVATE 2
+#define MAP_TYPE 0xf
+#define MAP_FIXED 0x10
+#define MAP_ANONYMOUS 0x20
+#define MAP_ANON MAP_ANONYMOUS
+
+#define MAP_FAILED ((void *)-1)
+
+/* Flags for msync. */
+#define MS_ASYNC 1
+#define MS_SYNC 2
+#define MS_INVALIDATE 4
+
+MMANSHARED_EXPORT void *mmap(void *addr, size_t len, int prot, int flags,
+ int fildes, OffsetType off);
+MMANSHARED_EXPORT int munmap(void *addr, size_t len);
+MMANSHARED_EXPORT int _mprotect(void *addr, size_t len, int prot);
+MMANSHARED_EXPORT int msync(void *addr, size_t len, int flags);
+MMANSHARED_EXPORT int mlock(const void *addr, size_t len);
+MMANSHARED_EXPORT int munlock(const void *addr, size_t len);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_MMAN_H_ */
diff --git a/lib/librte_eal/windows/eal/meson.build b/lib/librte_eal/windows/eal/meson.build
index 2a062c365..634b689c8 100644
--- a/lib/librte_eal/windows/eal/meson.build
+++ b/lib/librte_eal/windows/eal/meson.build
@@ -24,4 +24,5 @@ env_sources = files('eal.c',
'eal_lcore.c',
'eal_thread.c',
'getopt.c',
+ 'mman.c',
)
diff --git a/lib/librte_eal/windows/eal/mman.c b/lib/librte_eal/windows/eal/mman.c
new file mode 100644
index 000000000..c1f60d4df
--- /dev/null
+++ b/lib/librte_eal/windows/eal/mman.c
@@ -0,0 +1,181 @@
+/* SPDX-License-Identifier: MIT
+ */
+
+#include <windows.h>
+#include <errno.h>
+#include <io.h>
+
+#include "sys/mman.h"
+
+#ifndef FILE_MAP_EXECUTE
+#define FILE_MAP_EXECUTE 0x0020
+#endif /* FILE_MAP_EXECUTE */
+
+static int __map_mman_error(const DWORD err, const int deferr)
+{
+ if (err == 0)
+ return 0;
+ //TODO: implement
+ return err;
+}
+
+static DWORD __map_mmap_prot_page(const int prot)
+{
+ DWORD protect = 0;
+
+ if (prot == PROT_NONE)
+ return protect;
+
+ if ((prot & PROT_EXEC) != 0) {
+ protect = ((prot & PROT_WRITE) != 0) ?
+ PAGE_EXECUTE_READWRITE : PAGE_EXECUTE_READ;
+ } else {
+ protect = ((prot & PROT_WRITE) != 0) ?
+ PAGE_READWRITE : PAGE_READONLY;
+ }
+
+ return protect;
+}
+
+static DWORD __map_mmap_prot_file(const int prot)
+{
+ DWORD desiredAccess = 0;
+
+ if (prot == PROT_NONE)
+ return desiredAccess;
+
+ if ((prot & PROT_READ) != 0)
+ desiredAccess |= FILE_MAP_READ;
+ if ((prot & PROT_WRITE) != 0)
+ desiredAccess |= FILE_MAP_WRITE;
+ if ((prot & PROT_EXEC) != 0)
+ desiredAccess |= FILE_MAP_EXECUTE;
+
+ return desiredAccess;
+}
+
+void*
+mmap(void *addr, size_t len, int prot, int flags, int fildes, OffsetType off)
+{
+ HANDLE fm, h;
+
+ void *map = MAP_FAILED;
+
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable : 4293)
+#endif
+
+ const DWORD dwFileOffsetLow = (sizeof(OffsetType) <= sizeof(DWORD)) ?
+ (DWORD)off : (DWORD)(off & 0xFFFFFFFFL);
+ const DWORD dwFileOffsetHigh = (sizeof(OffsetType) <= sizeof(DWORD)) ?
+ (DWORD)0 : (DWORD)((off >> 32) & 0xFFFFFFFFL);
+ const DWORD protect = __map_mmap_prot_page(prot);
+ const DWORD desiredAccess = __map_mmap_prot_file(prot);
+
+ const OffsetType maxSize = off + (OffsetType)len;
+
+ const DWORD dwMaxSizeLow = (sizeof(OffsetType) <= sizeof(DWORD)) ?
+ (DWORD)maxSize : (DWORD)(maxSize & 0xFFFFFFFFL);
+ const DWORD dwMaxSizeHigh = (sizeof(OffsetType) <= sizeof(DWORD)) ?
+ (DWORD)0 : (DWORD)((maxSize >> 32) & 0xFFFFFFFFL);
+
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+ errno = 0;
+
+ if (len == 0
+ /* Usupported protection combinations */
+ || prot == PROT_EXEC){
+ errno = EINVAL;
+ return MAP_FAILED;
+ }
+
+ h = ((flags & MAP_ANONYMOUS) == 0) ?
+ (HANDLE)_get_osfhandle(fildes) : INVALID_HANDLE_VALUE;
+
+ if ((flags & MAP_ANONYMOUS) == 0 && h == INVALID_HANDLE_VALUE) {
+ errno = EBADF;
+ return MAP_FAILED;
+ }
+
+ fm = CreateFileMapping(h, NULL, protect, dwMaxSizeHigh, dwMaxSizeLow,
+ NULL);
+
+ if (fm == NULL) {
+ errno = __map_mman_error(GetLastError(), EPERM);
+ return MAP_FAILED;
+ }
+
+ if ((flags & MAP_FIXED) == 0) {
+ map = MapViewOfFile(fm, desiredAccess, dwFileOffsetHigh,
+ dwFileOffsetLow, len);
+ } else {
+ map = MapViewOfFileEx(fm, desiredAccess, dwFileOffsetHigh,
+ dwFileOffsetLow, len, addr);
+ }
+
+ CloseHandle(fm);
+
+ if (map == NULL) {
+ errno = __map_mman_error(GetLastError(), EPERM);
+ return MAP_FAILED;
+ }
+
+ return map;
+}
+
+int munmap(void *addr, size_t len)
+{
+ if (UnmapViewOfFile(addr))
+ return 0;
+
+ errno = __map_mman_error(GetLastError(), EPERM);
+
+ return -1;
+}
+
+int _mprotect(void *addr, size_t len, int prot)
+{
+ DWORD newProtect = __map_mmap_prot_page(prot);
+ DWORD oldProtect = 0;
+
+ if (VirtualProtect(addr, len, newProtect, &oldProtect))
+ return 0;
+
+ errno = __map_mman_error(GetLastError(), EPERM);
+
+ return -1;
+}
+
+int msync(void *addr, size_t len, int flags)
+{
+ if (FlushViewOfFile(addr, len))
+ return 0;
+
+ errno = __map_mman_error(GetLastError(), EPERM);
+
+ return -1;
+}
+
+int mlock(const void *addr, size_t len)
+{
+ if (VirtualLock((LPVOID)addr, len))
+ return 0;
+
+ errno = __map_mman_error(GetLastError(), EPERM);
+
+ return -1;
+}
+
+int munlock(const void *addr, size_t len)
+{
+ if (VirtualUnlock((LPVOID)addr, len))
+ return 0;
+
+ errno = __map_mman_error(GetLastError(), EPERM);
+
+ return -1;
+}
--
2.18.0.windows.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* [dpdk-dev] [PATCH 2/2] build: add module definitions and pci lib support
2020-03-17 0:48 [dpdk-dev] [PATCH 0/2] Support librte_pci on Windows Pallavi Kadam
2020-03-17 0:48 ` [dpdk-dev] [PATCH 1/2] eal: mman implementation for windows Pallavi Kadam
@ 2020-03-17 0:48 ` Pallavi Kadam
2020-03-17 9:31 ` Thomas Monjalon
1 sibling, 1 reply; 5+ messages in thread
From: Pallavi Kadam @ 2020-03-17 0:48 UTC (permalink / raw)
To: dev, thomas; +Cc: ranjit.menon, talshn, pallavi.kadam
Added mman functions to eal exports list.
Added librte_pci support for Windows.
Signed-off-by: Pallavi Kadam <pallavi.kadam@intel.com>
Reviewed-by: Ranjit Menon <ranjit.menon@intel.com>
---
lib/librte_eal/rte_eal_exports.def | 2 ++
lib/meson.build | 2 +-
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/lib/librte_eal/rte_eal_exports.def b/lib/librte_eal/rte_eal_exports.def
index 12a6c79d6..bc577dd45 100644
--- a/lib/librte_eal/rte_eal_exports.def
+++ b/lib/librte_eal/rte_eal_exports.def
@@ -7,3 +7,5 @@ EXPORTS
rte_eal_remote_launch
rte_log
rte_vlog
+ mmap
+ munmap
diff --git a/lib/meson.build b/lib/meson.build
index 0af3efab2..ab580202b 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -33,7 +33,7 @@ libraries = [
'flow_classify', 'bpf', 'telemetry']
if is_windows
- libraries = ['kvargs','eal'] # only supported libraries for windows
+ libraries = ['kvargs','eal','pci'] # only supported libraries for windows
endif
default_cflags = machine_args
--
2.18.0.windows.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [dpdk-dev] [PATCH 2/2] build: add module definitions and pci lib support
2020-03-17 0:48 ` [dpdk-dev] [PATCH 2/2] build: add module definitions and pci lib support Pallavi Kadam
@ 2020-03-17 9:31 ` Thomas Monjalon
2020-03-18 0:28 ` Dmitry Kozlyuk
0 siblings, 1 reply; 5+ messages in thread
From: Thomas Monjalon @ 2020-03-17 9:31 UTC (permalink / raw)
To: Pallavi Kadam
Cc: dev, ranjit.menon, talshn, pallavi.kadam, dmitry.kozliuk, narcisa.vasile
17/03/2020 01:48, Pallavi Kadam:
> Added mman functions to eal exports list.
[...]
> --- a/lib/librte_eal/rte_eal_exports.def
> +++ b/lib/librte_eal/rte_eal_exports.def
This file is generated. Only the .map can be updated.
> @@ -7,3 +7,5 @@ EXPORTS
> rte_eal_remote_launch
> rte_log
> rte_vlog
> + mmap
> + munmap
These functions should not be exported for Linux.
And in general, I think it would be better to state what is
the memory management strategy on Windows first.
Maybe we will need to use a different abstraction.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [dpdk-dev] [PATCH 2/2] build: add module definitions and pci lib support
2020-03-17 9:31 ` Thomas Monjalon
@ 2020-03-18 0:28 ` Dmitry Kozlyuk
0 siblings, 0 replies; 5+ messages in thread
From: Dmitry Kozlyuk @ 2020-03-18 0:28 UTC (permalink / raw)
To: Thomas Monjalon; +Cc: Pallavi Kadam, dev, ranjit.menon, talshn, narcisa.vasile
> 17/03/2020 01:48, Pallavi Kadam:
> > Added mman functions to eal exports list.
> [...]
> > --- a/lib/librte_eal/rte_eal_exports.def
> > +++ b/lib/librte_eal/rte_eal_exports.def
>
> This file is generated. Only the .map can be updated.
A minor correction: this file is not generated, it overrides generation of
*.def from *.map, see buildtools/map_to_def.py.
> > @@ -7,3 +7,5 @@ EXPORTS
> > rte_eal_remote_launch
> > rte_log
> > rte_vlog
> > + mmap
> > + munmap
>
> These functions should not be exported for Linux.
>
> And in general, I think it would be better to state what is
> the memory management strategy on Windows first.
> Maybe we will need to use a different abstraction.
I concur, this patch should be postponed at least. Hopefully we'll settle
to something regarding Windows MM at the nearest Community Call.
EAL will have to export mmap/munmap-like functions for mapping files and
anonymous pages to support library code. Depending on the approach to MM
implementation for Windows, not all mmap() calls may even translate into its
Win32 equivalent. For example, hugepage allocation on Windows will use
different approach that MMF.
Mapping device BARs can only be done using IOCTLs on Windows, so
rte_pci_map/unmap_resource() code will not work even if it compiles.
--
Dmitry Kozlyuk
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2020-03-18 0:28 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-03-17 0:48 [dpdk-dev] [PATCH 0/2] Support librte_pci on Windows Pallavi Kadam
2020-03-17 0:48 ` [dpdk-dev] [PATCH 1/2] eal: mman implementation for windows Pallavi Kadam
2020-03-17 0:48 ` [dpdk-dev] [PATCH 2/2] build: add module definitions and pci lib support Pallavi Kadam
2020-03-17 9:31 ` Thomas Monjalon
2020-03-18 0:28 ` Dmitry Kozlyuk
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).