{
struct io_u *io_u;
unsigned int max_bs;
- int i, max_units;
+ int cl_align, i, max_units;
char *p;
max_units = td->o.iodepth;
else
p = td->orig_buffer;
+ cl_align = os_cache_line_size();
+
for (i = 0; i < max_units; i++) {
+ void *ptr;
+
if (td->terminate)
return 1;
- io_u = malloc(sizeof(*io_u));
+
+ if (posix_memalign(&ptr, cl_align, sizeof(*io_u))) {
+ log_err("fio: posix_memalign=%s\n", strerror(errno));
+ break;
+ }
+
+ io_u = ptr;
memset(io_u, 0, sizeof(*io_u));
INIT_FLIST_HEAD(&io_u->list);
#define FIO_HAVE_FALLOCATE
#define FIO_HAVE_POSIXAIO_FSYNC
#define FIO_HAVE_PSHARED_MUTEX
+#define FIO_HAVE_CL_SIZE
#define OS_MAP_ANON MAP_ANONYMOUS
#define FIO_O_NOATIME 0
#endif
+#define CACHE_LINE_FILE \
+ "/sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size"
+
+static inline int arch_cache_line_size(void)
+{
+ char size[32];
+ int fd, ret;
+
+ fd = open(CACHE_LINE_FILE, O_RDONLY);
+ if (fd < 0)
+ return -1;
+
+ ret = read(fd, size, sizeof(size));
+ if (ret <= 0)
+ return -1;
+
+ return atoi(size);
+}
+
#endif
}
#endif
+#define FIO_DEF_CL_SIZE 128
+
+static inline int os_cache_line_size(void)
+{
+#ifdef FIO_HAVE_CL_SIZE
+ int ret = arch_cache_line_size();
+
+ if (ret <= 0)
+ return FIO_DEF_CL_SIZE;
+
+ return ret;
+#else
+ return FIO_DEF_CL_SIZE;
+#endif
+}
+
#endif