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

Commit e1fa2e13 authored by Benjamin Herrenschmidt's avatar Benjamin Herrenschmidt Committed by Linus Torvalds
Browse files

powerpc: fixup hard_irq_disable semantics



This patch renames the raw hard_irq_{enable,disable} into
__hard_irq_{enable,disable} and introduces a higher level hard_irq_disable()
function that can be used by any code to enforce that IRQs are fully disabled,
not only lazy disabled.

The difference with the __ versions is that it will update some per-processor
fields so that the kernel keeps track and properly re-enables them in the next
local_irq_disable();

This prepares powerpc for my next patch that introduces hard_irq_disable()
generically.

Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Paul Mackerras <paulus@samba.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 2acdb169
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -173,7 +173,7 @@ void local_irq_restore(unsigned long en)
		lv1_get_version_info(&tmp);
		lv1_get_version_info(&tmp);
	}
	}


	hard_irq_enable();
	__hard_irq_enable();
}
}
#endif /* CONFIG_PPC64 */
#endif /* CONFIG_PPC64 */


+0 −4
Original line number Original line Diff line number Diff line
@@ -36,8 +36,4 @@ void restore_processor_state(void)
#ifdef CONFIG_PPC32
#ifdef CONFIG_PPC32
	set_context(current->active_mm->context.id, current->active_mm->pgd);
	set_context(current->active_mm->context.id, current->active_mm->pgd);
#endif
#endif

#ifdef CONFIG_PPC64
	hard_irq_enable();
#endif
}
}
+2 −4
Original line number Original line Diff line number Diff line
@@ -43,12 +43,10 @@ static void cbe_power_save(void)
	unsigned long ctrl, thread_switch_control;
	unsigned long ctrl, thread_switch_control;


	/*
	/*
	 * We need to hard disable interrupts, but we also need to mark them
	 * We need to hard disable interrupts, the local_irq_enable() done by
	 * hard disabled in the PACA so that the local_irq_enable() done by
	 * our caller upon return will hard re-enable.
	 * our caller upon return propertly hard enables.
	 */
	 */
	hard_irq_disable();
	hard_irq_disable();
	get_paca()->hard_enabled = 0;


	ctrl = mfspr(SPRN_CTRLF);
	ctrl = mfspr(SPRN_CTRLF);


+9 −2
Original line number Original line Diff line number Diff line
@@ -48,8 +48,15 @@ extern void iseries_handle_interrupts(void);


#define irqs_disabled()		(local_get_flags() == 0)
#define irqs_disabled()		(local_get_flags() == 0)


#define hard_irq_enable()	__mtmsrd(mfmsr() | MSR_EE, 1)
#define __hard_irq_enable()	__mtmsrd(mfmsr() | MSR_EE, 1)
#define hard_irq_disable()	__mtmsrd(mfmsr() & ~MSR_EE, 1)
#define __hard_irq_disable()	__mtmsrd(mfmsr() & ~MSR_EE, 1)

#define  hard_irq_disable()			\
	do {					\
		__hard_irq_disable();		\
		get_paca()->soft_enabled = 0;	\
		get_paca()->hard_enabled = 0;	\
	} while(0)


#else
#else