Skip to contentSkip to conversation

Patch "ARC: udelay: fix inline assembler by adding LP_COUNT to clobber list" has been added to the 4.4-stable tree

PATCH [email protected] 1 participant 1 message Jan 30, 2017

Subsystems (2)
lore
Share & tools
lore

[email protected]

author maintainer Applied
#0 lore raw

This is a note to let you know that I've just added the patch titled

ARC: udelay: fix inline assembler by adding LP_COUNT to clobber list

to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
arc-udelay-fix-inline-assembler-by-adding-lp_count-to-clobber-list.patch
and it can be found in the queue-4.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.

Quoted 1 line

From 36425cd67052e3becf325fd4d3ba5691791ef7e4 Mon Sep 17 00:00:00 2001

From: Vineet Gupta <[email protected]>
Date: Tue, 24 Jan 2017 10:23:42 -0800
Subject: ARC: udelay: fix inline assembler by adding LP_COUNT to clobber list

From: Vineet Gupta <[email protected]>

commit 36425cd67052e3becf325fd4d3ba5691791ef7e4 upstream.

commit 3c7c7a2fc8811bc ("ARC: Don't use "+l" inline asm constraint") modified the inline assembly to setup LP_COUNT register manually and NOT rely on gcc to do it (with the +l inline assembler contraint hint, now being retired in the compiler)

However the fix was flawed as we didn't add LP_COUNT to asm clobber list, meaning gcc doesn't know that LP_COUNT or zero-delay-loops are in action in the inline asm.

This resulted in some fun - as nested ZOL loops were being generared

| mov lp_count,250000 ;16 # tmp235,
| lp .L__GCC__LP14 #		<======= OUTER LOOP (gcc generated)
|   .L14:
|   ld r2, [r5] # MEM[(volatile u32 *)prephitmp_43], w
|   dmb 1
|   breq r2, -1, @.L21 #, w,,
|   bbit0 r2,1,@.L13 # w,,
|   ld r4,[r7] ;25 # loops_per_jiffy, loops_per_jiffy
|   mpymu r3,r4,r6 #, loops_per_jiffy, tmp234
|
|   mov lp_count, r3 #		 <====== INNER LOOP (from inline asm)
|   lp 1f
| 	 nop
|   1:
|   nop_s
| .L__GCC__LP14: ; loop end, start is @.L14 #,

This caused issues with drivers relying on sane behaviour of udelay friends.

With LP_COUNT added to clobber list, gcc doesn't generate the outer loop in say above case.

Addresses STAR 9001146134

Fixes 3c7c7a2fc8811bc ("ARC: Don't use "+l" inline asm constraint")
---
 arch/arc/include/asm/delay.h |    4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
arch/arc/include/asm/delay.h +3 -1
@@ -26,7 +26,9 @@ static inline void __delay(unsigned long
 	"	lp  1f			\n"
 	"	nop			\n"
 	"1:				\n"
-	: : "r"(loops));
+	:
+        : "r"(loops)
+        : "lp_count");
 }
 
 extern void __bad_udelay(void);

Patches currently in stable-queue which might be from [email protected] are

queue-4.4/arc-udelay-fix-inline-assembler-by-adding-lp_count-to-clobber-list.patch queue-4.4/arc-handle-unaligned-access-delay-slot-corner-case.patch