From: dev.madaari@gmail.com
To: fio@vger.kernel.org
Cc: Udit kumar agarwal <dev.madaari@gmail.com>
Subject: [PATCH] Fio's initial RTEMS port
Date: Mon, 16 Jul 2018 14:36:46 +0530 [thread overview]
Message-ID: <1531732006-11136-2-git-send-email-dev.madaari@gmail.com> (raw)
In-Reply-To: <1531732006-11136-1-git-send-email-dev.madaari@gmail.com>
From: Udit kumar agarwal <dev.madaari@gmail.com>
- Add rtems-specific config files.
- Constructors/Destructors being not supported by RTEMS, should be
invoked as normal routines.
- Add documentation for RTEMS
- Update Makefile, os.h for RTEMS
---
Makefile | 11 ++-
README | 29 ++++++
cgroup.c | 7 +-
client.c | 7 +-
configure | 2 +
crc/xxhash.h | 15 ++++
engines/cpu.c | 14 ++-
engines/falloc.c | 7 +-
engines/filecreate.c | 14 ++-
engines/ftruncate.c | 14 ++-
engines/glusterfs_async.c | 7 +-
engines/glusterfs_sync.c | 14 ++-
engines/mmap.c | 14 ++-
engines/net.c | 14 ++-
engines/null.c | 14 ++-
engines/sync.c | 14 ++-
fio.c | 3 +
fio.h | 10 ++-
fio_sem.c | 6 ++
gettime.c | 14 ++-
init.c | 26 +++++-
ioengines.c | 2 +
lib/prio_tree.c | 7 +-
options.c | 6 +-
os/os-rtems.h | 70 +++++++++++++++
os/os.h | 3 +
os/rtems/rtems-fio-wrap.h | 54 +++++++++++
os/rtems/rtems-init.c | 225 ++++++++++++++++++++++++++++++++++++++++++++++
oslib/inet_aton.c | 3 +-
profiles/act.c | 14 ++-
profiles/tiobench.c | 14 ++-
smalloc.c | 11 ++-
stat.c | 6 ++
t/arch.c | 2 +
34 files changed, 638 insertions(+), 35 deletions(-)
create mode 100644 os/os-rtems.h
create mode 100644 os/rtems/rtems-fio-wrap.h
create mode 100644 os/rtems/rtems-init.c
diff --git a/Makefile b/Makefile
index 20d3ec1..e93f964 100644
--- a/Makefile
+++ b/Makefile
@@ -194,11 +194,20 @@ ifneq (,$(findstring CYGWIN,$(CONFIG_TARGET_OS)))
LIBS += -lpthread -lpsapi -lws2_32
CFLAGS += -DPSAPI_VERSION=1 -Ios/windows/posix/include -Wno-format -static
endif
+ifeq ($(CONFIG_TARGET_OS), RTEMS)
+ LDFLAGS += -B $(TOOL_PATH_PREFIX)/arm-rtems5/beagleboneblack/lib -specs bsp_specs -qrtems -Wl,--gc-sections
+ LIBS += -Wl,-Bstatic -L. -lbsd -Wl,-Bdynamic -lm -lz
+ CFLAGS += -I $(TOOL_PATH_PREFIX)/arm-rtems5/beagleboneblack/lib/include -ffunction-sections -fdata-sections -g -mcpu=cortex-a8 -fno-strict-aliasing -ffreestanding -fno-common -w -DHAVE_RTEMS_SCORE_CPUOPTS_H=1 -DHAVE_RTEMS_H=1 -DHAVE_DLFCN_H=1 -DHAVE_RTEMS_PCI_H=1 -DHAVE_RTEMS_RTEMS_DEBUGGER_H=1
+endif
OBJS := $(SOURCE:.c=.o)
FIO_OBJS = $(OBJS) fio.o
+ifeq ($(CONFIG_TARGET_OS), RTEMS)
+ FIO_OBJS += os/rtems/rtems-init.o
+endif
+
GFIO_OBJS = $(OBJS) gfio.o graph.o tickmarks.o ghelpers.o goptions.o gerror.o \
gclient.o gcompat.o cairo_text_helpers.o printing.o
@@ -462,7 +471,7 @@ t/time-test: $(T_TT_OBJS)
$(QUIET_LINK)$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $(T_TT_OBJS) $(LIBS)
clean: FORCE
- @rm -f .depend $(FIO_OBJS) $(GFIO_OBJS) $(OBJS) $(T_OBJS) $(PROGS) $(T_PROGS) $(T_TEST_PROGS) core.* core gfio FIO-VERSION-FILE *.[do] lib/*.d oslib/*.[do] crc/*.d engines/*.[do] profiles/*.[do] t/*.[do] config-host.mak config-host.h y.tab.[ch] lex.yy.c exp/*.[do] lexer.h
+ @rm -f .depend $(FIO_OBJS) $(GFIO_OBJS) $(OBJS) $(T_OBJS) $(PROGS) $(T_PROGS) $(T_TEST_PROGS) core.* core gfio FIO-VERSION-FILE *.[do] lib/*.d oslib/*.[do] crc/*.d engines/*.[do] profiles/*.[do] t/*.[do] config-host.mak config-host.h y.tab.[ch] lex.yy.c exp/*.[do] lexer.h os/rtems/*.[do]
@rm -rf doc/output
distclean: clean FORCE
diff --git a/README b/README
index 38022bb..cbca933 100644
--- a/README
+++ b/README
@@ -192,6 +192,35 @@ https://github.com/mintty/mintty/issues/56 and
https://github.com/mintty/mintty/wiki/Tips#inputoutput-interaction-with-alien-programs
for details).
+RTEMS
+~~~~~~~
+
+For RTEMS Toolchain generation::
+
+Toolchain, required for cross-compiling fio for desired architecture
+(like arm in this example) can be generated by using RTEMS Source Builder(RSB).
+
+Please note that fio's build for RTEMS has been tested with RSB version 5(commit id:
+25f4db09c85a52fb1640a29f9bdc2de8c2768988), and it may not work with older versions.
+
+Moreover, For enabling POSIX support(required by fio), build the BSP using RTEMS v5 with
+--enable-posix option. After that, if needed(like for using SD card driver for BeagleBone Black)
+one may also need to build rtems-libbsd for the desired BSP.
+
+For Cross-compiling fio for RTEMS::
+
+Variable to be passed for toolchain path is TOOL_PATH_PREFIX, which in this case would be,
+
+ $ export TOOL_PATH_PREFIX=/home/uka_in/development/sandbox/5
+
+After setting up the variable, next step would be to configure and build fio as:
+
+ $ make clean
+ $ ./configure --cc=$TOOL_PATH_PREFIX/bin/arm-rtems5-gcc --disable-optimizations --extra-cflags=-O3
+ $ make CROSS_COMPILE=$TOOL_PATH_PREFIX/bin/arm-rtems5- V=1
+
+Refer to ticket #3429 https://devel.rtems.org/ticket/3429 for updates and
+drawbacks of current implementation.
Documentation
~~~~~~~~~~~~~
diff --git a/cgroup.c b/cgroup.c
index 77e31a4..0a3d372 100644
--- a/cgroup.c
+++ b/cgroup.c
@@ -224,7 +224,12 @@ out:
sfree(mnt);
}
-static void fio_init cgroup_init(void)
+#ifdef __rtems__
+void
+#else /* __rtems__ */
+static void fio_init
+#endif /* __rtems__ */
+cgroup_init(void)
{
lock = fio_sem_init(FIO_SEM_UNLOCKED);
if (!lock)
diff --git a/client.c b/client.c
index 2a86ea9..cb4ef56 100644
--- a/client.c
+++ b/client.c
@@ -86,7 +86,12 @@ static void fio_client_remove_hash(struct fio_client *client)
flist_del_init(&client->hash_list);
}
-static void fio_init fio_client_hash_init(void)
+#ifdef __rtems__
+void
+#else /* __rtems__ */
+static void fio_init
+#endif /* __rtems__ */
+fio_client_hash_init(void)
{
int i;
diff --git a/configure b/configure
index 9bdc7a1..53dd857 100755
--- a/configure
+++ b/configure
@@ -262,6 +262,8 @@ elif check_define __sun__ ; then
CFLAGS="$CFLAGS -D_REENTRANT"
elif check_define _WIN32 ; then
targetos='CYGWIN'
+elif check_define __rtems__ ; then
+ targetos='RTEMS'
else
targetos=`uname -s`
fi
diff --git a/crc/xxhash.h b/crc/xxhash.h
index 8850d20..81bf51d 100644
--- a/crc/xxhash.h
+++ b/crc/xxhash.h
@@ -107,9 +107,16 @@ XXH32() :
// Advanced Hash Functions
//****************************
+/* Unlike most desktop OS, In Newlib unsigned int and uint32_t are different */
+#ifndef __rtems__
void* XXH32_init (unsigned int seed);
XXH_errorcode XXH32_update (void* state, const void* input, int len);
unsigned int XXH32_digest (void* state);
+#else /* __rtems__ */
+void* XXH32_init (uint32_t seed);
+XXH_errorcode XXH32_update (void* state, const void* input, int len);
+uint32_t XXH32_digest (void* state);
+#endif /* __rtems__ */
/*
These functions calculate the xxhash of an input provided in several small packets,
@@ -135,7 +142,11 @@ Memory will be freed by XXH32_digest().
int XXH32_sizeofState(void);
+#ifndef __rtems__
XXH_errorcode XXH32_resetState(void* state, unsigned int seed);
+#else /* __rtems__ */
+XXH_errorcode XXH32_resetState(void* state, uint32_t seed);
+#endif /* __rtems__ */
#define XXH32_SIZEOFSTATE 48
typedef struct { long long ll[(XXH32_SIZEOFSTATE+(sizeof(long long)-1))/sizeof(long long)]; } XXH32_stateSpace_t;
@@ -151,7 +162,11 @@ use the structure XXH32_stateSpace_t, which will ensure that memory space is lar
*/
+#ifndef __rtems__
unsigned int XXH32_intermediateDigest (void* state);
+#else /* __rtems__ */
+uint32_t XXH32_intermediateDigest (void* state);
+#endif /* __rtems__ */
/*
This function does the same as XXH32_digest(), generating a 32-bit hash,
but preserve memory context.
diff --git a/engines/cpu.c b/engines/cpu.c
index 0987250..9838af1 100644
--- a/engines/cpu.c
+++ b/engines/cpu.c
@@ -112,12 +112,22 @@ static struct ioengine_ops ioengine = {
.option_struct_size = sizeof(struct cpu_options),
};
-static void fio_init fio_cpuio_register(void)
+#ifdef __rtems__
+void
+#else /* __rtems__ */
+static void fio_init
+#endif /* __rtems__ */
+fio_cpuio_register(void)
{
register_ioengine(&ioengine);
}
-static void fio_exit fio_cpuio_unregister(void)
+#ifdef __rtems__
+void
+#else /* __rtems__ */
+static void fio_exit
+#endif /* __rtems__ */
+fio_cpuio_unregister(void)
{
unregister_ioengine(&ioengine);
}
diff --git a/engines/falloc.c b/engines/falloc.c
index 6382569..446638c 100644
--- a/engines/falloc.c
+++ b/engines/falloc.c
@@ -101,7 +101,12 @@ static struct ioengine_ops ioengine = {
.flags = FIO_SYNCIO
};
-static void fio_init fio_syncio_register(void)
+#ifdef __rtems__
+void
+#else /* __rtems__ */
+static void fio_init
+#endif /* __rtems__ */
+fio_syncio_register(void)
{
register_ioengine(&ioengine);
}
diff --git a/engines/filecreate.c b/engines/filecreate.c
index 39a2950..35dc5d7 100644
--- a/engines/filecreate.c
+++ b/engines/filecreate.c
@@ -107,12 +107,22 @@ static struct ioengine_ops ioengine = {
FIO_NOSTATS | FIO_NOFILEHASH,
};
-static void fio_init fio_filecreate_register(void)
+#ifdef __rtems__
+void
+#else /* __rtems__ */
+static void fio_init
+#endif /* __rtems__ */
+fio_filecreate_register(void)
{
register_ioengine(&ioengine);
}
-static void fio_exit fio_filecreate_unregister(void)
+#ifdef __rtems__
+void
+#else /* __rtems__ */
+static void fio_exit
+#endif /* __rtems__ */
+fio_filecreate_unregister(void)
{
unregister_ioengine(&ioengine);
}
diff --git a/engines/ftruncate.c b/engines/ftruncate.c
index c7ad038..ab616be 100644
--- a/engines/ftruncate.c
+++ b/engines/ftruncate.c
@@ -41,12 +41,22 @@ static struct ioengine_ops ioengine = {
.flags = FIO_SYNCIO | FIO_FAKEIO
};
-static void fio_init fio_syncio_register(void)
+#ifdef __rtems__
+void
+#else /* __rtems__ */
+static void fio_init
+#endif /* __rtems__ */
+fio_syncio_register(void)
{
register_ioengine(&ioengine);
}
-static void fio_exit fio_syncio_unregister(void)
+#ifdef __rtems__
+void
+#else /* __rtems__ */
+static void fio_exit
+#endif /* __rtems__ */
+fio_syncio_unregister(void)
{
unregister_ioengine(&ioengine);
}
diff --git a/engines/glusterfs_async.c b/engines/glusterfs_async.c
index 9e1c4bf..0f1083b 100644
--- a/engines/glusterfs_async.c
+++ b/engines/glusterfs_async.c
@@ -177,7 +177,12 @@ static struct ioengine_ops ioengine = {
.flags = FIO_DISKLESSIO,
};
-static void fio_init fio_gf_register(void)
+#ifdef __rtems__
+void
+#else /* __rtems__ */
+static void fio_init
+#endif /* __rtems__ */
+fio_gf_register(void)
{
register_ioengine(&ioengine);
}
diff --git a/engines/glusterfs_sync.c b/engines/glusterfs_sync.c
index a10e0ed..b634ce8 100644
--- a/engines/glusterfs_sync.c
+++ b/engines/glusterfs_sync.c
@@ -88,12 +88,22 @@ static struct ioengine_ops ioengine = {
.flags = FIO_SYNCIO | FIO_DISKLESSIO,
};
-static void fio_init fio_gf_register(void)
+#ifdef __rtems__
+void
+#else /* __rtems__ */
+static void fio_init
+#endif /* __rtems__ */
+fio_gf_register(void)
{
register_ioengine(&ioengine);
}
-static void fio_exit fio_gf_unregister(void)
+#ifdef __rtems__
+void
+#else /* __rtems__ */
+static void fio_exit
+#endif /* __rtems__ */
+fio_gf_unregister(void)
{
unregister_ioengine(&ioengine);
}
diff --git a/engines/mmap.c b/engines/mmap.c
index 308b466..7ce6ebf 100644
--- a/engines/mmap.c
+++ b/engines/mmap.c
@@ -277,12 +277,22 @@ static struct ioengine_ops ioengine = {
.flags = FIO_SYNCIO | FIO_NOEXTEND,
};
-static void fio_init fio_mmapio_register(void)
+#ifdef __rtems__
+void
+#else /* __rtems__ */
+static void fio_init
+#endif /* __rtems__ */
+fio_mmapio_register(void)
{
register_ioengine(&ioengine);
}
-static void fio_exit fio_mmapio_unregister(void)
+#ifdef __rtems__
+void
+#else /* __rtems__ */
+static void fio_exit
+#endif /* __rtems__ */
+fio_mmapio_unregister(void)
{
unregister_ioengine(&ioengine);
}
diff --git a/engines/net.c b/engines/net.c
index ca6fb34..5222601 100644
--- a/engines/net.c
+++ b/engines/net.c
@@ -1451,7 +1451,12 @@ static int str_hostname_cb(void *data, const char *input)
return 0;
}
-static void fio_init fio_netio_register(void)
+#ifdef __rtems__
+void
+#else /* __rtems__ */
+static void fio_init
+#endif /* __rtems__ */
+fio_netio_register(void)
{
register_ioengine(&ioengine_rw);
#ifdef CONFIG_LINUX_SPLICE
@@ -1459,7 +1464,12 @@ static void fio_init fio_netio_register(void)
#endif
}
-static void fio_exit fio_netio_unregister(void)
+#ifdef __rtems__
+void
+#else /* __rtems__ */
+static void fio_exit
+#endif /* __rtems__ */
+fio_netio_unregister(void)
{
unregister_ioengine(&ioengine_rw);
#ifdef CONFIG_LINUX_SPLICE
diff --git a/engines/null.c b/engines/null.c
index 4cc0102..da10d69 100644
--- a/engines/null.c
+++ b/engines/null.c
@@ -154,12 +154,22 @@ static struct ioengine_ops ioengine = {
.flags = FIO_DISKLESSIO | FIO_FAKEIO,
};
-static void fio_init fio_null_register(void)
+#ifdef __rtems__
+void
+#else /* __rtems__ */
+static void fio_init
+#endif /* __rtems__ */
+fio_null_register(void)
{
register_ioengine(&ioengine);
}
-static void fio_exit fio_null_unregister(void)
+#ifdef __rtems__
+void
+#else /* __rtems__ */
+static void fio_exit
+#endif /* __rtems__ */
+fio_null_unregister(void)
{
unregister_ioengine(&ioengine);
}
diff --git a/engines/sync.c b/engines/sync.c
index b3e1c9d..4b98f4d 100644
--- a/engines/sync.c
+++ b/engines/sync.c
@@ -466,7 +466,12 @@ static struct ioengine_ops ioengine_pvrw2 = {
};
#endif
-static void fio_init fio_syncio_register(void)
+#ifdef __rtems__
+void
+#else /* __rtems__ */
+static void fio_init
+#endif /* __rtems__ */
+fio_syncio_register(void)
{
register_ioengine(&ioengine_rw);
register_ioengine(&ioengine_prw);
@@ -479,7 +484,12 @@ static void fio_init fio_syncio_register(void)
#endif
}
-static void fio_exit fio_syncio_unregister(void)
+#ifdef __rtems__
+void
+#else /* __rtems__ */
+static void fio_exit
+#endif /* __rtems__ */
+fio_syncio_unregister(void)
{
unregister_ioengine(&ioengine_rw);
unregister_ioengine(&ioengine_prw);
diff --git a/fio.c b/fio.c
index f19db1b..d4e0821 100644
--- a/fio.c
+++ b/fio.c
@@ -65,3 +65,6 @@ done:
deinitialize_fio();
return ret;
}
+#ifdef __rtems__
+#include <os/rtems/rtems-fio-wrap.h>
+#endif /* __rtems__ */
diff --git a/fio.h b/fio.h
index 3ac552b..e382eb7 100644
--- a/fio.h
+++ b/fio.h
@@ -785,7 +785,11 @@ static inline void td_flags_clear(struct thread_data *td, unsigned int *flags,
if (!td_async_processing(td))
*flags &= ~value;
else
+#ifndef __rtems__
__sync_fetch_and_and(flags, ~value);
+#else /* __rtems__ */
+ atomic_fetch_and_explicit(flags, ~value, memory_order_relaxed);
+#endif /* __rtems__ */
}
static inline void td_flags_set(struct thread_data *td, unsigned int *flags,
@@ -794,7 +798,11 @@ static inline void td_flags_set(struct thread_data *td, unsigned int *flags,
if (!td_async_processing(td))
*flags |= value;
else
- __sync_fetch_and_or(flags, value);
+#ifndef __rtems__
+ __sync_fetch_and_or(flags, ~value);
+#else /*__rtems__ */
+ atomic_fetch_or_explicit(flags, ~value, memory_order_relaxed);
+#endif /* __rtems__ */
}
extern const char *fio_get_arch_string(int);
diff --git a/fio_sem.c b/fio_sem.c
index 3b48061..b5bc9c2 100644
--- a/fio_sem.c
+++ b/fio_sem.c
@@ -56,9 +56,15 @@ struct fio_sem *fio_sem_init(int value)
{
struct fio_sem *sem = NULL;
+#ifndef __rtems__
sem = (void *) mmap(NULL, sizeof(struct fio_sem),
PROT_READ | PROT_WRITE,
OS_MAP_ANON | MAP_SHARED, -1, 0);
+#else /* __rtems__ */
+ sem = (void *) mmap(NULL, sizeof(struct fio_sem),
+ PROT_READ | PROT_WRITE,
+ OS_MAP_ANON | MAP_PRIVATE, -1, 0);
+#endif /* __rtems__ */
if (sem == MAP_FAILED) {
perror("mmap semaphore");
return NULL;
diff --git a/gettime.c b/gettime.c
index c0f2638..03f11eb 100644
--- a/gettime.c
+++ b/gettime.c
@@ -94,7 +94,12 @@ static void gtod_log_caller(void *caller)
inc_caller(caller);
}
-static void fio_exit fio_dump_gtod(void)
+#ifdef __rtems__
+void
+#else /* __rtems__ */
+static void fio_exit
+#endif /* __rtems__ */
+fio_dump_gtod(void)
{
unsigned long total_calls = 0;
int i;
@@ -115,7 +120,12 @@ static void fio_exit fio_dump_gtod(void)
printf("Total %lu gettimeofday\n", total_calls);
}
-static void fio_init gtod_init(void)
+#ifdef __rtems__
+void
+#else /* __rtems__ */
+static void fio_init
+#endif /* __rtems__ */
+gtod_init(void)
{
int i;
diff --git a/init.c b/init.c
index af4cc6b..d69b644 100644
--- a/init.c
+++ b/init.c
@@ -7,7 +7,6 @@
#include <ctype.h>
#include <string.h>
#include <errno.h>
-#include <sys/ipc.h>
#include <sys/types.h>
#include <dlfcn.h>
#ifdef CONFIG_VALGRIND_DEV
@@ -21,6 +20,10 @@
#include <sys/shm.h>
#endif
+#ifndef __rtems__
+#include <sys/ipc.h>
+#endif /* __rtems__ */
+
#include "parse.h"
#include "smalloc.h"
#include "filehash.h"
@@ -31,7 +34,13 @@
#include "filelock.h"
#include "steadystate.h"
+/* RTEMS uses newlib's getopt_long_only_r() */
+#ifdef __rtems__
+#include <getopt.h>
+#else /* __rtems__ */
#include "oslib/getopt.h"
+#endif /* __rtems__ */
+
#include "oslib/strcasestr.h"
#include "crc/test.h"
@@ -87,6 +96,10 @@ unsigned int *fio_warned = NULL;
static char cmd_optstr[256];
static bool did_arg;
+#ifdef __rtems__
+ struct getopt_data getopt_reent;
+#endif /* __rtems__ */
+
#define FIO_CLIENT_FLAG (1 << 16)
/*
@@ -2435,13 +2448,20 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
void *cur_client = NULL;
int backend = 0;
+#ifdef __rtems__
+ memset(&getopt_reent, 0, sizeof(getopt_data));
+#endif /* __rtems__ */
/*
* Reset optind handling, since we may call this multiple times
* for the backend.
*/
optind = 1;
-
- while ((c = getopt_long_only(argc, argv, ostr, l_opts, &lidx)) != -1) {
+ while ((c =
+#ifdef __rtems__ /* Using Newlib's reentrant version of getopt */
+ getopt_long_only_r(argc, argv, ostr, l_opts, &lidx, &getopt_reent))!= -1) {
+#else /* __rtems__ */
+ getopt_long_only(argc, argv, ostr, l_opts, &lidx))!= -1) {
+#endif /* __rtems__ */
if ((c & FIO_CLIENT_FLAG) || client_flag_set(c)) {
parse_cmd_client(cur_client, argv[optind - 1]);
c &= ~FIO_CLIENT_FLAG;
diff --git a/ioengines.c b/ioengines.c
index d579682..c051ed5 100644
--- a/ioengines.c
+++ b/ioengines.c
@@ -185,6 +185,7 @@ struct ioengine_ops *load_ioengine(struct thread_data *td)
*/
void free_ioengine(struct thread_data *td)
{
+#ifndef __rtems__
dprint(FD_IO, "free ioengine %s\n", td->io_ops->name);
if (td->eo && td->io_ops->options) {
@@ -199,6 +200,7 @@ void free_ioengine(struct thread_data *td)
}
td->io_ops = NULL;
+#endif /* __rtems__ */
}
void close_ioengine(struct thread_data *td)
diff --git a/lib/prio_tree.c b/lib/prio_tree.c
index d8e1b89..95b55a8 100644
--- a/lib/prio_tree.c
+++ b/lib/prio_tree.c
@@ -53,7 +53,12 @@ static void get_index(const struct prio_tree_node *node,
static unsigned long index_bits_to_maxindex[BITS_PER_LONG];
-static void fio_init prio_tree_init(void)
+#ifdef __rtems__
+void
+#else /* __rtems__ */
+static void fio_init
+#endif /* __rtems__ */
+prio_tree_init(void)
{
unsigned int i;
diff --git a/options.c b/options.c
index a174e2c..0abb5b1 100644
--- a/options.c
+++ b/options.c
@@ -4744,7 +4744,7 @@ static char *bc_calc(char *str)
if ((!strchr(str, '+') && !strchr(str, '-') && !strchr(str, '*') &&
!strchr(str, '/')) || strchr(str, '\''))
return str;
-
+#ifndef __rtems__
/*
* Split option from value, we only need to calculate the value
*/
@@ -4782,6 +4782,10 @@ static char *bc_calc(char *str)
memcpy(buf, str, tmp - str);
free(str);
return strdup(buf);
+#else /* __rtems__ */
+ log_err("fio: performing math is not supported\n");
+ return NULL;
+#endif /* __rtems__ */
}
/*
diff --git a/os/os-rtems.h b/os/os-rtems.h
new file mode 100644
index 0000000..4964eb1
--- /dev/null
+++ b/os/os-rtems.h
@@ -0,0 +1,70 @@
+/*-
+ * Copyright (c) 2018 Udit kumar agarwal <dev.madaari@gmail.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef FIO_OS_RTEMS_H
+#define FIO_OS_RTEMS_H
+
+#define FIO_OS os_rtems
+
+#include <errno.h>
+#include <machine/endian.h>
+#include <sys/socket.h>
+#include <machine/param.h>
+#include <sys/cpuset.h>
+#include <sys/resource.h>
+#include <stdatomic.h>
+#include "../file.h"
+
+#define FIO_HAVE_ODIRECT
+#define FIO_USE_GENERIC_RAND
+#define FIO_USE_GENERIC_INIT_RANDOM_STATE
+#define off64_t _off64_t
+#define OS_MAP_ANON MAP_ANON
+#define O_DIRECT 0x1000000
+#define FIO_NO_HAVE_SHM_H
+#define CONFIG_NO_SHM
+#define CONFIG_HAVE_MKDIR_TWO
+#define SA_RESTART 0
+#define __need_getopt_newlib
+
+static inline int blockdev_invalidate_cache(struct fio_file *f)
+{
+ return ENOTSUP;
+}
+
+static inline int blockdev_size(struct fio_file *f, unsigned long long *bytes)
+{
+ errno = ENOSYS;
+ return 0;
+}
+
+static inline unsigned long long os_phys_mem(void)
+{
+ errno = ENOSYS;
+ return 0;
+}
+
+#endif
diff --git a/os/os.h b/os/os.h
index becc410..bc230dc 100644
--- a/os/os.h
+++ b/os/os.h
@@ -23,6 +23,7 @@ enum {
os_windows,
os_android,
os_dragonfly,
+ os_rtems,
os_nr,
};
@@ -36,6 +37,8 @@ typedef enum {
#include "os-android.h"
#elif defined(__linux__)
#include "os-linux.h"
+#elif defined (__rtems__)
+#include "os-rtems.h"
#elif defined(__FreeBSD__)
#include "os-freebsd.h"
#elif defined(__OpenBSD__)
diff --git a/os/rtems/rtems-fio-wrap.h b/os/rtems/rtems-fio-wrap.h
new file mode 100644
index 0000000..2c639cb
--- /dev/null
+++ b/os/rtems/rtems-fio-wrap.h
@@ -0,0 +1,54 @@
+/* RTEMS specific wrapper for explicitly calling constructors and
+ * destructors */
+
+void act_register(void);
+void tiobench_register(void);
+void fio_syncio_register(void);
+void fio_filecreate_register(void);
+void fio_null_register(void);
+void prio_tree_init(void);
+void fio_syncio_register_ft(void);
+void fio_client_hash_init(void);
+void fio_syncio_unregister(void);
+void tiobench_unregister(void);
+void fio_filecreate_unregister(void);
+void fio_null_unregister(void);
+void act_unregister(void);
+void fio_syncio_unregister_ft(void);
+
+static int
+mainwrapper(int argc, char *argv[])
+{
+ int err=0;
+
+ /* Constructors */
+ act_register();
+ tiobench_register();
+ fio_syncio_register();
+ fio_filecreate_register();
+ fio_null_register();
+ prio_tree_init();
+ fio_syncio_register_ft();
+ fio_client_hash_init();
+
+ err = main(argc, argv, (char *)NULL);
+
+ /* Destructors */
+ fio_syncio_unregister();
+ tiobench_unregister();
+ fio_filecreate_unregister();
+ fio_null_unregister();
+ act_unregister();
+ fio_syncio_unregister_ft();
+
+ return err;
+}
+
+rtems_bsd_command_fio(int argc, char *argv[])
+{
+ int exit_code;
+
+ exit_code = mainwrapper(argc, argv);
+
+ return exit_code;
+}
diff --git a/os/rtems/rtems-init.c b/os/rtems/rtems-init.c
new file mode 100644
index 0000000..a10cfc9
--- /dev/null
+++ b/os/rtems/rtems-init.c
@@ -0,0 +1,225 @@
+/*-
+ * Copyright (c) 2018 Udit kumar agarwal <dev.madaari@gmail.com>
+ * Copyright (c) 2018 Christian Mauderer <christian.mauderer@embedded-brains.de>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <sys/stat.h>
+#include <sys/socket.h>
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <ifaddrs.h>
+#include <sysexits.h>
+
+#include <machine/rtems-bsd-commands.h>
+
+#include <net/if.h>
+
+#include <rtems/bdbuf.h>
+#include <rtems/console.h>
+#include <rtems/ftpd.h>
+#include <rtems/media.h>
+#include <rtems/shell.h>
+#include <rtems/telnetd.h>
+#include <rtems.h>
+#include <rtems/printer.h>
+#include <rtems/stackchk.h>
+#include <rtems/bsd/bsd.h>
+#include <rtems/bsd/modules.h>
+#include <rtems/dhcpcd.h>
+#include <rtems/console.h>
+#include <rtems/shell.h>
+
+rtems_bsd_command_fio(int argc, char *argv[]);
+
+static rtems_status_code
+media_listener(rtems_media_event event, rtems_media_state state,
+ const char *src, const char *dest, void *arg)
+{
+
+ if (dest != NULL) {
+ printf(", dest = %s", dest);
+ }
+
+ if (arg != NULL) {
+ printf(", arg = %p\n", arg);
+ }
+
+ return RTEMS_SUCCESSFUL;
+}
+
+rtems_shell_cmd_t rtems_shell_fio_Command = {
+ .name = "fio",
+ .usage = "fio testfile.fio",
+ .topic = "user",
+ .command = rtems_bsd_command_fio
+};
+
+int nice(int incr)
+{
+ /* FIXME */
+ return 0;
+}
+
+static void
+early_initialization(void)
+{
+ rtems_status_code sc;
+
+ sc = rtems_bdbuf_init();
+ assert(sc == RTEMS_SUCCESSFUL);
+
+ sc = rtems_media_initialize();
+ assert(sc == RTEMS_SUCCESSFUL);
+
+ sc = rtems_media_listener_add(media_listener, NULL);
+ assert(sc == RTEMS_SUCCESSFUL);
+
+ sc = rtems_media_server_initialize(
+ 200,
+ 32 * 1024,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES
+ );
+ assert(sc == RTEMS_SUCCESSFUL);
+}
+
+void
+Init(rtems_task_argument arg)
+{
+ rtems_status_code sc;
+
+ puts("\n*** FIO - Flexible I/O tester ***\n\n");
+
+ early_initialization();
+ rtems_bsd_initialize();
+
+ /* Let the callout timer allocate its resources */
+ sc = rtems_task_wake_after(2);
+ assert(sc == RTEMS_SUCCESSFUL);
+
+ sc = rtems_shell_init("SHLL", 16 * 1024, 1, CONSOLE_DEVICE_NAME,
+ false, true, NULL);
+ assert(sc == RTEMS_SUCCESSFUL);
+
+ assert(0);
+}
+
+
+#define CONFIGURE_MICROSECONDS_PER_TICK 1000
+
+#define CONFIGURE_MAXIMUM_DRIVERS 32
+
+#define CONFIGURE_FILESYSTEM_DOSFS
+
+#define CONFIGURE_MAXIMUM_PROCESSORS 32
+
+/*
+ * Configure LibBSD.
+ */
+
+#define RTEMS_BSD_CONFIG_NET_PF_UNIX
+#define RTEMS_BSD_CONFIG_NET_IP_MROUTE
+#define RTEMS_BSD_CONFIG_NET_IP6_MROUTE
+#define RTEMS_BSD_CONFIG_NET_IF_BRIDGE
+#define RTEMS_BSD_CONFIG_NET_IF_LAGG
+#define RTEMS_BSD_CONFIG_NET_IF_VLAN
+#define RTEMS_BSD_CONFIG_BSP_CONFIG
+#define RTEMS_BSD_CONFIG_INIT
+
+#include <machine/rtems-bsd-config.h>
+
+#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_STUB_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_ZERO_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_LIBBLOCK
+
+#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 32
+
+#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 1
+
+#define CONFIGURE_UNLIMITED_ALLOCATION_SIZE 32
+#define CONFIGURE_UNLIMITED_OBJECTS
+#define CONFIGURE_UNIFIED_WORK_AREAS
+
+/* Turn cache off */
+#define CONFIGURE_BDBUF_BUFFER_MAX_SIZE (4 * 1024)
+#define CONFIGURE_BDBUF_MAX_READ_AHEAD_BLOCKS 0
+#define CONFIGURE_BDBUF_CACHE_MEMORY_SIZE (1 * 1024 * 1024)
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#define CONFIGURE_INIT_TASK_STACK_SIZE (256 * 1024)
+#define CONFIGURE_INIT_TASK_INITIAL_MODES RTEMS_DEFAULT_MODES
+#define CONFIGURE_INIT_TASK_ATTRIBUTES RTEMS_FLOATING_POINT
+
+#define CONFIGURE_INIT
+#define CPU_STACK_MINIMUM_SIZE (256*1024)
+#include <rtems/confdefs.h>
+
+#define CONFIGURE_SHELL_COMMANDS_INIT
+
+#include <bsp/irq-info.h>
+
+#define CONFIGURE_SHELL_USER_COMMANDS \
+ &rtems_shell_fio_Command
+
+#define CONFIGURE_SHELL_COMMAND_CPUINFO
+#define CONFIGURE_SHELL_COMMAND_PROFREPORT
+#define CONFIGURE_SHELL_COMMAND_MKRFS
+
+#define CONFIGURE_SHELL_COMMAND_CP
+#define CONFIGURE_SHELL_COMMAND_PWD
+#define CONFIGURE_SHELL_COMMAND_LS
+#define CONFIGURE_SHELL_COMMAND_LN
+#define CONFIGURE_SHELL_COMMAND_LSOF
+#define CONFIGURE_SHELL_COMMAND_CHDIR
+#define CONFIGURE_SHELL_COMMAND_CD
+#define CONFIGURE_SHELL_COMMAND_MKDIR
+#define CONFIGURE_SHELL_COMMAND_RMDIR
+#define CONFIGURE_SHELL_COMMAND_CAT
+#define CONFIGURE_SHELL_COMMAND_MV
+#define CONFIGURE_SHELL_COMMAND_RM
+#define CONFIGURE_SHELL_COMMAND_MALLOC_INFO
+#define CONFIGURE_SHELL_COMMAND_SHUTDOWN
+
+#define CONFIGURE_SHELL_COMMAND_FDISK
+#define CONFIGURE_SHELL_COMMAND_BLKSTATS
+#define CONFIGURE_SHELL_COMMAND_BLKSYNC
+#define CONFIGURE_SHELL_COMMAND_MSDOSFMT
+#define CONFIGURE_SHELL_COMMAND_DF
+#define CONFIGURE_SHELL_COMMAND_MOUNT
+#define CONFIGURE_SHELL_COMMAND_UNMOUNT
+#define CONFIGURE_SHELL_COMMAND_MSDOSFMT
+#define CONFIGURE_SHELL_COMMAND_EDIT
+#define CONFIGURE_SHELL_COMMAND_GETENV
+#define CONFIGURE_SHELL_COMMAND_SETENV
+#define CONFIGURE_SHELL_COMMAND_UNSETENV
+#include <rtems/shellconfig.h>
diff --git a/oslib/inet_aton.c b/oslib/inet_aton.c
index 7ae7db7..5bbc05b 100644
--- a/oslib/inet_aton.c
+++ b/oslib/inet_aton.c
@@ -1,6 +1,7 @@
#include "inet_aton.h"
-
+#ifndef __rtems__
int inet_aton(const char *cp, struct in_addr *inp)
{
return inet_pton(AF_INET, cp, inp);
}
+#endif
diff --git a/profiles/act.c b/profiles/act.c
index 5d3bd25..49a321f 100644
--- a/profiles/act.c
+++ b/profiles/act.c
@@ -461,7 +461,12 @@ static struct profile_ops act_profile = {
.io_ops = &act_io_ops,
};
-static void fio_init act_register(void)
+#ifdef __rtems__
+void
+#else /* __rtems__ */
+static void fio_init
+#endif /* __rtems__ */
+act_register(void)
{
act_run_data = calloc(1, sizeof(*act_run_data));
act_run_data->sem = fio_sem_init(FIO_SEM_UNLOCKED);
@@ -470,7 +475,12 @@ static void fio_init act_register(void)
log_err("fio: failed to register profile 'act'\n");
}
-static void fio_exit act_unregister(void)
+#ifdef __rtems__
+void
+#else /* __rtems__ */
+static void fio_exit
+#endif /* __rtems__ */
+act_unregister(void)
{
while (org_idx && org_idx < opt_idx)
free((void *) act_opts[++org_idx]);
diff --git a/profiles/tiobench.c b/profiles/tiobench.c
index f19a085..e36be66 100644
--- a/profiles/tiobench.c
+++ b/profiles/tiobench.c
@@ -121,13 +121,23 @@ static struct profile_ops tiobench_profile = {
.opt_data = &tiobench_options,
};
-static void fio_init tiobench_register(void)
+#ifdef __rtems__
+void
+#else /* __rtems__ */
+static void fio_init
+#endif /* __rtems__ */
+tiobench_register(void)
{
if (register_profile(&tiobench_profile))
log_err("fio: failed to register profile 'tiobench'\n");
}
-static void fio_exit tiobench_unregister(void)
+#ifdef __rtems__
+void
+#else /* __rtems__ */
+static void fio_exit
+#endif /* __rtems__ */
+tiobench_unregister(void)
{
unregister_profile(&tiobench_profile);
}
diff --git a/smalloc.c b/smalloc.c
index a2ad25a..f42677a 100644
--- a/smalloc.c
+++ b/smalloc.c
@@ -170,12 +170,17 @@ static bool add_pool(struct pool *pool, unsigned int alloc_size)
pool->free_blocks = bitmap_blocks * SMALLOC_BPB;
mmap_flags = OS_MAP_ANON;
-#ifdef CONFIG_ESX
+#if defined(CONFIG_ESX)||defined(__rtems__)
mmap_flags |= MAP_PRIVATE;
#else
mmap_flags |= MAP_SHARED;
#endif
+
+#ifdef __rtems__
+ ptr = (void*)malloc(alloc_size);
+#else
ptr = mmap(NULL, alloc_size, PROT_READ|PROT_WRITE, mmap_flags, -1, 0);
+#endif
if (ptr == MAP_FAILED)
goto out_fail;
@@ -193,7 +198,11 @@ static bool add_pool(struct pool *pool, unsigned int alloc_size)
out_fail:
log_err("smalloc: failed adding pool\n");
if (pool->map)
+#ifdef __rtems__
+ free(pool->map);
+#else /* __rtems__ */
munmap(pool->map, pool->mmap_size);
+#endif /* __rtems__ */
return false;
}
diff --git a/stat.c b/stat.c
index a308eb8..093f216 100644
--- a/stat.c
+++ b/stat.c
@@ -38,10 +38,16 @@ void update_rusage_stat(struct thread_data *td)
&td->ru_end.ru_utime);
ts->sys_time += mtime_since_tv(&td->ru_start.ru_stime,
&td->ru_end.ru_stime);
+#ifndef __rtems__ /* Virtual Memory not supported on RTEMS */
ts->ctx += td->ru_end.ru_nvcsw + td->ru_end.ru_nivcsw
- (td->ru_start.ru_nvcsw + td->ru_start.ru_nivcsw);
ts->minf += td->ru_end.ru_minflt - td->ru_start.ru_minflt;
ts->majf += td->ru_end.ru_majflt - td->ru_start.ru_majflt;
+#else /* __rtems__ */
+ ts->ctx = ((uint64_t) -1);
+ ts->minf = ((uint64_t) -1);
+ ts->majf = ((uint64_t) -1);
+#endif /* __rtems__ */
memcpy(&td->ru_start, &td->ru_end, sizeof(td->ru_end));
}
diff --git a/t/arch.c b/t/arch.c
index bd28a84..efee2db 100644
--- a/t/arch.c
+++ b/t/arch.c
@@ -1,5 +1,7 @@
#include "../arch/arch.h"
unsigned long arch_flags = 0;
+#ifndef __rtems__
bool tsc_reliable;
+#endif /* __rtems__ */
int arch_random;
--
1.9.1
next prev parent reply other threads:[~2018-07-16 9:33 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-07-16 9:06 [PATCH] Fio's initial RTEMS port dev.madaari
2018-07-16 9:06 ` dev.madaari [this message]
2018-07-16 18:08 ` Elliott, Robert (Persistent Memory)
2018-07-16 20:05 ` Udit agarwal
2018-07-24 15:47 ` Jens Axboe
2018-07-24 18:32 ` Udit agarwal
2018-07-30 10:52 ` [PATCH 1/1] " dev.madaari
2018-07-30 14:44 ` Jens Axboe
2018-08-01 3:47 ` Udit agarwal
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=1531732006-11136-2-git-send-email-dev.madaari@gmail.com \
--to=dev.madaari@gmail.com \
--cc=fio@vger.kernel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.