[igt-dev] [i-g-t, v2, 3/3] benchmarks/gem_syslatency: make realtime mode optional

Kamil Konieczny kamil.konieczny at linux.intel.com
Wed Jun 1 15:26:51 UTC 2022


Hi Mauro,

On 2022-05-31 at 08:52:11 +0200, Mauro Carvalho Chehab wrote:
> From: Mauro Carvalho Chehab <mchehab at kernel.org>
> 
> Use a logic similar to the one at gem_latency in order to setup
> the device to realtime, as, depending on the Kernel and on
> CGroup settings, trying to setup realtime may return EPERM.

All gem_* tests and benchmarks are meant to be run by root.
Maybe just add error checks there ?

> For more details, see:
> 
> 	https://www.kernel.org/doc/html/latest/scheduler/sched-rt-group.html?highlight=cgroup%20realtime
> 
> Signed-off-by: Mauro Carvalho Chehab <mchehab at kernel.org>
> ---
>  benchmarks/gem_syslatency.c | 14 +++++++++++---
>  1 file changed, 11 insertions(+), 3 deletions(-)
> 
> diff --git a/benchmarks/gem_syslatency.c b/benchmarks/gem_syslatency.c
> index 4b097e1c9316..db95cbcc6048 100644
> --- a/benchmarks/gem_syslatency.c
> +++ b/benchmarks/gem_syslatency.c
> @@ -47,6 +47,8 @@
>  #include "i915/gem_create.h"
>  #include "i915/gem_ring.h"
>  
> +#define REALTIME	0x1
> +
>  #define sigev_notify_thread_id _sigev_un._tid
>  
>  static volatile int done;
> @@ -234,7 +236,7 @@ static void bind_cpu(pthread_attr_t *attr, int cpu)
>  static void rtprio(pthread_attr_t *attr, int prio)
>  {
>  #ifdef PTHREAD_EXPLICIT_SCHED
> -	struct sched_param param = { .sched_priority = 99 };
> +	struct sched_param param = { .sched_priority = prio };

Nice catch.

>  	pthread_attr_setinheritsched(attr, PTHREAD_EXPLICIT_SCHED);
>  	pthread_attr_setschedpolicy(attr, SCHED_FIFO);
>  	pthread_attr_setschedparam(attr, &param);

Here there are no error checks.

> @@ -344,6 +346,7 @@ int main(int argc, char **argv)
>  	pthread_t bg_fs = 0;
>  	int ncpus = sysconf(_SC_NPROCESSORS_ONLN);
>  	igt_stats_t cycles, mean, max;
> +	unsigned flags = 0;
>  	double min;
>  	int time = 10;
>  	int field = -1;
> @@ -353,7 +356,7 @@ int main(int argc, char **argv)
>  	long batch = 0;
>  	int ret, n, c;
>  
> -	while ((c = getopt(argc, argv, "r:t:f:bmni1")) != -1) {
> +	while ((c = getopt(argc, argv, "r:t:f:bmni1R")) != -1) {
>  		switch (c) {
>  		case '1':
>  			ncpus = 1;
> @@ -374,6 +377,10 @@ int main(int argc, char **argv)
>  			/* Duration of each batch (microseconds) */
>  			batch = atoi(optarg);
>  			break;
> +		case 'R':
> +			/* Run the producers at RealTime priority */
> +			flags |= REALTIME;
> +			break;
>  		case 'f':
>  			/* Select an output field */
>  			field = atoi(optarg);
> @@ -419,7 +426,8 @@ int main(int argc, char **argv)
>  
>  	wait = calloc(ncpus, sizeof(*wait));
>  	pthread_attr_init(&attr);
> -	rtprio(&attr, 99);
> +	if (flags & REALTIME)
> +		rtprio(&attr, 99);

This changes codepath here, imho we should ask Chris about this
(added to cc).

Regards,
Kamil


>  	for (n = 0; n < ncpus; n++) {
>  		igt_mean_init(&wait[n].mean);
>  		bind_cpu(&attr, n);


More information about the igt-dev mailing list