diff mbox series

[i-g-t] tests/perf_pmu: Restore sysfs freq in exit handler

Message ID 20240105011000.138538-1-vinay.belgaumkar@intel.com (mailing list archive)
State New, archived
Headers show
Series [i-g-t] tests/perf_pmu: Restore sysfs freq in exit handler | expand

Commit Message

Vinay Belgaumkar Jan. 5, 2024, 1:10 a.m. UTC
Seeing random issues where this test starts with invalid values.
Ensure that we restore the frequencies in case test exits early
due to some system issues.

Link: https://gitlab.freedesktop.org/drm/intel/-/issues/9432
Signed-off-by: Vinay Belgaumkar <vinay.belgaumkar@intel.com>
---
 tests/intel/perf_pmu.c | 53 +++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 52 insertions(+), 1 deletion(-)

Comments

Kamil Konieczny Jan. 5, 2024, 11:33 a.m. UTC | #1
Hi Vinay,
On 2024-01-04 at 17:10:00 -0800, Vinay Belgaumkar wrote:

looks good, there are some nits, first about subject:

[PATCH i-g-t] tests/perf_pmu: Restore sysfs freq in exit handler

s!tests/perf_pmu:!tests/intel/perf_pmu:!
Also you can drop "sysfs", so it will look:

[PATCH i-g-t] tests/intel/perf_pmu: Restore freq in exit handler

> Seeing random issues where this test starts with invalid values.

Btw if issue is it starts with invalid values maybe culprit is in
some previous test, not this one? What about setting freq values
to defaults first? This can be done in separate patch.

I looked into log from test here:
https://intel-gfx-ci.01.org/tree/drm-tip/drmtip_1438/bat-dg2-11/igt_runner10.txt
and here:
https://intel-gfx-ci.01.org/tree/drm-tip/drmtip_1438/bat-dg2-11/igt@perf_pmu@frequency@gt0.html

One more thing, why is boost < max? Is it allowed? What about
just restore it to max (or other value?) before testing and
skipping only when min == max? But even then it seems like
restoring defaults should be first step before freq checks.

For more nits see below.

> Ensure that we restore the frequencies in case test exits early
> due to some system issues.
> 
> Link: https://gitlab.freedesktop.org/drm/intel/-/issues/9432
> Signed-off-by: Vinay Belgaumkar <vinay.belgaumkar@intel.com>
> ---
>  tests/intel/perf_pmu.c | 53 +++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 52 insertions(+), 1 deletion(-)
> 
> diff --git a/tests/intel/perf_pmu.c b/tests/intel/perf_pmu.c
> index c6e6a8b77..ceacc1d3d 100644
> --- a/tests/intel/perf_pmu.c
> +++ b/tests/intel/perf_pmu.c
> @@ -2454,12 +2454,59 @@ static void pmu_read(int i915)
>  		for_each_if((e)->class == I915_ENGINE_CLASS_RENDER) \
>  			igt_dynamic_f("%s", e->name)
>  
> +int fd = -1;
> +uint32_t *stash_min, *stash_max, *stash_boost;
> +
> +static void save_sysfs_freq(int i915)
> +{
> +	int gt, num_gts, sysfs, tmp;
> +
> +	num_gts = igt_sysfs_get_num_gt(i915);
> +
> +	stash_min = (uint32_t *)malloc(sizeof(uint32_t) * num_gts);
> +	stash_max = (uint32_t *)malloc(sizeof(uint32_t) * num_gts);
> +	stash_boost = (uint32_t *)malloc(sizeof(uint32_t) * num_gts);
> +
> +	/* Save boost, min and max across GTs */
> +	i915_for_each_gt(i915, tmp, gt) {
> +		sysfs = igt_sysfs_gt_open(i915, gt);
> +		igt_require(sysfs >= 0);
> +
> +		stash_min[gt] = igt_sysfs_get_u32(sysfs, "rps_min_freq_mhz");
> +		stash_max[gt] = igt_sysfs_get_u32(sysfs, "rps_max_freq_mhz");
> +		stash_boost[gt] = igt_sysfs_get_u32(sysfs, "rps_boost_freq_mhz");
> +		igt_debug("GT: %d, min: %d, max: %d, boost:%d\n",
> +			  gt, stash_min[gt], stash_max[gt], stash_boost[gt]);
> +
> +		close(sysfs);
> +	}
> +}
> +
> +static void restore_sysfs_freq(int sig)
> +{
> +	int sysfs, gt, tmp;
> +
> +	/* Restore frequencies */
> +	i915_for_each_gt(fd, tmp, gt) {
> +		sysfs = igt_sysfs_gt_open(fd, gt);
> +		igt_require(sysfs >= 0);
--------^
Don't use require at exit handler, better use continue.

> +
> +		igt_require(__igt_sysfs_set_u32(sysfs, "rps_max_freq_mhz", stash_max[gt]));
--------^
Same here.

> +		igt_require(__igt_sysfs_set_u32(sysfs, "rps_min_freq_mhz", stash_min[gt]));
--------^
Same.

> +		igt_require(__igt_sysfs_set_u32(sysfs, "rps_boost_freq_mhz", stash_boost[gt]));
--------^
Same.

> +
> +		close(sysfs);
> +	}
> +	free(stash_min);
> +	free(stash_max);

Free also stash_boost.

> +}
> +
>  igt_main
>  {
>  	const struct intel_execution_engine2 *e;
>  	unsigned int num_engines = 0;
>  	const intel_ctx_t *ctx = NULL;
> -	int gt, tmp, fd = -1;
> +	int gt, tmp;
>  	int num_gt = 0;
>  
>  	/**
> @@ -2482,6 +2529,7 @@ igt_main
>  
>  		i915_for_each_gt(fd, tmp, gt)
>  			num_gt++;
> +

Remove this empty line.

Regards,
Kamil

>  	}
>  
>  	igt_describe("Verify i915 pmu dir exists and read all events");
> @@ -2664,6 +2712,9 @@ igt_main
>  	 * Test GPU frequency.
>  	 */
>  	igt_subtest_with_dynamic("frequency") {
> +		save_sysfs_freq(fd);
> +		igt_install_exit_handler(restore_sysfs_freq);
> +
>  		i915_for_each_gt(fd, tmp, gt) {
>  			igt_dynamic_f("gt%u", gt)
>  				test_frequency(fd, gt);
> -- 
> 2.38.1
>
Vinay Belgaumkar Jan. 9, 2024, 1:12 a.m. UTC | #2
On 1/5/2024 3:33 AM, Kamil Konieczny wrote:
> Hi Vinay,
> On 2024-01-04 at 17:10:00 -0800, Vinay Belgaumkar wrote:
>
> looks good, there are some nits, first about subject:
>
> [PATCH i-g-t] tests/perf_pmu: Restore sysfs freq in exit handler
>
> s!tests/perf_pmu:!tests/intel/perf_pmu:!
> Also you can drop "sysfs", so it will look:
>
> [PATCH i-g-t] tests/intel/perf_pmu: Restore freq in exit handler
>
>> Seeing random issues where this test starts with invalid values.
> Btw if issue is it starts with invalid values maybe culprit is in
> some previous test, not this one? What about setting freq values
> to defaults first? This can be done in separate patch.
>
> I looked into log from test here:
> https://intel-gfx-ci.01.org/tree/drm-tip/drmtip_1438/bat-dg2-11/igt_runner10.txt
> and here:
> https://intel-gfx-ci.01.org/tree/drm-tip/drmtip_1438/bat-dg2-11/igt@perf_pmu@frequency@gt0.html
>
> One more thing, why is boost < max? Is it allowed? What about
> just restore it to max (or other value?) before testing and
> skipping only when min == max? But even then it seems like
> restoring defaults should be first step before freq checks.
The only freq related test in that log is gem_ctx_freq which never 
modifies boost freq. AFAICS, this is the only test that modifies boost 
freq to be below RP0. I am thinking a previous iteration of this test 
left it in this state, not impossible I guess. Boost freq can be < max, 
it is allowed. We could "restore" to default,  but if we have exit 
handlers in place, that should never be needed.
>
> For more nits see below.
>
>> Ensure that we restore the frequencies in case test exits early
>> due to some system issues.
>>
>> Link: https://gitlab.freedesktop.org/drm/intel/-/issues/9432
>> Signed-off-by: Vinay Belgaumkar <vinay.belgaumkar@intel.com>
>> ---
>>   tests/intel/perf_pmu.c | 53 +++++++++++++++++++++++++++++++++++++++++-
>>   1 file changed, 52 insertions(+), 1 deletion(-)
>>
>> diff --git a/tests/intel/perf_pmu.c b/tests/intel/perf_pmu.c
>> index c6e6a8b77..ceacc1d3d 100644
>> --- a/tests/intel/perf_pmu.c
>> +++ b/tests/intel/perf_pmu.c
>> @@ -2454,12 +2454,59 @@ static void pmu_read(int i915)
>>   		for_each_if((e)->class == I915_ENGINE_CLASS_RENDER) \
>>   			igt_dynamic_f("%s", e->name)
>>   
>> +int fd = -1;
>> +uint32_t *stash_min, *stash_max, *stash_boost;
>> +
>> +static void save_sysfs_freq(int i915)
>> +{
>> +	int gt, num_gts, sysfs, tmp;
>> +
>> +	num_gts = igt_sysfs_get_num_gt(i915);
>> +
>> +	stash_min = (uint32_t *)malloc(sizeof(uint32_t) * num_gts);
>> +	stash_max = (uint32_t *)malloc(sizeof(uint32_t) * num_gts);
>> +	stash_boost = (uint32_t *)malloc(sizeof(uint32_t) * num_gts);
>> +
>> +	/* Save boost, min and max across GTs */
>> +	i915_for_each_gt(i915, tmp, gt) {
>> +		sysfs = igt_sysfs_gt_open(i915, gt);
>> +		igt_require(sysfs >= 0);
>> +
>> +		stash_min[gt] = igt_sysfs_get_u32(sysfs, "rps_min_freq_mhz");
>> +		stash_max[gt] = igt_sysfs_get_u32(sysfs, "rps_max_freq_mhz");
>> +		stash_boost[gt] = igt_sysfs_get_u32(sysfs, "rps_boost_freq_mhz");
>> +		igt_debug("GT: %d, min: %d, max: %d, boost:%d\n",
>> +			  gt, stash_min[gt], stash_max[gt], stash_boost[gt]);
>> +
>> +		close(sysfs);
>> +	}
>> +}
>> +
>> +static void restore_sysfs_freq(int sig)
>> +{
>> +	int sysfs, gt, tmp;
>> +
>> +	/* Restore frequencies */
>> +	i915_for_each_gt(fd, tmp, gt) {
>> +		sysfs = igt_sysfs_gt_open(fd, gt);
>> +		igt_require(sysfs >= 0);
> --------^
> Don't use require at exit handler, better use continue.
Not sure about this. If we cannot restore, doesn't it mean there is an 
issue writing to sysfs and we should fail?
>
>> +
>> +		igt_require(__igt_sysfs_set_u32(sysfs, "rps_max_freq_mhz", stash_max[gt]));
> --------^
> Same here.
>
>> +		igt_require(__igt_sysfs_set_u32(sysfs, "rps_min_freq_mhz", stash_min[gt]));
> --------^
> Same.
>
>> +		igt_require(__igt_sysfs_set_u32(sysfs, "rps_boost_freq_mhz", stash_boost[gt]));
> --------^
> Same.
>
>> +
>> +		close(sysfs);
>> +	}
>> +	free(stash_min);
>> +	free(stash_max);
> Free also stash_boost.
ok.
>
>> +}
>> +
>>   igt_main
>>   {
>>   	const struct intel_execution_engine2 *e;
>>   	unsigned int num_engines = 0;
>>   	const intel_ctx_t *ctx = NULL;
>> -	int gt, tmp, fd = -1;
>> +	int gt, tmp;
>>   	int num_gt = 0;
>>   
>>   	/**
>> @@ -2482,6 +2529,7 @@ igt_main
>>   
>>   		i915_for_each_gt(fd, tmp, gt)
>>   			num_gt++;
>> +
> Remove this empty line.

ok, thanks,

Vinay,

>
> Regards,
> Kamil
>
>>   	}
>>   
>>   	igt_describe("Verify i915 pmu dir exists and read all events");
>> @@ -2664,6 +2712,9 @@ igt_main
>>   	 * Test GPU frequency.
>>   	 */
>>   	igt_subtest_with_dynamic("frequency") {
>> +		save_sysfs_freq(fd);
>> +		igt_install_exit_handler(restore_sysfs_freq);
>> +
>>   		i915_for_each_gt(fd, tmp, gt) {
>>   			igt_dynamic_f("gt%u", gt)
>>   				test_frequency(fd, gt);
>> -- 
>> 2.38.1
>>
diff mbox series

Patch

diff --git a/tests/intel/perf_pmu.c b/tests/intel/perf_pmu.c
index c6e6a8b77..ceacc1d3d 100644
--- a/tests/intel/perf_pmu.c
+++ b/tests/intel/perf_pmu.c
@@ -2454,12 +2454,59 @@  static void pmu_read(int i915)
 		for_each_if((e)->class == I915_ENGINE_CLASS_RENDER) \
 			igt_dynamic_f("%s", e->name)
 
+int fd = -1;
+uint32_t *stash_min, *stash_max, *stash_boost;
+
+static void save_sysfs_freq(int i915)
+{
+	int gt, num_gts, sysfs, tmp;
+
+	num_gts = igt_sysfs_get_num_gt(i915);
+
+	stash_min = (uint32_t *)malloc(sizeof(uint32_t) * num_gts);
+	stash_max = (uint32_t *)malloc(sizeof(uint32_t) * num_gts);
+	stash_boost = (uint32_t *)malloc(sizeof(uint32_t) * num_gts);
+
+	/* Save boost, min and max across GTs */
+	i915_for_each_gt(i915, tmp, gt) {
+		sysfs = igt_sysfs_gt_open(i915, gt);
+		igt_require(sysfs >= 0);
+
+		stash_min[gt] = igt_sysfs_get_u32(sysfs, "rps_min_freq_mhz");
+		stash_max[gt] = igt_sysfs_get_u32(sysfs, "rps_max_freq_mhz");
+		stash_boost[gt] = igt_sysfs_get_u32(sysfs, "rps_boost_freq_mhz");
+		igt_debug("GT: %d, min: %d, max: %d, boost:%d\n",
+			  gt, stash_min[gt], stash_max[gt], stash_boost[gt]);
+
+		close(sysfs);
+	}
+}
+
+static void restore_sysfs_freq(int sig)
+{
+	int sysfs, gt, tmp;
+
+	/* Restore frequencies */
+	i915_for_each_gt(fd, tmp, gt) {
+		sysfs = igt_sysfs_gt_open(fd, gt);
+		igt_require(sysfs >= 0);
+
+		igt_require(__igt_sysfs_set_u32(sysfs, "rps_max_freq_mhz", stash_max[gt]));
+		igt_require(__igt_sysfs_set_u32(sysfs, "rps_min_freq_mhz", stash_min[gt]));
+		igt_require(__igt_sysfs_set_u32(sysfs, "rps_boost_freq_mhz", stash_boost[gt]));
+
+		close(sysfs);
+	}
+	free(stash_min);
+	free(stash_max);
+}
+
 igt_main
 {
 	const struct intel_execution_engine2 *e;
 	unsigned int num_engines = 0;
 	const intel_ctx_t *ctx = NULL;
-	int gt, tmp, fd = -1;
+	int gt, tmp;
 	int num_gt = 0;
 
 	/**
@@ -2482,6 +2529,7 @@  igt_main
 
 		i915_for_each_gt(fd, tmp, gt)
 			num_gt++;
+
 	}
 
 	igt_describe("Verify i915 pmu dir exists and read all events");
@@ -2664,6 +2712,9 @@  igt_main
 	 * Test GPU frequency.
 	 */
 	igt_subtest_with_dynamic("frequency") {
+		save_sysfs_freq(fd);
+		igt_install_exit_handler(restore_sysfs_freq);
+
 		i915_for_each_gt(fd, tmp, gt) {
 			igt_dynamic_f("gt%u", gt)
 				test_frequency(fd, gt);