- sd->events = malloc(sizeof(struct io_u *) * td->iodepth);
- memset(sd->events, 0, sizeof(struct io_u *) * td->iodepth);
- td->io_ops->data = sd;
- async_head_init(sd, td->iodepth);
- return 0;
+
+ sd->events = malloc(sizeof(struct io_u *) * td->o.iodepth);
+ memset(sd->events, 0, sizeof(struct io_u *) * td->o.iodepth);
+
+ /*
+ * The ring needs to be a power-of-2, so round it up if we have to
+ */
+ ring_nr = td->o.iodepth;
+ if (ring_nr & (ring_nr - 1))
+ ring_nr = 1 << __fls(ring_nr);
+
+ ring_size = sizeof(struct syslet_ring) +
+ ring_nr * sizeof(struct syslet_completion);
+ if (posix_memalign(&ring, sizeof(uint64_t), ring_size))
+ goto err_mem;
+ if (posix_memalign(&stack, page_size, page_size))
+ goto err_mem;
+
+ sd->ring = ring;
+ sd->ring_mask = ring_nr - 1;
+ sd->stack = stack;
+
+ memset(sd->ring, 0, ring_size);
+ sd->ring->elements = ring_nr;
+
+ if (!check_syslet_support(sd)) {
+ td->io_ops->data = sd;
+ return 0;
+ }
+
+ log_err("fio: syslets do not appear to work\n");
+err_mem:
+ free(sd->events);
+ if (ring)
+ free(ring);
+ if (stack)
+ free(stack);
+ free(sd);
+ return 1;