[Intel-gfx] [PATCH igt] igt/perf_pmu: Avoid underflow in measured_sleep()

Tvrtko Ursulin tvrtko.ursulin at linux.intel.com
Thu Nov 23 07:04:57 UTC 2017


On 22/11/2017 20:14, Chris Wilson wrote:
> Be careful not to underflow into a very large positive usec value and so
> sleep forever^W until boredom kicks in.
> 
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> ---
>   tests/perf_pmu.c | 23 +++++++++--------------
>   1 file changed, 9 insertions(+), 14 deletions(-)
> 
> diff --git a/tests/perf_pmu.c b/tests/perf_pmu.c
> index 5d5f2b30..e153aaf3 100644
> --- a/tests/perf_pmu.c
> +++ b/tests/perf_pmu.c
> @@ -111,22 +111,17 @@ static void pmu_read_multi(int fd, unsigned int num, uint64_t *val)
>    */
>   static unsigned int measured_usleep(unsigned int usec)
>   {
> -	uint64_t slept = 0;
> -
> -	while (usec > 0) {
> -		struct timespec start = { };
> -		uint64_t this_sleep;
> +	struct timespec ts = { };
> +	unsigned int slept;
>   
> -		igt_nsec_elapsed(&start);
> -		usleep(usec);
> -		this_sleep = igt_nsec_elapsed(&start);
> -		slept += this_sleep;
> -		if (this_sleep > usec * 1000)
> -			break;
> -		usec -= this_sleep;
> -	}
> +	slept = igt_nsec_elapsed(&ts);
> +	igt_assert(slept == 0);
> +	do {
> +		usleep(usec - slept);
> +		slept = igt_nsec_elapsed(&ts) / 1000;
> +	} while (slept < usec);
>   
> -	return slept;
> +	return igt_nsec_elapsed(&ts);
>   }
>   
>   static unsigned int e2ring(int gem_fd, const struct intel_execution_engine2 *e)
> 

Looks OK. Silly bug of mine and I wonder how I was so lucky not to hit 
it all this time.

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

Regards,

Tvrtko


More information about the Intel-gfx mailing list