forked from mirrors/linux
		
	MIPS: Get rid of finish_arch_switch().
MIPS was using finish_arch_switch() as a hook to restore and initialize CPU context for all threads, even newly created kernel and user threads. This is however entirely solvable within switch_to() so get rid of finish_arch_switch() which is in the way of scheduler cleanups. Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
		
							parent
							
								
									f1f5e41485
								
							
						
					
					
						commit
						f51246efee
					
				
					 1 changed files with 25 additions and 27 deletions
				
			
		| 
						 | 
				
			
			@ -83,45 +83,43 @@ do {	if (cpu_has_rw_llb) {						\
 | 
			
		|||
	}								\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * For newly created kernel threads switch_to() will return to
 | 
			
		||||
 * ret_from_kernel_thread, newly created user threads to ret_from_fork.
 | 
			
		||||
 * That is, everything following resume() will be skipped for new threads.
 | 
			
		||||
 * So everything that matters to new threads should be placed before resume().
 | 
			
		||||
 */
 | 
			
		||||
#define switch_to(prev, next, last)					\
 | 
			
		||||
do {									\
 | 
			
		||||
	u32 __c0_stat;							\
 | 
			
		||||
	s32 __fpsave = FP_SAVE_NONE;					\
 | 
			
		||||
	__mips_mt_fpaff_switch_to(prev);				\
 | 
			
		||||
	if (cpu_has_dsp)						\
 | 
			
		||||
	if (cpu_has_dsp) {						\
 | 
			
		||||
		__save_dsp(prev);					\
 | 
			
		||||
	if (cop2_present && (KSTK_STATUS(prev) & ST0_CU2)) {		\
 | 
			
		||||
		if (cop2_lazy_restore)					\
 | 
			
		||||
			KSTK_STATUS(prev) &= ~ST0_CU2;			\
 | 
			
		||||
		__c0_stat = read_c0_status();				\
 | 
			
		||||
		write_c0_status(__c0_stat | ST0_CU2);			\
 | 
			
		||||
		cop2_save(prev);					\
 | 
			
		||||
		write_c0_status(__c0_stat & ~ST0_CU2);			\
 | 
			
		||||
		__restore_dsp(next);					\
 | 
			
		||||
	}								\
 | 
			
		||||
	if (cop2_present) {						\
 | 
			
		||||
		set_c0_status(ST0_CU2);					\
 | 
			
		||||
		if ((KSTK_STATUS(prev) & ST0_CU2)) {			\
 | 
			
		||||
			if (cop2_lazy_restore)				\
 | 
			
		||||
				KSTK_STATUS(prev) &= ~ST0_CU2;		\
 | 
			
		||||
			cop2_save(prev);				\
 | 
			
		||||
		}							\
 | 
			
		||||
		if (KSTK_STATUS(next) & ST0_CU2 &&			\
 | 
			
		||||
		    !cop2_lazy_restore) {				\
 | 
			
		||||
			cop2_restore(next);				\
 | 
			
		||||
		}							\
 | 
			
		||||
		clear_c0_status(ST0_CU2);				\
 | 
			
		||||
	}								\
 | 
			
		||||
	__clear_software_ll_bit();					\
 | 
			
		||||
	if (test_and_clear_tsk_thread_flag(prev, TIF_USEDFPU))		\
 | 
			
		||||
		__fpsave = FP_SAVE_SCALAR;				\
 | 
			
		||||
	if (test_and_clear_tsk_thread_flag(prev, TIF_USEDMSA))		\
 | 
			
		||||
		__fpsave = FP_SAVE_VECTOR;				\
 | 
			
		||||
	if (cpu_has_userlocal)						\
 | 
			
		||||
		write_c0_userlocal(task_thread_info(next)->tp_value);	\
 | 
			
		||||
	__restore_watch();						\
 | 
			
		||||
	disable_msa();							\
 | 
			
		||||
	(last) = resume(prev, next, task_thread_info(next), __fpsave);	\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define finish_arch_switch(prev)					\
 | 
			
		||||
do {									\
 | 
			
		||||
	u32 __c0_stat;							\
 | 
			
		||||
	if (cop2_present && !cop2_lazy_restore &&			\
 | 
			
		||||
			(KSTK_STATUS(current) & ST0_CU2)) {		\
 | 
			
		||||
		__c0_stat = read_c0_status();				\
 | 
			
		||||
		write_c0_status(__c0_stat | ST0_CU2);			\
 | 
			
		||||
		cop2_restore(current);					\
 | 
			
		||||
		write_c0_status(__c0_stat & ~ST0_CU2);			\
 | 
			
		||||
	}								\
 | 
			
		||||
	if (cpu_has_dsp)						\
 | 
			
		||||
		__restore_dsp(current);					\
 | 
			
		||||
	if (cpu_has_userlocal)						\
 | 
			
		||||
		write_c0_userlocal(current_thread_info()->tp_value);	\
 | 
			
		||||
	__restore_watch();						\
 | 
			
		||||
	disable_msa();							\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#endif /* _ASM_SWITCH_TO_H */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue