Mailing List Archive

[xen master] x86/shadow: re-work 4-level SHADOW_FOREACH_L2E()
commit 5a703566eb5dd59da718a46b5047b454a0d93cb4
Author: Jan Beulich <jbeulich@suse.com>
AuthorDate: Mon Feb 13 10:09:15 2023 +0100
Commit: Jan Beulich <jbeulich@suse.com>
CommitDate: Mon Feb 13 10:09:15 2023 +0100

x86/shadow: re-work 4-level SHADOW_FOREACH_L2E()

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@suse.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
---
xen/arch/x86/mm/shadow/multi.c | 23 +++++++++++------------
1 file changed, 11 insertions(+), 12 deletions(-)

diff --git a/xen/arch/x86/mm/shadow/multi.c b/xen/arch/x86/mm/shadow/multi.c
index 1642c0e167..cded39ef09 100644
--- 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 */ && \
+ mfn_to_page(_sl2mfn)->u.sh.type != SH_type_l2_64_shadow ) \
+ _end = COMPAT_L2_PAGETABLE_FIRST_XEN_SLOT(_dom); \
+ for ( _i = 0; _i < _end; ++_i ) \
{ \
- if ( (!(_xen)) \
- || !is_pv_32bit_domain(_dom) \
- || mfn_to_page(_sl2mfn)->u.sh.type == SH_type_l2_64_shadow \
- || (_i < COMPAT_L2_PAGETABLE_FIRST_XEN_SLOT(_dom)) ) \
+ (_sl2e) = _sp + _i; \
+ if ( shadow_l2e_get_flags(*(_sl2e)) & _PAGE_PRESENT ) \
{ \
- (_sl2e) = _sp + _i; \
- if ( shadow_l2e_get_flags(*(_sl2e)) & _PAGE_PRESENT ) \
- {_code} \
- if ( _done ) break; \
- increment_ptr_to_guest_entry(_gl2p); \
+ _code; \
} \
+ if ( _done ) \
+ break; \
+ increment_ptr_to_guest_entry(_gl2p); \
} \
unmap_domain_page(_sp); \
} while (0)
--
generated by git-patchbot for /home/xen/git/xen.git#master