|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 10/11] x86/vpt: remove vPT timers per-vCPU lists
On 30.09.2020 12:41, Roger Pau Monne wrote:
> --- a/xen/arch/x86/domain.c
> +++ b/xen/arch/x86/domain.c
> @@ -1964,7 +1964,7 @@ void context_switch(struct vcpu *prev, struct vcpu
> *next)
> vpmu_switch_from(prev);
> np2m_schedule(NP2M_SCHEDLE_OUT);
>
> - if ( is_hvm_domain(prevd) && !list_empty(&prev->arch.hvm.tm_list) )
> + if ( is_hvm_domain(prevd) )
> pt_save_timer(prev);
While most of the function goes away, pt_freeze_time() now will get
called in cases it previously wasn't called - is this benign?
> @@ -195,50 +182,20 @@ static void pt_thaw_time(struct vcpu *v)
>
> void pt_save_timer(struct vcpu *v)
> {
> - struct list_head *head = &v->arch.hvm.tm_list;
> - struct periodic_time *pt;
> -
> - if ( v->pause_flags & VPF_blocked )
> - return;
> -
> - pt_vcpu_lock(v);
> -
> - list_for_each_entry ( pt, head, list )
> - if ( !pt->do_not_freeze )
> - stop_timer(&pt->timer);
>
> pt_freeze_time(v);
> -
> - pt_vcpu_unlock(v);
> }
>
> void pt_restore_timer(struct vcpu *v)
> {
> - struct list_head *head = &v->arch.hvm.tm_list;
> - struct periodic_time *pt;
> -
> - pt_vcpu_lock(v);
> -
> - list_for_each_entry ( pt, head, list )
> - if ( pt->pending_intr_nr == 0 )
> - set_timer(&pt->timer, pt->scheduled);
> -
> pt_thaw_time(v);
> -
> - pt_vcpu_unlock(v);
> }
In both functions the single function called also is the only
time it is used anywhere, so I guess the extra layer could be
removed.
> @@ -402,8 +339,7 @@ void create_periodic_time(
> write_lock(&v->domain->arch.hvm.pl_time->pt_migrate);
>
> pt->pending_intr_nr = 0;
> - pt->do_not_freeze = 0;
> - pt->irq_issued = 0;
> + pt->masked = false;
I agree here, but ...
> @@ -479,10 +412,8 @@ void destroy_periodic_time(struct periodic_time *pt)
> return;
>
> pt_lock(pt);
> - if ( pt->on_list )
> - list_del(&pt->list);
> - pt->on_list = 0;
> pt->pending_intr_nr = 0;
> + pt->masked = false;
... why not "true" here, at the very least for pt_active()'s sake?
> --- a/xen/include/asm-x86/hvm/vpt.h
> +++ b/xen/include/asm-x86/hvm/vpt.h
> @@ -31,13 +31,10 @@
> typedef void time_cb(struct vcpu *v, void *opaque);
>
> struct periodic_time {
> - struct list_head list;
> - bool on_list;
> bool one_shot;
> - bool do_not_freeze;
> - bool irq_issued;
> bool warned_timeout_too_short;
> bool level;
> + bool masked;
"masked" aiui doesn't say anything about the present state of a
timer, but about its state the last time an interrupt was
attempted to be injected. If this is right, either a name change
("last_seen_masked" is somewhat longish) might be helpful, but
at the very least I'd like to ask for a comment to this effect.
> @@ -158,7 +153,7 @@ void pt_adjust_global_vcpu_target(struct vcpu *v);
> void pt_may_unmask_irq(struct domain *d, struct periodic_time *vlapic_pt);
>
> /* Is given periodic timer active? */
> -#define pt_active(pt) ((pt)->on_list || (pt)->pending_intr_nr)
> +#define pt_active(pt) !(pt)->masked
This wants parentheses around it. And why does the right side of the
|| go away?
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |