Merge branch 'android_cgroup' of https://github.com/omor1/fio
authorJens Axboe <axboe@fb.com>
Mon, 22 May 2017 16:22:46 +0000 (10:22 -0600)
committerJens Axboe <axboe@fb.com>
Mon, 22 May 2017 16:22:46 +0000 (10:22 -0600)
1  2 
os/os-android.h

diff --combined os/os-android.h
index c8c6cb85fce1a45ff9bf8bb95e604afdad32f53e,7ce312854806566252c376ab11369cde4dba5ac1..c56d6827109ad09befe8b429617e4932e82eaa70
@@@ -32,6 -32,7 +32,7 @@@
  #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
  
  #ifndef CONFIG_NO_SHM
  /*
 - * The Android NDK doesn't currently export <sys/shm.h>, so define the
 - * necessary stuff here.
 + * Bionic doesn't support SysV shared memeory, so implement it using ashmem
   */
 -
 -#include <sys/shm.h>
 -#define SHM_HUGETLB    04000
 -
  #include <stdio.h>
  #include <linux/ashmem.h>
 +#include <linux/shm.h>
 +#define shmid_ds shmid64_ds
 +#define SHM_HUGETLB    04000
  
  #define ASHMEM_DEVICE "/dev/ashmem"
  
 -static inline int shmctl (int __shmid, int __cmd, struct shmid_ds *__buf)
 +static inline int shmctl(int __shmid, int __cmd, struct shmid_ds *__buf)
  {
        int ret=0;
        if (__cmd == IPC_RMID)
@@@ -82,7 -85,7 +83,7 @@@
        return ret;
  }
  
 -static inline int shmget (key_t __key, size_t __size, int __shmflg)
 +static inline int shmget(key_t __key, size_t __size, int __shmflg)
  {
        int fd,ret;
        char keybuf[11];
@@@ -96,8 -99,7 +97,8 @@@
        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;
  
@@@ -108,22 -110,21 +109,22 @@@ error
        return ret;
  }
  
 -static inline void *shmat (int __shmid, const void *__shmaddr, int __shmflg)
 +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