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