From: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
To: Ashutosh Dixit <ashutosh.dixit@intel.com>
Cc: <igt-dev@lists.freedesktop.org>
Subject: Re: [PATCH i-g-t 19/28] tests/intel/xe_oa: OA buffer mmap tests
Date: Thu, 20 Jun 2024 16:39:33 -0700 [thread overview]
Message-ID: <ZnS9tc7PNj9HqXEx@orsosgc001> (raw)
In-Reply-To: <20240620200054.3550653-20-ashutosh.dixit@intel.com>
On Thu, Jun 20, 2024 at 01:00:44PM -0700, Ashutosh Dixit wrote:
>Add the following tests:
>* "map-oa-buffer"
>* "invalid-map-oa-buffer"
>* "non-privileged-map-oa-buffer"
>* "non-privileged-access-vaddr"
>* "privileged-forked-access-vaddr"
>* "closed-fd-and-unmapped-access"
>
>Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com>
Reviewed-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
>---
> tests/intel/xe_oa.c | 251 ++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 251 insertions(+)
>
>diff --git a/tests/intel/xe_oa.c b/tests/intel/xe_oa.c
>index 8e6de2db11..30d1ed329f 100644
>--- a/tests/intel/xe_oa.c
>+++ b/tests/intel/xe_oa.c
>@@ -4113,6 +4113,231 @@ test_oa_unit_concurrent_oa_buffer_read(void)
> igt_waitchildren();
> }
>
>+static void *map_oa_buffer(u32 *size)
>+{
>+ void *vaddr = mmap(0, OA_BUFFER_SIZE, PROT_READ, MAP_PRIVATE, stream_fd, 0);
>+
>+ igt_assert(vaddr != NULL);
>+ *size = OA_BUFFER_SIZE;
>+ return vaddr;
>+}
>+
>+static void invalid_param_map_oa_buffer(const struct drm_xe_engine_class_instance *hwe)
>+{
>+ void *oa_vaddr = NULL;
>+
>+ /* try a couple invalid mmaps */
>+ /* bad prots */
>+ oa_vaddr = mmap(0, OA_BUFFER_SIZE, PROT_WRITE, MAP_PRIVATE, stream_fd, 0);
>+ igt_assert(oa_vaddr == MAP_FAILED);
>+
>+ oa_vaddr = mmap(0, OA_BUFFER_SIZE, PROT_EXEC, MAP_PRIVATE, stream_fd, 0);
>+ igt_assert(oa_vaddr == MAP_FAILED);
>+
>+ /* bad MAPs */
>+ oa_vaddr = mmap(0, OA_BUFFER_SIZE, PROT_READ, MAP_SHARED, stream_fd, 0);
>+ igt_assert(oa_vaddr == MAP_FAILED);
>+
>+ /* bad size */
>+ oa_vaddr = mmap(0, OA_BUFFER_SIZE + 1, PROT_READ, MAP_PRIVATE, stream_fd, 0);
>+ igt_assert(oa_vaddr == MAP_FAILED);
>+
>+ /* do the right thing */
>+ oa_vaddr = mmap(0, OA_BUFFER_SIZE, PROT_READ, MAP_PRIVATE, stream_fd, 0);
>+ igt_assert(oa_vaddr != MAP_FAILED && oa_vaddr != NULL);
>+
>+ munmap(oa_vaddr, OA_BUFFER_SIZE);
>+}
>+
>+static void unprivileged_try_to_map_oa_buffer(void)
>+{
>+ void *oa_vaddr;
>+
>+ oa_vaddr = mmap(0, OA_BUFFER_SIZE, PROT_READ, MAP_PRIVATE, stream_fd, 0);
>+ igt_assert(oa_vaddr == MAP_FAILED);
>+ igt_assert_eq(errno, EACCES);
>+}
>+
>+static void unprivileged_map_oa_buffer(const struct drm_xe_engine_class_instance *hwe)
>+{
>+ igt_fork(child, 1) {
>+ igt_drop_root();
>+ unprivileged_try_to_map_oa_buffer();
>+ }
>+ igt_waitchildren();
>+}
>+
>+static jmp_buf jmp;
>+static void __attribute__((noreturn)) sigtrap(int sig)
>+{
>+ siglongjmp(jmp, sig);
>+}
>+
>+static void try_invalid_access(void *vaddr)
>+{
>+ sighandler_t old_sigsegv;
>+ uint32_t dummy;
>+
>+ old_sigsegv = signal(SIGSEGV, sigtrap);
>+ switch (sigsetjmp(jmp, SIGSEGV)) {
>+ case SIGSEGV:
>+ break;
>+ case 0:
>+ dummy = READ_ONCE(*((uint32_t *)vaddr + 1));
>+ (void) dummy;
>+ default:
>+ igt_assert(!"reached");
>+ break;
>+ }
>+ signal(SIGSEGV, old_sigsegv);
>+}
>+
>+static void map_oa_buffer_unprivilege_access(const struct drm_xe_engine_class_instance *hwe)
>+{
>+ void *vaddr;
>+ uint32_t size;
>+
>+ vaddr = map_oa_buffer(&size);
>+
>+ igt_fork(child, 1) {
>+ igt_drop_root();
>+ try_invalid_access(vaddr);
>+ }
>+ igt_waitchildren();
>+
>+ munmap(vaddr, size);
>+}
>+
>+static void map_oa_buffer_forked_access(const struct drm_xe_engine_class_instance *hwe)
>+{
>+ void *vaddr;
>+ uint32_t size;
>+
>+ vaddr = map_oa_buffer(&size);
>+
>+ igt_fork(child, 1) {
>+ try_invalid_access(vaddr);
>+ }
>+ igt_waitchildren();
>+
>+ munmap(vaddr, size);
>+}
>+
>+static void check_reports(void *oa_vaddr, uint32_t oa_size,
>+ const struct drm_xe_engine_class_instance *hwe)
>+{
>+ struct intel_xe_perf_metric_set *test_set = metric_set(hwe);
>+ uint64_t fmt = test_set->perf_oa_format;
>+ struct oa_format format = get_oa_format(fmt);
>+ size_t report_words = format.size >> 2;
>+ uint32_t *reports;
>+ uint32_t timer_reports = 0;
>+
>+ for (reports = (uint32_t *)oa_vaddr;
>+ timer_reports < 20 && reports[0] && oa_timestamp(reports, fmt);
>+ reports += report_words) {
>+ if (!oa_report_is_periodic(oa_exp_1_millisec, reports))
>+ continue;
>+
>+ timer_reports++;
>+ if (timer_reports >= 3)
>+ sanity_check_reports(reports - 2 * report_words,
>+ reports - report_words, fmt);
>+ }
>+
>+ igt_assert(timer_reports >= 3);
>+}
>+
>+static void check_reports_from_mapped_buffer(const struct drm_xe_engine_class_instance *hwe)
>+{
>+ void *vaddr;
>+ uint32_t size;
>+ uint32_t period_us = oa_exponent_to_ns(oa_exp_1_millisec) / 1000;
>+
>+ vaddr = map_oa_buffer(&size);
>+
>+ /* wait for approx 100 reports */
>+ usleep(100 * period_us);
>+ check_reports(vaddr, size, hwe);
>+
>+ munmap(vaddr, size);
>+}
>+
>+/**
>+ * SUBTEST: closed-fd-and-unmapped-access
>+ * Description: Unmap buffer, close fd and try to access
>+ */
>+static void closed_fd_and_unmapped_access(const struct drm_xe_engine_class_instance *hwe)
>+{
>+ uint64_t properties[] = {
>+ DRM_XE_OA_PROPERTY_OA_UNIT_ID, 0,
>+ DRM_XE_OA_PROPERTY_SAMPLE_OA, true,
>+ DRM_XE_OA_PROPERTY_OA_METRIC_SET, default_test_set->perf_oa_metrics_set,
>+ DRM_XE_OA_PROPERTY_OA_FORMAT, __ff(default_test_set->perf_oa_format),
>+ DRM_XE_OA_PROPERTY_OA_PERIOD_EXPONENT, oa_exp_1_millisec,
>+ };
>+ struct intel_xe_oa_open_prop param = {
>+ .num_properties = ARRAY_SIZE(properties) / 2,
>+ .properties_ptr = to_user_pointer(properties),
>+ };
>+ void *vaddr;
>+ uint32_t size;
>+ uint32_t period_us = oa_exponent_to_ns(oa_exp_1_millisec) / 1000;
>+
>+ stream_fd = __perf_open(drm_fd, ¶m, false);
>+ vaddr = map_oa_buffer(&size);
>+
>+ usleep(100 * period_us);
>+ check_reports(vaddr, size, hwe);
>+
>+ munmap(vaddr, size);
>+ __perf_close(stream_fd);
>+
>+ try_invalid_access(vaddr);
>+}
>+
>+/**
>+ * SUBTEST: map-oa-buffer
>+ * Description: Verify mapping of oa buffer
>+ *
>+ * SUBTEST: invalid-map-oa-buffer
>+ * Description: Verify invalid mappings of oa buffer
>+ *
>+ * SUBTEST: non-privileged-map-oa-buffer
>+ * Description: Verify if non-privileged user can map oa buffer
>+ *
>+ * SUBTEST: non-privileged-access-vaddr
>+ * Description: Verify if non-privileged user can map oa buffer
>+ *
>+ * SUBTEST: privileged-forked-access-vaddr
>+ * Description: Verify that forked access to mapped buffer fails
>+ */
>+typedef void (*map_oa_buffer_test_t)(const struct drm_xe_engine_class_instance *hwe);
>+static void test_mapped_oa_buffer(map_oa_buffer_test_t test_with_fd_open,
>+ const struct drm_xe_engine_class_instance *hwe)
>+{
>+ struct intel_xe_perf_metric_set *test_set = metric_set(hwe);
>+ uint64_t properties[] = {
>+ DRM_XE_OA_PROPERTY_OA_UNIT_ID, 0,
>+ DRM_XE_OA_PROPERTY_SAMPLE_OA, true,
>+ DRM_XE_OA_PROPERTY_OA_METRIC_SET, test_set->perf_oa_metrics_set,
>+ DRM_XE_OA_PROPERTY_OA_FORMAT, __ff(test_set->perf_oa_format),
>+ DRM_XE_OA_PROPERTY_OA_PERIOD_EXPONENT, oa_exp_1_millisec,
>+ DRM_XE_OA_PROPERTY_OA_ENGINE_INSTANCE, hwe->engine_instance,
>+ };
>+ struct intel_xe_oa_open_prop param = {
>+ .num_properties = ARRAY_SIZE(properties) / 2,
>+ .properties_ptr = to_user_pointer(properties),
>+ };
>+
>+ stream_fd = __perf_open(drm_fd, ¶m, false);
>+
>+ igt_assert(test_with_fd_open);
>+ test_with_fd_open(hwe);
>+
>+ __perf_close(stream_fd);
>+}
>+
> static const char *xe_engine_class_name(uint32_t engine_class)
> {
> switch (engine_class) {
>@@ -4312,6 +4537,32 @@ igt_main
> igt_subtest("whitelisted-registers-userspace-config")
> test_whitelisted_registers_userspace_config();
>
>+ igt_subtest_group {
>+ igt_subtest_with_dynamic("map-oa-buffer")
>+ __for_one_hwe_in_oag(hwe)
>+ test_mapped_oa_buffer(check_reports_from_mapped_buffer, hwe);
>+
>+ igt_subtest_with_dynamic("invalid-map-oa-buffer")
>+ __for_one_hwe_in_oag(hwe)
>+ test_mapped_oa_buffer(invalid_param_map_oa_buffer, hwe);
>+
>+ igt_subtest_with_dynamic("non-privileged-map-oa-buffer")
>+ __for_one_hwe_in_oag(hwe)
>+ test_mapped_oa_buffer(unprivileged_map_oa_buffer, hwe);
>+
>+ igt_subtest_with_dynamic("non-privileged-access-vaddr")
>+ __for_one_hwe_in_oag(hwe)
>+ test_mapped_oa_buffer(map_oa_buffer_unprivilege_access, hwe);
>+
>+ igt_subtest_with_dynamic("privileged-forked-access-vaddr")
>+ __for_one_hwe_in_oag(hwe)
>+ test_mapped_oa_buffer(map_oa_buffer_forked_access, hwe);
>+
>+ igt_subtest_with_dynamic("closed-fd-and-unmapped-access")
>+ __for_one_hwe_in_oag(hwe)
>+ closed_fd_and_unmapped_access(hwe);
>+ }
>+
> igt_fixture {
> /* leave sysctl options in their default state... */
> write_u64_file("/proc/sys/dev/xe/perf_stream_paranoid", 1);
>--
>2.41.0
>
next prev parent reply other threads:[~2024-06-20 23:39 UTC|newest]
Thread overview: 68+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-20 20:00 [PATCH v4 i-g-t 00/28] Intel Xe OA IGT's Ashutosh Dixit
2024-06-20 20:00 ` [PATCH i-g-t 01/28] lib/xe/oa: Import OA metric generation files from i915 Ashutosh Dixit
2024-06-20 21:54 ` Umesh Nerlige Ramappa
2024-06-20 20:00 ` [PATCH i-g-t 02/28] lib/xe/oa: Add LNL metric guids Ashutosh Dixit
2024-06-20 21:54 ` Umesh Nerlige Ramappa
2024-06-20 20:00 ` [PATCH i-g-t 03/28] lib/xe/oa: Add OA LNL metrics (oa_lnl.xml) Ashutosh Dixit
2024-06-20 21:55 ` Umesh Nerlige Ramappa
2024-06-20 20:00 ` [PATCH i-g-t 04/28] lib/xe/oa: Add truncated legacy Xe1 metrics XML's Ashutosh Dixit
2024-06-20 21:57 ` Umesh Nerlige Ramappa
2024-06-20 20:00 ` [PATCH i-g-t 05/28] lib/xe/oa: Generate LNL metrics/registers files Ashutosh Dixit
2024-06-20 21:52 ` Umesh Nerlige Ramappa
2024-06-20 23:05 ` Dixit, Ashutosh
2024-06-20 20:00 ` [PATCH i-g-t 06/28] lib/xe/oa: Switch generated files to Xe namespace Ashutosh Dixit
2024-06-20 23:24 ` Umesh Nerlige Ramappa
2024-06-20 20:00 ` [PATCH i-g-t 07/28] drm-uapi/xe: Sync with Perf/OA changes Ashutosh Dixit
2024-06-20 23:24 ` Umesh Nerlige Ramappa
2024-06-20 20:00 ` [PATCH i-g-t 08/28] lib/xe: Complete xe_oa lib functionality Ashutosh Dixit
2024-06-20 23:24 ` Umesh Nerlige Ramappa
2024-06-20 20:00 ` [PATCH i-g-t 09/28] tests/intel/xe_query: Add OA units query test Ashutosh Dixit
2024-06-20 23:25 ` Umesh Nerlige Ramappa
2024-06-20 20:00 ` [PATCH i-g-t 10/28] tests/intel/xe_oa: Add first tests Ashutosh Dixit
2024-06-20 23:11 ` Umesh Nerlige Ramappa
2024-06-30 22:42 ` Dixit, Ashutosh
2024-06-20 20:00 ` [PATCH i-g-t 11/28] tests/intel/xe_oa: Add some negative tests Ashutosh Dixit
2024-06-20 23:12 ` Umesh Nerlige Ramappa
2024-06-20 20:00 ` [PATCH i-g-t 12/28] tests/intel/xe_oa: Add "oa-formats" subtest Ashutosh Dixit
2024-06-20 23:15 ` Umesh Nerlige Ramappa
2024-06-30 22:43 ` Dixit, Ashutosh
2024-06-20 20:00 ` [PATCH i-g-t 13/28] tests/intel/xe_oa: Add oa exponent tests Ashutosh Dixit
2024-06-20 23:18 ` Umesh Nerlige Ramappa
2024-06-30 22:43 ` Dixit, Ashutosh
2024-06-20 20:00 ` [PATCH i-g-t 14/28] tests/intel/xe_oa: buffer-fill, non-zero-reason, enable-disable Ashutosh Dixit
2024-06-20 23:19 ` Umesh Nerlige Ramappa
2024-06-20 20:00 ` [PATCH i-g-t 15/28] tests/intel/xe_oa: blocking and polling tests Ashutosh Dixit
2024-06-20 23:20 ` Umesh Nerlige Ramappa
2024-06-20 20:00 ` [PATCH i-g-t 16/28] tests/intel/xe_oa: OAR/OAC tests Ashutosh Dixit
2024-06-20 23:46 ` Umesh Nerlige Ramappa
2024-06-20 20:00 ` [PATCH i-g-t 17/28] tests/intel/xe_oa: Exclusive/concurrent access, rc6 and stress open close Ashutosh Dixit
2024-06-20 23:37 ` Umesh Nerlige Ramappa
2024-06-30 22:43 ` Dixit, Ashutosh
2024-06-20 20:00 ` [PATCH i-g-t 18/28] tests/intel/xe_oa: add remove OA config tests Ashutosh Dixit
2024-06-20 23:38 ` Umesh Nerlige Ramappa
2024-06-20 20:00 ` [PATCH i-g-t 19/28] tests/intel/xe_oa: OA buffer mmap tests Ashutosh Dixit
2024-06-20 23:39 ` Umesh Nerlige Ramappa [this message]
2024-06-20 20:00 ` [PATCH i-g-t 20/28] tests/intel/xe_oa: Register whitelisting and MMIO trigger tests Ashutosh Dixit
2024-06-20 23:39 ` Umesh Nerlige Ramappa
2024-06-20 20:00 ` [PATCH i-g-t 21/28] lib/xe/oa: Add xe_oa_data_reader to IGT lib Ashutosh Dixit
2024-06-20 23:40 ` Umesh Nerlige Ramappa
2024-06-20 20:00 ` [PATCH i-g-t 22/28] tools/xe-perf: Add xe_perf_recorder Ashutosh Dixit
2024-06-20 23:41 ` Umesh Nerlige Ramappa
2024-06-20 20:00 ` [PATCH i-g-t 23/28] tools/xe-perf: xe_perf_reader, xe_perf_control and xe_perf_configs Ashutosh Dixit
2024-06-20 23:41 ` Umesh Nerlige Ramappa
2024-06-20 20:00 ` [PATCH i-g-t 24/28] xe/oa: Fix invalid escape warnings Ashutosh Dixit
2024-06-20 23:43 ` Umesh Nerlige Ramappa
2024-06-20 20:00 ` [PATCH i-g-t 25/28] xe/oa/mdapi-xml-convert: Add support for 576B_PEC64LL format Ashutosh Dixit
2024-06-20 23:43 ` Umesh Nerlige Ramappa
2024-06-20 20:00 ` [PATCH i-g-t 26/28] xe/oa: Regenerate oa-lnl.xml now parsing all counters Ashutosh Dixit
2024-06-20 23:43 ` Umesh Nerlige Ramappa
2024-06-20 20:00 ` [PATCH i-g-t 27/28] xe/oa/oa-metricset-codegen: Fix XE_OA_FORMAT_PEC64u64 offsets Ashutosh Dixit
2024-06-20 23:44 ` Umesh Nerlige Ramappa
2024-06-20 20:00 ` [PATCH i-g-t 28/28] HAX: Add Xe OA tests to xe-fast-feedback.testlist Ashutosh Dixit
2024-06-20 23:45 ` Umesh Nerlige Ramappa
2024-06-30 22:43 ` Dixit, Ashutosh
2024-06-20 20:19 ` ✗ GitLab.Pipeline: warning for Intel Xe OA IGT's (rev4) Patchwork
2024-06-20 20:36 ` ✓ CI.xeBAT: success " Patchwork
2024-06-20 20:43 ` ✓ Fi.CI.BAT: " Patchwork
2024-06-20 23:01 ` ✗ CI.xeFULL: failure " Patchwork
2024-06-21 5:51 ` ✗ Fi.CI.IGT: " 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=ZnS9tc7PNj9HqXEx@orsosgc001 \
--to=umesh.nerlige.ramappa@intel.com \
--cc=ashutosh.dixit@intel.com \
--cc=igt-dev@lists.freedesktop.org \
/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