[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v3 4/4] x86/shadow: re-work 4-level SHADOW_FOREACH_L2E()


  • To: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
  • From: Jan Beulich <jbeulich@xxxxxxxx>
  • Date: Fri, 10 Feb 2023 08:07:20 +0100
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=suse.com; dmarc=pass action=none header.from=suse.com; dkim=pass header.d=suse.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=xdZufVofTAmzX8PPw6oGCkz3RIXqxNKnbYb4efDk5Lw=; b=e4sCdqRTpzyKfeUDDlGMYiX1p3GmmeCjb0UG/Yb/WroTi4Zm15yMB1Kbg2WTpj35AfvgEiGygzyXv/EHpWJOFLO6NA3EpSBskR/Vl0sBpCe4gyJXjgTEk1aGmIUvn2pfKoK3asZ+OkhAIzzYDhWZ65MmwTJzEQcUddWolorjdkf43uIm/nj5lTAFgoLZ3opJjNquNBPIlZ2/NT3NkWqkbEtxOEgaJPlCd/BWsHBsFdUgFZ39FeiTZh5Ham8f5I7Mq3leOKqNNdbXUe9fE6WGLkKVFHc5LlhOFT+I1g/juCCKCTtVMZitYIigSR2/Zud9IVcEb2m6dEn/1gR8C8qr6A==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=OvRySI0DlVTF9N0PcBcFDb5WDvAdaE1RecI9kJkX3IR5mcoaF+6MqYCvuoUXYU6pGGc/mkC9s7D2mxLf5XDy8zN4/qMicRItfUyH5zxGcvPLeb7JWg7sKCfezsUUtAUn3VbTcILve9ci6cxio9tpDmTxat8Mp1xKiNN5VGJu1A6r/w9fmbZ2kKtcxcYSo9AgqE+bxAM82deVv5jQPhmf10gl2/v3HS23aX9t2v/o/a/PyYydNTSjHLqKKE5S5OtUQPPxAc+Gc7JpzyGcKe7EZKEPrFUT8zuO6j5byISWmSNM757yK4mF1GSsvz5Rm5ianWYgvJLs4fTmZiPvXimftQ==
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=suse.com;
  • Cc: Wei Liu <wl@xxxxxxx>, Roger Pau Monné <roger.pau@xxxxxxxxxx>, Tim Deegan <tim@xxxxxxx>, George Dunlap <george.dunlap@xxxxxxxxxx>, "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • Delivery-date: Fri, 10 Feb 2023 07:07:28 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On 09.02.2023 18:26, Andrew Cooper wrote:
> On 08/02/2023 2:38 pm, Jan Beulich wrote:
>> First of all move the almost loop-invariant condition out of the loop;
>> transform it into an altered loop boundary, noting that the updating of
>> _gl2p is relevant only at one use site, and then also only inside the
>> _code blob it provides. Then drop the shadow_mode_external() part of the
>> condition as being redundant with the is_pv_32bit_domain() check.
>> Further, since the new local variable wants to be "unsigned int",
>> convert the loop induction variable accordingly. Finally also adjust
>> formatting as most code needs touching anyway.
>>
>> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
> 
> Acked-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>

Thanks.

>> --- a/xen/arch/x86/mm/shadow/multi.c
>> +++ b/xen/arch/x86/mm/shadow/multi.c
>> @@ -861,23 +861,22 @@ do {
>>  /* 64-bit l2: touch all entries except for PAE compat guests. */
>>  #define SHADOW_FOREACH_L2E(_sl2mfn, _sl2e, _gl2p, _done, _dom, _code)       
>> \
>>  do {                                                                        
>> \
>> -    int _i;                                                                 
>> \
>> -    int _xen = !shadow_mode_external(_dom);                                 
>> \
>> +    unsigned int _i, _end = SHADOW_L2_PAGETABLE_ENTRIES;                    
>> \
>>      shadow_l2e_t *_sp = map_domain_page((_sl2mfn));                         
>> \
>>      ASSERT_VALID_L2(mfn_to_page(_sl2mfn)->u.sh.type);                       
>> \
>> -    for ( _i = 0; _i < SHADOW_L2_PAGETABLE_ENTRIES; _i++ )                  
>> \
>> +    if ( is_pv_32bit_domain(_dom) /* implies !shadow_mode_external(_dom) */ 
>> && \
> 
> As this is a comment, I think can reasonably be
> 
> /* implies !shadow_mode_external */
> 
> which shortens it enough to maintain the RHS justification.

I would certainly have done it without pushing out the escape, but both
alternative variants look worse to me: In

    /* Implies !shadow_mode_external(_dom) */                               \
    if ( is_pv_32bit_domain(_dom) &&                                        \
         mfn_to_page(_sl2mfn)->u.sh.type != SH_type_l2_64_shadow )          \
        _end = COMPAT_L2_PAGETABLE_FIRST_XEN_SLOT(_dom);                    \

it isn't clear that the comment applies to only the first part of the
conditions, whereas
    
    if ( /* Implies !shadow_mode_external(_dom): */                         \
         is_pv_32bit_domain(_dom) &&                                        \
         mfn_to_page(_sl2mfn)->u.sh.type != SH_type_l2_64_shadow )          \
        _end = COMPAT_L2_PAGETABLE_FIRST_XEN_SLOT(_dom);                    \

looks more clumsy to me. I'm not very likely to accept a suggestion to
for the former route; if you think the latter variant is strictly
better than the original, I might make the change while committing.

Hmm, or maybe

    if ( mfn_to_page(_sl2mfn)->u.sh.type != SH_type_l2_64_shadow )          \
         /* Implies !shadow_mode_external(_dom): */                         \
         is_pv_32bit_domain(_dom) &&                                        \
        _end = COMPAT_L2_PAGETABLE_FIRST_XEN_SLOT(_dom);                    \

?

Jan



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.