diff --git a/benchmarks/gem_fence_upload.c b/benchmarks/gem_fence_upload.c
index 7d9acdc0fcb3..d656d4ea70f8 100644
--- a/benchmarks/gem_fence_upload.c
+++ b/benchmarks/gem_fence_upload.c
@@ -103,7 +103,7 @@ static void performance(void)
 
 	errno = 0;
 	igt_assert(linear[1] > 0.75 * linear[0]);
-	igt_assert(tiled[1] > 0.75 * tiled[0]);
+	igt_assert(tiled[1] < tiled[0]);
 }
 
 struct thread_performance {
@@ -155,7 +155,8 @@ static const char *direction_string(unsigned mask)
 }
 static void thread_performance(unsigned mask)
 {
-	const int loops = 4096;
+	const int ncpus = sysconf(_SC_NPROCESSORS_ONLN);
+	const int loops = (mask & READ) ? 4096 : 32768;
 	int n, count;
 	int fd, num_fences;
 	double linear[2], tiled[2];
@@ -164,9 +165,11 @@ static void thread_performance(unsigned mask)
 
 	num_fences = gem_available_fences(fd);
 	igt_require(num_fences > 0);
+	igt_require(num_fences > ncpus);
 
 	for (count = 2; count < 4*num_fences; count *= 2) {
 		const int nthreads = (mask & READ ? count : 0) + (mask & WRITE ? count : 0);
+		const int idx = ncpus != count;
 		struct timeval start, end;
 		struct thread_performance readers[count];
 		struct thread_performance writers[count];
@@ -209,8 +212,8 @@ static void thread_performance(unsigned mask)
 		}
 		gettimeofday(&end, NULL);
 
-		linear[count != 2] = nthreads * loops / elapsed(&start, &end) / (OBJECT_SIZE / 4096);
-		igt_info("%s rate for %d linear surfaces, %d threads:	%7.3fMiB/s\n", direction_string(mask), count, nthreads, linear[count != 2]);
+		linear[idx] = nthreads * loops / elapsed(&start, &end) / (OBJECT_SIZE / 4096);
+		igt_info("%s rate for %d linear surfaces, %d threads:	%7.3fMiB/s\n", direction_string(mask), count, nthreads, linear[idx]);
 
 		for (n = 0; n < count; n++)
 			gem_set_tiling(fd, handle[n], I915_TILING_X, 1024);
@@ -230,8 +233,8 @@ static void thread_performance(unsigned mask)
 		}
 		gettimeofday(&end, NULL);
 
-		tiled[count != 2] = nthreads * loops / elapsed(&start, &end) / (OBJECT_SIZE / 4096);
-		igt_info("%s rate for %d tiled surfaces, %d threads:	%7.3fMiB/s\n", direction_string(mask), count, nthreads, tiled[count != 2]);
+		tiled[idx] = nthreads * loops / elapsed(&start, &end) / (OBJECT_SIZE / 4096);
+		igt_info("%s rate for %d tiled surfaces, %d threads:	%7.3fMiB/s\n", direction_string(mask), count, nthreads, tiled[idx]);
 
 		for (n = 0; n < count; n++) {
 			munmap(ptr[n], OBJECT_SIZE);
@@ -241,7 +244,7 @@ static void thread_performance(unsigned mask)
 
 	errno = 0;
 	igt_assert(linear[1] > 0.75 * linear[0]);
-	igt_assert(tiled[1] > 0.75 * tiled[0]);
+	igt_assert(tiled[1] < tiled[0]);
 }
 
 struct thread_contention {
@@ -329,13 +332,13 @@ static void thread_contention(void)
 
 	errno = 0;
 	igt_assert(linear[1] > 0.75 * linear[0]);
-	igt_assert(tiled[1] > 0.75 * tiled[0]);
+	igt_assert(tiled[1] < tiled[0]);
 }
 
 static void wc_contention(void)
 {
-	const int loops = 4096;
-	int n, count;
+	const int ncpus = sysconf(_SC_NPROCESSORS_ONLN);
+	int n, count, order;
 	int fd, num_fences;
 	double linear[2], tiled[2];
 
@@ -344,8 +347,13 @@ static void wc_contention(void)
 
 	num_fences = gem_available_fences(fd);
 	igt_require(num_fences > 0);
+	igt_require(num_fences > ncpus);
 
-	for (count = 1; count < 4*num_fences; count *= 2) {
+	for (count = 1, order = log2(num_fences * 2) + 1;
+	     count < 4 * num_fences;
+	     count *= 2, order--) {
+		const int loops = 4096 * order * 2;
+		const int idx = 1 != count;
 		struct timeval start, end;
 		struct thread_contention threads[count];
 
@@ -355,15 +363,20 @@ static void wc_contention(void)
 			threads[n].fd = fd;
 		}
 
+		if (count <= ncpus / 2) {
+			for (n = 0; n < count; n++)
+				pthread_create(&threads[n].thread, NULL, wc_mmap, &threads[n]);
+			for (n = 0; n < count; n++)
+				pthread_join(threads[n].thread, NULL);
+		}
 		gettimeofday(&start, NULL);
 		for (n = 0; n < count; n++)
 			pthread_create(&threads[n].thread, NULL, wc_mmap, &threads[n]);
 		for (n = 0; n < count; n++)
 			pthread_join(threads[n].thread, NULL);
 		gettimeofday(&end, NULL);
-
-		linear[count != 2] = count * loops / elapsed(&start, &end) / (OBJECT_SIZE / 4096);
-		igt_info("Contended upload rate for %d linear threads/wc:	%7.3fMiB/s\n", count, linear[count != 2]);
+		linear[idx] = count * loops / elapsed(&start, &end) / (OBJECT_SIZE / 4096);
+		igt_info("Contended upload rate for %d linear threads/wc:	%7.3fMiB/s\n", count, linear[idx]);
 
 		for (n = 0; n < count; n++)
 			gem_set_tiling(fd, threads[n].handle, I915_TILING_X, 1024);
@@ -375,17 +388,19 @@ static void wc_contention(void)
 			pthread_join(threads[n].thread, NULL);
 		gettimeofday(&end, NULL);
 
-		tiled[count != 2] = count * loops / elapsed(&start, &end) / (OBJECT_SIZE / 4096);
-		igt_info("Contended upload rate for %d tiled threads/wc:	%7.3fMiB/s\n", count, tiled[count != 2]);
+		tiled[idx] = count * loops / elapsed(&start, &end) / (OBJECT_SIZE / 4096);
+		igt_info("Contended upload rate for %d tiled threads/wc:	%7.3fMiB/s\n", count, tiled[idx]);
 
 		for (n = 0; n < count; n++) {
 			gem_close(fd, threads[n].handle);
 		}
+
+		igt_require(fabs((linear[idx] - tiled[idx]) / linear[idx]) < 0.15);
 	}
 
 	errno = 0;
-	igt_assert(linear[1] > 0.75 * linear[0]);
-	igt_assert(tiled[1] > 0.75 * tiled[0]);
+	igt_assert(linear[1] < linear[0]);
+	igt_assert(tiled[1] < tiled[0]);
 }
 
 igt_main
