Index: benchmark/io/readv.cfa
===================================================================
--- benchmark/io/readv.cfa	(revision d9c2284a9d9f81d61d2fa67b461262ba1be38950)
+++ benchmark/io/readv.cfa	(revision 95789be69da1e578ec7ea697904a12ffc63b0263)
@@ -12,7 +12,9 @@
 }
 
+#include <errno.h>
 #include <unistd.h>
 
 #include <clock.hfa>
+#include <iofwd.hfa>
 #include <kernel.hfa>
 #include <thread.hfa>
@@ -23,7 +25,4 @@
 
 extern bool traceHeapOn();
-extern ssize_t cfa_preadv2(int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags);
-extern ssize_t cfa_preadv2_fixed(int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags);
-extern void register_fixed_files( cluster &, int *, unsigned count );
 
 int fd;
@@ -31,5 +30,5 @@
 volatile size_t count = 0;
 
-unsigned long int buflen = 50;
+unsigned long int buflen = 512;
 bool fixed_file = false;
 
@@ -40,10 +39,10 @@
 
 int do_read(int fd, struct iovec * iov) {
+	// extern ssize_t cfa_preadv2(int, const struct iovec *, int, off_t, int, int = 0, Duration = -1`s, io_cancellation * = 0p, io_context * = 0p);
+	int sflags = 0;
 	if(fixed_file) {
-		return cfa_preadv2_fixed(fd, iov, 1, 0, 0);
+		sflags |= CFA_IO_FIXED_FD1;
 	}
-	else {
-		return cfa_preadv2(fd, iov, 1, 0, 0);
-	}
+	return cfa_preadv2(fd, iov, 1, 0, 0, sflags, -1`s, 0p, 0p);
 }
 
@@ -52,10 +51,10 @@
 	/* paranoid */ assert( true == __atomic_load_n(&run, __ATOMIC_RELAXED) );
 
-	char data[buflen];
+	__attribute__((aligned(512)))  char data[buflen];
 	struct iovec iov = { data, buflen };
 
 	while(__atomic_load_n(&run, __ATOMIC_RELAXED)) {
 		int r = do_read(fd, &iov);
-		if(r < 0) abort("%s\n", strerror(-r));
+		if(r < 0) abort("%s\n", strerror(errno));
 
 		__atomic_fetch_add( &count, 1, __ATOMIC_SEQ_CST );
@@ -65,5 +64,6 @@
 int main(int argc, char * argv[]) {
 	BENCH_DECL
-	unsigned flags = 0;
+	unsigned num_io = 1;
+	io_context_params params;
 	int file_flags = 0;
 	unsigned sublen = 16;
@@ -74,9 +74,10 @@
 			BENCH_OPT_LONG
 			{"bufsize",       required_argument, 0, 'b'},
-			{"userthread",    no_argument      , 0, 'u'},
 			{"submitthread",  no_argument      , 0, 's'},
 			{"eagersubmit",   no_argument      , 0, 'e'},
 			{"kpollsubmit",   no_argument      , 0, 'k'},
 			{"kpollcomplete", no_argument      , 0, 'i'},
+			{"fixed-files",   no_argument      , 0, 'f'},
+			{"open-direct",   no_argument      , 0, 'o'},
 			{"submitlength",  required_argument, 0, 'l'},
 			{0, 0, 0, 0}
@@ -84,5 +85,5 @@
 
 		int idx = 0;
-		int opt = getopt_long(argc, argv, BENCH_OPT_SHORT "b:usekil:", options, &idx);
+		int opt = getopt_long(argc, argv, BENCH_OPT_SHORT "b:sekil:", options, &idx);
 
 		const char * arg = optarg ? optarg : "";
@@ -100,19 +101,18 @@
 				}
 				break;
-			case 'u':
-				flags |= CFA_CLUSTER_IO_POLLER_USER_THREAD;
-				break;
 			case 's':
-				flags |= CFA_CLUSTER_IO_POLLER_THREAD_SUBMITS;
+				params.poller_submits = true;
 				break;
 			case 'e':
-				flags |= CFA_CLUSTER_IO_EAGER_SUBMITS;
+				params.eager_submits = true;
 				break;
 			case 'k':
-				flags |= CFA_CLUSTER_IO_KERNEL_POLL_SUBMITS;
+				params.poll_submit = true;
+			case 'f':
 				fixed_file = true;
 				break;
 			case 'i':
-				flags |= CFA_CLUSTER_IO_KERNEL_POLL_COMPLETES;
+				params.poll_complete = true;
+			case 'o':
 				file_flags |= O_DIRECT;
 				break;
@@ -123,5 +123,5 @@
 					goto usage;
 				}
-				flags |= (sublen << CFA_CLUSTER_IO_BUFFLEN_OFFSET);
+				// flags |= (sublen << CFA_CLUSTER_IO_BUFFLEN_OFFSET);
 				break;
 			default: /* ? */
@@ -150,5 +150,5 @@
 	{
 		Time start, end;
-		BenchCluster cl = { flags, CFA_STATS_READY_Q | CFA_STATS_IO };
+		BenchCluster cl = { num_io, params, CFA_STATS_READY_Q | CFA_STATS_IO };
 
 		if(fixed_file) {
@@ -179,4 +179,5 @@
 				printf("\nDone\n");
 			}
+			printf("Readers closed\n");
 		}
 		printf("Took %'ld ms\n", (end - start)`ms);
