From: Bart Van Assche Date: Wed, 24 Aug 2022 21:55:51 +0000 (-0700) Subject: Split os-android.h X-Git-Tag: fio-3.33~57^2~1 X-Git-Url: https://git.kernel.dk/?a=commitdiff_plain;h=646d19a4fbc5185ef614bc45d59edf5819ba22a7;p=fio.git Split os-android.h Move the shared memory emulation into a new header file in preparation of merging the Linux and Android operating system header files. Signed-off-by: Bart Van Assche --- diff --git a/os/os-android.h b/os/os-android.h index 34534239..146f5138 100644 --- a/os/os-android.h +++ b/os/os-android.h @@ -90,90 +90,7 @@ static inline int fio_cpuset_exit(os_cpu_mask_t *mask) #define FIO_MAX_CPUS CPU_SETSIZE -#ifndef CONFIG_NO_SHM -/* - * Bionic doesn't support SysV shared memory, so implement it using ashmem - */ -#include -#include -#include -#include -#if __ANDROID_API__ >= __ANDROID_API_O__ -#include -#else -#define ASHMEM_DEVICE "/dev/ashmem" -#endif -#define shmid_ds shmid64_ds -#define SHM_HUGETLB 04000 - -static inline int shmctl(int __shmid, int __cmd, struct shmid_ds *__buf) -{ - int ret=0; - if (__cmd == IPC_RMID) - { - int length = ioctl(__shmid, ASHMEM_GET_SIZE, NULL); - struct ashmem_pin pin = {0 , length}; - ret = ioctl(__shmid, ASHMEM_UNPIN, &pin); - close(__shmid); - } - return ret; -} - -#if __ANDROID_API__ >= __ANDROID_API_O__ -static inline int shmget(key_t __key, size_t __size, int __shmflg) -{ - char keybuf[11]; - - sprintf(keybuf, "%d", __key); - - return ASharedMemory_create(keybuf, __size + sizeof(uint64_t)); -} -#else -static inline int shmget(key_t __key, size_t __size, int __shmflg) -{ - int fd,ret; - char keybuf[11]; - - fd = open(ASHMEM_DEVICE, O_RDWR); - if (fd < 0) - return fd; - - sprintf(keybuf,"%d",__key); - ret = ioctl(fd, ASHMEM_SET_NAME, keybuf); - if (ret < 0) - goto error; - - /* Stores size in first 8 bytes, allocate extra space */ - ret = ioctl(fd, ASHMEM_SET_SIZE, __size + sizeof(uint64_t)); - if (ret < 0) - goto error; - - return fd; - -error: - close(fd); - return ret; -} -#endif - -static inline void *shmat(int __shmid, const void *__shmaddr, int __shmflg) -{ - size_t size = ioctl(__shmid, ASHMEM_GET_SIZE, NULL); - /* Needs to be 8-byte aligned to prevent SIGBUS on 32-bit ARM */ - uint64_t *ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, __shmid, 0); - /* Save size at beginning of buffer, for use with munmap */ - *ptr = size; - return ptr + 1; -} - -static inline int shmdt (const void *__shmaddr) -{ - /* Find mmap size which we stored at the beginning of the buffer */ - uint64_t *ptr = (uint64_t *)__shmaddr - 1; - size_t size = *ptr; - return munmap(ptr, size); -} -#endif +#include "os-ashmem.h" #define SPLICE_DEF_SIZE (64*1024) diff --git a/os/os-ashmem.h b/os/os-ashmem.h new file mode 100644 index 00000000..c34ff656 --- /dev/null +++ b/os/os-ashmem.h @@ -0,0 +1,84 @@ +#ifndef CONFIG_NO_SHM +/* + * Bionic doesn't support SysV shared memory, so implement it using ashmem + */ +#include +#include +#include +#include +#if __ANDROID_API__ >= __ANDROID_API_O__ +#include +#else +#define ASHMEM_DEVICE "/dev/ashmem" +#endif +#define shmid_ds shmid64_ds +#define SHM_HUGETLB 04000 + +static inline int shmctl(int __shmid, int __cmd, struct shmid_ds *__buf) +{ + int ret=0; + if (__cmd == IPC_RMID) + { + int length = ioctl(__shmid, ASHMEM_GET_SIZE, NULL); + struct ashmem_pin pin = {0 , length}; + ret = ioctl(__shmid, ASHMEM_UNPIN, &pin); + close(__shmid); + } + return ret; +} + +#if __ANDROID_API__ >= __ANDROID_API_O__ +static inline int shmget(key_t __key, size_t __size, int __shmflg) +{ + char keybuf[11]; + + sprintf(keybuf, "%d", __key); + + return ASharedMemory_create(keybuf, __size + sizeof(uint64_t)); +} +#else +static inline int shmget(key_t __key, size_t __size, int __shmflg) +{ + int fd,ret; + char keybuf[11]; + + fd = open(ASHMEM_DEVICE, O_RDWR); + if (fd < 0) + return fd; + + sprintf(keybuf,"%d",__key); + ret = ioctl(fd, ASHMEM_SET_NAME, keybuf); + if (ret < 0) + goto error; + + /* Stores size in first 8 bytes, allocate extra space */ + ret = ioctl(fd, ASHMEM_SET_SIZE, __size + sizeof(uint64_t)); + if (ret < 0) + goto error; + + return fd; + +error: + close(fd); + return ret; +} +#endif + +static inline void *shmat(int __shmid, const void *__shmaddr, int __shmflg) +{ + size_t size = ioctl(__shmid, ASHMEM_GET_SIZE, NULL); + /* Needs to be 8-byte aligned to prevent SIGBUS on 32-bit ARM */ + uint64_t *ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, __shmid, 0); + /* Save size at beginning of buffer, for use with munmap */ + *ptr = size; + return ptr + 1; +} + +static inline int shmdt (const void *__shmaddr) +{ + /* Find mmap size which we stored at the beginning of the buffer */ + uint64_t *ptr = (uint64_t *)__shmaddr - 1; + size_t size = *ptr; + return munmap(ptr, size); +} +#endif