]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
Introduce a new, HVM compatible, paravirtualized timer driver for Xen.
authorgibbs <gibbs@FreeBSD.org>
Thu, 29 Aug 2013 23:11:58 +0000 (23:11 +0000)
committergibbs <gibbs@FreeBSD.org>
Thu, 29 Aug 2013 23:11:58 +0000 (23:11 +0000)
commitf5ff33730e4d7c8ed7baf90dfb75a20ee45fdfd0
treed3a1d0f880bba269983f967cc4477ca719a19d07
parent76248c6467c383919f68dde031fabc532f64d2f0
Introduce a new, HVM compatible, paravirtualized timer driver for Xen.
Use this new driver for both PV and HVM instances.

This driver requires a Xen hypervisor that supports vector callbacks,
VCPUOP hypercalls, and reports that it has a "safe PV clock".

New timer driver:
Submitted by: will
Sponsored by: Spectra Logic Corporation

PV port to new driver, and bug fixes:
Submitted by: Roger Pau MonnĂ©
Sponsored by: Citrix Systems R&D

sys/dev/xen/timer/timer.c:
- Register a PV timer device driver which (currently)
  implements device_{identify,probe,attach} and stubs
  device_detach.  The detach routine requires functionality
  not provided by timecounters(4).  The suspend and resume
  routines need additional work (due to Xen requiring that
  the hypercalls be executed on the target VCPU), and aren't
  needed for our purposes.

- Make sure there can only be one device instance of this
  driver, and that it only registers one eventtimers(4) and
  one timecounters(4) device interface.  Make both interfaces
  use PCPU data as needed.

- Match, with a few style cleanups & API differences, the
  Xen versions of the "fetch time" functions.

- Document the magic scale_delta() better for the i386 version.

- When registering the event timer, bind a separate event
  channel for the timer VIRQ to the device's event timer
  interrupt handler for each active VCPU.  Describe each
  interrupt as "xen_et:c%d", so they can be identified per
  CPU in "vmstat -i" or "show intrcnt" in KDB.

- When scheduling a timer into the hypervisor, try up to
  60 times if the hypervisor rejects the time as being in
  the past.  In the common case, this retry shouldn't happen,
  and if it does, it should only happen once.  This is
  because the event timer advertises a minimum period of
  100usec, which is only less than the usual hypercall round
  trip time about 1 out of every 100 tries.  (Unlike other
  similar drivers, this one actually checks whether the
  hypervisor accepted the singleshot timer set hypercall.)

- Implement a RTC PV clock based on the hypervisor wallclock.

sys/conf/files:
- Add dev/xen/timer/timer.c if the kernel configuration
  includes either the XEN or XENHVM options.

sys/conf/files.i386:
sys/i386/include/xen/xen_clock_util.h:
sys/i386/xen/clock.c:
sys/i386/xen/xen_clock_util.c:
sys/i386/xen/mp_machdep.c:
sys/i386/xen/xen_rtc.c:
- Remove previous PV timer used in i386 XEN PV kernels, the
  new timer introduced in this change is used instead (so
  we share the same code between PVHVM and PV).

MFC after: 2 weeks
sys/conf/files
sys/conf/files.i386
sys/dev/xen/timer/timer.c [new file with mode: 0644]
sys/i386/include/xen/xen_clock_util.h [deleted file]
sys/i386/xen/clock.c
sys/i386/xen/mp_machdep.c
sys/i386/xen/xen_clock_util.c [deleted file]
sys/i386/xen/xen_rtc.c [deleted file]