[PATCH i-g-t v2 53/66] tests/xe_eudebug_online: Set dynamic breakpoint on interrupt-all
Piatkowski, Dominik Karol
dominik.karol.piatkowski at intel.com
Mon Aug 5 06:27:41 UTC 2024
With typo fixed:
Reviewed-by: Dominik Karol Piątkowski <dominik.karol.piatkowski at intel.com>
> -----Original Message-----
> From: Manszewski, Christoph <christoph.manszewski at intel.com>
> Sent: Tuesday, July 30, 2024 1:45 PM
> To: igt-dev at lists.freedesktop.org
> Cc: Kempczynski, Zbigniew <zbigniew.kempczynski at intel.com>; Kamil
> Konieczny <kamil.konieczny at linux.intel.com>; Grzegorzek, Dominik
> <dominik.grzegorzek at intel.com>; Patelczyk, Maciej
> <maciej.patelczyk at intel.com>; Piatkowski, Dominik Karol
> <dominik.karol.piatkowski at intel.com>; Sikora, Pawel
> <pawel.sikora at intel.com>; Hajda, Andrzej <andrzej.hajda at intel.com>;
> Kolanupaka Naveena <kolanupaka.naveena at intel.com>; Kuoppala, Mika
> <mika.kuoppala at intel.com>; Mun, Gwan-gyeong <gwan-
> gyeong.mun at intel.com>
> Subject: [PATCH i-g-t v2 53/66] tests/xe_eudebug_online: Set dynamic
> breakpoint on interrupt-all
>
> From: Dominik Grzegorzek <dominik.grzegorzek at intel.com>
>
> Implement interrupt-all-set-breakpoint, which interrupts all threads, and once
> spots attention it sets a breakpoint on the next instruction.
>
> Signed-off-by: Dominik Grzegorzek <dominik.grzegorzek at intel.com>
> Cc: Mika Kuoppala <mika.kuoppala at intel.com>
> ---
> tests/intel/xe_eudebug_online.c | 81
> ++++++++++++++++++++++++++++++++-
> 1 file changed, 80 insertions(+), 1 deletion(-)
>
> diff --git a/tests/intel/xe_eudebug_online.c b/tests/intel/xe_eudebug_online.c
> index 8791b29fa..5bb165fef 100644
> --- a/tests/intel/xe_eudebug_online.c
> +++ b/tests/intel/xe_eudebug_online.c
> @@ -22,6 +22,7 @@
>
> #define SHADER_BREAKPOINT (1 << 0)
> #define SHADER_LOOP (1 << 1)
> +#define TRIGGER_RESUME_SET_BP (1 << 28)
> #define TRIGGER_RESUME_DELAYED (1 << 29)
> #define TRIGGER_RESUME_DSS (1 << 30)
> #define TRIGGER_RESUME_ONE (1 << 31)
> @@ -276,6 +277,7 @@ struct online_debug_data {
> uint64_t bb_offset;
> size_t bb_size;
> int vm_fd;
> + uint32_t first_aip;
> struct timespec exception_arrived;
> int last_eu_control_seqno;
> };
> @@ -342,6 +344,71 @@ static void copy_first_bit(uint8_t *dst, uint8_t *src,
> int size)
> }
> }
>
> +/*
> + * Searches for the first instruction. It stands on assumption,
> + * that shader kernel is placed before sip within the bb.
> + */
> +static uint32_t find_kernel_in_bb(struct gpgpu_shader *kernel,
> + struct online_debug_data *data)
> +{
> + uint32_t *p = kernel->code;
> + size_t sz = 4 * sizeof(uint32_t);
> + uint32_t buf[4];
> + int i;
> +
> + for (i = 0; i < data->bb_size; i += sz) {
> + igt_assert_eq(pread(data->vm_fd, &buf, sz, data->bb_offset +
> i), sz);
> +
> +
> + if (memcmp(p, buf, sz) == 0)
> + break;
> + }
> +
> + igt_assert(i < data->bb_size);
> +
> + return i;
> +}
> +
> +static void set_breakpoint_once(struct xe_eudebug_debugger *d,
> + struct online_debug_data *data)
> +{
> + const uint32_t breakpoint_bit = 1 << 30;
> + size_t sz = sizeof(uint32_t);
> + struct gpgpu_shader *kernel;
> + uint32_t aip;
> +
> + kernel = get_shader(d->master_fd, d->flags);
> +
> + if (data->first_aip) {
> + uint32_t expected = find_kernel_in_bb(kernel, data) + kernel-
> >size *
> +4 - 0x10;
> +
> + igt_assert_eq(pread(data->vm_fd, &aip, sz, data-
> >target_offset), sz);
> + igt_assert_eq_u32(aip, expected);
> + } else {
> + uint32_t instr_usdw;
> +
> + igt_assert(data->vm_fd != -1);
> + igt_assert(data->target_size != 0);
> + igt_assert(data->bb_size != 0);
> +
> + igt_assert_eq(pread(data->vm_fd, &aip, sz, data-
> >target_offset), sz);
> + data->first_aip = aip;
> +
> + aip = find_kernel_in_bb(kernel, data);
> +
> + /* set breakpoint on last instruction */
> + aip += kernel->size * 4 - 0x10;
> + igt_assert_eq(pread(data->vm_fd, &instr_usdw, sz,
> + data->bb_offset + aip), sz);
> + instr_usdw |= breakpoint_bit;
> + igt_assert_eq(pwrite(data->vm_fd, &instr_usdw, sz,
> + data->bb_offset + aip), sz);
> +
> + }
> +
> + gpgpu_shader_destroy(kernel);
> +}
> +
> #define MAX_PREEMPT_TIMEOUT 10ull
> static void eu_attention_resume_trigger(struct xe_eudebug_debugger *d,
> struct drm_xe_eudebug_event *e)
> @@ -382,6 +449,8 @@ static void eu_attention_resume_trigger(struct
> xe_eudebug_debugger *d,
> resume[i] = event[i];
> break;
> }
> + } else if (d->flags & TRIGGER_RESUME_SET_BP) {
> + set_breakpoint_once(d, data);
> }
>
> if (d->flags & SHADER_LOOP) {
> @@ -602,7 +671,7 @@ static void run_online_client(struct
> xe_eudebug_client *c)
> data->threads_count = count_canaries_neq(ptr, w_dim, 0);
> igt_assert_f(data->threads_count, "No canaries found, nothing
> executed?\n");
>
> - if (c->flags & SHADER_BREAKPOINT) {
> + if (c->flags & SHADER_BREAKPOINT || c->flags &
> TRIGGER_RESUME_SET_BP)
> +{
> uint32_t aip = ptr[0];
>
> igt_assert_f(aip != SHADER_CANARY, "Workload executed but
> breakpoint not hit!\n"); @@ -860,6 +929,13 @@ static void
> test_basic_online(int fd, struct drm_xe_engine_class_instance *hwe,
> * Schedules EU workload which should last about a few seconds, then
> * interrupts all threads, checks whether attention event came, and
> * resumes stopped threads back.
> + *
> + * SUBTEST: interrupt-all-set-breakpoint
> + * Description:
> + * Schedules EU workload which should last about a few seconds, then
> + * interrupts all threads, once attention event come it sets breakpoint on
> + * the very next instruction and resumes stopped thereads back. It
Typo: threads
> expects
> + * that every thread hits the breakpoint.
> */
> static void test_interrupt_all(int fd, struct drm_xe_engine_class_instance
> *hwe, int flags) { @@ -970,6 +1046,9 @@ igt_main
> test_gt_render_or_compute("interrupt-all", fd, hwe)
> test_interrupt_all(fd, hwe, SHADER_LOOP);
>
> + test_gt_render_or_compute("interrupt-all-set-breakpoint", fd, hwe)
> + test_interrupt_all(fd, hwe, SHADER_LOOP |
> TRIGGER_RESUME_SET_BP);
> +
> igt_fixture {
> intel_allocator_multiprocess_stop();
> drm_close_driver(fd);
> --
> 2.34.1
More information about the igt-dev
mailing list