X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=os%2Fos-android.h;h=1699539cad2a1a525cbec6f98f8ee449f16004af;hp=df22333f44d11cdf8dbcc4a79dcd2e85330a7443;hb=a306497afd5ae9dfa52d0423073ed73333ded475;hpb=9dfc3010e11e6cac60255462675b52ba800c7e74 diff --git a/os/os-android.h b/os/os-android.h index df22333f..1699539c 100644 --- a/os/os-android.h +++ b/os/os-android.h @@ -4,6 +4,7 @@ #define FIO_OS os_android #include +#include #include #include #include @@ -37,10 +38,13 @@ #define OS_MAP_ANON MAP_ANONYMOUS +#ifndef POSIX_MADV_DONTNEED #define posix_madvise madvise #define POSIX_MADV_DONTNEED MADV_DONTNEED #define POSIX_MADV_SEQUENTIAL MADV_SEQUENTIAL #define POSIX_MADV_RANDOM MADV_RANDOM +#endif + #ifdef MADV_REMOVE #define FIO_MADV_FREE MADV_REMOVE #endif @@ -57,27 +61,67 @@ #include #define SHM_HUGETLB 04000 +#include +#include +#include + +#define ASHMEM_DEVICE "/dev/ashmem" + static inline int shmctl (int __shmid, int __cmd, struct shmid_ds *__buf) { - return syscall(__NR_shmctl, __shmid, __cmd, __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; } static inline int shmget (key_t __key, size_t __size, int __shmflg) { - return syscall(__NR_shmget, __key, __size, __shmflg); + int fd,ret; + char key[11]; + + fd = open(ASHMEM_DEVICE, O_RDWR); + if (fd < 0) + return fd; + + sprintf(key,"%d",__key); + ret = ioctl(fd, ASHMEM_SET_NAME, key); + if (ret < 0) + goto error; + + ret = ioctl(fd, ASHMEM_SET_SIZE, __size); + if (ret < 0) + goto error; + + return fd; + +error: + close(fd); + return ret; } static inline void *shmat (int __shmid, const void *__shmaddr, int __shmflg) { - return (void *)syscall(__NR_shmat, __shmid, __shmaddr, __shmflg); + size_t *ptr, size = ioctl(__shmid, ASHMEM_GET_SIZE, NULL); + ptr = mmap(NULL, size + sizeof(size_t), PROT_READ | PROT_WRITE, MAP_SHARED, __shmid, 0); + *ptr = size; //save size at beginning of buffer, for use with munmap + return &ptr[1]; } static inline int shmdt (const void *__shmaddr) { - return syscall(__NR_shmctl, __shmaddr); + size_t *ptr, size; + ptr = (size_t *)__shmaddr; + ptr--; + size = *ptr; //find mmap size which we stored at the beginning of the buffer + return munmap((void *)ptr, size + sizeof(size_t)); } - #define SPLICE_DEF_SIZE (64*1024) enum { @@ -194,7 +238,7 @@ static inline int arch_cache_line_size(void) return atoi(size); } -static inline unsigned long long get_fs_size(const char *path) +static inline unsigned long long get_fs_free_size(const char *path) { unsigned long long ret; struct statfs s; @@ -221,4 +265,12 @@ static inline int os_trim(int fd, unsigned long long start, return errno; } +#ifdef CONFIG_SCHED_IDLE +static inline int fio_set_sched_idle(void) +{ + struct sched_param p = { .sched_priority = 0, }; + return sched_setscheduler(gettid(), SCHED_IDLE, &p); +} +#endif + #endif