Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F102636426
D37705.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D37705.diff
View Options
diff --git a/sys/dev/kvm_clock/kvm_clock.c b/sys/dev/kvm_clock/kvm_clock.c
--- a/sys/dev/kvm_clock/kvm_clock.c
+++ b/sys/dev/kvm_clock/kvm_clock.c
@@ -71,10 +71,14 @@
struct pvclock_vcpu_time_info *timeinfos;
u_int msr_tc;
u_int msr_wc;
+#ifndef EARLY_AP_STARTUP
+ int firstcpu;
+#endif
};
static struct pvclock_wall_clock *kvm_clock_get_wallclock(void *arg);
-static void kvm_clock_system_time_enable(struct kvm_clock_softc *sc);
+static void kvm_clock_system_time_enable(struct kvm_clock_softc *sc,
+ const cpuset_t *cpus);
static void kvm_clock_system_time_enable_pcpu(void *arg);
static void kvm_clock_setup_sysctl(device_t);
@@ -88,9 +92,10 @@
}
static void
-kvm_clock_system_time_enable(struct kvm_clock_softc *sc)
+kvm_clock_system_time_enable(struct kvm_clock_softc *sc, const cpuset_t *cpus)
{
- smp_rendezvous(NULL, kvm_clock_system_time_enable_pcpu, NULL, sc);
+ smp_rendezvous_cpus(*cpus, NULL, kvm_clock_system_time_enable_pcpu,
+ NULL, sc);
}
static void
@@ -104,6 +109,32 @@
wrmsr(sc->msr_tc, vtophys(&(sc->timeinfos)[curcpu]) | 1);
}
+#ifndef EARLY_AP_STARTUP
+static void
+kvm_clock_init_smp(void *arg __unused)
+{
+ devclass_t kvm_clock_devclass;
+ cpuset_t cpus;
+ struct kvm_clock_softc *sc;
+
+ kvm_clock_devclass = devclass_find(KVM_CLOCK_DEVNAME);
+ sc = devclass_get_softc(kvm_clock_devclass, 0);
+ if (sc == NULL || mp_ncpus == 1)
+ return;
+
+ /*
+ * Register with the hypervisor on all CPUs except the one that
+ * registered in kvm_clock_attach().
+ */
+ cpus = all_cpus;
+ KASSERT(CPU_ISSET(sc->firstcpu, &cpus),
+ ("%s: invalid first CPU %d", __func__, sc->firstcpu));
+ CPU_CLR(sc->firstcpu, &cpus);
+ kvm_clock_system_time_enable(sc, &cpus);
+}
+SYSINIT(kvm_clock, SI_SUB_SMP, SI_ORDER_ANY, kvm_clock_init_smp, NULL);
+#endif
+
static void
kvm_clock_identify(driver_t *driver, device_t parent)
{
@@ -150,7 +181,12 @@
/* Set up 'struct pvclock_vcpu_time_info' page(s): */
sc->timeinfos = kmem_malloc(mp_ncpus *
sizeof(struct pvclock_vcpu_time_info), M_WAITOK | M_ZERO);
- kvm_clock_system_time_enable(sc);
+#ifdef EARLY_AP_STARTUP
+ kvm_clock_system_time_enable(sc, &all_cpus);
+#else
+ sc->firstcpu = curcpu;
+ kvm_clock_system_time_enable_pcpu(sc);
+#endif
/*
* Init pvclock; register KVM clock wall clock, register KVM clock
@@ -192,7 +228,7 @@
* conservatively assume that the system time must be re-inited in
* suspend/resume scenarios.
*/
- kvm_clock_system_time_enable(device_get_softc(dev));
+ kvm_clock_system_time_enable(device_get_softc(dev), &all_cpus);
pvclock_resume();
inittodr(time_second);
return (0);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Nov 16, 3:48 AM (21 h, 59 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
14652701
Default Alt Text
D37705.diff (2 KB)
Attached To
Mode
D37705: kvmclock: Fix initialization when EARLY_AP_STARTUP is not defined
Attached
Detach File
Event Timeline
Log In to Comment