Index: benchmark/io/readv.cfa
===================================================================
--- benchmark/io/readv.cfa	(revision 5dadc9b7571b4f9de735cfb7669aac60846b0c5f)
+++ benchmark/io/readv.cfa	(revision 0335620c9fbbe75897c5ef0473c3475796a22d6f)
@@ -64,14 +64,15 @@
 	for(;;) {
 		static struct option options[] = {
-			{"duration",   required_argument, 0, 'd'},
-			{"nthreads",   required_argument, 0, 't'},
-			{"nprocs",     required_argument, 0, 'p'},
-			{"bufsize",    required_argument, 0, 'b'},
-			{"userthread", no_argument      , 0, 'u'},
+			{"duration",     required_argument, 0, 'd'},
+			{"nthreads",     required_argument, 0, 't'},
+			{"nprocs",       required_argument, 0, 'p'},
+			{"bufsize",      required_argument, 0, 'b'},
+			{"userthread",   no_argument      , 0, 'u'},
+			{"submitthread", no_argument      , 0, 's'},
 			{0, 0, 0, 0}
 		};
 
 		int idx = 0;
-		int opt = getopt_long(argc, argv, "d:t:p:b:u", options, &idx);
+		int opt = getopt_long(argc, argv, "d:t:p:b:us", options, &idx);
 
 		const char * arg = optarg ? optarg : "";
@@ -113,4 +114,7 @@
 				flags |= CFA_CLUSTER_IO_POLLER_USER_THREAD;
 				break;
+			case 's':
+				flags |= CFA_CLUSTER_IO_POLLER_THREAD_SUBMITS;
+				break;
 			// Other cases
 			default: /* ? */
@@ -123,4 +127,6 @@
 				fprintf(stderr, "  -p, --nprocs=NPROCS      Number of kernel threads\n");
 				fprintf(stderr, "  -b, --buflen=SIZE        Number of bytes to read per request\n");
+				fprintf(stderr, "  -u, --userthread         If set, cluster uses user-thread to poll I/O\n");
+				fprintf(stderr, "  -s, --submitthread       If set, cluster uses polling thread to submit I/O\n");
 				exit(EXIT_FAILURE);
 		}
Index: libcfa/src/concurrency/io.cfa
===================================================================
--- libcfa/src/concurrency/io.cfa	(revision 5dadc9b7571b4f9de735cfb7669aac60846b0c5f)
+++ libcfa/src/concurrency/io.cfa	(revision 0335620c9fbbe75897c5ef0473c3475796a22d6f)
@@ -280,6 +280,6 @@
 
 		if( io_flags & CFA_CLUSTER_IO_POLLER_THREAD_SUBMITS ) {
-			sq.ready_cnt = 10;
-			sq.ready = alloc( sq.ready_cnt );
+			sq.ready_cnt = 32;
+			sq.ready = alloc_align( 64, sq.ready_cnt );
 			for(i; sq.ready_cnt) {
 				sq.ready[i] = -1ul32;
@@ -584,5 +584,5 @@
 				int count;
 				bool again;
-				[count, again] = __drain_io( ring, &mask, 1, true );
+				[count, again] = __drain_io( ring, &mask, 0, true );
 
 				// Update statistics
@@ -665,7 +665,8 @@
 	}
 
+	static inline void __wake_poller( struct __io_data & ring ) __attribute__((artificial));
 	static inline void __wake_poller( struct __io_data & ring ) {
-		sigval val = { 1 };
-		pthread_sigqueue( ring.poller.slow.kthrd, SIGUSR1, val );
+		// sigval val = { 1 };
+		// pthread_sigqueue( ring.poller.slow.kthrd, SIGUSR1, val );
 	}
 
