Index: benchmark/io/readv.cfa
===================================================================
--- benchmark/io/readv.cfa	(revision cbabfd465e992dc4640f24e51f246f6fb1bc8e08)
+++ 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);
 		}
