From 4490668af2958cd025e7b81dbcebb095390525d7 Mon Sep 17 00:00:00 2001 From: Brian Gianforcaro Date: Wed, 22 Dec 2021 00:16:14 -0800 Subject: [PATCH] Ports: Add `fio` port fio allows you to test various different IO subsystems and patterns. It can help us test and benchmark the I/O subsystems of Serenity. This port gets the fio bootstrapped and working, using the included .fio file, I have been able to test the file I/O performance already. --- Ports/AvailablePorts.md | 1 + Ports/fio/basic-verify.fio | 6 + Ports/fio/package.sh | 8 ++ ...o-remove-non-existent-header-sys-ipc.patch | 27 ++++ ...-fio-add-serenityos-platform-support.patch | 128 ++++++++++++++++++ ...-add-serenityos-support-to-configure.patch | 26 ++++ ...disable-rdtsc-support-for-serenityos.patch | 25 ++++ Ports/fio/patches/ReadMe.md | 25 ++++ 8 files changed, 246 insertions(+) create mode 100644 Ports/fio/basic-verify.fio create mode 100755 Ports/fio/package.sh create mode 100644 Ports/fio/patches/0001-fio-remove-non-existent-header-sys-ipc.patch create mode 100644 Ports/fio/patches/0002-fio-add-serenityos-platform-support.patch create mode 100644 Ports/fio/patches/0003-fio-add-serenityos-support-to-configure.patch create mode 100644 Ports/fio/patches/0004-fio-disable-rdtsc-support-for-serenityos.patch create mode 100644 Ports/fio/patches/ReadMe.md diff --git a/Ports/AvailablePorts.md b/Ports/AvailablePorts.md index ea4fcd9676..05f2e54397 100644 --- a/Ports/AvailablePorts.md +++ b/Ports/AvailablePorts.md @@ -36,6 +36,7 @@ Please make sure to keep this list up to date when adding and updating ports. :^ | [`emu2`](emu2/) | emu2 DOS emulator | 2021.01 | https://github.com/dmsc/emu2 | | [`epsilon`](epsilon/) | graphical calculator simulator | 15.5.0 | https://github.com/numworks/epsilon | | [`figlet`](figlet/) | FIGlet | 2.2.5 | http://www.figlet.org/ | +| [`fio`](fio/) | fio - Flexible I/O tester | 3.29 | https://fio.readthedocs.io/en/latest/ | | [`flatbuffers`](flatbuffers/) | Flatbuffers | 1.12.0 | https://github.com/google/flatbuffers | | [`flex`](flex/) | flex | 2.6.4 | https://github.com/westes/flex | | [`fotaq`](fotaq/) | Flight of the Amazon Queen | 1.0 | https://www.scummvm.org/games/#games-queen | diff --git a/Ports/fio/basic-verify.fio b/Ports/fio/basic-verify.fio new file mode 100644 index 0000000000..1f64f02690 --- /dev/null +++ b/Ports/fio/basic-verify.fio @@ -0,0 +1,6 @@ +[write-and-verify] +rw=readwrite +bs=4k +iodepth=16 +verify=crc32c +size=100MB diff --git a/Ports/fio/package.sh b/Ports/fio/package.sh new file mode 100755 index 0000000000..190b094ab7 --- /dev/null +++ b/Ports/fio/package.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env -S bash ../.port_include.sh +port=fio +version=3.29 +files="https://brick.kernel.dk/snaps/${port}-${version}.tar.gz ${port}-${version}.tar.gz bea42d6f9d6c009f951135591e99787ff5fa9bc1425596d3d3b19339afc7bb0e" +auth_type=sha256 +depends=("zlib") + +export LDFLAGS=-ldl diff --git a/Ports/fio/patches/0001-fio-remove-non-existent-header-sys-ipc.patch b/Ports/fio/patches/0001-fio-remove-non-existent-header-sys-ipc.patch new file mode 100644 index 0000000000..c8a81e49df --- /dev/null +++ b/Ports/fio/patches/0001-fio-remove-non-existent-header-sys-ipc.patch @@ -0,0 +1,27 @@ +From d59316cb9bc616b4b44d432d1ad363afa69f67eb Mon Sep 17 00:00:00 2001 +From: Brian Gianforcaro +Date: Tue, 21 Dec 2021 23:41:47 -0800 +Subject: [PATCH 1/4] Port: fio, remove non existent header sys/ipc.h + +Serenity doesn't currently have this header, and +it doesn't appear to be needed on our platform so +remove it for the port. +--- + init.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/init.c b/init.c +index 5f069d9..81c4771 100644 +--- a/init.c ++++ b/init.c +@@ -7,7 +7,6 @@ + #include + #include + #include +-#include + #include + #include + #ifdef CONFIG_VALGRIND_DEV +-- +2.32.0 + diff --git a/Ports/fio/patches/0002-fio-add-serenityos-platform-support.patch b/Ports/fio/patches/0002-fio-add-serenityos-platform-support.patch new file mode 100644 index 0000000000..11ace38112 --- /dev/null +++ b/Ports/fio/patches/0002-fio-add-serenityos-platform-support.patch @@ -0,0 +1,128 @@ +From 50d3ac3b6faa9d117ec26296067aecee988dbd8c Mon Sep 17 00:00:00 2001 +From: Brian Gianforcaro +Date: Tue, 21 Dec 2021 23:47:36 -0800 +Subject: [PATCH 2/4] Port: fio - Add SerenityOS platform support + +--- + os/os-serenity.h | 87 ++++++++++++++++++++++++++++++++++++++++++++++++ + os/os.h | 3 ++ + 2 files changed, 90 insertions(+) + create mode 100644 os/os-serenity.h + +diff --git a/os/os-serenity.h b/os/os-serenity.h +new file mode 100644 +index 0000000..941bf09 +--- /dev/null ++++ b/os/os-serenity.h +@@ -0,0 +1,87 @@ ++#ifndef FIO_OS_SERENITY_H ++#define FIO_OS_SERENITY_H ++ ++#define FIO_OS os_serenity ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "../file.h" ++ ++#define FIO_NO_HAVE_SHM_H ++#define FIO_USE_GENERIC_INIT_RANDOM_STATE ++#define FIO_HAVE_FS_STAT ++#define FIO_HAVE_GETTID ++ ++#define OS_MAP_ANON MAP_ANON ++ ++/* Serenity doesn't support: ++ * - MADV_RANDOM ++ * - MADV_SEQUENTIAL ++ * ++ * So any values will work for these defines. ++ */ ++#ifndef POSIX_MADV_RANDOM ++#define POSIX_MADV_RANDOM 0 ++#endif ++ ++#ifndef POSIX_MADV_SEQUENTIAL ++#define POSIX_MADV_SEQUENTIAL 0 ++#endif ++ ++/* ++ * Serenity doesn't have O_SYNC, so define it here so it can be ++ * rejected at runtime instead. ++ */ ++#define O_SYNC 0x2000000 ++ ++static inline int blockdev_size(struct fio_file *f, unsigned long long *bytes) ++{ ++ // TODO: Implement ++ return ENOTSUP; ++} ++ ++static inline int blockdev_invalidate_cache(struct fio_file *f) ++{ ++ // TODO: Implement ++ return ENOTSUP; ++} ++ ++static inline unsigned long long os_phys_mem(void) ++{ ++ // TODO: Implement ++ return 0; ++} ++ ++static inline int nice(int incr) ++{ ++ // TODO: Implement ++ return 0; ++} ++ ++static inline unsigned long long get_fs_free_size(const char *path) ++{ ++ unsigned long long ret; ++ struct statvfs s; ++ ++ if (statvfs(path, &s) < 0) ++ return -1ULL; ++ ++ ret = s.f_frsize; ++ ret *= (unsigned long long) s.f_bfree; ++ return ret; ++} ++ ++static inline in_addr_t inet_network(const char *cp) ++{ ++ in_addr_t hbo; ++ in_addr_t nbo = inet_addr(cp); ++ hbo = ((nbo & 0xFF) << 24) + ((nbo & 0xFF00) << 8) + ((nbo & 0xFF0000) >> 8) + ((nbo & 0xFF000000) >> 24); ++ return hbo; ++} ++ ++#endif +diff --git a/os/os.h b/os/os.h +index 5965d7b..46604f7 100644 +--- a/os/os.h ++++ b/os/os.h +@@ -24,6 +24,7 @@ enum { + os_windows, + os_android, + os_dragonfly, ++ os_serenity, + + os_nr, + }; +@@ -55,6 +56,8 @@ typedef enum { + #include "os-windows.h" + #elif defined (__DragonFly__) + #include "os-dragonfly.h" ++#elif defined (__serenity__) ++#include "os-serenity.h" + #else + #error "unsupported os" + #endif +-- +2.32.0 + diff --git a/Ports/fio/patches/0003-fio-add-serenityos-support-to-configure.patch b/Ports/fio/patches/0003-fio-add-serenityos-support-to-configure.patch new file mode 100644 index 0000000000..99144ee7b7 --- /dev/null +++ b/Ports/fio/patches/0003-fio-add-serenityos-support-to-configure.patch @@ -0,0 +1,26 @@ +From 99f1cf657e539078c7347c3ddc4a1537d5332e15 Mon Sep 17 00:00:00 2001 +From: Brian Gianforcaro +Date: Tue, 21 Dec 2021 23:48:09 -0800 +Subject: [PATCH 3/4] Port: Add SerenityOS support to configure + +--- + configure | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/configure b/configure +index 84ccce0..04bac14 100755 +--- a/configure ++++ b/configure +@@ -323,6 +323,9 @@ elif check_define __NetBSD__ ; then + elif check_define __sun__ ; then + targetos='SunOS' + CFLAGS="$CFLAGS -D_REENTRANT" ++elif check_define __serenity__ ; then ++ targetos='SerenityOS' ++ no_shm="yes" + elif check_define _WIN32 ; then + targetos='CYGWIN' + else +-- +2.32.0 + diff --git a/Ports/fio/patches/0004-fio-disable-rdtsc-support-for-serenityos.patch b/Ports/fio/patches/0004-fio-disable-rdtsc-support-for-serenityos.patch new file mode 100644 index 0000000000..ad3a04bf53 --- /dev/null +++ b/Ports/fio/patches/0004-fio-disable-rdtsc-support-for-serenityos.patch @@ -0,0 +1,25 @@ +From fdf16439ed5ecb36f762dc2b66102424920e26c1 Mon Sep 17 00:00:00 2001 +From: Brian Gianforcaro +Date: Tue, 21 Dec 2021 23:48:46 -0800 +Subject: [PATCH 4/4] Port: fio - Disable rdtsc support for serenity + +--- + arch/arch-x86.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/arch/arch-x86.h b/arch/arch-x86.h +index c6bcb54..c1005b1 100644 +--- a/arch/arch-x86.h ++++ b/arch/arch-x86.h +@@ -35,6 +35,7 @@ static inline unsigned long long get_cpu_clock(void) + } + + #define ARCH_HAVE_FFZ +-#define ARCH_HAVE_CPU_CLOCK ++// Serenity OS doesn't allow you to read rdtsc. ++// #define ARCH_HAVE_CPU_CLOCK + + #endif +-- +2.32.0 + diff --git a/Ports/fio/patches/ReadMe.md b/Ports/fio/patches/ReadMe.md new file mode 100644 index 0000000000..fab55e5557 --- /dev/null +++ b/Ports/fio/patches/ReadMe.md @@ -0,0 +1,25 @@ +# Patches for fio 3.29 on SerenityOS + +## `0001-fio-remove-non-existent-header-sys-ipc.patch` + +Serenity currently doesn't have a header, so we have to patch the include out. + +## `0002-fio-add-serenityos-platform-support.patch` + +`fio` abstracts individual operating system support out into to an `os/os-.h` header +where you can select which platform features are available and implement missing function +stubs for our operating system. + +This patch implements basic OS support for Serenity just to get fio up and running. + +## `0003-fio-add-serenityos-support-to-configure.patch` + +This patch implements targetos detection for serenity, and also disables shared memory +support automatically for serenity, as it's not currently supported. + +## `0004-fio-disable-rdtsc-support-for-serenityos.patch` + +This patch disables the function which uses `rdtsc` to get the current clock time, +as that instruction isn't allowed to be called from user space by serenity. + +If you did attempt to call it you would trip a segfault.