]>
Commit | Line | Data |
---|---|---|
9880552d GKH |
1 | From b70f4e85bfc4d7000036355b714a92d5c574f1be Mon Sep 17 00:00:00 2001 |
2 | From: Tony Luck <tony.luck@intel.com> | |
3 | Date: Wed, 30 Jun 2010 10:46:16 -0700 | |
4 | Subject: [IA64] Fix spinaphore down_spin() | |
5 | ||
6 | From: Tony Luck <tony.luck@intel.com> | |
7 | ||
8 | commit b70f4e85bfc4d7000036355b714a92d5c574f1be upstream. | |
9 | ||
10 | Typo in down_spin() meant it only read the low 32 bits of the | |
11 | "serve" value, instead of the full 64 bits. This results in the | |
12 | system hanging when the values in ticket/serve get larger than | |
13 | 32-bits. A big enough system running the right test can hit this | |
14 | in a just a few hours. | |
15 | ||
16 | Broken since 883a3acf5b0d4782ac35981227a0d094e8b44850 | |
17 | [IA64] Re-implement spinaphores using ticket lock concepts | |
18 | ||
19 | Reported via IRC by Bjorn Helgaas | |
20 | ||
21 | Signed-off-by: Tony Luck <tony.luck@intel.com> | |
22 | Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> | |
23 | ||
24 | --- | |
25 | arch/ia64/mm/tlb.c | 2 +- | |
26 | 1 file changed, 1 insertion(+), 1 deletion(-) | |
27 | ||
28 | --- a/arch/ia64/mm/tlb.c | |
29 | +++ b/arch/ia64/mm/tlb.c | |
30 | @@ -120,7 +120,7 @@ static inline void down_spin(struct spin | |
31 | ia64_invala(); | |
32 | ||
33 | for (;;) { | |
34 | - asm volatile ("ld4.c.nc %0=[%1]" : "=r"(serve) : "r"(&ss->serve) : "memory"); | |
35 | + asm volatile ("ld8.c.nc %0=[%1]" : "=r"(serve) : "r"(&ss->serve) : "memory"); | |
36 | if (time_before(t, serve)) | |
37 | return; | |
38 | cpu_relax(); |