forked from mirrors/linux
		
	powerpc/irq: Don't open code irq_soft_mask helpers
Use READ_ONCE() and WRITE_ONCE() instead of open coding read and write of local PACA irq_soft_mask. For the write, add a barrier to keep the memory clobber that was there previously. Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/e2454434992cc932a5a34b695ae981c0b2f4c28e.1652862729.git.christophe.leroy@csgroup.eu
This commit is contained in:
		
							parent
							
								
									98552307e3
								
							
						
					
					
						commit
						ef5b570d37
					
				
					 1 changed files with 7 additions and 36 deletions
				
			
		|  | @ -113,14 +113,7 @@ static inline void __hard_RI_enable(void) | |||
| 
 | ||||
| static inline notrace unsigned long irq_soft_mask_return(void) | ||||
| { | ||||
| 	unsigned long flags; | ||||
| 
 | ||||
| 	asm volatile( | ||||
| 		"lbz %0,%1(13)" | ||||
| 		: "=r" (flags) | ||||
| 		: "i" (offsetof(struct paca_struct, irq_soft_mask))); | ||||
| 
 | ||||
| 	return flags; | ||||
| 	return READ_ONCE(local_paca->irq_soft_mask); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  | @ -148,46 +141,24 @@ static inline notrace void irq_soft_mask_set(unsigned long mask) | |||
| 	WARN_ON(mask && !(mask & IRQS_DISABLED)); | ||||
| #endif | ||||
| 
 | ||||
| 	asm volatile( | ||||
| 		"stb %0,%1(13)" | ||||
| 		: | ||||
| 		: "r" (mask), | ||||
| 		  "i" (offsetof(struct paca_struct, irq_soft_mask)) | ||||
| 		: "memory"); | ||||
| 	WRITE_ONCE(local_paca->irq_soft_mask, mask); | ||||
| 	barrier(); | ||||
| } | ||||
| 
 | ||||
| static inline notrace unsigned long irq_soft_mask_set_return(unsigned long mask) | ||||
| { | ||||
| 	unsigned long flags; | ||||
| 	unsigned long flags = irq_soft_mask_return(); | ||||
| 
 | ||||
| #ifdef CONFIG_PPC_IRQ_SOFT_MASK_DEBUG | ||||
| 	WARN_ON(mask && !(mask & IRQS_DISABLED)); | ||||
| #endif | ||||
| 
 | ||||
| 	asm volatile( | ||||
| 		"lbz %0,%1(13); stb %2,%1(13)" | ||||
| 		: "=&r" (flags) | ||||
| 		: "i" (offsetof(struct paca_struct, irq_soft_mask)), | ||||
| 		  "r" (mask) | ||||
| 		: "memory"); | ||||
| 	irq_soft_mask_set(mask); | ||||
| 
 | ||||
| 	return flags; | ||||
| } | ||||
| 
 | ||||
| static inline notrace unsigned long irq_soft_mask_or_return(unsigned long mask) | ||||
| { | ||||
| 	unsigned long flags, tmp; | ||||
| 	unsigned long flags = irq_soft_mask_return(); | ||||
| 
 | ||||
| 	asm volatile( | ||||
| 		"lbz %0,%2(13); or %1,%0,%3; stb %1,%2(13)" | ||||
| 		: "=&r" (flags), "=r" (tmp) | ||||
| 		: "i" (offsetof(struct paca_struct, irq_soft_mask)), | ||||
| 		  "r" (mask) | ||||
| 		: "memory"); | ||||
| 
 | ||||
| #ifdef CONFIG_PPC_IRQ_SOFT_MASK_DEBUG | ||||
| 	WARN_ON((mask | flags) && !((mask | flags) & IRQS_DISABLED)); | ||||
| #endif | ||||
| 	irq_soft_mask_set(flags | mask); | ||||
| 
 | ||||
| 	return flags; | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Christophe Leroy
						Christophe Leroy