Index: benchmark/io/http/http_ring.cpp
===================================================================
--- benchmark/io/http/http_ring.cpp	(revision 7cc532bd7bf50a99daef9129a4f15c7b523c7919)
+++ benchmark/io/http/http_ring.cpp	(revision c05c58f5be1c7fe6b4c0b065b52021f075f2638c)
@@ -53,4 +53,7 @@
 };
 
+volatile size_t total = 0;
+volatile size_t count = 0;
+
 //=========================================================
 static struct io_uring_sqe * get_sqe(struct io_uring * ring) {
@@ -64,4 +67,5 @@
 
 static void submit(struct io_uring * ) {
+	// io_uring_sqe_set_flags(sqe, IOSQE_ASYNC);
 	// io_uring_submit(ring);
 }
@@ -305,4 +309,5 @@
 	ring_accept(ring, opt.acpt.sockfd, opt.acpt.addr, opt.acpt.addrlen, opt.acpt.flags);
 
+	int reset = 1;
 	bool done = false;
 	while(!done) {
@@ -345,4 +350,12 @@
 
 		io_uring_cqe_seen(ring, cqe);
+		reset--;
+		if(reset == 0) {
+			size_t ltotal = opt.result.subs;
+			size_t lcount = opt.result.cnts;
+
+			std::cout << "Submit average: " << ltotal << "/" << lcount << "(" << (((double)ltotal) / lcount) << ")" << std::endl;
+			reset = 100000 + (100000 * (ring->ring_fd % 5));
+		}
 	}
 
@@ -373,9 +386,10 @@
 	unsigned backlog = 10;
 	bool attach = false;
+	bool sqpoll = false;
 
 	//===================
 	// Arguments
 	int c;
-	while ((c = getopt (argc, argv, "t:p:e:b:a")) != -1) {
+	while ((c = getopt (argc, argv, "t:p:e:b:aS")) != -1) {
 		switch (c)
 		{
@@ -395,7 +409,10 @@
 			attach = true;
 			break;
+		case 'S':
+			sqpoll = true;
+			break;
 		case '?':
 		default:
-			std::cerr << "Usage: -t <threads> -p <port> -e <entries> -b <backlog> -a" << std::endl;
+			std::cerr << "Usage: -t <threads> -p <port> -e <entries> -b <backlog> -aS" << std::endl;
 			return EXIT_FAILURE;
 		}
@@ -478,15 +495,21 @@
 	pthread_t    thrd_hdls[nthreads];
 	options_t    thrd_opts[nthreads];
+	bool fast_poll = true;
+	bool nfix_sqpl = true;
 	for(unsigned i = 0; i < nthreads; i++) {
-		if(!attach || i == 0) {
-			io_uring_queue_init(entries, &thrd_rings[i].storage, 0);
-		}
-		else {
-			struct io_uring_params p;
-			memset(&p, 0, sizeof(p));
-			p.flags = IORING_SETUP_ATTACH_WQ;
+		struct io_uring_params p = { };
+		if(sqpoll) {
+			p.flags |= IORING_SETUP_SQPOLL;
+			p.sq_thread_idle = 100;
+		}
+
+		if (attach && i != 0) {
+			p.flags |= IORING_SETUP_ATTACH_WQ;
 			p.wq_fd = thrd_rings[0].storage.ring_fd;
-			io_uring_queue_init_params(entries, &thrd_rings[i].storage, &p);
-		}
+		}
+		io_uring_queue_init_params(entries, &thrd_rings[i].storage, &p);
+
+		if(0 == (p.features & IORING_FEAT_FAST_POLL      )) { fast_poll = false; }
+		if(0 == (p.features & IORING_FEAT_SQPOLL_NONFIXED)) { nfix_sqpl = false; }
 
 		thrd_opts[i].acpt.sockfd  = server_fd;
@@ -503,4 +526,7 @@
 		}
 	}
+
+	if( fast_poll) std::cout << "Fast Poll Present" << std::endl;
+	if(!nfix_sqpl) std::cout << "Non-Fixed SQ Poll not Present" << std::endl;
 
 	//===================
@@ -537,6 +563,4 @@
 	//===================
 	(std::cout << "Stopping Threads Done... ").flush();
-	size_t total = 0;
-	size_t count = 0;
 	for(unsigned i = 0; i < nthreads; i++) {
 		void * retval;
@@ -546,12 +570,8 @@
 			exit(EXIT_FAILURE);
 		}
-		// total += (size_t)retval;
-		total += thrd_opts[i].result.subs;
-		count += thrd_opts[i].result.cnts;
 
 		io_uring_queue_exit(thrd_opts[i].ring);
 	}
 	std::cout << "done" << std::endl;
-	std::cout << "Submit average: " << total << "/" << count << "(" << (((double)total) / count) << ")" << std::endl;
 
 	//===================
