[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 3/4] x86/hvm: Avoid needlessly resetting the periodic timer.



>>> On 28.03.13 at 14:22, Tim Deegan <tim@xxxxxxx> wrote:
> --- a/xen/arch/x86/hvm/rtc.c
> +++ b/xen/arch/x86/hvm/rtc.c
> @@ -78,7 +78,10 @@ void rtc_periodic_interrupt(void *opaque)
>  
>      spin_lock(&s->lock);
>      if ( s->hw.cmos_data[RTC_REG_C] & RTC_PF )
> +    {
>          destroy_periodic_time(&s->pt);
> +        s->pt_active = 0;
> +    }
>      else
>      {
>          s->hw.cmos_data[RTC_REG_C] |= RTC_PF;
> @@ -109,13 +112,20 @@ static void rtc_timer_update(RTCState *s)
>          {
>              period = 1 << (period_code - 1); /* period in 32 Khz cycles */
>              period = DIV_ROUND(period * 1000000000ULL, 32768); /* in ns */
> -            delta = period - ((NOW() - s->start_time) % period);
> -            create_periodic_time(v, &s->pt, delta, period, RTC_IRQ, NULL, s);
> +            if ( !s->pt_active || (period != s->period) )
> +            {
> +                s->period = period;
> +                s->pt_active = 1;

I think that by storing period_code rather than period, you could
easily fold the two new fields "period" and "pt_active" into one
(because period_code is zero if and only if the timer is inactive).

Beyond that the patch looks mostly like what I had in mind during
our recent discussion.

Jan

> +                delta = period - ((NOW() - s->start_time) % period);
> +                create_periodic_time(v, &s->pt, delta, period,
> +                                     RTC_IRQ, NULL, s);
> +            }
>              break;
>          }
>          /* fall through */
>      default:
>          destroy_periodic_time(&s->pt);
> +        s->pt_active = 0;
>          break;
>      }
>  }
> @@ -717,6 +727,7 @@ void rtc_reset(struct domain *d)
>      RTCState *s = domain_vrtc(d);
>  
>      destroy_periodic_time(&s->pt);
> +    s->pt_active = 0;
>      s->pt.source = PTSRC_isa;
>  }
>  
> diff --git a/xen/include/asm-x86/hvm/vpt.h b/xen/include/asm-x86/hvm/vpt.h
> index 2e9c7d2..76a83a1 100644
> --- a/xen/include/asm-x86/hvm/vpt.h
> +++ b/xen/include/asm-x86/hvm/vpt.h
> @@ -104,16 +104,17 @@ typedef struct RTCState {
>      struct hvm_hw_rtc hw;
>      /* RTC's idea of the current time */
>      struct tm current_tm;
> -    /* periodic timer */
> -    s_time_t start_time;
> -    /* second update */
> -    struct periodic_time pt;
>      /* update-ended timer */
>      struct timer update_timer;
>      struct timer update_timer2;
> +    uint64_t next_update_time;
>      /* alarm timer */
>      struct timer alarm_timer;
> -    uint64_t next_update_time;
> +    /* periodic timer */
> +    struct periodic_time pt;
> +    s_time_t start_time;
> +    int period;
> +    bool_t pt_active;
>      uint32_t use_timer;
>      spinlock_t lock;
>  } RTCState;
> -- 
> 1.7.10.4




_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.