Re: [patch 14/18] time: export time information for KVM pvclock

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

 



On Fri, Nov 09, 2012 at 05:02:52PM -0800, John Stultz wrote:
> On 10/24/2012 06:13 AM, Marcelo Tosatti wrote:
> >As suggested by John, export time data similarly to how its
> >done by vsyscall support. This allows KVM to retrieve necessary
> >information to implement vsyscall support in KVM guests.
> >
> >Signed-off-by: Marcelo Tosatti <mtosatti@xxxxxxxxxx>
> Thanks Marcelo, I like this much better then what you were proposing
> privately earlier!
> 
> Fairly minor nit below.
> 
> >Index: vsyscall/kernel/time/timekeeping.c
> >===================================================================
> >--- vsyscall.orig/kernel/time/timekeeping.c
> >+++ vsyscall/kernel/time/timekeeping.c
> >@@ -21,6 +21,7 @@
> >  #include <linux/time.h>
> >  #include <linux/tick.h>
> >  #include <linux/stop_machine.h>
> >+#include <linux/pvclock_gtod.h>
> >
> >
> >  static struct timekeeper timekeeper;
> >@@ -180,6 +181,79 @@ static inline s64 timekeeping_get_ns_raw
> >  	return nsec + arch_gettimeoffset();
> >  }
> >
> >+static RAW_NOTIFIER_HEAD(pvclock_gtod_chain);
> >+
> >+/**
> >+ * pvclock_gtod_register_notifier - register a pvclock timedata update listener
> >+ *
> >+ * Must hold write on timekeeper.lock
> >+ */
> >+int pvclock_gtod_register_notifier(struct notifier_block *nb)
> >+{
> >+	struct timekeeper *tk = &timekeeper;
> >+	unsigned long flags;
> >+	int ret;
> >+
> >+	write_seqlock_irqsave(&tk->lock, flags);
> >+	ret = raw_notifier_chain_register(&pvclock_gtod_chain, nb);
> >+	write_sequnlock_irqrestore(&tk->lock, flags);
> >+
> >+	return ret;
> >+}
> >+EXPORT_SYMBOL_GPL(pvclock_gtod_register_notifier);
> >+
> >+/**
> >+ * pvclock_gtod_unregister_notifier - unregister a pvclock
> >+ * timedata update listener
> >+ *
> >+ * Must hold write on timekeeper.lock
> >+ */
> >+int pvclock_gtod_unregister_notifier(struct notifier_block *nb)
> >+{
> >+	struct timekeeper *tk = &timekeeper;
> >+	unsigned long flags;
> >+	int ret;
> >+
> >+	write_seqlock_irqsave(&tk->lock, flags);
> >+	ret = raw_notifier_chain_unregister(&pvclock_gtod_chain, nb);
> >+	write_sequnlock_irqrestore(&tk->lock, flags);
> >+
> >+	return ret;
> >+}
> >+EXPORT_SYMBOL_GPL(pvclock_gtod_unregister_notifier);
> >+
> >+struct pvclock_gtod_data pvclock_gtod_data;
> >+EXPORT_SYMBOL_GPL(pvclock_gtod_data);
> >+
> >+static void update_pvclock_gtod(struct timekeeper *tk)
> >+{
> >+	struct pvclock_gtod_data *vdata = &pvclock_gtod_data;
> >+
> >+	write_seqcount_begin(&vdata->seq);
> >+
> >+	/* copy pvclock gtod data */
> >+	vdata->clock.vclock_mode	= tk->clock->archdata.vclock_mode;
> >+	vdata->clock.cycle_last		= tk->clock->cycle_last;
> >+	vdata->clock.mask		= tk->clock->mask;
> >+	vdata->clock.mult		= tk->mult;
> >+	vdata->clock.shift		= tk->shift;
> >+
> >+	vdata->monotonic_time_sec	= tk->xtime_sec
> >+					+ tk->wall_to_monotonic.tv_sec;
> >+	vdata->monotonic_time_snsec	= tk->xtime_nsec
> >+					+ (tk->wall_to_monotonic.tv_nsec
> >+						<< tk->shift);
> >+	while (vdata->monotonic_time_snsec >=
> >+					(((u64)NSEC_PER_SEC) << tk->shift)) {
> >+		vdata->monotonic_time_snsec -=
> >+					((u64)NSEC_PER_SEC) << tk->shift;
> >+		vdata->monotonic_time_sec++;
> >+	}
> >+
> >+	write_seqcount_end(&vdata->seq);
> >+	raw_notifier_call_chain(&pvclock_gtod_chain, 0, NULL);
> >+}
> >+
> 
> My only request is could the update_pvclock_gtod() be implemented
> similarly to the update_vsyscall, where the update function lives in
> the pvclock code (maybe using a weak symbol or something) so we
> don't have to have all these pvclock details in the timekeeping
> core?
> 
> thanks
> -john

In KVM code, yes, no problem.

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux