From: Francois Dugast <francois.dugast@intel.com>
To: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: <igt-dev@lists.freedesktop.org>, <intel-xe@lists.freedesktop.org>,
"Kamil Konieczny" <kamil.konieczny@linux.intel.com>,
Badal Nilawar <badal.nilawar@intel.com>,
Anshuman Gupta <anshuman.gupta@intel.com>
Subject: Re: [PATCH i-g-t 1/5] tests/intel/xe_pm: Update runtime pm conditions
Date: Thu, 16 May 2024 18:49:28 +0200 [thread overview]
Message-ID: <ZkY5GINHo2p8BYRo@fdugast-desk> (raw)
In-Reply-To: <20240513185518.772398-1-rodrigo.vivi@intel.com>
On Mon, May 13, 2024 at 02:55:14PM -0400, Rodrigo Vivi wrote:
> Xe is no longer holding a runtime pm reference for the life
> of a VM or exec_queue.
>
> Also, IGT changes autosuspend time to a minimal time, so we
> cannot guarantee that rpm is still suspended after the execution
> has finished.
>
> So, the reference usage is not a reliable reference.
>
> Hence, start using runtime_active_time as the indicator
> that runtime_pm resumed upon our actions.
>
> v2: Usage of runtime_active_pm and inclusion of mmap tests.
> v3: Add doc for the exported lib function (Kamil)
>
> Cc: Kamil Konieczny <kamil.konieczny@linux.intel.com>
> Cc: Badal Nilawar <badal.nilawar@intel.com>
> Cc: Anshuman Gupta <anshuman.gupta@intel.com>
> Cc: Francois Dugast <francois.dugast@intel.com>
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Seeing failures and getting some "ACPI Error: " in dmesg when running
tests for a state which is not the platform default, for example s3-*
on a laptop which defaults to s2idle. But this is not caused by this
patch, which LGTM, so:
Reviewed-by: Francois Dugast <francois.dugast@intel.com>
> ---
> lib/igt_pm.c | 24 ++++++++++++++
> lib/igt_pm.h | 1 +
> tests/intel/xe_pm.c | 77 +++++++++++++++++----------------------------
> 3 files changed, 53 insertions(+), 49 deletions(-)
>
> diff --git a/lib/igt_pm.c b/lib/igt_pm.c
> index fe7692960..928b72685 100644
> --- a/lib/igt_pm.c
> +++ b/lib/igt_pm.c
> @@ -1412,6 +1412,30 @@ int igt_pm_get_runtime_suspended_time(struct pci_device *pci_dev)
> return -1;
> }
>
> +/**
> + * igt_pm_get_runtime_active_time:
> + * @pci_dev: PCI device struct
> + *
> + * Return: The total time that the device has been active.
> + */
> +int igt_pm_get_runtime_active_time(struct pci_device *pci_dev)
> +{
> + char time_str[64];
> + int time, time_fd;
> +
> + time_fd = igt_pm_get_power_attr_fd_rdonly(pci_dev, "runtime_active_time");
> + if (igt_pm_read_power_attr(time_fd, time_str, 64, false)) {
> + igt_assert(sscanf(time_str, "%d", &time) > 0);
> +
> + igt_debug("runtime active time for PCI '%04x:%02x:%02x.%01x' = %d\n",
> + pci_dev->domain, pci_dev->bus, pci_dev->dev, pci_dev->func, time);
> +
> + return time;
> + }
> +
> + return -1;
> +}
> +
> /**
> * igt_pm_get_runtime_usage:
> * @pci_dev: pci device
> diff --git a/lib/igt_pm.h b/lib/igt_pm.h
> index 91ee05cd1..b71f7c440 100644
> --- a/lib/igt_pm.h
> +++ b/lib/igt_pm.h
> @@ -94,6 +94,7 @@ void igt_pm_print_pci_card_runtime_status(void);
> bool i915_is_slpc_enabled_gt(int drm_fd, int gt);
> bool i915_is_slpc_enabled(int drm_fd);
> int igt_pm_get_runtime_suspended_time(struct pci_device *pci_dev);
> +int igt_pm_get_runtime_active_time(struct pci_device *pci_dev);
> int igt_pm_get_runtime_usage(struct pci_device *pci_dev);
> void igt_pm_ignore_slpc_efficient_freq(int i915, int gtfd, bool val);
>
> diff --git a/tests/intel/xe_pm.c b/tests/intel/xe_pm.c
> index e81a75d88..3f963bd9b 100644
> --- a/tests/intel/xe_pm.c
> +++ b/tests/intel/xe_pm.c
> @@ -184,34 +184,6 @@ static bool in_d3(device_t device, enum igt_acpi_d_state state)
> return true;
> }
>
> -static bool out_of_d3(device_t device, enum igt_acpi_d_state state)
> -{
> - uint16_t val;
> -
> - /* Runtime resume needs to be immediate action without any wait */
> - if (runtime_usage_available(device.pci_xe) &&
> - igt_pm_get_runtime_usage(device.pci_xe) <= 0)
> - return false;
> -
> - if (igt_get_runtime_pm_status() != IGT_RUNTIME_PM_STATUS_ACTIVE)
> - return false;
> -
> - switch (state) {
> - case IGT_ACPI_D3Hot:
> - igt_assert_eq(pci_device_cfg_read_u16(device.pci_xe,
> - &val, 0xd4), 0);
> - return (val & 0x3) == 0;
> - case IGT_ACPI_D3Cold:
> - return igt_pm_get_acpi_real_d_state(device.pci_root) ==
> - IGT_ACPI_D0;
> - default:
> - igt_info("Invalid D3 State\n");
> - igt_assert(0);
> - }
> -
> - return true;
> -}
> -
> static void close_fw_handle(int sig)
> {
> if (fw_handle < 0)
> @@ -326,27 +298,27 @@ test_exec(device_t device, struct drm_xe_engine_class_instance *eci,
> uint64_t pad;
> uint32_t data;
> } *data;
> - int i, b, rpm_usage;
> + int i, b, active_time;
> bool check_rpm = (d_state == IGT_ACPI_D3Hot ||
> d_state == IGT_ACPI_D3Cold);
>
> igt_assert(n_exec_queues <= MAX_N_EXEC_QUEUES);
> igt_assert(n_execs > 0);
>
> - if (check_rpm)
> + if (check_rpm) {
> igt_assert(in_d3(device, d_state));
> + active_time = igt_pm_get_runtime_active_time(device.pci_xe);
> + }
>
> vm = xe_vm_create(device.fd_xe, 0, 0);
>
> if (check_rpm)
> - igt_assert(out_of_d3(device, d_state));
> + igt_assert(igt_pm_get_runtime_active_time(device.pci_xe) >
> + active_time);
>
> bo_size = sizeof(*data) * n_execs;
> bo_size = xe_bb_size(device.fd_xe, bo_size);
>
> - if (check_rpm && runtime_usage_available(device.pci_xe))
> - rpm_usage = igt_pm_get_runtime_usage(device.pci_xe);
> -
> if (flags & USERPTR) {
> data = aligned_alloc(xe_get_default_alignment(device.fd_xe), bo_size);
> memset(data, 0, bo_size);
> @@ -384,8 +356,10 @@ test_exec(device_t device, struct drm_xe_engine_class_instance *eci,
> xe_vm_prefetch_async(device.fd_xe, vm, bind_exec_queues[0], 0, addr,
> bo_size, sync, 1, 0);
>
> - if (check_rpm && runtime_usage_available(device.pci_xe))
> - igt_assert(igt_pm_get_runtime_usage(device.pci_xe) > rpm_usage);
> + if (check_rpm) {
> + igt_assert(in_d3(device, d_state));
> + active_time = igt_pm_get_runtime_active_time(device.pci_xe);
> + }
>
> for (i = 0; i < n_execs; i++) {
> uint64_t batch_offset = (char *)&data[i].batch - (char *)data;
> @@ -429,9 +403,6 @@ test_exec(device_t device, struct drm_xe_engine_class_instance *eci,
> igt_assert(syncobj_wait(device.fd_xe, &sync[0].handle, 1, INT64_MAX, 0,
> NULL));
>
> - if (check_rpm && runtime_usage_available(device.pci_xe))
> - rpm_usage = igt_pm_get_runtime_usage(device.pci_xe);
> -
> sync[0].flags |= DRM_XE_SYNC_FLAG_SIGNAL;
> if (n_vmas > 1)
> xe_vm_unbind_all_async(device.fd_xe, vm, 0, bo, sync, 1);
> @@ -459,15 +430,13 @@ NULL));
> free(data);
> }
>
> - if (check_rpm && runtime_usage_available(device.pci_xe))
> - igt_assert(igt_pm_get_runtime_usage(device.pci_xe) < rpm_usage);
> - if (check_rpm)
> - igt_assert(out_of_d3(device, d_state));
> -
> xe_vm_destroy(device.fd_xe, vm);
>
> - if (check_rpm)
> + if (check_rpm) {
> + igt_assert(igt_pm_get_runtime_active_time(device.pci_xe) >
> + active_time);
> igt_assert(in_d3(device, d_state));
> + }
> }
>
> /**
> @@ -561,10 +530,13 @@ static void test_mmap(device_t device, uint32_t placement, uint32_t flags)
> size_t bo_size = 8192;
> uint32_t *map = NULL;
> uint32_t bo;
> - int i;
> + int i, active_time;
>
> igt_require_f(placement, "Device doesn't support such memory region\n");
>
> + igt_assert(igt_wait_for_pm_status(IGT_RUNTIME_PM_STATUS_SUSPENDED));
> + active_time = igt_pm_get_runtime_active_time(device.pci_xe);
> +
> bo_size = ALIGN(bo_size, xe_get_default_alignment(device.fd_xe));
>
> bo = xe_bo_create(device.fd_xe, 0, bo_size, placement, flags);
> @@ -575,7 +547,8 @@ static void test_mmap(device_t device, uint32_t placement, uint32_t flags)
> fw_handle = igt_debugfs_open(device.fd_xe, "forcewake_all", O_RDONLY);
>
> igt_assert(fw_handle >= 0);
> - igt_assert(igt_get_runtime_pm_status() == IGT_RUNTIME_PM_STATUS_ACTIVE);
> + igt_assert(igt_pm_get_runtime_active_time(device.pci_xe) >
> + active_time);
>
> for (i = 0; i < bo_size / sizeof(*map); i++)
> map[i] = MAGIC_1;
> @@ -585,22 +558,28 @@ static void test_mmap(device_t device, uint32_t placement, uint32_t flags)
>
> /* Runtime suspend and validate the pattern and changed the pattern */
> close(fw_handle);
> + sleep(1);
> +
> igt_assert(igt_wait_for_pm_status(IGT_RUNTIME_PM_STATUS_SUSPENDED));
> + active_time = igt_pm_get_runtime_active_time(device.pci_xe);
>
> for (i = 0; i < bo_size / sizeof(*map); i++)
> igt_assert(map[i] == MAGIC_1);
>
> /* dgfx page-fault on mmaping should wake the gpu */
> if (xe_has_vram(device.fd_xe) && flags & DRM_XE_GEM_CREATE_FLAG_NEEDS_VISIBLE_VRAM)
> - igt_assert(igt_get_runtime_pm_status() == IGT_RUNTIME_PM_STATUS_ACTIVE);
> + igt_assert(igt_pm_get_runtime_active_time(device.pci_xe) >
> + active_time);
>
> igt_assert(igt_wait_for_pm_status(IGT_RUNTIME_PM_STATUS_SUSPENDED));
> + active_time = igt_pm_get_runtime_active_time(device.pci_xe);
>
> for (i = 0; i < bo_size / sizeof(*map); i++)
> map[i] = MAGIC_2;
>
> if (xe_has_vram(device.fd_xe) && flags & DRM_XE_GEM_CREATE_FLAG_NEEDS_VISIBLE_VRAM)
> - igt_assert(igt_get_runtime_pm_status() == IGT_RUNTIME_PM_STATUS_ACTIVE);
> + igt_assert(igt_pm_get_runtime_active_time(device.pci_xe) >
> + active_time);
>
> igt_assert(igt_wait_for_pm_status(IGT_RUNTIME_PM_STATUS_SUSPENDED));
>
> --
> 2.44.0
>
next prev parent reply other threads:[~2024-05-16 16:49 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-13 18:55 [PATCH i-g-t 1/5] tests/intel/xe_pm: Update runtime pm conditions Rodrigo Vivi
2024-05-13 18:55 ` [PATCH i-g-t 2/5] lib/igt_pm: Fix and standardize IGT PM library documentation Rodrigo Vivi
2024-05-14 6:49 ` Riana Tauro
2024-05-13 18:55 ` [PATCH i-g-t 3/5] tests/intel/xe_pm: Also disable display for mmap_system test Rodrigo Vivi
2024-05-14 6:12 ` Gupta, Anshuman
2024-05-14 6:46 ` Nilawar, Badal
2024-05-13 18:55 ` [PATCH i-g-t 4/5] tests/intel/xe_pm: Only check the rpm resume after the first mmap operation Rodrigo Vivi
2024-05-14 15:19 ` Nilawar, Badal
2024-05-14 16:39 ` Nilawar, Badal
2024-05-13 18:55 ` [PATCH i-g-t 5/5] tests/intel/xe_pm: Convert mmap tests to use existing d3 helpers Rodrigo Vivi
2024-05-16 16:52 ` Francois Dugast
2024-05-13 19:01 ` ✗ CI.Patch_applied: failure for series starting with [i-g-t,1/5] tests/intel/xe_pm: Update runtime pm conditions Patchwork
2024-05-13 20:03 ` Rodrigo Vivi
2024-05-13 22:59 ` ✓ CI.xeBAT: success " Patchwork
2024-05-13 23:00 ` ✗ Fi.CI.BAT: failure " Patchwork
2024-05-14 1:38 ` ✗ CI.xeFULL: " Patchwork
2024-05-16 16:49 ` Francois Dugast [this message]
-- strict thread matches above, loose matches on Subject: below --
2024-05-15 17:13 [PATCH i-g-t 1/5] " Rodrigo Vivi
2024-05-16 18:10 Rodrigo Vivi
2024-05-17 15:13 ` Kamil Konieczny
2024-05-20 19:06 ` Rodrigo Vivi
2024-05-20 18:35 Rodrigo Vivi
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=ZkY5GINHo2p8BYRo@fdugast-desk \
--to=francois.dugast@intel.com \
--cc=anshuman.gupta@intel.com \
--cc=badal.nilawar@intel.com \
--cc=igt-dev@lists.freedesktop.org \
--cc=intel-xe@lists.freedesktop.org \
--cc=kamil.konieczny@linux.intel.com \
--cc=rodrigo.vivi@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.