diff mbox series

[i-g-t] i915: Use O_NONBLOCK for faster ringsize probing

Message ID 20191011080642.23061-1-chris@chris-wilson.co.uk (mailing list archive)
State New, archived
Headers show
Series [i-g-t] i915: Use O_NONBLOCK for faster ringsize probing | expand

Commit Message

Chris Wilson Oct. 11, 2019, 8:06 a.m. UTC
When the kernel supports O_NONBLOCK reporting of a full execbuf queue,
take advantage of that to immediately report when the output would block
due to the ring being full.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
---
 lib/i915/gem_ring.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

Comments

Tvrtko Ursulin Oct. 11, 2019, 8:25 a.m. UTC | #1
On 11/10/2019 09:06, Chris Wilson wrote:
> When the kernel supports O_NONBLOCK reporting of a full execbuf queue,
> take advantage of that to immediately report when the output would block
> due to the ring being full.
> 
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> ---
>   lib/i915/gem_ring.c | 13 ++++++++++---
>   1 file changed, 10 insertions(+), 3 deletions(-)
> 
> diff --git a/lib/i915/gem_ring.c b/lib/i915/gem_ring.c
> index 9f099edff..5ca2a728b 100644
> --- a/lib/i915/gem_ring.c
> +++ b/lib/i915/gem_ring.c
> @@ -21,6 +21,7 @@
>    * IN THE SOFTWARE.
>    */
>   
> +#include <fcntl.h>
>   #include <signal.h>
>   #include <sys/ioctl.h>
>   #include <sys/time.h>
> @@ -89,11 +90,16 @@ __gem_measure_ring_inflight(int fd, unsigned int engine, enum measure_ring_flags
>   
>   	count = 0;
>   	do {
> -		if (__execbuf(fd, &execbuf) == 0) {
> +		int err = __execbuf(fd, &execbuf);
> +
> +		if (err == 0) {
>   			count++;
>   			continue;
>   		}
>   
> +		if (err == -EWOULDBLOCK)
> +			break;
> +
>   		if (last[1] == count)
>   			break;
>   
> @@ -102,8 +108,6 @@ __gem_measure_ring_inflight(int fd, unsigned int engine, enum measure_ring_flags
>   		last[1] = last[0];
>   		last[0] = count;
>   	} while (1);
> -
> -	igt_assert_eq(__execbuf(fd, &execbuf), -EINTR);
>   	igt_assert(count > 2);
>   
>   	memset(&itv, 0, sizeof(itv));
> @@ -145,6 +149,9 @@ gem_measure_ring_inflight(int fd, unsigned int engine, enum measure_ring_flags f
>   
>   	fd = gem_reopen_driver(fd);
>   
> +	/* When available, disable execbuf throttling */
> +	fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | O_NONBLOCK);
> +
>   	if (engine == ALL_ENGINES) {
>   		for_each_physical_engine(fd, engine) {
>   			unsigned int count =
> 

Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>

Regards,

Tvrtko
diff mbox series

Patch

diff --git a/lib/i915/gem_ring.c b/lib/i915/gem_ring.c
index 9f099edff..5ca2a728b 100644
--- a/lib/i915/gem_ring.c
+++ b/lib/i915/gem_ring.c
@@ -21,6 +21,7 @@ 
  * IN THE SOFTWARE.
  */
 
+#include <fcntl.h>
 #include <signal.h>
 #include <sys/ioctl.h>
 #include <sys/time.h>
@@ -89,11 +90,16 @@  __gem_measure_ring_inflight(int fd, unsigned int engine, enum measure_ring_flags
 
 	count = 0;
 	do {
-		if (__execbuf(fd, &execbuf) == 0) {
+		int err = __execbuf(fd, &execbuf);
+
+		if (err == 0) {
 			count++;
 			continue;
 		}
 
+		if (err == -EWOULDBLOCK)
+			break;
+
 		if (last[1] == count)
 			break;
 
@@ -102,8 +108,6 @@  __gem_measure_ring_inflight(int fd, unsigned int engine, enum measure_ring_flags
 		last[1] = last[0];
 		last[0] = count;
 	} while (1);
-
-	igt_assert_eq(__execbuf(fd, &execbuf), -EINTR);
 	igt_assert(count > 2);
 
 	memset(&itv, 0, sizeof(itv));
@@ -145,6 +149,9 @@  gem_measure_ring_inflight(int fd, unsigned int engine, enum measure_ring_flags f
 
 	fd = gem_reopen_driver(fd);
 
+	/* When available, disable execbuf throttling */
+	fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | O_NONBLOCK);
+
 	if (engine == ALL_ENGINES) {
 		for_each_physical_engine(fd, engine) {
 			unsigned int count =