|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 2/2] viridian: fix mistakes in timer expiration and re-start
This patch fixes a few issues:
- The specification says that a one-shot timers should be marked as
disabled at the point of expiry, so the enabled bit should be cleared by
stimer_expire() rather than poll_stimer(). For simplicity, call
stimer_expire() from start_stimer() for timers that expire immediately
rather than open-coding the expiry.
- The code omits updating the expiration value for one-shot timers and
so the eventual message delivered via the synic will be incorrect.
- Periodic timers should only be re-started if they are still enabled so,
now that enabled will be already clear for one-shot timers, call
start_stimer() from poll_stimer() only if the timer is still enabled.
Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
---
Cc: Jan Beulich <jbeulich@xxxxxxxx>
Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Cc: Wei Liu <wei.liu2@xxxxxxxxxx>
Cc: "Roger Pau Monné" <roger.pau@xxxxxxxxxx>
---
xen/arch/x86/hvm/viridian/time.c | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/xen/arch/x86/hvm/viridian/time.c b/xen/arch/x86/hvm/viridian/time.c
index 7a759e70b3..692f014fc4 100644
--- a/xen/arch/x86/hvm/viridian/time.c
+++ b/xen/arch/x86/hvm/viridian/time.c
@@ -187,7 +187,7 @@ static void stop_stimer(struct viridian_stimer *vs)
static void stimer_expire(void *data)
{
- const struct viridian_stimer *vs = data;
+ struct viridian_stimer *vs = data;
struct vcpu *v = vs->v;
struct viridian_vcpu *vv = v->arch.hvm.viridian;
unsigned int stimerx = vs - &vv->stimer[0];
@@ -197,6 +197,9 @@ static void stimer_expire(void *data)
set_bit(stimerx, &vv->stimer_pending);
vcpu_kick(v);
+
+ if ( !vs->config.periodic )
+ vs->config.enabled = 0;
}
static void start_stimer(struct viridian_stimer *vs)
@@ -256,7 +259,8 @@ static void start_stimer(struct viridian_stimer *vs)
expiration = vs->count;
if ( expiration - now <= 0 )
{
- set_bit(stimerx, &vv->stimer_pending);
+ vs->expiration = expiration;
+ stimer_expire(vs);
return;
}
}
@@ -285,10 +289,8 @@ static void poll_stimer(struct vcpu *v, unsigned int
stimerx)
clear_bit(stimerx, &vv->stimer_pending);
- if ( vs->config.periodic )
+ if ( vs->config.enabled )
start_stimer(vs);
- else
- vs->config.enabled = 0;
}
void viridian_time_poll_timers(struct vcpu *v)
--
2.20.1
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |