summaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorJens Axboe <jens.axboe@oracle.com>2007-12-11 08:22:53 +0100
committerJens Axboe <jens.axboe@oracle.com>2007-12-11 08:22:53 +0100
commit05f6a172967321798f63869d330f88a1bc2c8ed9 (patch)
treec7199aff610dd72bce37b963041dc28f8b6f02ab /engines
parente81f734048dae2bc14349fddae6230b959a12198 (diff)
downloadfio-05f6a172967321798f63869d330f88a1bc2c8ed9.tar.gz
syslet: make sure ring buffer is a power-of-2
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'engines')
-rw-r--r--engines/syslet-rw.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/engines/syslet-rw.c b/engines/syslet-rw.c
index d74fcdf8..2e23fc93 100644
--- a/engines/syslet-rw.c
+++ b/engines/syslet-rw.c
@@ -225,13 +225,30 @@ static int fio_syslet_init(struct thread_data *td)
{
struct syslet_data *sd;
void *ring = NULL, *stack = NULL;
+ unsigned int ring_size, ring_nr;
sd = malloc(sizeof(*sd));
memset(sd, 0, sizeof(*sd));
sd->events = malloc(sizeof(struct io_u *) * td->o.iodepth);
memset(sd->events, 0, sizeof(struct io_u *) * td->o.iodepth);
- if (posix_memalign(&ring, sizeof(uint64_t), sizeof(struct syslet_ring)))
+
+ /*
+ * 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)) {
+ int bits = 1;
+
+ while (ring_nr >>= 1)
+ bits++;
+
+ ring_nr = 1 << bits;
+ }
+
+ 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;
@@ -239,8 +256,8 @@ static int fio_syslet_init(struct thread_data *td)
sd->ring = ring;
sd->stack = stack;
- memset(sd->ring, 0, sizeof(*sd->ring));
- sd->ring->elements = td->o.iodepth;
+ memset(sd->ring, 0, ring_size);
+ sd->ring->elements = ring_nr;
if (!check_syslet_support(sd)) {
td->io_ops->data = sd;