mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	Commitf51246efee("MIPS: Get rid of finish_arch_switch().") moved the __restore_watch() call from finish_arch_switch() (i.e. after resume() returns) to before the resume() call in switch_to(). This results in watchpoints only being restored when a task is descheduled, preventing the watchpoints from being effective most of the time, except due to chance before the watchpoints are lazily removed. Fix the call sequence from switch_to() through to mips_install_watch_registers() to pass the task_struct pointer of the next task, instead of using current. This allows the watchpoints for the next (non-current) task to be restored without reintroducing finish_arch_switch(). Fixes:f51246efee("MIPS: Get rid of finish_arch_switch().") Signed-off-by: James Hogan <james.hogan@imgtec.com> Cc: Paul Burton <paul.burton@imgtec.com> Cc: linux-mips@linux-mips.org Cc: <stable@vger.kernel.org> # 4.3.x- Patchwork: https://patchwork.linux-mips.org/patch/12726/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
		
			
				
	
	
		
			32 lines
		
	
	
	
		
			827 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			32 lines
		
	
	
	
		
			827 B
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * This file is subject to the terms and conditions of the GNU General Public
 | 
						|
 * License.  See the file "COPYING" in the main directory of this archive
 | 
						|
 * for more details.
 | 
						|
 *
 | 
						|
 * Copyright (C) 2008 David Daney
 | 
						|
 */
 | 
						|
#ifndef _ASM_WATCH_H
 | 
						|
#define _ASM_WATCH_H
 | 
						|
 | 
						|
#include <linux/bitops.h>
 | 
						|
 | 
						|
#include <asm/mipsregs.h>
 | 
						|
 | 
						|
void mips_install_watch_registers(struct task_struct *t);
 | 
						|
void mips_read_watch_registers(void);
 | 
						|
void mips_clear_watch_registers(void);
 | 
						|
void mips_probe_watch_registers(struct cpuinfo_mips *c);
 | 
						|
 | 
						|
#ifdef CONFIG_HARDWARE_WATCHPOINTS
 | 
						|
#define __restore_watch(task) do {					\
 | 
						|
	if (unlikely(test_bit(TIF_LOAD_WATCH,				\
 | 
						|
			      &task_thread_info(task)->flags))) {	\
 | 
						|
		mips_install_watch_registers(task);			\
 | 
						|
	}								\
 | 
						|
} while (0)
 | 
						|
 | 
						|
#else
 | 
						|
#define __restore_watch(task) do {} while (0)
 | 
						|
#endif
 | 
						|
 | 
						|
#endif /* _ASM_WATCH_H */
 |