aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorRuss Anderson <rja@sgi.com>2006-12-20 12:32:27 -0500
committerTony Luck <tony.luck@intel.com>2007-03-08 12:44:45 -0500
commit396e8e76c5eda19184e7b14ba9f1dcd5c4ea8d7e (patch)
tree992cff98c27c43ed49e935eed513e66cd77cdb01 /arch
parent618b206f0b580d965eb26f704ed23beee2a8c25d (diff)
[IA64] Cache error recovery
Similar to memory error recovery, when a cache error is consumed by a user process terminate the user instead of crashing the system. Signed-off-by: Russ Anderson (rja@sgi.com) Acked-by: Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/ia64/kernel/mca_drv.c32
1 files changed, 11 insertions, 21 deletions
diff --git a/arch/ia64/kernel/mca_drv.c b/arch/ia64/kernel/mca_drv.c
index 5e2d18fbce40..832cf1e647e8 100644
--- a/arch/ia64/kernel/mca_drv.c
+++ b/arch/ia64/kernel/mca_drv.c
@@ -602,6 +602,8 @@ recover_from_platform_error(slidx_table_t *slidx, peidx_table_t *peidx,
602 default: 602 default:
603 break; 603 break;
604 } 604 }
605 } else if (psp->cc && !psp->bc) { /* Cache error */
606 status = recover_from_read_error(slidx, peidx, pbci, sos);
605 } 607 }
606 608
607 return status; 609 return status;
@@ -645,13 +647,6 @@ recover_from_tlb_check(peidx_table_t *peidx)
645 * Return value: 647 * Return value:
646 * 1 on Success / 0 on Failure 648 * 1 on Success / 0 on Failure
647 */ 649 */
648/*
649 * Later we try to recover when below all conditions are satisfied.
650 * 1. Only one processor error section is exist.
651 * 2. BUS_CHECK is exist and the others are not exist.(Except TLB_CHECK)
652 * 3. The entry of BUS_CHECK_INFO is 1.
653 * 4. "External bus error" flag is set and the others are not set.
654 */
655 650
656static int 651static int
657recover_from_processor_error(int platform, slidx_table_t *slidx, 652recover_from_processor_error(int platform, slidx_table_t *slidx,
@@ -687,36 +682,31 @@ recover_from_processor_error(int platform, slidx_table_t *slidx,
687 /* 682 /*
688 * The cache check and bus check bits have four possible states 683 * The cache check and bus check bits have four possible states
689 * cc bc 684 * cc bc
690 * 0 0 Weird record, not recovered
691 * 1 0 Cache error, not recovered
692 * 0 1 I/O error, attempt recovery
693 * 1 1 Memory error, attempt recovery 685 * 1 1 Memory error, attempt recovery
686 * 1 0 Cache error, attempt recovery
687 * 0 1 I/O error, attempt recovery
688 * 0 0 Other error type, not recovered
694 */ 689 */
695 if (psp->bc == 0 || pbci == NULL) 690 if (psp->cc == 0 && (psp->bc == 0 || pbci == NULL))
696 return fatal_mca("No bus check"); 691 return fatal_mca("No cache or bus check");
697 692
698 /* 693 /*
699 * Sorry, we cannot handle so many. 694 * Cannot handle more than one bus check.
700 */ 695 */
701 if (peidx_bus_check_num(peidx) > 1) 696 if (peidx_bus_check_num(peidx) > 1)
702 return fatal_mca("Too many bus checks"); 697 return fatal_mca("Too many bus checks");
703 /* 698
704 * Well, here is only one bus error.
705 */
706 if (pbci->ib) 699 if (pbci->ib)
707 return fatal_mca("Internal Bus error"); 700 return fatal_mca("Internal Bus error");
708 if (pbci->cc)
709 return fatal_mca("Cache-cache error");
710 if (pbci->eb && pbci->bsi > 0) 701 if (pbci->eb && pbci->bsi > 0)
711 return fatal_mca("External bus check fatal status"); 702 return fatal_mca("External bus check fatal status");
712 703
713 /* 704 /*
714 * This is a local MCA and estimated as recoverble external bus error. 705 * This is a local MCA and estimated as a recoverble error.
715 * (e.g. a load from poisoned memory)
716 * This means "there are some platform errors".
717 */ 706 */
718 if (platform) 707 if (platform)
719 return recover_from_platform_error(slidx, peidx, pbci, sos); 708 return recover_from_platform_error(slidx, peidx, pbci, sos);
709
720 /* 710 /*
721 * On account of strange SAL error record, we cannot recover. 711 * On account of strange SAL error record, we cannot recover.
722 */ 712 */