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 3/4] x86/hvm: Rework hpet_write() for improved code generation
Date: Tue, 27 Aug 2024 14:57:45 +0100 [thread overview]
Message-ID: <20240827135746.1908070-4-andrew.cooper3@citrix.com> (raw)
In-Reply-To: <20240827135746.1908070-1-andrew.cooper3@citrix.com>
In the HPET_STATUS handling, the use of __clear_bit(i, &new_val) is the only
thing causing it to be spilled to the stack. Furthemore we only care about
the bottom 3 bits, so rewrite it to be a plain for loop.
For the {start,stop}_timer variables, these are spilled to the stack despite
the __{set,clear}_bit() calls. Again we only care about the bottom 3 bits, so
shrink the variables from long to int. Use for_each_set_bit() rather than
opencoding it at the end which amongst other things means the loop predicate
is no longer forced to the stack by the loop body.
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
---
CC: Jan Beulich <JBeulich@suse.com>
CC: Roger Pau Monné <roger.pau@citrix.com>
All in all, it's modest according to bloat-o-meter:
add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-29 (-29)
Function old new delta
hpet_write 2225 2196 -29
but we have shrunk the stack frame by 8 bytes; 0x28 as opposed to 0x30 before.
---
xen/arch/x86/hvm/hpet.c | 29 ++++++++---------------------
1 file changed, 8 insertions(+), 21 deletions(-)
diff --git a/xen/arch/x86/hvm/hpet.c b/xen/arch/x86/hvm/hpet.c
index 87642575f9cd..e3981d5e467c 100644
--- a/xen/arch/x86/hvm/hpet.c
+++ b/xen/arch/x86/hvm/hpet.c
@@ -349,8 +349,7 @@ static int cf_check hpet_write(
unsigned int tn, i;
/* Acculumate a bit mask of timers whos state is changed by this write. */
- unsigned long start_timers = 0;
- unsigned long stop_timers = 0;
+ unsigned int start_timers = 0, stop_timers = 0;
#define set_stop_timer(n) (__set_bit((n), &stop_timers))
#define set_start_timer(n) (__set_bit((n), &start_timers))
#define set_restart_timer(n) (set_stop_timer(n),set_start_timer(n))
@@ -405,16 +404,12 @@ static int cf_check hpet_write(
case HPET_STATUS:
/* write 1 to clear. */
- while ( new_val )
+ for ( i = 0; i < HPET_TIMER_NUM; i++ )
{
- bool active;
-
- i = ffsl(new_val) - 1;
- if ( i >= HPET_TIMER_NUM )
- break;
- __clear_bit(i, &new_val);
- active = __test_and_clear_bit(i, &h->hpet.isr);
- if ( active )
+ if ( !(new_val & (1U << i)) )
+ continue;
+
+ if ( __test_and_clear_bit(i, &h->hpet.isr) )
{
hvm_ioapic_deassert(v->domain, timer_int_route(h, i));
if ( hpet_enabled(h) && timer_enabled(h, i) &&
@@ -533,19 +528,11 @@ static int cf_check hpet_write(
}
/* stop/start timers whos state was changed by this write. */
- while (stop_timers)
- {
- i = ffsl(stop_timers) - 1;
- __clear_bit(i, &stop_timers);
+ for_each_set_bit ( i, stop_timers )
hpet_stop_timer(h, i, guest_time);
- }
- while (start_timers)
- {
- i = ffsl(start_timers) - 1;
- __clear_bit(i, &start_timers);
+ for_each_set_bit ( i, start_timers )
hpet_set_timer(h, i, guest_time);
- }
#undef set_stop_timer
#undef set_start_timer
--
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 ` [PATCH 2/4] x86/hvm: Use for_each_set_bit() in hvm_emulate_writeback() Andrew Cooper
2024-08-27 16:07 ` 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 ` Andrew Cooper [this message]
2024-08-28 8:13 ` [PATCH 3/4] x86/hvm: Rework hpet_write() for improved code generation 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-4-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.