cregit-Linux how code gets into the kernel

Release 4.14 arch/x86/kernel/pvclock.c

Directory: arch/x86/kernel
/*  paravirtual clock -- common code used by kvm/xen

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

#include <linux/kernel.h>
#include <linux/percpu.h>
#include <linux/notifier.h>
#include <linux/sched.h>
#include <linux/gfp.h>
#include <linux/bootmem.h>
#include <linux/nmi.h>

#include <asm/fixmap.h>
#include <asm/pvclock.h>


static u8 valid_flags __read_mostly = 0;


void pvclock_set_flags(u8 flags) { valid_flags = flags; }

Contributors

PersonTokensPropCommitsCommitProp
Glauber de Oliveira Costa12100.00%1100.00%
Total12100.00%1100.00%


unsigned long pvclock_tsc_khz(struct pvclock_vcpu_time_info *src) { u64 pv_tsc_khz = 1000000ULL << 32; do_div(pv_tsc_khz, src->tsc_to_system_mul); if (src->tsc_shift < 0) pv_tsc_khz <<= -src->tsc_shift; else pv_tsc_khz >>= src->tsc_shift; return pv_tsc_khz; }

Contributors

PersonTokensPropCommitsCommitProp
Glauber de Oliveira Costa4790.38%150.00%
Harvey Harrison59.62%150.00%
Total52100.00%2100.00%


void pvclock_touch_watchdogs(void) { touch_softlockup_watchdog_sync(); clocksource_touch_watchdog(); rcu_cpu_stall_reset(); reset_hung_task_detector(); }

Contributors

PersonTokensPropCommitsCommitProp
Marcelo Tosatti19100.00%2100.00%
Total19100.00%2100.00%

static atomic64_t last_value = ATOMIC64_INIT(0);
void pvclock_resume(void) { atomic64_set(&last_value, 0); }

Contributors

PersonTokensPropCommitsCommitProp
Jeremy Fitzhardinge15100.00%1100.00%
Total15100.00%1100.00%


u8 pvclock_read_flags(struct pvclock_vcpu_time_info *src) { unsigned version; u8 flags; do { version = pvclock_read_begin(src); flags = src->flags; } while (pvclock_read_retry(src, version)); return flags & valid_flags; }

Contributors

PersonTokensPropCommitsCommitProp
Marcelo Tosatti3574.47%133.33%
Paolo Bonzini714.89%133.33%
Minfei Huang510.64%133.33%
Total47100.00%3100.00%


u64 pvclock_clocksource_read(struct pvclock_vcpu_time_info *src) { unsigned version; u64 ret; u64 last; u8 flags; do { version = pvclock_read_begin(src); ret = __pvclock_read_cycles(src, rdtsc_ordered()); flags = src->flags; } while (pvclock_read_retry(src, version)); if (unlikely((flags & PVCLOCK_GUEST_STOPPED) != 0)) { src->flags &= ~PVCLOCK_GUEST_STOPPED; pvclock_touch_watchdogs(); } if ((valid_flags & PVCLOCK_TSC_STABLE_BIT) && (flags & PVCLOCK_TSC_STABLE_BIT)) return ret; /* * 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; }

Contributors

PersonTokensPropCommitsCommitProp
Glauber de Oliveira Costa6343.15%220.00%
Gerd Hoffmann3121.23%110.00%
Marcelo Tosatti3020.55%330.00%
Paolo Bonzini1913.01%220.00%
Thomas Gleixner21.37%110.00%
Minfei Huang10.68%110.00%
Total146100.00%10100.00%


void pvclock_read_wallclock(struct pvclock_wall_clock *wall_clock, struct pvclock_vcpu_time_info *vcpu_time, struct timespec *ts) { u32 version; u64 delta; struct timespec now; /* get wallclock at system boot */ do { version = wall_clock->version; rmb(); /* fetch version before time */ now.tv_sec = wall_clock->sec; now.tv_nsec = wall_clock->nsec; rmb(); /* fetch time before checking version */ } while ((wall_clock->version & 1) || (version != wall_clock->version)); delta = pvclock_clocksource_read(vcpu_time); /* time since system boot */ delta += now.tv_sec * (u64)NSEC_PER_SEC + now.tv_nsec; now.tv_nsec = do_div(delta, NSEC_PER_SEC); now.tv_sec = delta; set_normalized_timespec(ts, now.tv_sec, now.tv_nsec); }

Contributors

PersonTokensPropCommitsCommitProp
Gerd Hoffmann136100.00%1100.00%
Total136100.00%1100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
Gerd Hoffmann17737.58%15.26%
Glauber de Oliveira Costa13829.30%421.05%
Marcelo Tosatti9921.02%631.58%
Paolo Bonzini265.52%210.53%
Jeremy Fitzhardinge153.18%15.26%
Minfei Huang61.27%210.53%
Harvey Harrison51.06%15.26%
Ingo Molnar30.64%15.26%
Thomas Gleixner20.42%15.26%
Total471100.00%19100.00%
Directory: arch/x86/kernel
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.