[PATCH v6 6/6] drm/xe/guc: Only add GuC crash dump if available
Dong, Zhanjun
zhanjun.dong at intel.com
Thu Aug 21 22:26:50 UTC 2025
On 2025-08-04 5:21 p.m., John Harrison wrote:
> On 8/4/2025 1:14 PM, John Harrison wrote:
>> On 7/21/2025 6:35 PM, Zhanjun Dong wrote:
>>> Add GuC crash dump data empty check. LFD will only include crash dump
>>> section when data is not empty.
>>>
>>> Signed-off-by: Zhanjun Dong<zhanjun.dong at intel.com>
>>> ---
>>> drivers/gpu/drm/xe/xe_guc_log.c | 60 +++++++++++++++++++++++++++++++++
>>> 1 file changed, 60 insertions(+)
>>>
>>> diff --git a/drivers/gpu/drm/xe/xe_guc_log.c b/drivers/gpu/drm/xe/
>>> xe_guc_log.c
>>> index a8910211c579..f5f31f15e7e3 100644
>>> --- a/drivers/gpu/drm/xe/xe_guc_log.c
>>> +++ b/drivers/gpu/drm/xe/xe_guc_log.c
>>> @@ -502,6 +502,65 @@ xe_guc_log_add_log_event(struct drm_printer *p,
>>> struct xe_guc_log_snapshot *snap
>>> return size;
>>> }
>>> +static int
>>> +xe_guc_log_add_crash_dump(struct drm_printer *p, struct
>>> xe_guc_log_snapshot *snapshot,
>>> + struct guc_lic_save *config)
>>> +{
>>> + struct guc_log_buffer_entry_list *entry;
>>> + int chunk_from, chunk_id, to_chunk_id;
>>> + int pos, from, to;
>>> + size_t size = 0;
>>> + char buf[GUC_LFD_BUFFER_SIZE] = {0};
>>> +
>>> + entry = &config->entry[GUC_LOG_BUFFER_STATE_HEADER_ENTRY_CRASH];
>>> +
>>> + /* Skip zero sized crash dump */
>>> + if (!entry->buf_size)
>>> + return 0;
>>> +
>>> + /* Check if crash dump section are all zero */
>>> + from = entry->offset;
>>> + to = entry->offset + entry->buf_size;
>>> + chunk_from = from % GUC_LOG_CHUNK_SIZE;
>>> + chunk_id = from / GUC_LOG_CHUNK_SIZE;
>>> + to_chunk_id = to / GUC_LOG_CHUNK_SIZE;
>>> + pos = from;
>>> +
>>> + do {
>>> + size_t size = (to_chunk_id > chunk_id ? GUC_LOG_CHUNK_SIZE :
>>> to) - chunk_from;
>>> + u32 *buf32 = snapshot->copy[chunk_id] + chunk_from;
>>> + int i;
>>> +
>>> + for (i = 0; i < size / sizeof(u32); i++)
>>> + if (buf32[i])
>>> + break;
>>> + if (i < size / sizeof(u32)) {
>>> + pos += i * sizeof(u32) - chunk_from;
>>> + break;
>>> + }
>>> + pos += size;
>>> + chunk_id++;
>>> + chunk_from = 0;
>>> + } while (pos < to);
>>> +
>>> + /* Buffer has non-zero data? */
>>> + if (pos < to) {
>>> + struct guc_lfd_data *lfd = (void *)buf;
>>> +
>>> + size = xe_guc_log_add_lfd_header(buf, GUC_LFD_BUFFER_SIZE);
>>> + lfd->dw0 |= FIELD_PREP(GUC_LFD_DATA_DESC_TYPE,
>>> GUC_LFD_TYPE_FW_CRASH_DUMP);
>>> + /* Calculate data length */
>>> + lfd->dw_size = DIV_ROUND_UP(entry->buf_size, sizeof(u32));
>>> + /* Output GUC_LFD_TYPE_FW_CRASH_DUMP header */
>>> + xe_print_blob_ascii85(p, NULL, 0, buf, 0, size);
>>> +
>>> + /* rd/wr ptr is not used for crash dump */
>>> + xe_guc_log_print_over_chunks(p, snapshot, entry->offset,
>>> + entry->offset + entry->buf_size);
>>> + }
>>> + return size;
>> Can't help but think that this is all way too complicated.
>>
>> The crash dump buffer is never going to be more than 1MB. And that
>> size is the smallest we can allocate when using large units in order
>> to get a larger log buffer (because the units are shared). My
>> understanding is that the actual size used is only a few pages
>> (currently working on getting a definitive answer from someone who
>> knows). So it would be far simpler to just save the crash buffer to
>> its own single, contiguous allocation in the snapshot with no chunking
>> required.
> Just got an answer back. The size is needed is 12KB currently but will
> shortly rise to 16KB. So a private allocation in the snapshot will be
> sufficient and is definitely going to be simpler than going through the
> chunking stuff.
Nice to hear no need to handle across chunks.
It could be a single buffer print.
>
> Unfortunately, that also means that our current default of 8KB in non-
> debug builds is too small! Can you post a patch to bump that up to 16KB?
Sure, I will. As it will be out of LFD scope, that will be a separate patch.
Regard,
Zhanjun Dong>
> Thanks,
> John.
>
>>
>> Then all the above complication disappears. You get a simple "for(i =
>> 0; i < size; i++) if(i) break;" to check for empty and a single print
>> buffer call.
>>
>> John.
>>
>>> +}
>>> +
>>> static void
>>> xe_guc_log_snapshot_print_lfd(struct xe_guc_log_snapshot *snapshot,
>>> struct drm_printer *p)
>>> {
>>> @@ -522,6 +581,7 @@ xe_guc_log_snapshot_print_lfd(struct
>>> xe_guc_log_snapshot *snapshot, struct drm_p
>>> return;
>>> xe_guc_log_add_log_event(p, snapshot, &config);
>>> + xe_guc_log_add_crash_dump(p, snapshot, &config);
>>> }
>>> /**
>>
>
More information about the Intel-xe
mailing list