diff --git a/pkgs/os-specific/linux/kernel/patches.nix b/pkgs/os-specific/linux/kernel/patches.nix index 694f6699b4f6..cdc67b9a3d54 100644 --- a/pkgs/os-specific/linux/kernel/patches.nix +++ b/pkgs/os-specific/linux/kernel/patches.nix @@ -199,20 +199,24 @@ in }; guruplug_defconfig = - { - # Default configuration for the GuruPlug. From + { # Default configuration for the GuruPlug. From # . name = "guruplug-defconfig"; patch = ./guruplug-defconfig.patch; }; guruplug_arch_number = - { - # Hack to match the `arch_number' of the U-Boot that ships with the + { # Hack to match the `arch_number' of the U-Boot that ships with the # GuruPlug. This is only needed when using this specific U-Boot # binary. See # . name = "guruplug-arch-number"; patch = ./guruplug-mach-type.patch; }; + + revert_pvclock_sync = + { name = "revert-pvclock-sync"; + patch = ./revert-pvclock-sync.patch; + }; + } diff --git a/pkgs/os-specific/linux/kernel/revert-pvclock-sync.patch b/pkgs/os-specific/linux/kernel/revert-pvclock-sync.patch new file mode 100644 index 000000000000..df29cfbf1825 --- /dev/null +++ b/pkgs/os-specific/linux/kernel/revert-pvclock-sync.patch @@ -0,0 +1,46 @@ +diff -ru -x '*~' linux-2.6.32.24-orig/arch/x86/kernel/pvclock.c linux-2.6.32.24/arch/x86/kernel/pvclock.c +--- linux-2.6.32.24-orig/arch/x86/kernel/pvclock.c 2010-10-01 22:51:56.000000000 +0200 ++++ linux-2.6.32.24/arch/x86/kernel/pvclock.c 2010-10-25 14:02:14.000000000 +0200 +@@ -109,14 +109,11 @@ + return pv_tsc_khz; + } + +-static atomic64_t last_value = ATOMIC64_INIT(0); +- + cycle_t pvclock_clocksource_read(struct pvclock_vcpu_time_info *src) + { + struct pvclock_shadow_time shadow; + unsigned version; + cycle_t ret, offset; +- u64 last; + + do { + version = pvclock_get_time_values(&shadow, src); +@@ -126,27 +123,6 @@ + barrier(); + } while (version != src->version); + +- /* +- * Assumption here is that last_value, a global accumulator, always goes +- * forward. If we are less than that, we should not be much smaller. +- * We assume there is an error marging we're inside, and then the correction +- * does not sacrifice accuracy. +- * +- * For reads: global may have changed between test and return, +- * but this means someone else updated poked the clock at a later time. +- * We just need to make sure we are not seeing a backwards event. +- * +- * For updates: last_value = ret is not enough, since two vcpus could be +- * updating at the same time, and one of them could be slightly behind, +- * making the assumption that last_value always go forward fail to hold. +- */ +- last = atomic64_read(&last_value); +- do { +- if (ret < last) +- return last; +- last = atomic64_cmpxchg(&last_value, last, ret); +- } while (unlikely(last != ret)); +- + return ret; + } + diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 53e36db9d7e1..92a23c1a5eb7 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -4584,6 +4584,7 @@ let kernelPatches.cifs_timeout kernelPatches.no_xsave kernelPatches.dell_rfkill + kernelPatches.revert_pvclock_sync ]; };