From: Andrew Cooper <andrew.cooper3@citrix.com>
To: Xen-devel <xen-devel@lists.xenproject.org>
Cc: "Andrew Cooper" <andrew.cooper3@citrix.com>,
"Jan Beulich" <JBeulich@suse.com>,
"Roger Pau Monné" <roger.pau@citrix.com>
Subject: [PATCH 2/4] x86/hvm: Use for_each_set_bit() in hvm_emulate_writeback()
Date: Tue, 27 Aug 2024 14:57:44 +0100 [thread overview]
Message-ID: <20240827135746.1908070-3-andrew.cooper3@citrix.com> (raw)
In-Reply-To: <20240827135746.1908070-1-andrew.cooper3@citrix.com>
... which is more consise than the opencoded form.
Also, for production VMs, ~100% of emulations are simple MOVs, so it is likely
that there are no segments to write back.
Furthermore, now that find_{first,next}_bit() are no longer in use, the
seg_reg_{accessed,dirty} fields aren't forced to be unsigned long, although
they do need to remain unsigned int because of __set_bit() elsewhere.
No practical change.
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
---
CC: Jan Beulich <JBeulich@suse.com>
CC: Roger Pau Monné <roger.pau@citrix.com>
Pulling current out into curr is good for code generation. When using current
in the loop, GCC can't retain the calculation across the call to
hvm_set_segment_register() and is forced to re-read from the cpu_info block.
However, if curr is initialised, it's calculated even in the likely path...
---
xen/arch/x86/hvm/emulate.c | 20 ++++++++++----------
xen/arch/x86/include/asm/hvm/emulate.h | 4 ++--
2 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/xen/arch/x86/hvm/emulate.c b/xen/arch/x86/hvm/emulate.c
index feb4792cc567..732bdbab25b0 100644
--- a/xen/arch/x86/hvm/emulate.c
+++ b/xen/arch/x86/hvm/emulate.c
@@ -2908,18 +2908,18 @@ void hvm_emulate_init_per_insn(
void hvm_emulate_writeback(
struct hvm_emulate_ctxt *hvmemul_ctxt)
{
- enum x86_segment seg;
+ struct vcpu *curr;
+ unsigned int dirty = hvmemul_ctxt->seg_reg_dirty;
- seg = find_first_bit(&hvmemul_ctxt->seg_reg_dirty,
- ARRAY_SIZE(hvmemul_ctxt->seg_reg));
+ if ( likely(!dirty) )
+ return;
- while ( seg < ARRAY_SIZE(hvmemul_ctxt->seg_reg) )
- {
- hvm_set_segment_register(current, seg, &hvmemul_ctxt->seg_reg[seg]);
- seg = find_next_bit(&hvmemul_ctxt->seg_reg_dirty,
- ARRAY_SIZE(hvmemul_ctxt->seg_reg),
- seg+1);
- }
+ curr = current;
+
+ for_each_set_bit ( seg, dirty )
+ hvm_set_segment_register(curr, seg, &hvmemul_ctxt->seg_reg[seg]);
+
+ hvmemul_ctxt->seg_reg_dirty = 0;
}
/*
diff --git a/xen/arch/x86/include/asm/hvm/emulate.h b/xen/arch/x86/include/asm/hvm/emulate.h
index 29d679442e10..972cdf1fa0cf 100644
--- a/xen/arch/x86/include/asm/hvm/emulate.h
+++ b/xen/arch/x86/include/asm/hvm/emulate.h
@@ -36,8 +36,8 @@ struct hvm_emulate_ctxt {
unsigned int insn_buf_bytes;
struct segment_register seg_reg[10];
- unsigned long seg_reg_accessed;
- unsigned long seg_reg_dirty;
+ unsigned int seg_reg_accessed;
+ unsigned int seg_reg_dirty;
/*
* MFNs behind temporary mappings in the write callback. The length is
--
2.39.2
next prev parent reply other threads:[~2024-08-27 13:58 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-27 13:57 [PATCH 0/4] xen/bitops: More for_each_bit() conversions Andrew Cooper
2024-08-27 13:57 ` [PATCH 1/4] xen/evtchn: Use bitmap_for_each() in evtchn_check_pollers() Andrew Cooper
2024-08-27 15:57 ` Jan Beulich
2024-08-27 13:57 ` Andrew Cooper [this message]
2024-08-27 16:07 ` [PATCH 2/4] x86/hvm: Use for_each_set_bit() in hvm_emulate_writeback() Jan Beulich
2024-08-28 14:44 ` Andrew Cooper
2024-08-28 14:56 ` Jan Beulich
2024-08-28 18:56 ` Andrew Cooper
2024-08-29 6:13 ` Jan Beulich
2024-08-27 13:57 ` [PATCH 3/4] x86/hvm: Rework hpet_write() for improved code generation Andrew Cooper
2024-08-28 8:13 ` Jan Beulich
2024-08-28 17:50 ` Andrew Cooper
2024-08-29 6:25 ` Jan Beulich
2024-08-27 13:57 ` [PATCH v2 4/4] x86/vmx: Rewrite vmx_sync_pir_to_irr() to be more efficient Andrew Cooper
2024-08-27 16:25 ` Andrew Cooper
2024-08-28 9:19 ` Jan Beulich
2024-08-28 18:08 ` Andrew Cooper
2024-08-28 19:36 ` Andrew Cooper
2024-08-29 6:35 ` Jan Beulich
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240827135746.1908070-3-andrew.cooper3@citrix.com \
--to=andrew.cooper3@citrix.com \
--cc=JBeulich@suse.com \
--cc=roger.pau@citrix.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.