Igt-dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: "Dixit, Ashutosh" <ashutosh.dixit@intel.com>
To: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
Cc: <igt-dev@lists.freedesktop.org>
Subject: Re: [PATCH i-g-t v2 11/14] tests/intel/xe_oa: Rewrite enable-disable test
Date: Tue, 04 Mar 2025 07:04:30 -0800	[thread overview]
Message-ID: <85bjug6dmp.wl-ashutosh.dixit@intel.com> (raw)
In-Reply-To: <87bjuhty74.wl-ashutosh.dixit@intel.com>

On Mon, 03 Mar 2025 16:51:43 -0800, Dixit, Ashutosh wrote:
>
> On Mon, 03 Mar 2025 15:14:59 -0800, Umesh Nerlige Ramappa wrote:
> >
> > Keep it simple and just check if enable/disable is working correctly
> > using the read call and existing uapi.
> >
> > v2: Drop mmio and use the value returned in read (Ashutosh)
>
> Thanks for changing this.
>
> >
> > Signed-off-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
> > Reviewed-by: Ashutosh Dixit <ashutosh.dixit@intel.com>
> > ---
> >  tests/intel/xe_oa.c | 140 ++++++++------------------------------------
> >  1 file changed, 24 insertions(+), 116 deletions(-)
> >
> > diff --git a/tests/intel/xe_oa.c b/tests/intel/xe_oa.c
> > index 9c10a8fd2..47c4a1fdb 100644
> > --- a/tests/intel/xe_oa.c
> > +++ b/tests/intel/xe_oa.c
> > @@ -2524,145 +2524,53 @@ test_non_zero_reason(const struct drm_xe_engine_class_instance *hwe, size_t oa_b
> >  static void
> >  test_enable_disable(const struct drm_xe_engine_class_instance *hwe)
> >  {
> > -	/* ~5 micro second period */
> > -	int oa_exponent = max_oa_exponent_for_period_lte(5000);
> > -	uint64_t oa_period = oa_exponent_to_ns(oa_exponent);
> > +	uint32_t num_reports = 5;
> >	struct intel_xe_perf_metric_set *test_set = metric_set(hwe);
> >	uint64_t fmt = test_set->perf_oa_format;
> >	uint64_t properties[] = {
> >		DRM_XE_OA_PROPERTY_OA_UNIT_ID, 0,
> > -
> > -		/* Include OA reports in samples */
> >		DRM_XE_OA_PROPERTY_SAMPLE_OA, true,
> > -
> > -		/* OA unit configuration */
> >		DRM_XE_OA_PROPERTY_OA_METRIC_SET, test_set->perf_oa_metrics_set,
> >		DRM_XE_OA_PROPERTY_OA_FORMAT, __ff(fmt),
> > -		DRM_XE_OA_PROPERTY_OA_PERIOD_EXPONENT, oa_exponent,
> > +		DRM_XE_OA_PROPERTY_OA_PERIOD_EXPONENT, oa_exponent_default,
> >		DRM_XE_OA_PROPERTY_OA_DISABLED, true,
> >		DRM_XE_OA_PROPERTY_OA_ENGINE_INSTANCE, hwe->engine_instance,
> > +		DRM_XE_OA_PROPERTY_WAIT_NUM_REPORTS, num_reports,
> >	};
> >	struct intel_xe_oa_open_prop param = {
> >		.num_properties = ARRAY_SIZE(properties) / 2,
> >		.properties_ptr = to_user_pointer(properties),
> >	};
> > -	size_t report_size = get_oa_format(fmt).size;
> > -	int buf_size = 65536 * report_size;
> > -	uint8_t *buf = malloc(buf_size);
> > -	int n_full_oa_reports = default_oa_buffer_size / report_size;
> > -	uint64_t fill_duration = n_full_oa_reports * oa_period;
> > -	uint32_t *last_periodic_report = malloc(report_size);
> > -
> > -	load_helper_init();
> > -	load_helper_run(HIGH);
> > +	size_t format_size = get_oa_format(fmt).size;
> > +	uint8_t buf[num_reports * format_size];
> > +	struct pollfd pollfd;
> > +	int ret;
> >
> >	stream_fd = __perf_open(drm_fd, &param, true /* prevent_pm */);
> >          set_fd_flags(stream_fd, O_CLOEXEC);
>
> Doesn't make a difference to the test, but to reduce confusion, I'm
> wondering if we should change this to 'O_CLOEXEC | O_NONBLOCK' since we
> have introduced poll() here?
>
> Also, there seem to be spaces here rather than tabs.

If you fix this, just fix it up at the time of merging and make sure the
patch compiles, no need to post a new version I think.

>
> > -	for (int i = 0; i < 5; i++) {
> > -		int len;
> > -		uint32_t n_periodic_reports;
> > -		uint64_t first_timestamp = 0, last_timestamp = 0;
> > -		u32 oa_status;
> > -
> > -		/* Giving enough time for an overflow might help catch whether
> > -		 * the OA unit has been enabled even if the driver might at
> > -		 * least avoid copying reports while disabled.
> > -		 */
> > -		nanosleep(&(struct timespec){ .tv_sec = 0,
> > -					      .tv_nsec = fill_duration * 1.25 },
> > -			  NULL);
> > -
> > -		while ((len = read(stream_fd, buf, buf_size)) == -1 &&
> > -		       (errno == EINTR || errno == EIO))
> > -			;
> > -
> > -		igt_assert_eq(len, -1);
> > -		igt_assert_eq(errno, EINVAL);
> > -
> > -		do_ioctl(stream_fd, DRM_XE_OBSERVATION_IOCTL_ENABLE, 0);
> > -
> > -		nanosleep(&(struct timespec){ .tv_sec = 0,
> > -					      .tv_nsec = fill_duration / 2 },
> > -			NULL);
> > -
> > -		n_periodic_reports = 0;
> > -
> > -		/* Because of the race condition between notification of new
> > -		 * reports and reports landing in memory, we need to rely on
> > -		 * timestamps to figure whether we've read enough of them.
> > -		 */
> > -		while (((last_timestamp - first_timestamp) * oa_period) < (fill_duration / 2)) {
> > -
> > -			while ((len = read(stream_fd, buf, buf_size)) == -1 && errno == EINTR)
> > -				;
> > -			if (errno == EIO) {
> > -				oa_status = get_stream_status(stream_fd);
> > -				igt_debug("oa_status %#x\n", oa_status);
> > -				igt_assert(!(oa_status & DRM_XE_OASTATUS_BUFFER_OVERFLOW));
> > -				continue;
> > -			}
> > -			igt_assert_neq(len, -1);
> > -
> > -			for (int offset = 0; offset < len; offset += report_size) {
> > -				uint32_t *report = (void *) (buf + offset);
> > -
> > -				if (first_timestamp == 0)
> > -					first_timestamp = oa_timestamp(report, fmt);
> > -				last_timestamp = oa_timestamp(report, fmt);
> > -
> > -				igt_debug(" > report ts=%"PRIx64""
> > -					  " ts_delta_last_periodic=%s%"PRIu64""
> > -					  " is_timer=%i ctx_id=0x%8x\n",
> > -					  oa_timestamp(report, fmt),
> > -					  oa_report_is_periodic(report) ? " " : "*",
> > -					  n_periodic_reports > 0 ?  oa_timestamp_delta(report, last_periodic_report, fmt) : 0,
> > -					  oa_report_is_periodic(report),
> > -					  oa_report_get_ctx_id(report));
> > -
> > -				if (oa_report_is_periodic(report)) {
> > -					memcpy(last_periodic_report, report, report_size);
> > -
> > -					/* We want to measure only the periodic reports,
> > -					 * ctx-switch might inflate the content of the
> > -					 * buffer and skew or measurement.
> > -					 */
> > -					n_periodic_reports++;
> > -				}
> > -			}
> > -		}
> > -
> > -		do_ioctl(stream_fd, DRM_XE_OBSERVATION_IOCTL_DISABLE, 0);
> > -
> > -		igt_debug("first ts = %"PRIu64", last ts = %"PRIu64"\n", first_timestamp, last_timestamp);
> > -
> > -		igt_debug("%f < %zu < %f\n",
> > -			  report_size * n_full_oa_reports * 0.45,
> > -			  n_periodic_reports * report_size,
> > -			  report_size * n_full_oa_reports * 0.55);
> > -
> > -		igt_assert((n_periodic_reports * report_size) >
> > -			   (report_size * n_full_oa_reports * 0.45));
> > -		igt_assert((n_periodic_reports * report_size) <
> > -			   report_size * n_full_oa_reports * 0.55);
> > -
> > +	errno = 0;
> > +	ret = read(stream_fd, buf, sizeof(buf));
> > +	igt_assert_eq(ret, -1);
> > +	igt_assert_eq(errno, EINVAL);
> >
> > -		/* It's considered an error to read a stream while it's disabled
> > -		 * since it would block indefinitely...
> > -		 */
> > -		len = read(stream_fd, buf, buf_size);
> > +	do_ioctl(stream_fd, DRM_XE_OBSERVATION_IOCTL_ENABLE, 0);
> >
> > -		igt_assert_eq(len, -1);
> > -		igt_assert_eq(errno, EINVAL);
> > -	}
> > +	/*
> > +	 * Wait for number of reports specified in
> > +	 * DRM_XE_OA_PROPERTY_WAIT_NUM_REPORTS
> > +	 */
> > +	pollfd.fd = stream_fd;
> > +	pollfd.events = POLLIN;
> > +	poll(&pollfd, 1, -1);
> > +	igt_assert(pollfd.revents & POLLIN);
> >
> > -	free(last_periodic_report);
> > -	free(buf);
> > +	/* Ensure num_reports can be read */
> > +	while ((ret = read(stream_fd, buf, sizeof(buf))) < 0 && errno == EINTR)
> > +		;
> > +	igt_assert_eq(ret, sizeof(buf));
> >
> >	__perf_close(stream_fd);
> > -
> > -	load_helper_stop();
> > -	load_helper_fini();
> >  }
> >
> >  /**
> > --
> > 2.34.1
> >

  reply	other threads:[~2025-03-04 15:04 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-03-03 23:14 [PATCH i-g-t v2 00/14] Some refactor, rewrite and fixes for OA tests Umesh Nerlige Ramappa
2025-03-03 23:14 ` [PATCH i-g-t v2 01/14] tests/intel/xe_oa: Use static for global variables Umesh Nerlige Ramappa
2025-03-03 23:14 ` [PATCH i-g-t v2 02/14] tests/intel/xe_oa: Drop unused macro Umesh Nerlige Ramappa
2025-03-03 23:14 ` [PATCH i-g-t v2 03/14] tests/intel/xe_oa: Use period_ns in max_oa_exponent_for_period_lte Umesh Nerlige Ramappa
2025-03-03 23:38   ` Dixit, Ashutosh
2025-03-03 23:14 ` [PATCH i-g-t v2 04/14] tests/intel/xe_oa: Rename oa_exp_1_millisec to oa_exponent_default Umesh Nerlige Ramappa
2025-03-03 23:14 ` [PATCH i-g-t v2 05/14] tests/intel/xe_oa: Use default exponent for some tests Umesh Nerlige Ramappa
2025-03-03 23:14 ` [PATCH i-g-t v2 06/14] tests/intel/xe_oa: Use same render copy width and height across tests Umesh Nerlige Ramappa
2025-03-03 23:14 ` [PATCH i-g-t v2 07/14] tests/intel/xe_oa: Rewrite the polling small buf test Umesh Nerlige Ramappa
2025-03-04  0:05   ` Dixit, Ashutosh
2025-03-03 23:14 ` [PATCH i-g-t v2 08/14] tests/intel/xe_oa: Simplify the buffer-fill test Umesh Nerlige Ramappa
2025-03-04  0:17   ` Dixit, Ashutosh
2025-03-04  0:28   ` Dixit, Ashutosh
2025-03-04 15:11     ` Dixit, Ashutosh
2025-03-03 23:14 ` [PATCH i-g-t v2 09/14] tests/intel/xe_oa: Use default buffer size for non-zero reason Umesh Nerlige Ramappa
2025-03-03 23:14 ` [PATCH i-g-t v2 10/14] tests/intel/xe_oa: Test oa buffer sizes Umesh Nerlige Ramappa
2025-03-03 23:14 ` [PATCH i-g-t v2 11/14] tests/intel/xe_oa: Rewrite enable-disable test Umesh Nerlige Ramappa
2025-03-04  0:51   ` Dixit, Ashutosh
2025-03-04 15:04     ` Dixit, Ashutosh [this message]
2025-03-03 23:15 ` [PATCH i-g-t v2 12/14] tests/intel/xe_oa: Enable unprivileged-single-ctx-counters and fix it Umesh Nerlige Ramappa
2025-03-03 23:15 ` [PATCH i-g-t v2 13/14] tests/intel/xe_oa: Fix mmio_trigger_reports testing Umesh Nerlige Ramappa
2025-03-03 23:15 ` [PATCH i-g-t v2 14/14] tests/intel/xe_oa: Set boundaries for OA exponent test Umesh Nerlige Ramappa
2025-03-04  1:56 ` ✓ Xe.CI.BAT: success for Some refactor, rewrite and fixes for OA tests (rev2) Patchwork
2025-03-04  2:09 ` ✗ i915.CI.BAT: failure " Patchwork
2025-03-04  6:07 ` ✗ Xe.CI.Full: " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=85bjug6dmp.wl-ashutosh.dixit@intel.com \
    --to=ashutosh.dixit@intel.com \
    --cc=igt-dev@lists.freedesktop.org \
    --cc=umesh.nerlige.ramappa@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox