diff options
Diffstat (limited to 'arch/s390/lib/delay.c')
| -rw-r--r-- | arch/s390/lib/delay.c | 14 | 
1 files changed, 9 insertions, 5 deletions
diff --git a/arch/s390/lib/delay.c b/arch/s390/lib/delay.c index 752b362bf65..7c37ec359ec 100644 --- a/arch/s390/lib/delay.c +++ b/arch/s390/lib/delay.c @@ -29,17 +29,21 @@ static void __udelay_disabled(unsigned long long usecs)  {  	unsigned long mask, cr0, cr0_saved;  	u64 clock_saved; +	u64 end; +	mask = psw_kernel_bits | PSW_MASK_WAIT | PSW_MASK_EXT; +	end = get_clock() + (usecs << 12);  	clock_saved = local_tick_disable(); -	set_clock_comparator(get_clock() + (usecs << 12));  	__ctl_store(cr0_saved, 0, 0);  	cr0 = (cr0_saved & 0xffff00e0) | 0x00000800;  	__ctl_load(cr0 , 0, 0); -	mask = psw_kernel_bits | PSW_MASK_WAIT | PSW_MASK_EXT;  	lockdep_off(); -	trace_hardirqs_on(); -	__load_psw_mask(mask); -	local_irq_disable(); +	do { +		set_clock_comparator(end); +		trace_hardirqs_on(); +		__load_psw_mask(mask); +		local_irq_disable(); +	} while (get_clock() < end);  	lockdep_on();  	__ctl_load(cr0_saved, 0, 0);  	local_tick_enable(clock_saved);  |