|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 1/4] x86/shadow: Rework trace_shadow_gen() into sh_trace_va()
On 22.05.2024 15:47, Andrew Cooper wrote:
> On 22/05/2024 2:40 pm, Jan Beulich wrote:
>> On 22.05.2024 15:17, Andrew Cooper wrote:
>>> --- a/xen/arch/x86/mm/shadow/multi.c
>>> +++ b/xen/arch/x86/mm/shadow/multi.c
>>> @@ -1974,13 +1974,17 @@ typedef u32 guest_va_t;
>>> typedef u32 guest_pa_t;
>>> #endif
>>>
>>> -static inline void trace_shadow_gen(u32 event, guest_va_t va)
>>> +/* Shadow trace event with GUEST_PAGING_LEVELS folded into the event
>>> field. */
>>> +static void sh_trace(uint32_t event, unsigned int extra, const void
>>> *extra_data)
>>> +{
>>> + trace(event | ((GUEST_PAGING_LEVELS - 2) << 8), extra, extra_data);
>>> +}
>>> +
>>> +/* Shadow trace event with the guest's linear address. */
>>> +static void sh_trace_va(uint32_t event, guest_va_t va)
>>> {
>>> if ( tb_init_done )
>>> - {
>>> - event |= (GUEST_PAGING_LEVELS-2)<<8;
>>> - trace(event, sizeof(va), &va);
>>> - }
>>> + sh_trace(event, sizeof(va), &va);
>>> }
>> If any tb_init_done check, then perhaps rather in sh_trace()? With that
>> (and provided you agree)
>> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
>
> Sadly not. That leads to double reads of tb_init_done when tracing is
> compiled in.
Not here, but I can see how that could happen in principle, when ...
> When GCC can't fully inline the structure initialisation, it can't prove
> that a function call modified tb_init_done. This is why I arranged all
> the trace cleanup in this way.
... inlining indeed doesn't happen. Patch 2 fits the one here in this regard
(no function calls); I have yet to look at patch 3, though.
But anyway, the present placement, while likely a little redundant, is not
the end of the world, so my R-b holds either way.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |