cregit-Linux how code gets into the kernel

Release 4.10 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 <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 costaglauber 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 costaglauber de oliveira costa4790.38%150.00%
harvey harrisonharvey 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 tosattimarcelo 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 fitzhardingejeremy 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 tosattimarcelo tosatti3574.47%133.33%
paolo bonzinipaolo bonzini714.89%133.33%
minfei huangminfei 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 costaglauber costa6343.15%220.00%
gerd hoffmanngerd hoffmann3121.23%110.00%
marcelo tosattimarcelo tosatti3020.55%330.00%
paolo bonzinipaolo bonzini1913.01%220.00%
thomas gleixnerthomas gleixner21.37%110.00%
minfei huangminfei 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 hoffmanngerd hoffmann136100.00%1100.00%
Total136100.00%1100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
gerd hoffmanngerd hoffmann17737.82%15.56%
marcelo tosattimarcelo tosatti9921.15%633.33%
glauber costaglauber costa9119.44%316.67%
glauber de oliveira costaglauber de oliveira costa4710.04%15.56%
paolo bonzinipaolo bonzini265.56%211.11%
jeremy fitzhardingejeremy fitzhardinge153.21%15.56%
minfei huangminfei huang61.28%211.11%
harvey harrisonharvey harrison51.07%15.56%
thomas gleixnerthomas gleixner20.43%15.56%
Total468100.00%18100.00%
Directory: arch/x86/kernel
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.