Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7ef363a3 authored by Thomas Gleixner's avatar Thomas Gleixner
Browse files

x86/kvmclock: Remove page size requirement from wall_clock



There is no requirement for wall_clock data to be page aligned or page
sized.

Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarPavel Tatashin <pasha.tatashin@oracle.com>
Acked-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Cc: steven.sistare@oracle.com
Cc: daniel.m.jordan@oracle.com
Cc: linux@armlinux.org.uk
Cc: schwidefsky@de.ibm.com
Cc: heiko.carstens@de.ibm.com
Cc: john.stultz@linaro.org
Cc: sboyd@codeaurora.org
Cc: hpa@zytor.com
Cc: douly.fnst@cn.fujitsu.com
Cc: peterz@infradead.org
Cc: prarit@redhat.com
Cc: feng.tang@intel.com
Cc: pmladek@suse.com
Cc: gnomes@lxorguk.ukuu.org.uk
Cc: linux-s390@vger.kernel.org
Cc: boris.ostrovsky@oracle.com
Cc: jgross@suse.com
Link: https://lkml.kernel.org/r/20180719205545.16512-3-pasha.tatashin@oracle.com
parent 368a540e
Loading
Loading
Loading
Loading
+4 −8
Original line number Original line Diff line number Diff line
@@ -46,14 +46,12 @@ early_param("no-kvmclock", parse_no_kvmclock);


/* Aligned to page sizes to match whats mapped via vsyscalls to userspace */
/* Aligned to page sizes to match whats mapped via vsyscalls to userspace */
#define HV_CLOCK_SIZE	(sizeof(struct pvclock_vsyscall_time_info) * NR_CPUS)
#define HV_CLOCK_SIZE	(sizeof(struct pvclock_vsyscall_time_info) * NR_CPUS)
#define WALL_CLOCK_SIZE	(sizeof(struct pvclock_wall_clock))


static u8 hv_clock_mem[PAGE_ALIGN(HV_CLOCK_SIZE)] __aligned(PAGE_SIZE);
static u8 hv_clock_mem[PAGE_ALIGN(HV_CLOCK_SIZE)] __aligned(PAGE_SIZE);
static u8 wall_clock_mem[PAGE_ALIGN(WALL_CLOCK_SIZE)] __aligned(PAGE_SIZE);


/* The hypervisor will put information about time periodically here */
/* The hypervisor will put information about time periodically here */
static struct pvclock_vsyscall_time_info *hv_clock;
static struct pvclock_vsyscall_time_info *hv_clock;
static struct pvclock_wall_clock *wall_clock;
static struct pvclock_wall_clock wall_clock;


/*
/*
 * The wallclock is the time of day when we booted. Since then, some time may
 * The wallclock is the time of day when we booted. Since then, some time may
@@ -66,15 +64,15 @@ static void kvm_get_wallclock(struct timespec64 *now)
	int low, high;
	int low, high;
	int cpu;
	int cpu;


	low = (int)slow_virt_to_phys(wall_clock);
	low = (int)slow_virt_to_phys(&wall_clock);
	high = ((u64)slow_virt_to_phys(wall_clock) >> 32);
	high = ((u64)slow_virt_to_phys(&wall_clock) >> 32);


	native_write_msr(msr_kvm_wall_clock, low, high);
	native_write_msr(msr_kvm_wall_clock, low, high);


	cpu = get_cpu();
	cpu = get_cpu();


	vcpu_time = &hv_clock[cpu].pvti;
	vcpu_time = &hv_clock[cpu].pvti;
	pvclock_read_wallclock(wall_clock, vcpu_time, now);
	pvclock_read_wallclock(&wall_clock, vcpu_time, now);


	put_cpu();
	put_cpu();
}
}
@@ -267,12 +265,10 @@ void __init kvmclock_init(void)
	} else if (!(kvmclock && kvm_para_has_feature(KVM_FEATURE_CLOCKSOURCE)))
	} else if (!(kvmclock && kvm_para_has_feature(KVM_FEATURE_CLOCKSOURCE)))
		return;
		return;


	wall_clock = (struct pvclock_wall_clock *)wall_clock_mem;
	hv_clock = (struct pvclock_vsyscall_time_info *)hv_clock_mem;
	hv_clock = (struct pvclock_vsyscall_time_info *)hv_clock_mem;


	if (kvm_register_clock("primary cpu clock")) {
	if (kvm_register_clock("primary cpu clock")) {
		hv_clock = NULL;
		hv_clock = NULL;
		wall_clock = NULL;
		return;
		return;
	}
	}