snapshot->sched_props.preempt_timeout_us =
                q->sched_props.preempt_timeout_us;
 
-       snapshot->lrc = kmalloc_array(q->width, sizeof(struct lrc_snapshot),
+       snapshot->lrc = kmalloc_array(q->width, sizeof(struct xe_lrc_snapshot *),
                                      GFP_ATOMIC);
 
        if (snapshot->lrc) {
                for (i = 0; i < q->width; ++i) {
                        struct xe_lrc *lrc = q->lrc + i;
 
-                       snapshot->lrc[i].context_desc =
-                               lower_32_bits(xe_lrc_ggtt_addr(lrc));
-                       snapshot->lrc[i].head = xe_lrc_ring_head(lrc);
-                       snapshot->lrc[i].tail.internal = lrc->ring.tail;
-                       snapshot->lrc[i].tail.memory =
-                               xe_lrc_read_ctx_reg(lrc, CTX_RING_TAIL);
-                       snapshot->lrc[i].start_seqno = xe_lrc_start_seqno(lrc);
-                       snapshot->lrc[i].seqno = xe_lrc_seqno(lrc);
+                       snapshot->lrc[i] = xe_lrc_snapshot_capture(lrc);
                }
        }
 
        drm_printf(p, "\tPreempt timeout: %u (us)\n",
                   snapshot->sched_props.preempt_timeout_us);
 
-       for (i = 0; snapshot->lrc && i < snapshot->width; ++i) {
-               drm_printf(p, "\tHW Context Desc: 0x%08x\n",
-                          snapshot->lrc[i].context_desc);
-               drm_printf(p, "\tLRC Head: (memory) %u\n",
-                          snapshot->lrc[i].head);
-               drm_printf(p, "\tLRC Tail: (internal) %u, (memory) %u\n",
-                          snapshot->lrc[i].tail.internal,
-                          snapshot->lrc[i].tail.memory);
-               drm_printf(p, "\tStart seqno: (memory) %d\n",
-                          snapshot->lrc[i].start_seqno);
-               drm_printf(p, "\tSeqno: (memory) %d\n", snapshot->lrc[i].seqno);
-       }
+       for (i = 0; snapshot->lrc && i < snapshot->width; ++i)
+               xe_lrc_snapshot_print(snapshot->lrc[i], p);
+
        drm_printf(p, "\tSchedule State: 0x%x\n", snapshot->schedule_state);
        drm_printf(p, "\tFlags: 0x%lx\n", snapshot->exec_queue_flags);
 
  */
 void xe_guc_exec_queue_snapshot_free(struct xe_guc_submit_exec_queue_snapshot *snapshot)
 {
+       int i;
        if (!snapshot)
                return;
 
-       kfree(snapshot->lrc);
+       if (snapshot->lrc) {
+               for (i = 0; i < snapshot->width; i++)
+                       xe_lrc_snapshot_free(snapshot->lrc[i]);
+               kfree(snapshot->lrc);
+       }
        kfree(snapshot->pending_list);
        kfree(snapshot);
 }
 
 #define ENGINE_CLASS_SHIFT                     61
 #define ENGINE_INSTANCE_SHIFT                  48
 
+struct xe_lrc_snapshot {
+       u32 context_desc;
+       u32 head;
+       struct {
+               u32 internal;
+               u32 memory;
+       } tail;
+       u32 start_seqno;
+       u32 seqno;
+};
+
 static struct xe_device *
 lrc_to_xe(struct xe_lrc *lrc)
 {
                bb->len += num_dw;
        }
 }
+
+struct xe_lrc_snapshot *xe_lrc_snapshot_capture(struct xe_lrc *lrc)
+{
+       struct xe_lrc_snapshot *snapshot = kmalloc(sizeof(*snapshot), GFP_NOWAIT);
+
+       if (!snapshot)
+               return NULL;
+
+       snapshot->context_desc = lower_32_bits(xe_lrc_ggtt_addr(lrc));
+       snapshot->head = xe_lrc_ring_head(lrc);
+       snapshot->tail.internal = lrc->ring.tail;
+       snapshot->tail.memory = xe_lrc_read_ctx_reg(lrc, CTX_RING_TAIL);
+       snapshot->start_seqno = xe_lrc_start_seqno(lrc);
+       snapshot->seqno = xe_lrc_seqno(lrc);
+       return snapshot;
+}
+
+void xe_lrc_snapshot_print(struct xe_lrc_snapshot *snapshot, struct drm_printer *p)
+{
+       if (!snapshot)
+               return;
+
+       drm_printf(p, "\tHW Context Desc: 0x%08x\n", snapshot->context_desc);
+       drm_printf(p, "\tLRC Head: (memory) %u\n", snapshot->head);
+       drm_printf(p, "\tLRC Tail: (internal) %u, (memory) %u\n",
+                  snapshot->tail.internal, snapshot->tail.memory);
+       drm_printf(p, "\tStart seqno: (memory) %d\n", snapshot->start_seqno);
+       drm_printf(p, "\tSeqno: (memory) %d\n", snapshot->seqno);
+}
+
+void xe_lrc_snapshot_free(struct xe_lrc_snapshot *snapshot)
+{
+       kfree(snapshot);
+}