#include <sys/mman.h>
#include <sys/uio.h>
#include <sys/syscall.h>
+#include <sys/sysmacros.h>
#include <sys/vfs.h>
#include <unistd.h>
#include <fcntl.h>
#include <asm/byteorder.h>
#include "./os-linux-syscall.h"
-#include "binject.h"
#include "../file.h"
#ifndef __has_builtin // Optional of course.
#define FIO_HAVE_HUGETLB
#define FIO_HAVE_BLKTRACE
#define FIO_HAVE_CL_SIZE
+#define FIO_HAVE_CGROUPS
#define FIO_HAVE_FS_STAT
#define FIO_HAVE_TRIM
#define FIO_HAVE_GETTID
if (ret < 0)
goto error;
- ret = ioctl(fd, ASHMEM_SET_SIZE, __size);
+ /* Stores size in first 8 bytes, allocate extra space */
+ ret = ioctl(fd, ASHMEM_SET_SIZE, __size + sizeof(uint64_t));
if (ret < 0)
goto error;
static inline void *shmat(int __shmid, const void *__shmaddr, int __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];
+ 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)
{
- 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));
+ /* 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
return (unsigned long long) pages * (unsigned long long) pagesize;
}
-typedef struct { unsigned short r[3]; } os_random_state_t;
-
-static inline void os_random_seed(unsigned long seed, os_random_state_t *rs)
-{
- rs->r[0] = seed & 0xffff;
- seed >>= 16;
- rs->r[1] = seed & 0xffff;
- seed >>= 16;
- rs->r[2] = seed & 0xffff;
- seed48(rs->r);
-}
-
-static inline long os_random_long(os_random_state_t *rs)
-{
- return nrand48(rs->r);
-}
-
#ifdef O_NOATIME
#define FIO_O_NOATIME O_NOATIME
#else
return ret;
}
-static inline int os_trim(int fd, unsigned long long start,
+static inline int os_trim(struct fio_file *f, unsigned long long start,
unsigned long long len)
{
uint64_t range[2];
range[0] = start;
range[1] = len;
- if (!ioctl(fd, BLKDISCARD, range))
+ if (!ioctl(f->fd, BLKDISCARD, range))
return 0;
return errno;