|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 3/4] x86/hvm: Rework hpet_write() for improved code generation
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@xxxxxxxxxx>
---
CC: Jan Beulich <JBeulich@xxxxxxxx>
CC: Roger Pau Monné <roger.pau@xxxxxxxxxx>
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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |