mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	By using lockdep_assert_*() from seqlock.h, the spaghetti monster
attacked.
Attack back by reducing seqlock.h dependencies from two key high level headers:
 - <linux/seqlock.h>:               -Remove <linux/ww_mutex.h>
 - <linux/time.h>:                  -Remove <linux/seqlock.h>
 - <linux/sched.h>:                 +Add    <linux/seqlock.h>
The price was to add it to sched.h ...
Core header fallout, we add direct header dependencies instead of gaining them
parasitically from higher level headers:
 - <linux/dynamic_queue_limits.h>:  +Add <asm/bug.h>
 - <linux/hrtimer.h>:               +Add <linux/seqlock.h>
 - <linux/ktime.h>:                 +Add <asm/bug.h>
 - <linux/lockdep.h>:               +Add <linux/smp.h>
 - <linux/sched.h>:                 +Add <linux/seqlock.h>
 - <linux/videodev2.h>:             +Add <linux/kernel.h>
Arch headers fallout:
 - PARISC: <asm/timex.h>:           +Add <asm/special_insns.h>
 - SH:     <asm/io.h>:              +Add <asm/page.h>
 - SPARC:  <asm/timer_64.h>:        +Add <uapi/asm/asi.h>
 - SPARC:  <asm/vvar.h>:            +Add <asm/processor.h>, <asm/barrier.h>
                                    -Remove <linux/seqlock.h>
 - X86:    <asm/fixmap.h>:          +Add <asm/pgtable_types.h>
                                    -Remove <asm/acpi.h>
There's also a bunch of parasitic header dependency fallout in .c files, not listed
separately.
[ mingo: Extended the changelog, split up & fixed the original patch. ]
Co-developed-by: Ingo Molnar <mingo@kernel.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Link: https://lore.kernel.org/r/20200804133438.GK2674@hirez.programming.kicks-ass.net
		
	
			
		
			
				
	
	
		
			69 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 *  Copyright (C) 2001 Andrea Arcangeli <andrea@suse.de> SuSE
 | 
						|
 *  Copyright 2003 Andi Kleen, SuSE Labs.
 | 
						|
 *
 | 
						|
 *  Thanks to hpa@transmeta.com for some useful hint.
 | 
						|
 *  Special thanks to Ingo Molnar for his early experience with
 | 
						|
 *  a different vsyscall implementation for Linux/IA32 and for the name.
 | 
						|
 */
 | 
						|
 | 
						|
#include <linux/time.h>
 | 
						|
#include <linux/timekeeper_internal.h>
 | 
						|
 | 
						|
#include <asm/vvar.h>
 | 
						|
 | 
						|
void update_vsyscall_tz(void)
 | 
						|
{
 | 
						|
	if (unlikely(vvar_data == NULL))
 | 
						|
		return;
 | 
						|
 | 
						|
	vvar_data->tz_minuteswest = sys_tz.tz_minuteswest;
 | 
						|
	vvar_data->tz_dsttime = sys_tz.tz_dsttime;
 | 
						|
}
 | 
						|
 | 
						|
void update_vsyscall(struct timekeeper *tk)
 | 
						|
{
 | 
						|
	struct vvar_data *vdata = vvar_data;
 | 
						|
 | 
						|
	if (unlikely(vdata == NULL))
 | 
						|
		return;
 | 
						|
 | 
						|
	vvar_write_begin(vdata);
 | 
						|
	vdata->vclock_mode = tk->tkr_mono.clock->archdata.vclock_mode;
 | 
						|
	vdata->clock.cycle_last = tk->tkr_mono.cycle_last;
 | 
						|
	vdata->clock.mask = tk->tkr_mono.mask;
 | 
						|
	vdata->clock.mult = tk->tkr_mono.mult;
 | 
						|
	vdata->clock.shift = tk->tkr_mono.shift;
 | 
						|
 | 
						|
	vdata->wall_time_sec = tk->xtime_sec;
 | 
						|
	vdata->wall_time_snsec = tk->tkr_mono.xtime_nsec;
 | 
						|
 | 
						|
	vdata->monotonic_time_sec = tk->xtime_sec +
 | 
						|
				    tk->wall_to_monotonic.tv_sec;
 | 
						|
	vdata->monotonic_time_snsec = tk->tkr_mono.xtime_nsec +
 | 
						|
				      (tk->wall_to_monotonic.tv_nsec <<
 | 
						|
				       tk->tkr_mono.shift);
 | 
						|
 | 
						|
	while (vdata->monotonic_time_snsec >=
 | 
						|
	       (((u64)NSEC_PER_SEC) << tk->tkr_mono.shift)) {
 | 
						|
		vdata->monotonic_time_snsec -=
 | 
						|
				((u64)NSEC_PER_SEC) << tk->tkr_mono.shift;
 | 
						|
		vdata->monotonic_time_sec++;
 | 
						|
	}
 | 
						|
 | 
						|
	vdata->wall_time_coarse_sec = tk->xtime_sec;
 | 
						|
	vdata->wall_time_coarse_nsec =
 | 
						|
			(long)(tk->tkr_mono.xtime_nsec >> tk->tkr_mono.shift);
 | 
						|
 | 
						|
	vdata->monotonic_time_coarse_sec =
 | 
						|
		vdata->wall_time_coarse_sec + tk->wall_to_monotonic.tv_sec;
 | 
						|
	vdata->monotonic_time_coarse_nsec =
 | 
						|
		vdata->wall_time_coarse_nsec + tk->wall_to_monotonic.tv_nsec;
 | 
						|
 | 
						|
	while (vdata->monotonic_time_coarse_nsec >= NSEC_PER_SEC) {
 | 
						|
		vdata->monotonic_time_coarse_nsec -= NSEC_PER_SEC;
 | 
						|
		vdata->monotonic_time_coarse_sec++;
 | 
						|
	}
 | 
						|
 | 
						|
	vvar_write_end(vdata);
 | 
						|
}
 |