From 946733c6f19cf08f9a73ba86bc83f7c727dc2621 Mon Sep 17 00:00:00 2001 From: "Huang weiliang(weller)" Date: Mon, 3 Jun 2024 22:37:54 +0000 Subject: [PATCH] Support QNX OS platform Compile command: QNX SDP7.1 example ./configure --cc=aarch64-unknown-nto-qnx7.1.0-gcc --disable-shm make Function is verified by UFS device read and write test. Signed-off-by: Huang weiliang --- configure | 6 +++ engines/e4defrag.c | 1 + os/os-qnx.h | 100 +++++++++++++++++++++++++++++++++++++++++++++ os/os.h | 3 ++ 4 files changed, 110 insertions(+) create mode 100755 os/os-qnx.h diff --git a/configure b/configure index 3eef022b90..f3cb18a0c4 100755 --- a/configure +++ b/configure @@ -366,6 +366,8 @@ elif check_define __sun__ ; then CFLAGS="$CFLAGS -D_REENTRANT" elif check_define _WIN32 ; then targetos='CYGWIN' +elif check_define __QNX__ ; then + targetos='QNX' else targetos=`uname -s` fi @@ -466,6 +468,9 @@ CYGWIN*) pthread_condattr_setclock="no" pthread_affinity="no" ;; +QNX) + LIBS="-lsocket" + ;; esac # Now we know the target platform we can have another guess at the preferred @@ -1090,6 +1095,7 @@ if test "$have_vasprintf" != "yes" ; then fi cat > $TMPC << EOF #include +#include int main(int argc, char **argv) { diff --git a/engines/e4defrag.c b/engines/e4defrag.c index 37cc2ada81..65ef0da700 100644 --- a/engines/e4defrag.c +++ b/engines/e4defrag.c @@ -11,6 +11,7 @@ #include #include #include +#include #include "../fio.h" #include "../optgroup.h" diff --git a/os/os-qnx.h b/os/os-qnx.h new file mode 100755 index 0000000000..8c0b765279 --- /dev/null +++ b/os/os-qnx.h @@ -0,0 +1,100 @@ +#ifndef FIO_OS_QNX_H +#define FIO_OS_QNX_H + +#define FIO_OS os_qnx +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* XXX hack to avoid conflicts between rbtree.h and */ +#undef RB_BLACK +#undef RB_RED +#undef RB_ROOT + +#include "../file.h" + +/* QNX is not supporting SA_RESTART. Use SA_NOCLDSTOP instead of it */ +#ifndef SA_RESTART +#define SA_RESTART SA_NOCLDSTOP +#endif + +#define FIO_NO_HAVE_SHM_H + +typedef uint64_t __u64; +typedef unsigned int __u32; + +#define FIO_USE_GENERIC_INIT_RANDOM_STATE +#define FIO_HAVE_FS_STAT +#define FIO_HAVE_GETTID + +#define OS_MAP_ANON MAP_ANON + +#ifndef PTHREAD_STACK_MIN +#define PTHREAD_STACK_MIN 4096 +#endif + +#define fio_swap16(x) swap16(x) +#define fio_swap32(x) swap32(x) +#define fio_swap64(x) swap64(x) + +#ifdef CONFIG_PTHREAD_GETAFFINITY +#define FIO_HAVE_GET_THREAD_AFFINITY +#define fio_get_thread_affinity(mask) \ + pthread_getaffinity_np(pthread_self(), sizeof(mask), &(mask)) +#endif + +static inline int blockdev_size(struct fio_file *f, unsigned long long *bytes) +{ + struct stat statbuf; + if (fstat(f->fd, &statbuf) == -1) { + perror("fstat"); + } else { + *bytes = (unsigned long long)(statbuf.st_blocksize * statbuf.st_nblocks); + return 0; + } + + *bytes = 0; + return errno; +} + +static inline int blockdev_invalidate_cache(struct fio_file *f) +{ + return ENOTSUP; +} + +static inline unsigned long long os_phys_mem(void) +{ + int mib[2] = { CTL_HW, HW_PHYSMEM64 }; + uint64_t mem; + size_t len = sizeof(mem); + + sysctl(mib, 2, &mem, &len, NULL, 0); + return mem; +} + +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; +} + +#ifdef MADV_FREE +#define FIO_MADV_FREE MADV_FREE +#endif + +#endif diff --git a/os/os.h b/os/os.h index 0f1823240f..d54e7c0dd7 100644 --- a/os/os.h +++ b/os/os.h @@ -24,6 +24,7 @@ enum { os_windows, os_android, os_dragonfly, + os_qnx, os_nr, }; @@ -39,6 +40,8 @@ typedef enum { #include "os-freebsd.h" #elif defined(__OpenBSD__) #include "os-openbsd.h" +#elif defined(__QNX__) +#include "os-qnx.h" #elif defined(__NetBSD__) #include "os-netbsd.h" #elif defined(__sun__)