[PATCH v6 4/6] drm/xe/guc: Add GuC log init config in LFD format

John Harrison john.c.harrison at intel.com
Fri Aug 1 16:57:41 UTC 2025


On 7/30/2025 4:40 PM, Dong, Zhanjun wrote:
> There are multiple comments, this reply is focus on 1 topic, see my 
> comments below.
>
> Regards,
> Zhanjun
>
> On 2025-07-29 8:27 p.m., John Harrison wrote:
>> On 7/21/2025 6:35 PM, Zhanjun Dong wrote:
>>> Add support to output GuC log init config (LIC) in LFD format.
>>>
>>> Signed-off-by: Zhanjun Dong <zhanjun.dong at intel.com>
>>> ---
>>>   drivers/gpu/drm/xe/xe_guc_log.c | 204 
>>> ++++++++++++++++++++++++++++++++
>>>   1 file changed, 204 insertions(+)
>>>
>>> diff --git a/drivers/gpu/drm/xe/xe_guc_log.c b/drivers/gpu/drm/xe/ 
>>> xe_guc_log.c
>>> index d2256773aaf3..609a9fd5ba0c 100644
>>> --- a/drivers/gpu/drm/xe/xe_guc_log.c
>>> +++ b/drivers/gpu/drm/xe/xe_guc_log.c
> ...
>>> +
>>> +static int
>>> +xe_guc_log_output_lfd_init(struct drm_printer *p, struct 
>>> xe_guc_log_snapshot *snapshot,
>>> +               struct guc_lic_save *config)
>>> +{
>>> +    int type, len;
>>> +    size_t size = 0;
>>> +    char buf[GUC_LFD_BUFFER_SIZE] = {0};
>> This will add 1KB of zeros as a global static object. You should 
>> never give large arrays an empty initialisation like that. I recall 
>> someone once doing that with a 16MB array and it took us ages to work 
>> out why the driver was so huge in debug builds! Also, this is putting 
>> a 1KB array on the stack. Kernel stack space is limited and you 
>> should never put large objects on the stack unless absolutely 
>> necessary. Just use kzalloc() for this.
>>
>
> I agree with you for static or global arrays cases, which will cause 
> .bss, .rodata or other(depends on platform) read-only segment 
> increase, that's because the static/global data is initialized by 
> loader, loader copy data from .bss/.rodata segment to memory, that's 
> how it works.
> While for this case, which is clear local stack memory to zero, that's 
> not load's task, that is compiler's job. Compiler will generate either 
> memset call or machine code to clear it to zero, for example on X86, 
> disassembly code is:
>
> xe_guc_log_output_lfd_init(struct drm_printer *p, struct 
> xe_guc_log_snapshot *snapshot,
>  501:    65 48 8b 04 25 28 00     mov    %gs:0x28,%rax
>  508:    00 00
> // I set GUC_LFD_BUFFER_SIZE set to 0x258(decimal 600), compiler has 
> some calculation and make it 0x268
>  50a:    48 89 84 24 68 02 00     mov    %rax,0x268(%rsp)
>  511:    00
>  512:    31 c0                    xor    %eax,%eax
>     char buf[GUC_LFD_BUFFER_SIZE] = {0};
>  514:    48 c7 44 24 10 00 00     movq   $0x0,0x10(%rsp)
>  51b:    00 00
>  51d:    f3 48 ab                 rep stos %rax,%es:(%rdi)
>         size += xe_guc_log_add_klv(&buf[size], GUC_LFD_BUFFER_SIZE - 
> size, type, config);
>  520:    49 8d 47 10              lea    0x10(%r15),%rax
>  524:    4c 8d 34 04              lea    (%rsp,%rax,1),%r14
>     index = xe_guc_log_add_lfd_header(buf, buf_size);
>
> Data cleared by instructions, there is no access to RO segment.
>
> Local buf={0} should be similar to a memset call. If you have concerns 
> about support of compiler/compiler options/processor combination, let 
> me know, we can change it to memset call.
>
> About the size, I see warning of stack usage is more than 1K, will 
> reduce it to 600 or 800 to avoid the warning.
> LFD header is small, 600/800 looks good.
>
Several hundred bytes of object is still a lot of object to be putting 
on the stack. For anything over a hundred bytes, you should be asking if 
this is the best way to do this. And in this case, it is not. Simple 
re-working of the data structures would mean you never need to create an 
oversized buffer for run-time construction of fields.

John.



More information about the Intel-xe mailing list