From: William Tu <u9012063@gmail.com>
To: dev@dpdk.org
Cc: Dmitry.Kozliuk@gmail.com
Subject: [dpdk-dev] [PATCH RFC] net/ena: Add Windows support.
Date: Sat, 14 Aug 2021 03:36:09 +0000 [thread overview]
Message-ID: <20210814033609.58553-1-u9012063@gmail.com> (raw)
I don't have a physical Windows testbed so I want to see if I can
get virtual nic working, in this case ENA driver on AWS.
The patch passes build on Windows, but I haven't tested loading
the ena driver. I want to know if this is the right direction,
or whether I also need to change other places in ENA driver?
I copy some of the pthread code from
https://nachtimwald.com/2019/04/05/cross-platform-thread-wrapper/
https://stackoverflow.com/questions/10905892/equivalent-of-gettimeday-for-windows
Thanks.
Signed-off-by: William Tu <u9012063@gmail.com>
---
drivers/net/ena/base/ena_com.c | 4 +-
drivers/net/ena/base/ena_plat.h | 2 +-
drivers/net/ena/base/ena_plat_dpdk.h | 14 +++-
drivers/net/ena/meson.build | 5 --
lib/eal/version.map | 2 +-
lib/eal/windows/include/pthread.h | 105 ++++++++++++++++++++++++++
lib/eal/windows/include/rte_windows.h | 1 +
7 files changed, 120 insertions(+), 13 deletions(-)
diff --git a/drivers/net/ena/base/ena_com.c b/drivers/net/ena/base/ena_com.c
index 5ca36ab6d9..587e7b6ed1 100644
--- a/drivers/net/ena/base/ena_com.c
+++ b/drivers/net/ena/base/ena_com.c
@@ -1375,11 +1375,11 @@ int ena_com_execute_admin_command(struct ena_com_admin_queue *admin_queue,
if (IS_ERR(comp_ctx)) {
if (comp_ctx == ERR_PTR(ENA_COM_NO_DEVICE))
ena_trc_dbg(admin_queue->ena_dev,
- "Failed to submit command [%ld]\n",
+ "Failed to submit command [%" PRIu64 "]\n",
PTR_ERR(comp_ctx));
else
ena_trc_err(admin_queue->ena_dev,
- "Failed to submit command [%ld]\n",
+ "Failed to submit command [%" PRIu64 "]\n",
PTR_ERR(comp_ctx));
return (int)PTR_ERR(comp_ctx);
diff --git a/drivers/net/ena/base/ena_plat.h b/drivers/net/ena/base/ena_plat.h
index 2583823080..555cf23e5e 100644
--- a/drivers/net/ena/base/ena_plat.h
+++ b/drivers/net/ena/base/ena_plat.h
@@ -21,7 +21,7 @@
#include <ena_plat_dpdk.h>
#endif
#elif defined(_WIN32)
-#include <ena_plat_windows.h>
+#include <ena_plat_dpdk.h>
#else
#error "Invalid platform"
#endif
diff --git a/drivers/net/ena/base/ena_plat_dpdk.h b/drivers/net/ena/base/ena_plat_dpdk.h
index 4e7f52881a..bba61d7180 100644
--- a/drivers/net/ena/base/ena_plat_dpdk.h
+++ b/drivers/net/ena/base/ena_plat_dpdk.h
@@ -13,6 +13,7 @@
#include <inttypes.h>
#include <string.h>
#include <errno.h>
+#include <pthread.h>
#include <rte_atomic.h>
#include <rte_branch_prediction.h>
@@ -24,7 +25,12 @@
#include <rte_prefetch.h>
#include <rte_spinlock.h>
+#if defined(_WIN32)
+#include <rte_time.h>
+#include <rte_thread.h>
+#else
#include <sys/time.h>
+#endif
#include <rte_memcpy.h>
typedef uint64_t u64;
@@ -293,9 +299,9 @@ extern rte_atomic64_t ena_alloc_cnt;
#define dma_rmb() rmb()
#define MAX_ERRNO 4095
-#define IS_ERR(x) (((unsigned long)x) >= (unsigned long)-MAX_ERRNO)
-#define ERR_PTR(error) ((void *)(long)error)
-#define PTR_ERR(error) ((long)(void *)error)
+#define IS_ERR(x) (((uintptr_t)x) >= (uintptr_t)-MAX_ERRNO)
+#define ERR_PTR(error) ((void *)(uintptr_t)error)
+#define PTR_ERR(error) ((uintptr_t)(void *)error)
#define might_sleep()
#define prefetch(x) rte_prefetch0(x)
@@ -322,7 +328,7 @@ extern rte_atomic64_t ena_alloc_cnt;
#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
-#define ENA_FFS(x) ffs(x)
+#define ENA_FFS(x) __builtin_ffs(x)
void ena_rss_key_fill(void *key, size_t size);
diff --git a/drivers/net/ena/meson.build b/drivers/net/ena/meson.build
index d02ed3f64f..57f8050ccb 100644
--- a/drivers/net/ena/meson.build
+++ b/drivers/net/ena/meson.build
@@ -1,11 +1,6 @@
# SPDX-License-Identifier: BSD-3-Clause
# Copyright(c) 2018 Intel Corporation
-if is_windows
- build = false
- reason = 'not supported on Windows'
- subdir_done()
-endif
sources = files(
'ena_ethdev.c',
diff --git a/lib/eal/version.map b/lib/eal/version.map
index 887012d02a..3de59910cd 100644
--- a/lib/eal/version.map
+++ b/lib/eal/version.map
@@ -198,7 +198,7 @@ DPDK_21 {
rte_uuid_is_null; # WINDOWS_NO_EXPORT
rte_uuid_parse; # WINDOWS_NO_EXPORT
rte_uuid_unparse; # WINDOWS_NO_EXPORT
- rte_version; # WINDOWS_NO_EXPORT
+ rte_version;
rte_vfio_clear_group; # WINDOWS_NO_EXPORT
rte_vfio_container_create; # WINDOWS_NO_EXPORT
rte_vfio_container_destroy; # WINDOWS_NO_EXPORT
diff --git a/lib/eal/windows/include/pthread.h b/lib/eal/windows/include/pthread.h
index 27fd2cca52..4dc39b9a60 100644
--- a/lib/eal/windows/include/pthread.h
+++ b/lib/eal/windows/include/pthread.h
@@ -7,6 +7,7 @@
#include <stdint.h>
#include <sched.h>
+#include <time.h>
/**
* This file is required to support the common code in eal_common_proc.c,
@@ -34,6 +35,10 @@ typedef CRITICAL_SECTION pthread_mutex_t;
typedef SYNCHRONIZATION_BARRIER pthread_barrier_t;
+typedef CONDITION_VARIABLE pthread_cond_t;
+
+typedef void pthread_condattr_t;
+
#define pthread_barrier_init(barrier, attr, count) \
!InitializeSynchronizationBarrier(barrier, count, -1)
#define pthread_barrier_wait(barrier) EnterSynchronizationBarrier(barrier, \
@@ -185,6 +190,106 @@ pthread_mutex_destroy(pthread_mutex_t *mutex)
return 0;
}
+static inline DWORD
+timespec_to_ms(const struct timespec *abstime)
+{
+ DWORD t;
+
+ if (abstime == NULL)
+ return INFINITE;
+
+ t = ((abstime->tv_sec - time(NULL)) * 1000) +
+ (abstime->tv_nsec / 1000000);
+ if (t < 0)
+ t = 1;
+ return t;
+}
+
+static inline int
+pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *attr)
+{
+ (void)attr;
+ if (cond == NULL)
+ return 1;
+ InitializeConditionVariable(cond);
+ return 0;
+}
+
+static inline int
+pthread_cond_destroy(pthread_cond_t *cond)
+{
+ /* Windows does not have a destroy for conditionals */
+ (void)cond;
+ return 0;
+}
+
+static inline int
+pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
+ const struct timespec *abstime)
+{
+ if (cond == NULL || mutex == NULL)
+ return 1;
+ if (!SleepConditionVariableCS(cond, mutex, timespec_to_ms(abstime)))
+ return 1;
+ return 0;
+}
+
+static inline int
+pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
+{
+ if (cond == NULL || mutex == NULL)
+ return 1;
+ return pthread_cond_timedwait(cond, mutex, NULL);
+}
+
+static inline int
+pthread_cond_signal(pthread_cond_t *cond)
+{
+ if (cond == NULL)
+ return 1;
+ WakeConditionVariable(cond);
+ return 0;
+}
+
+static inline int
+pthread_cond_broadcast(pthread_cond_t *cond)
+{
+ if (cond == NULL)
+ return 1;
+ WakeAllConditionVariable(cond);
+ return 0;
+}
+
+struct timezone {
+ int tz_minuteswest;
+ int tz_dsttime;
+};
+
+static inline int
+gettimeofday(struct timeval *tv, struct timezone *tz)
+{
+ if (tv) {
+ FILETIME filetime;
+ ULARGE_INTEGER x;
+ ULONGLONG usec;
+ static const ULONGLONG epoch_ofs_us = 11644473600000000ULL;
+
+ GetSystemTimePreciseAsFileTime(&filetime);
+ x.LowPart = filetime.dwLowDateTime;
+ x.HighPart = filetime.dwHighDateTime;
+ usec = x.QuadPart / 10 - epoch_ofs_us;
+ tv->tv_sec = (time_t)(usec / 1000000ULL);
+ tv->tv_usec = (long)(usec % 1000000ULL);
+ }
+ if (tz) {
+ TIME_ZONE_INFORMATION timezone;
+ GetTimeZoneInformation(&timezone);
+ tz->tz_minuteswest = timezone.Bias;
+ tz->tz_dsttime = 0;
+ }
+ return 0;
+}
+
#ifdef __cplusplus
}
#endif
diff --git a/lib/eal/windows/include/rte_windows.h b/lib/eal/windows/include/rte_windows.h
index 0063b5d78c..3240970ab7 100644
--- a/lib/eal/windows/include/rte_windows.h
+++ b/lib/eal/windows/include/rte_windows.h
@@ -31,6 +31,7 @@
#include <psapi.h>
#include <setupapi.h>
#include <winioctl.h>
+#include <winsock2.h>
/* Have GUIDs defined. */
#ifndef INITGUID
--
2.30.2
next reply other threads:[~2021-08-14 3:36 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-14 3:36 William Tu [this message]
2021-08-14 11:31 ` Dmitry Kozlyuk
2021-08-14 15:37 ` William Tu
2021-08-19 2:19 ` William Tu
2021-08-30 7:11 ` Michał Krawczyk
2021-08-30 14:05 ` William Tu
2022-05-20 22:08 ` Ferruh Yigit
2022-06-06 7:53 ` Michał Krawczyk
2023-03-23 13:13 ` Ferruh Yigit
2023-03-23 14:19 ` Dmitry Kozlyuk
2023-08-10 15:47 ` Stephen Hemminger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210814033609.58553-1-u9012063@gmail.com \
--to=u9012063@gmail.com \
--cc=Dmitry.Kozliuk@gmail.com \
--cc=dev@dpdk.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).