eal: make OS shims internal
authorDmitry Kozlyuk <dmitry.kozliuk@gmail.com>
Sat, 10 Apr 2021 22:47:30 +0000 (01:47 +0300)
committerThomas Monjalon <thomas@monjalon.net>
Wed, 14 Apr 2021 23:56:20 +0000 (01:56 +0200)
DPDK code often relies on functions and macros that are not standard C,
but are found on all platforms, even if by slightly different names.
Windows <rte_os.h> provided macros or inline definitions for such symbols.
However, when placed in public header, these symbols were unnecessarily
exposed, breaking consumer POSIX compatibility code.

Move most of the shims to <rte_os_shim.h>, a header to be used instead
of <rte_os.h> by internal code. Include it in libraries and PMDs that
previously imported shims from <rte_os.h>. Directly replace shims that
were only used inside EAL:
* index -> strchr, rindex -> strrchr
* sleep -> rte_delay_us_sleep
* strerror_r -> strerror_s

Signed-off-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
Acked-by: Thomas Monjalon <thomas@monjalon.net>
Acked-by: Ranjit Menon <ranjit.menon@intel.com>
23 files changed:
drivers/bus/pci/private.h
drivers/bus/vdev/vdev_private.h
drivers/common/mlx5/mlx5_common.h
drivers/net/i40e/i40e_ethdev.c
lib/librte_cmdline/cmdline.c
lib/librte_cmdline/cmdline_os_windows.c
lib/librte_cmdline/cmdline_private.h
lib/librte_cmdline/cmdline_socket.c
lib/librte_eal/common/eal_common_config.c
lib/librte_eal/common/eal_common_errno.c
lib/librte_eal/common/eal_common_log.c
lib/librte_eal/common/eal_common_options.c
lib/librte_eal/common/eal_common_timer.c
lib/librte_eal/common/eal_internal_cfg.h
lib/librte_eal/freebsd/include/rte_os_shim.h [new file with mode: 0644]
lib/librte_eal/linux/include/rte_os_shim.h [new file with mode: 0644]
lib/librte_eal/windows/eal_hugepages.c
lib/librte_eal/windows/eal_lcore.c
lib/librte_eal/windows/eal_memalloc.c
lib/librte_eal/windows/include/rte_os.h
lib/librte_eal/windows/include/rte_os_shim.h [new file with mode: 0644]
lib/librte_ethdev/ethdev_private.h
lib/librte_kvargs/rte_kvargs.c

index f566943..4cd9d14 100644 (file)
@@ -7,8 +7,10 @@
 
 #include <stdbool.h>
 #include <stdio.h>
-#include <rte_pci.h>
+
 #include <rte_bus_pci.h>
+#include <rte_os_shim.h>
+#include <rte_pci.h>
 
 extern struct rte_pci_bus rte_pci_bus;
 
index ba6dc48..e683f5f 100644 (file)
@@ -5,6 +5,8 @@
 #ifndef _VDEV_PRIVATE_H_
 #define _VDEV_PRIVATE_H_
 
+#include <rte_os_shim.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif
index 327374f..f3c6beb 100644 (file)
@@ -14,6 +14,7 @@
 #include <rte_kvargs.h>
 #include <rte_devargs.h>
 #include <rte_bitops.h>
+#include <rte_os_shim.h>
 
 #include "mlx5_prm.h"
 #include "mlx5_devx_cmds.h"
index c03e4a0..ea5d384 100644 (file)
@@ -27,6 +27,7 @@
 #include <rte_tailq.h>
 #include <rte_hash_crc.h>
 #include <rte_bitmap.h>
+#include <rte_os_shim.h>
 
 #include "i40e_logs.h"
 #include "base/i40e_prototype.h"
index 79ea5f9..4977086 100644 (file)
 
 #include "cmdline_private.h"
 
-#ifdef RTE_EXEC_ENV_WINDOWS
-#define write _write
-#endif
-
 static void
 cmdline_valid_buffer(struct rdline *rdl, const char *buf,
                     __rte_unused unsigned int size)
index e9585c9..73ed9ba 100644 (file)
@@ -4,8 +4,6 @@
 
 #include <io.h>
 
-#include <rte_os.h>
-
 #include "cmdline_private.h"
 
 /* Missing from some MinGW-w64 distributions. */
index a8a6ee9..a87c452 100644 (file)
@@ -8,6 +8,7 @@
 #include <stdarg.h>
 
 #include <rte_common.h>
+#include <rte_os_shim.h>
 #ifdef RTE_EXEC_ENV_WINDOWS
 #include <rte_windows.h>
 #endif
index 0fe1497..998e8ad 100644 (file)
 #include "cmdline_private.h"
 #include "cmdline_socket.h"
 
-#ifdef RTE_EXEC_ENV_WINDOWS
-#define open _open
-#endif
-
 struct cmdline *
 cmdline_file_new(cmdline_parse_ctx_t *ctx, const char *prompt, const char *path)
 {
index 56d09dd..1c4c4dd 100644 (file)
@@ -3,7 +3,6 @@
  */
 #include <string.h>
 
-#include <rte_os.h>
 #include <rte_string_fns.h>
 
 #include "eal_private.h"
index 2a10fb8..f868027 100644 (file)
 #include <rte_errno.h>
 #include <rte_string_fns.h>
 
+#ifdef RTE_EXEC_ENV_WINDOWS
+#define strerror_r(errnum, buf, buflen) strerror_s(buf, buflen, errnum)
+#endif
+
 RTE_DEFINE_PER_LCORE(int, _rte_errno);
 
 const char *
index bed83a4..cedf9f0 100644 (file)
@@ -13,6 +13,7 @@
 
 #include <rte_eal.h>
 #include <rte_log.h>
+#include <rte_os_shim.h>
 #include <rte_per_lcore.h>
 
 #include "eal_log.h"
index 2951b1a..66f9114 100644 (file)
@@ -1959,7 +1959,7 @@ eal_check_common_options(struct internal_config *internal_cfg)
                RTE_LOG(ERR, EAL, "Invalid length of --" OPT_MBUF_POOL_OPS_NAME" option\n");
                return -1;
        }
-       if (index(eal_get_hugefile_prefix(), '%') != NULL) {
+       if (strchr(eal_get_hugefile_prefix(), '%') != NULL) {
                RTE_LOG(ERR, EAL, "Invalid char, '%%', in --"OPT_FILE_PREFIX" "
                        "option\n");
                return -1;
index 71e0bd0..86f8429 100644 (file)
@@ -47,9 +47,9 @@ estimate_tsc_freq(void)
 #define CYC_PER_10MHZ 1E7
        RTE_LOG(WARNING, EAL, "WARNING: TSC frequency estimated roughly"
                " - clock timings may be less accurate.\n");
-       /* assume that the sleep(1) will sleep for 1 second */
+       /* assume that the rte_delay_us_sleep() will sleep for 1 second */
        uint64_t start = rte_rdtsc();
-       sleep(1);
+       rte_delay_us_sleep(US_PER_S);
        /* Round up to 10Mhz. 1E7 ~ 10Mhz */
        return RTE_ALIGN_MUL_NEAR(rte_rdtsc() - start, CYC_PER_10MHZ);
 }
index 51dbe86..d6c0470 100644 (file)
@@ -11,6 +11,7 @@
 #define EAL_INTERNAL_CFG_H
 
 #include <rte_eal.h>
+#include <rte_os_shim.h>
 #include <rte_pci_dev_feature_defs.h>
 
 #include "eal_thread.h"
diff --git a/lib/librte_eal/freebsd/include/rte_os_shim.h b/lib/librte_eal/freebsd/include/rte_os_shim.h
new file mode 100644 (file)
index 0000000..1e85229
--- /dev/null
@@ -0,0 +1,14 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+
+#ifndef _RTE_OS_SHIM_
+#define _RTE_OS_SHIM_
+
+#include <rte_os.h>
+
+/**
+ * @file
+ * @internal
+ * Provides semi-standard OS facilities by convenient names.
+ */
+
+#endif /* _RTE_OS_SHIM_ */
diff --git a/lib/librte_eal/linux/include/rte_os_shim.h b/lib/librte_eal/linux/include/rte_os_shim.h
new file mode 100644 (file)
index 0000000..1e85229
--- /dev/null
@@ -0,0 +1,14 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+
+#ifndef _RTE_OS_SHIM_
+#define _RTE_OS_SHIM_
+
+#include <rte_os.h>
+
+/**
+ * @file
+ * @internal
+ * Provides semi-standard OS facilities by convenient names.
+ */
+
+#endif /* _RTE_OS_SHIM_ */
index 83a3d0f..b007dce 100644 (file)
@@ -6,7 +6,6 @@
 #include <rte_log.h>
 #include <rte_memory.h>
 #include <rte_memzone.h>
-#include <rte_os.h>
 
 #include "eal_private.h"
 #include "eal_filesystem.h"
index a85149b..476c2d2 100644 (file)
@@ -9,7 +9,6 @@
 #include <rte_common.h>
 #include <rte_debug.h>
 #include <rte_lcore.h>
-#include <rte_os.h>
 
 #include "eal_private.h"
 #include "eal_thread.h"
index 85a9712..4459d59 100644 (file)
@@ -3,7 +3,6 @@
  */
 
 #include <rte_errno.h>
-#include <rte_os.h>
 
 #include "eal_internal_cfg.h"
 #include "eal_memalloc.h"
index 1afe49f..66c711d 100644 (file)
 extern "C" {
 #endif
 
-/* limits.h replacement, value as in <windows.h> */
-#ifndef PATH_MAX
-#define PATH_MAX _MAX_PATH
-#endif
-
-#ifndef sleep
-#define sleep(x) Sleep(1000 * (x))
-#endif
-
-#ifndef strerror_r
-#define strerror_r(a, b, c) strerror_s(b, c, a)
-#endif
-
-#ifndef strdup
-/* strdup is deprecated in Microsoft libc and _strdup is preferred */
-#define strdup(str) _strdup(str)
-#endif
-
-#ifndef strtok_r
-#define strtok_r(str, delim, saveptr) strtok_s(str, delim, saveptr)
-#endif
-
-#ifndef index
-#define index(a, b)     strchr(a, b)
-#endif
-
-#ifndef rindex
-#define rindex(a, b)    strrchr(a, b)
-#endif
-
-#ifndef strncasecmp
-#define strncasecmp(s1, s2, count)        _strnicmp(s1, s2, count)
-#endif
-
-#ifndef close
-#define close _close
-#endif
-
-#ifndef unlink
-#define unlink _unlink
-#endif
-
 /* cpu_set macros implementation */
 #define RTE_CPU_AND(dst, src1, src2) CPU_AND(dst, src1, src2)
 #define RTE_CPU_OR(dst, src1, src2) CPU_OR(dst, src1, src2)
 #define RTE_CPU_FILL(set) CPU_FILL(set)
 #define RTE_CPU_NOT(dst, src) CPU_NOT(dst, src)
 
-/* as in <windows.h> */
+/* This is an exception without "rte_" prefix, because Windows does have
+ * ssize_t, but it's defined in <windows.h> which we avoid to expose.
+ * If ssize_t is defined in user code, it necessarily has the same type.
+ */
 typedef long long ssize_t;
 
-#ifndef RTE_TOOLCHAIN_GCC
-static inline const char *
-eal_strerror(int code)
-{
-       static char buffer[128];
-
-       strerror_s(buffer, sizeof(buffer), code);
-       return buffer;
-}
-
-#ifndef strerror
-#define strerror eal_strerror
-#endif
-#endif /* RTE_TOOLCHAIN_GCC */
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/lib/librte_eal/windows/include/rte_os_shim.h b/lib/librte_eal/windows/include/rte_os_shim.h
new file mode 100644 (file)
index 0000000..edd9a10
--- /dev/null
@@ -0,0 +1,28 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+
+#ifndef _RTE_OS_SHIM_
+#define _RTE_OS_SHIM_
+
+#include <rte_os.h>
+
+/**
+ * @file
+ * @internal
+ * Provides semi-standard OS facilities by convenient names.
+ */
+
+#ifndef PATH_MAX
+#define PATH_MAX _MAX_PATH
+#endif
+
+#define strdup(str) _strdup(str)
+#define strtok_r(str, delim, saveptr) strtok_s(str, delim, saveptr)
+#define strncasecmp(s1, s2, count) _strnicmp(s1, s2, count)
+
+#define open(path, flags, ...) _open(path, flags, ##__VA_ARGS__)
+#define read(fd, buf, n) _read(fd, buf, n)
+#define write(fd, buf, n) _write(fd, buf, n)
+#define close(fd) _close(fd)
+#define unlink(path) _unlink(path)
+
+#endif /* _RTE_OS_SHIM_ */
index 220ddd4..9bb0879 100644 (file)
@@ -5,6 +5,8 @@
 #ifndef _ETH_PRIVATE_H_
 #define _ETH_PRIVATE_H_
 
+#include <rte_os_shim.h>
+
 #include "rte_ethdev.h"
 
 #ifdef __cplusplus
index 4cce8e9..38e9d5c 100644 (file)
@@ -7,6 +7,7 @@
 #include <stdlib.h>
 #include <stdbool.h>
 
+#include <rte_os_shim.h>
 #include <rte_string_fns.h>
 
 #include "rte_kvargs.h"