* Re: [PATCH v3 2/2] pseries/mce: Refactor the pseries mce handling code
@ 2021-11-25 22:03 kernel test robot
0 siblings, 0 replies; 4+ messages in thread
From: kernel test robot @ 2021-11-25 22:03 UTC (permalink / raw)
To: kbuild
[-- Attachment #1: Type: text/plain, Size: 20898 bytes --]
CC: kbuild-all(a)lists.01.org
In-Reply-To: <20211124095500.98656-2-ganeshgr@linux.ibm.com>
References: <20211124095500.98656-2-ganeshgr@linux.ibm.com>
TO: Ganesh Goudar <ganeshgr@linux.ibm.com>
TO: linuxppc-dev(a)lists.ozlabs.org
TO: mpe(a)ellerman.id.au
CC: Ganesh Goudar <ganeshgr@linux.ibm.com>
CC: mahesh(a)linux.ibm.com
CC: npiggin(a)gmail.com
CC: dja(a)axtens.net
Hi Ganesh,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on powerpc/next]
[also build test WARNING on v5.16-rc2 next-20211125]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Ganesh-Goudar/powerpc-mce-Avoid-using-irq_work_queue-in-realmode/20211124-175800
base: https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next
:::::: branch date: 2 days ago
:::::: commit date: 2 days ago
config: powerpc64-randconfig-c024-20211124 (https://download.01.org/0day-ci/archive/20211126/202111260536.m57xOEqc-lkp(a)intel.com/config)
compiler: powerpc64-linux-gcc (GCC) 11.2.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Julia Lawall <julia.lawall@lip6.fr>
cocci warnings: (new ones prefixed by >>)
>> arch/powerpc/platforms/pseries/ras.c:550:6-8: WARNING: possible condition with no effect (if == else)
vim +550 arch/powerpc/platforms/pseries/ras.c
^1da177e4c3f41 arch/ppc64/kernel/ras.c Linus Torvalds 2005-04-16 513
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 514 static int mce_handle_error(struct pt_regs *regs, struct rtas_error_log *errp)
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 515 {
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 516 struct mce_error_info mce_err = { 0 };
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 517 unsigned long eaddr = 0, paddr = 0;
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 518 struct pseries_errorlog *pseries_log;
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 519 struct pseries_mc_errorlog *mce_log;
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 520 int disposition = rtas_error_disposition(errp);
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 521 int initiator = rtas_error_initiator(errp);
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 522 int severity = rtas_error_severity(errp);
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 523 u8 error_type, err_sub_type;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 524
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 525 if (initiator == RTAS_INITIATOR_UNKNOWN)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 526 mce_err.initiator = MCE_INITIATOR_UNKNOWN;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 527 else if (initiator == RTAS_INITIATOR_CPU)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 528 mce_err.initiator = MCE_INITIATOR_CPU;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 529 else if (initiator == RTAS_INITIATOR_PCI)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 530 mce_err.initiator = MCE_INITIATOR_PCI;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 531 else if (initiator == RTAS_INITIATOR_ISA)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 532 mce_err.initiator = MCE_INITIATOR_ISA;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 533 else if (initiator == RTAS_INITIATOR_MEMORY)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 534 mce_err.initiator = MCE_INITIATOR_MEMORY;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 535 else if (initiator == RTAS_INITIATOR_POWERMGM)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 536 mce_err.initiator = MCE_INITIATOR_POWERMGM;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 537 else
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 538 mce_err.initiator = MCE_INITIATOR_UNKNOWN;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 539
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 540 if (severity == RTAS_SEVERITY_NO_ERROR)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 541 mce_err.severity = MCE_SEV_NO_ERROR;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 542 else if (severity == RTAS_SEVERITY_EVENT)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 543 mce_err.severity = MCE_SEV_WARNING;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 544 else if (severity == RTAS_SEVERITY_WARNING)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 545 mce_err.severity = MCE_SEV_WARNING;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 546 else if (severity == RTAS_SEVERITY_ERROR_SYNC)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 547 mce_err.severity = MCE_SEV_SEVERE;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 548 else if (severity == RTAS_SEVERITY_ERROR)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 549 mce_err.severity = MCE_SEV_SEVERE;
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 @550 else if (severity == RTAS_SEVERITY_FATAL)
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 551 mce_err.severity = MCE_SEV_FATAL;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 552 else
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 553 mce_err.severity = MCE_SEV_FATAL;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 554
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 555 if (severity <= RTAS_SEVERITY_ERROR_SYNC)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 556 mce_err.sync_error = true;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 557 else
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 558 mce_err.sync_error = false;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 559
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 560 mce_err.error_type = MCE_ERROR_TYPE_UNKNOWN;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 561 mce_err.error_class = MCE_ECLASS_UNKNOWN;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 562
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 563 if (!rtas_error_extended(errp))
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 564 goto out;
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 565
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 566 pseries_log = get_pseries_errorlog(errp, PSERIES_ELOG_SECT_ID_MCE);
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 567 if (!pseries_log)
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 568 goto out;
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 569
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 570 mce_log = (struct pseries_mc_errorlog *)pseries_log->data;
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 571 error_type = mce_log->error_type;
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 572 err_sub_type = rtas_mc_error_sub_type(mce_log);
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 573
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 574 switch (mce_log->error_type) {
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 575 case MC_ERROR_TYPE_UE:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 576 mce_err.error_type = MCE_ERROR_TYPE_UE;
efbc4303b255bb arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2020-03-27 577 mce_common_process_ue(regs, &mce_err);
efbc4303b255bb arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2020-03-27 578 if (mce_err.ignore_event)
efbc4303b255bb arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2020-03-27 579 disposition = RTAS_DISP_FULLY_RECOVERED;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 580 switch (err_sub_type) {
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 581 case MC_ERROR_UE_IFETCH:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 582 mce_err.u.ue_error_type = MCE_UE_ERROR_IFETCH;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 583 break;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 584 case MC_ERROR_UE_PAGE_TABLE_WALK_IFETCH:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 585 mce_err.u.ue_error_type = MCE_UE_ERROR_PAGE_TABLE_WALK_IFETCH;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 586 break;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 587 case MC_ERROR_UE_LOAD_STORE:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 588 mce_err.u.ue_error_type = MCE_UE_ERROR_LOAD_STORE;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 589 break;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 590 case MC_ERROR_UE_PAGE_TABLE_WALK_LOAD_STORE:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 591 mce_err.u.ue_error_type = MCE_UE_ERROR_PAGE_TABLE_WALK_LOAD_STORE;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 592 break;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 593 case MC_ERROR_UE_INDETERMINATE:
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 594 default:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 595 mce_err.u.ue_error_type = MCE_UE_ERROR_INDETERMINATE;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 596 break;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 597 }
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 598 if (mce_log->sub_err_type & UE_EFFECTIVE_ADDR_PROVIDED)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 599 eaddr = be64_to_cpu(mce_log->effective_address);
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 600
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 601 if (mce_log->sub_err_type & UE_LOGICAL_ADDR_PROVIDED) {
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 602 paddr = be64_to_cpu(mce_log->logical_address);
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 603 } else if (mce_log->sub_err_type & UE_EFFECTIVE_ADDR_PROVIDED) {
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 604 unsigned long pfn;
c6d15258cdf1c1 arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 605
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 606 pfn = addr_to_pfn(regs, eaddr);
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 607 if (pfn != ULONG_MAX)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 608 paddr = pfn << PAGE_SHIFT;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 609 }
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 610
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 611 break;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 612 case MC_ERROR_TYPE_SLB:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 613 mce_err.error_type = MCE_ERROR_TYPE_SLB;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 614 switch (err_sub_type) {
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 615 case MC_ERROR_SLB_PARITY:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 616 mce_err.u.slb_error_type = MCE_SLB_ERROR_PARITY;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 617 break;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 618 case MC_ERROR_SLB_MULTIHIT:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 619 mce_err.u.slb_error_type = MCE_SLB_ERROR_MULTIHIT;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 620 break;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 621 case MC_ERROR_SLB_INDETERMINATE:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 622 default:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 623 mce_err.u.slb_error_type = MCE_SLB_ERROR_INDETERMINATE;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 624 break;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 625 }
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 626 if (mce_log->sub_err_type & 0x80)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 627 eaddr = be64_to_cpu(mce_log->effective_address);
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 628 break;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 629 case MC_ERROR_TYPE_ERAT:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 630 mce_err.error_type = MCE_ERROR_TYPE_ERAT;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 631 switch (err_sub_type) {
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 632 case MC_ERROR_ERAT_PARITY:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 633 mce_err.u.erat_error_type = MCE_ERAT_ERROR_PARITY;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 634 break;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 635 case MC_ERROR_ERAT_MULTIHIT:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 636 mce_err.u.erat_error_type = MCE_ERAT_ERROR_MULTIHIT;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 637 break;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 638 case MC_ERROR_ERAT_INDETERMINATE:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 639 default:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 640 mce_err.u.erat_error_type = MCE_ERAT_ERROR_INDETERMINATE;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 641 break;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 642 }
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 643 if (mce_log->sub_err_type & 0x80)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 644 eaddr = be64_to_cpu(mce_log->effective_address);
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 645 break;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 646 case MC_ERROR_TYPE_TLB:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 647 mce_err.error_type = MCE_ERROR_TYPE_TLB;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 648 switch (err_sub_type) {
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 649 case MC_ERROR_TLB_PARITY:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 650 mce_err.u.tlb_error_type = MCE_TLB_ERROR_PARITY;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 651 break;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 652 case MC_ERROR_TLB_MULTIHIT:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 653 mce_err.u.tlb_error_type = MCE_TLB_ERROR_MULTIHIT;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 654 break;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 655 case MC_ERROR_TLB_INDETERMINATE:
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 656 default:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 657 mce_err.u.tlb_error_type = MCE_TLB_ERROR_INDETERMINATE;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 658 break;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 659 }
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 660 if (mce_log->sub_err_type & 0x80)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 661 eaddr = be64_to_cpu(mce_log->effective_address);
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 662 break;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 663 case MC_ERROR_TYPE_D_CACHE:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 664 mce_err.error_type = MCE_ERROR_TYPE_DCACHE;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 665 break;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 666 case MC_ERROR_TYPE_I_CACHE:
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 667 mce_err.error_type = MCE_ERROR_TYPE_DCACHE;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 668 break;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 669 case MC_ERROR_TYPE_UNKNOWN:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 670 default:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 671 mce_err.error_type = MCE_ERROR_TYPE_UNKNOWN;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 672 break;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 673 }
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 674
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
^ permalink raw reply [flat|nested] 4+ messages in thread* [PATCH v3 1/2] powerpc/mce: Avoid using irq_work_queue() in realmode
@ 2021-11-24 9:54 Ganesh Goudar
2021-11-24 9:55 ` [PATCH v3 2/2] pseries/mce: Refactor the pseries mce handling code Ganesh Goudar
0 siblings, 1 reply; 4+ messages in thread
From: Ganesh Goudar @ 2021-11-24 9:54 UTC (permalink / raw)
To: linuxppc-dev, mpe; +Cc: Ganesh Goudar, mahesh, npiggin, dja
In realmode mce handler we use irq_work_queue() to defer
the processing of mce events, irq_work_queue() can only
be called when translation is enabled because it touches
memory outside RMA, hence we enable translation before
calling irq_work_queue and disable on return, though it
is not safe to do in realmode.
To avoid this, program the decrementer and call the event
processing functions from timer handler.
Signed-off-by: Ganesh Goudar <ganeshgr@linux.ibm.com>
---
V2:
* Use arch_irq_work_raise to raise decrementer interrupt.
* Avoid having atomic variable.
V3:
* Fix build error.
Reported by kernel test bot.
---
arch/powerpc/include/asm/machdep.h | 2 +
arch/powerpc/include/asm/mce.h | 2 +
arch/powerpc/include/asm/paca.h | 1 +
arch/powerpc/kernel/mce.c | 51 +++++++++++-------------
arch/powerpc/kernel/time.c | 3 ++
arch/powerpc/platforms/pseries/pseries.h | 1 +
arch/powerpc/platforms/pseries/ras.c | 31 +-------------
arch/powerpc/platforms/pseries/setup.c | 1 +
8 files changed, 34 insertions(+), 58 deletions(-)
diff --git a/arch/powerpc/include/asm/machdep.h b/arch/powerpc/include/asm/machdep.h
index 9c3c9f04129f..d22b222ba471 100644
--- a/arch/powerpc/include/asm/machdep.h
+++ b/arch/powerpc/include/asm/machdep.h
@@ -99,6 +99,8 @@ struct machdep_calls {
/* Called during machine check exception to retrive fixup address. */
bool (*mce_check_early_recovery)(struct pt_regs *regs);
+ void (*machine_check_log_err)(void);
+
/* Motherboard/chipset features. This is a kind of general purpose
* hook used to control some machine specific features (like reset
* lines, chip power control, etc...).
diff --git a/arch/powerpc/include/asm/mce.h b/arch/powerpc/include/asm/mce.h
index 331d944280b8..6e306aaf58aa 100644
--- a/arch/powerpc/include/asm/mce.h
+++ b/arch/powerpc/include/asm/mce.h
@@ -235,8 +235,10 @@ extern void machine_check_print_event_info(struct machine_check_event *evt,
unsigned long addr_to_pfn(struct pt_regs *regs, unsigned long addr);
extern void mce_common_process_ue(struct pt_regs *regs,
struct mce_error_info *mce_err);
+void machine_check_raise_dec_intr(void);
int mce_register_notifier(struct notifier_block *nb);
int mce_unregister_notifier(struct notifier_block *nb);
+void mce_run_late_handlers(void);
#ifdef CONFIG_PPC_BOOK3S_64
void flush_and_reload_slb(void);
void flush_erat(void);
diff --git a/arch/powerpc/include/asm/paca.h b/arch/powerpc/include/asm/paca.h
index dc05a862e72a..d463c796f7fa 100644
--- a/arch/powerpc/include/asm/paca.h
+++ b/arch/powerpc/include/asm/paca.h
@@ -280,6 +280,7 @@ struct paca_struct {
#endif
#ifdef CONFIG_PPC_BOOK3S_64
struct mce_info *mce_info;
+ u32 mces_to_process;
#endif /* CONFIG_PPC_BOOK3S_64 */
} ____cacheline_aligned;
diff --git a/arch/powerpc/kernel/mce.c b/arch/powerpc/kernel/mce.c
index fd829f7f25a4..8e17f29472a0 100644
--- a/arch/powerpc/kernel/mce.c
+++ b/arch/powerpc/kernel/mce.c
@@ -28,19 +28,9 @@
#include "setup.h"
-static void machine_check_process_queued_event(struct irq_work *work);
-static void machine_check_ue_irq_work(struct irq_work *work);
static void machine_check_ue_event(struct machine_check_event *evt);
static void machine_process_ue_event(struct work_struct *work);
-static struct irq_work mce_event_process_work = {
- .func = machine_check_process_queued_event,
-};
-
-static struct irq_work mce_ue_event_irq_work = {
- .func = machine_check_ue_irq_work,
-};
-
static DECLARE_WORK(mce_ue_event_work, machine_process_ue_event);
static BLOCKING_NOTIFIER_HEAD(mce_notifier_list);
@@ -89,6 +79,12 @@ static void mce_set_error_info(struct machine_check_event *mce,
}
}
+/* Raise decrementer interrupt */
+void machine_check_raise_dec_intr(void)
+{
+ arch_irq_work_raise();
+}
+
/*
* Decode and save high level MCE information into per cpu buffer which
* is an array of machine_check_event structure.
@@ -135,6 +131,8 @@ void save_mce_event(struct pt_regs *regs, long handled,
if (mce->error_type == MCE_ERROR_TYPE_UE)
mce->u.ue_error.ignore_event = mce_err->ignore_event;
+ local_paca->mces_to_process++;
+
if (!addr)
return;
@@ -217,7 +215,7 @@ void release_mce_event(void)
get_mce_event(NULL, true);
}
-static void machine_check_ue_irq_work(struct irq_work *work)
+static void machine_check_ue_work(void)
{
schedule_work(&mce_ue_event_work);
}
@@ -239,7 +237,7 @@ static void machine_check_ue_event(struct machine_check_event *evt)
evt, sizeof(*evt));
/* Queue work to process this event later. */
- irq_work_queue(&mce_ue_event_irq_work);
+ machine_check_raise_dec_intr();
}
/*
@@ -249,7 +247,6 @@ void machine_check_queue_event(void)
{
int index;
struct machine_check_event evt;
- unsigned long msr;
if (!get_mce_event(&evt, MCE_EVENT_RELEASE))
return;
@@ -263,20 +260,7 @@ void machine_check_queue_event(void)
memcpy(&local_paca->mce_info->mce_event_queue[index],
&evt, sizeof(evt));
- /*
- * Queue irq work to process this event later. Before
- * queuing the work enable translation for non radix LPAR,
- * as irq_work_queue may try to access memory outside RMO
- * region.
- */
- if (!radix_enabled() && firmware_has_feature(FW_FEATURE_LPAR)) {
- msr = mfmsr();
- mtmsr(msr | MSR_IR | MSR_DR);
- irq_work_queue(&mce_event_process_work);
- mtmsr(msr);
- } else {
- irq_work_queue(&mce_event_process_work);
- }
+ machine_check_raise_dec_intr();
}
void mce_common_process_ue(struct pt_regs *regs,
@@ -338,7 +322,7 @@ static void machine_process_ue_event(struct work_struct *work)
* process pending MCE event from the mce event queue. This function will be
* called during syscall exit.
*/
-static void machine_check_process_queued_event(struct irq_work *work)
+static void machine_check_process_queued_event(void)
{
int index;
struct machine_check_event *evt;
@@ -363,6 +347,17 @@ static void machine_check_process_queued_event(struct irq_work *work)
}
}
+void mce_run_late_handlers(void)
+{
+ if (unlikely(local_paca->mces_to_process)) {
+ if (ppc_md.machine_check_log_err)
+ ppc_md.machine_check_log_err();
+ machine_check_process_queued_event();
+ machine_check_ue_work();
+ local_paca->mces_to_process--;
+ }
+}
+
void machine_check_print_event_info(struct machine_check_event *evt,
bool user_mode, bool in_guest)
{
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
index cae8f03a44fe..94c591b6f9d2 100644
--- a/arch/powerpc/kernel/time.c
+++ b/arch/powerpc/kernel/time.c
@@ -594,6 +594,9 @@ DEFINE_INTERRUPT_HANDLER_ASYNC(timer_interrupt)
if (test_irq_work_pending()) {
clear_irq_work_pending();
+#ifdef CONFIG_PPC_BOOK3S_64
+ mce_run_late_handlers();
+#endif
irq_work_run();
}
diff --git a/arch/powerpc/platforms/pseries/pseries.h b/arch/powerpc/platforms/pseries/pseries.h
index 3544778e06d0..9cf0d33dfbf5 100644
--- a/arch/powerpc/platforms/pseries/pseries.h
+++ b/arch/powerpc/platforms/pseries/pseries.h
@@ -21,6 +21,7 @@ struct pt_regs;
extern int pSeries_system_reset_exception(struct pt_regs *regs);
extern int pSeries_machine_check_exception(struct pt_regs *regs);
extern long pseries_machine_check_realmode(struct pt_regs *regs);
+void pSeries_machine_check_log_err(void);
#ifdef CONFIG_SMP
extern void smp_init_pseries(void);
diff --git a/arch/powerpc/platforms/pseries/ras.c b/arch/powerpc/platforms/pseries/ras.c
index 56092dccfdb8..8613f9cc5798 100644
--- a/arch/powerpc/platforms/pseries/ras.c
+++ b/arch/powerpc/platforms/pseries/ras.c
@@ -23,11 +23,6 @@ static DEFINE_SPINLOCK(ras_log_buf_lock);
static int ras_check_exception_token;
-static void mce_process_errlog_event(struct irq_work *work);
-static struct irq_work mce_errlog_process_work = {
- .func = mce_process_errlog_event,
-};
-
#define EPOW_SENSOR_TOKEN 9
#define EPOW_SENSOR_INDEX 0
@@ -729,40 +724,16 @@ static int mce_handle_error(struct pt_regs *regs, struct rtas_error_log *errp)
error_type = mce_log->error_type;
disposition = mce_handle_err_realmode(disposition, error_type);
-
- /*
- * Enable translation as we will be accessing per-cpu variables
- * in save_mce_event() which may fall outside RMO region, also
- * leave it enabled because subsequently we will be queuing work
- * to workqueues where again per-cpu variables accessed, besides
- * fwnmi_release_errinfo() crashes when called in realmode on
- * pseries.
- * Note: All the realmode handling like flushing SLB entries for
- * SLB multihit is done by now.
- */
out:
- msr = mfmsr();
- mtmsr(msr | MSR_IR | MSR_DR);
-
disposition = mce_handle_err_virtmode(regs, errp, mce_log,
disposition);
-
- /*
- * Queue irq work to log this rtas event later.
- * irq_work_queue uses per-cpu variables, so do this in virt
- * mode as well.
- */
- irq_work_queue(&mce_errlog_process_work);
-
- mtmsr(msr);
-
return disposition;
}
/*
* Process MCE rtas errlog event.
*/
-static void mce_process_errlog_event(struct irq_work *work)
+void pSeries_machine_check_log_err(void)
{
struct rtas_error_log *err;
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c
index 8a62af5b9c24..9bdc487b8e35 100644
--- a/arch/powerpc/platforms/pseries/setup.c
+++ b/arch/powerpc/platforms/pseries/setup.c
@@ -1084,6 +1084,7 @@ define_machine(pseries) {
.system_reset_exception = pSeries_system_reset_exception,
.machine_check_early = pseries_machine_check_realmode,
.machine_check_exception = pSeries_machine_check_exception,
+ .machine_check_log_err = pSeries_machine_check_log_err,
#ifdef CONFIG_KEXEC_CORE
.machine_kexec = pSeries_machine_kexec,
.kexec_cpu_down = pseries_kexec_cpu_down,
--
2.31.1
^ permalink raw reply related [flat|nested] 4+ messages in thread* [PATCH v3 2/2] pseries/mce: Refactor the pseries mce handling code
2021-11-24 9:54 [PATCH v3 1/2] powerpc/mce: Avoid using irq_work_queue() in realmode Ganesh Goudar
@ 2021-11-24 9:55 ` Ganesh Goudar
2021-11-24 13:10 ` Nicholas Piggin
0 siblings, 1 reply; 4+ messages in thread
From: Ganesh Goudar @ 2021-11-24 9:55 UTC (permalink / raw)
To: linuxppc-dev, mpe; +Cc: Ganesh Goudar, mahesh, npiggin, dja
Now that we are no longer switching on the mmu in realmode
mce handler, Revert the commit 4ff753feab02("powerpc/pseries:
Avoid using addr_to_pfn in real mode") partially, which
introduced functions mce_handle_err_virtmode/realmode() to
separate mce handler code which needed translation to enabled.
Signed-off-by: Ganesh Goudar <ganeshgr@linux.ibm.com>
---
arch/powerpc/platforms/pseries/ras.c | 122 +++++++++++----------------
1 file changed, 49 insertions(+), 73 deletions(-)
diff --git a/arch/powerpc/platforms/pseries/ras.c b/arch/powerpc/platforms/pseries/ras.c
index 8613f9cc5798..62e1519b8355 100644
--- a/arch/powerpc/platforms/pseries/ras.c
+++ b/arch/powerpc/platforms/pseries/ras.c
@@ -511,58 +511,17 @@ int pSeries_system_reset_exception(struct pt_regs *regs)
return 0; /* need to perform reset */
}
-static int mce_handle_err_realmode(int disposition, u8 error_type)
-{
-#ifdef CONFIG_PPC_BOOK3S_64
- if (disposition == RTAS_DISP_NOT_RECOVERED) {
- switch (error_type) {
- case MC_ERROR_TYPE_ERAT:
- flush_erat();
- disposition = RTAS_DISP_FULLY_RECOVERED;
- break;
- case MC_ERROR_TYPE_SLB:
- /*
- * Store the old slb content in paca before flushing.
- * Print this when we go to virtual mode.
- * There are chances that we may hit MCE again if there
- * is a parity error on the SLB entry we trying to read
- * for saving. Hence limit the slb saving to single
- * level of recursion.
- */
- if (local_paca->in_mce == 1)
- slb_save_contents(local_paca->mce_faulty_slbs);
- flush_and_reload_slb();
- disposition = RTAS_DISP_FULLY_RECOVERED;
- break;
- default:
- break;
- }
- } else if (disposition == RTAS_DISP_LIMITED_RECOVERY) {
- /* Platform corrected itself but could be degraded */
- pr_err("MCE: limited recovery, system may be degraded\n");
- disposition = RTAS_DISP_FULLY_RECOVERED;
- }
-#endif
- return disposition;
-}
-
-static int mce_handle_err_virtmode(struct pt_regs *regs,
- struct rtas_error_log *errp,
- struct pseries_mc_errorlog *mce_log,
- int disposition)
+static int mce_handle_error(struct pt_regs *regs, struct rtas_error_log *errp)
{
struct mce_error_info mce_err = { 0 };
+ unsigned long eaddr = 0, paddr = 0;
+ struct pseries_errorlog *pseries_log;
+ struct pseries_mc_errorlog *mce_log;
+ int disposition = rtas_error_disposition(errp);
int initiator = rtas_error_initiator(errp);
int severity = rtas_error_severity(errp);
- unsigned long eaddr = 0, paddr = 0;
u8 error_type, err_sub_type;
- if (!mce_log)
- goto out;
-
- error_type = mce_log->error_type;
- err_sub_type = rtas_mc_error_sub_type(mce_log);
-
if (initiator == RTAS_INITIATOR_UNKNOWN)
mce_err.initiator = MCE_INITIATOR_UNKNOWN;
else if (initiator == RTAS_INITIATOR_CPU)
@@ -588,6 +547,8 @@ static int mce_handle_err_virtmode(struct pt_regs *regs,
mce_err.severity = MCE_SEV_SEVERE;
else if (severity == RTAS_SEVERITY_ERROR)
mce_err.severity = MCE_SEV_SEVERE;
+ else if (severity == RTAS_SEVERITY_FATAL)
+ mce_err.severity = MCE_SEV_FATAL;
else
mce_err.severity = MCE_SEV_FATAL;
@@ -599,7 +560,18 @@ static int mce_handle_err_virtmode(struct pt_regs *regs,
mce_err.error_type = MCE_ERROR_TYPE_UNKNOWN;
mce_err.error_class = MCE_ECLASS_UNKNOWN;
- switch (error_type) {
+ if (!rtas_error_extended(errp))
+ goto out;
+
+ pseries_log = get_pseries_errorlog(errp, PSERIES_ELOG_SECT_ID_MCE);
+ if (!pseries_log)
+ goto out;
+
+ mce_log = (struct pseries_mc_errorlog *)pseries_log->data;
+ error_type = mce_log->error_type;
+ err_sub_type = rtas_mc_error_sub_type(mce_log);
+
+ switch (mce_log->error_type) {
case MC_ERROR_TYPE_UE:
mce_err.error_type = MCE_ERROR_TYPE_UE;
mce_common_process_ue(regs, &mce_err);
@@ -692,41 +664,45 @@ static int mce_handle_err_virtmode(struct pt_regs *regs,
mce_err.error_type = MCE_ERROR_TYPE_DCACHE;
break;
case MC_ERROR_TYPE_I_CACHE:
- mce_err.error_type = MCE_ERROR_TYPE_ICACHE;
+ mce_err.error_type = MCE_ERROR_TYPE_DCACHE;
break;
case MC_ERROR_TYPE_UNKNOWN:
default:
mce_err.error_type = MCE_ERROR_TYPE_UNKNOWN;
break;
}
+
+#ifdef CONFIG_PPC_BOOK3S_64
+ if (disposition == RTAS_DISP_NOT_RECOVERED) {
+ switch (error_type) {
+ case MC_ERROR_TYPE_SLB:
+ case MC_ERROR_TYPE_ERAT:
+ /*
+ * Store the old slb content in paca before flushing.
+ * Print this when we go to virtual mode.
+ * There are chances that we may hit MCE again if there
+ * is a parity error on the SLB entry we trying to read
+ * for saving. Hence limit the slb saving to single
+ * level of recursion.
+ */
+ if (local_paca->in_mce == 1)
+ slb_save_contents(local_paca->mce_faulty_slbs);
+ flush_and_reload_slb();
+ disposition = RTAS_DISP_FULLY_RECOVERED;
+ break;
+ default:
+ break;
+ }
+ } else if (disposition == RTAS_DISP_LIMITED_RECOVERY) {
+ /* Platform corrected itself but could be degraded */
+ pr_err("MCE: limited recovery, system may be degraded\n");
+ disposition = RTAS_DISP_FULLY_RECOVERED;
+ }
+#endif
out:
save_mce_event(regs, disposition == RTAS_DISP_FULLY_RECOVERED,
- &mce_err, regs->nip, eaddr, paddr);
- return disposition;
-}
+ &mce_err, regs->nip, eaddr, paddr);
-static int mce_handle_error(struct pt_regs *regs, struct rtas_error_log *errp)
-{
- struct pseries_errorlog *pseries_log;
- struct pseries_mc_errorlog *mce_log = NULL;
- int disposition = rtas_error_disposition(errp);
- unsigned long msr;
- u8 error_type;
-
- if (!rtas_error_extended(errp))
- goto out;
-
- pseries_log = get_pseries_errorlog(errp, PSERIES_ELOG_SECT_ID_MCE);
- if (!pseries_log)
- goto out;
-
- mce_log = (struct pseries_mc_errorlog *)pseries_log->data;
- error_type = mce_log->error_type;
-
- disposition = mce_handle_err_realmode(disposition, error_type);
-out:
- disposition = mce_handle_err_virtmode(regs, errp, mce_log,
- disposition);
return disposition;
}
--
2.31.1
^ permalink raw reply related [flat|nested] 4+ messages in thread* Re: [PATCH v3 2/2] pseries/mce: Refactor the pseries mce handling code
2021-11-24 9:55 ` [PATCH v3 2/2] pseries/mce: Refactor the pseries mce handling code Ganesh Goudar
@ 2021-11-24 13:10 ` Nicholas Piggin
2022-01-17 8:11 ` Ganesh
0 siblings, 1 reply; 4+ messages in thread
From: Nicholas Piggin @ 2021-11-24 13:10 UTC (permalink / raw)
To: Ganesh Goudar, linuxppc-dev, mpe; +Cc: mahesh, dja
Excerpts from Ganesh Goudar's message of November 24, 2021 7:55 pm:
> Now that we are no longer switching on the mmu in realmode
> mce handler, Revert the commit 4ff753feab02("powerpc/pseries:
> Avoid using addr_to_pfn in real mode") partially, which
> introduced functions mce_handle_err_virtmode/realmode() to
> separate mce handler code which needed translation to enabled.
>
> Signed-off-by: Ganesh Goudar <ganeshgr@linux.ibm.com>
> ---
> arch/powerpc/platforms/pseries/ras.c | 122 +++++++++++----------------
> 1 file changed, 49 insertions(+), 73 deletions(-)
>
> diff --git a/arch/powerpc/platforms/pseries/ras.c b/arch/powerpc/platforms/pseries/ras.c
> index 8613f9cc5798..62e1519b8355 100644
> --- a/arch/powerpc/platforms/pseries/ras.c
> +++ b/arch/powerpc/platforms/pseries/ras.c
> @@ -511,58 +511,17 @@ int pSeries_system_reset_exception(struct pt_regs *regs)
> return 0; /* need to perform reset */
> }
>
> -static int mce_handle_err_realmode(int disposition, u8 error_type)
> -{
> -#ifdef CONFIG_PPC_BOOK3S_64
> - if (disposition == RTAS_DISP_NOT_RECOVERED) {
> - switch (error_type) {
> - case MC_ERROR_TYPE_ERAT:
> - flush_erat();
> - disposition = RTAS_DISP_FULLY_RECOVERED;
> - break;
> - case MC_ERROR_TYPE_SLB:
> - /*
> - * Store the old slb content in paca before flushing.
> - * Print this when we go to virtual mode.
> - * There are chances that we may hit MCE again if there
> - * is a parity error on the SLB entry we trying to read
> - * for saving. Hence limit the slb saving to single
> - * level of recursion.
> - */
> - if (local_paca->in_mce == 1)
> - slb_save_contents(local_paca->mce_faulty_slbs);
> - flush_and_reload_slb();
> - disposition = RTAS_DISP_FULLY_RECOVERED;
> - break;
> - default:
> - break;
> - }
> - } else if (disposition == RTAS_DISP_LIMITED_RECOVERY) {
> - /* Platform corrected itself but could be degraded */
> - pr_err("MCE: limited recovery, system may be degraded\n");
> - disposition = RTAS_DISP_FULLY_RECOVERED;
> - }
> -#endif
> - return disposition;
> -}
> -
> -static int mce_handle_err_virtmode(struct pt_regs *regs,
> - struct rtas_error_log *errp,
> - struct pseries_mc_errorlog *mce_log,
> - int disposition)
> +static int mce_handle_error(struct pt_regs *regs, struct rtas_error_log *errp)
> {
> struct mce_error_info mce_err = { 0 };
> + unsigned long eaddr = 0, paddr = 0;
> + struct pseries_errorlog *pseries_log;
> + struct pseries_mc_errorlog *mce_log;
> + int disposition = rtas_error_disposition(errp);
> int initiator = rtas_error_initiator(errp);
> int severity = rtas_error_severity(errp);
> - unsigned long eaddr = 0, paddr = 0;
> u8 error_type, err_sub_type;
>
> - if (!mce_log)
> - goto out;
> -
> - error_type = mce_log->error_type;
> - err_sub_type = rtas_mc_error_sub_type(mce_log);
> -
> if (initiator == RTAS_INITIATOR_UNKNOWN)
> mce_err.initiator = MCE_INITIATOR_UNKNOWN;
> else if (initiator == RTAS_INITIATOR_CPU)
> @@ -588,6 +547,8 @@ static int mce_handle_err_virtmode(struct pt_regs *regs,
> mce_err.severity = MCE_SEV_SEVERE;
> else if (severity == RTAS_SEVERITY_ERROR)
> mce_err.severity = MCE_SEV_SEVERE;
> + else if (severity == RTAS_SEVERITY_FATAL)
> + mce_err.severity = MCE_SEV_FATAL;
> else
> mce_err.severity = MCE_SEV_FATAL;
>
What's this hunk for?
> @@ -599,7 +560,18 @@ static int mce_handle_err_virtmode(struct pt_regs *regs,
> mce_err.error_type = MCE_ERROR_TYPE_UNKNOWN;
> mce_err.error_class = MCE_ECLASS_UNKNOWN;
>
> - switch (error_type) {
> + if (!rtas_error_extended(errp))
> + goto out;
> +
> + pseries_log = get_pseries_errorlog(errp, PSERIES_ELOG_SECT_ID_MCE);
> + if (!pseries_log)
> + goto out;
> +
> + mce_log = (struct pseries_mc_errorlog *)pseries_log->data;
> + error_type = mce_log->error_type;
> + err_sub_type = rtas_mc_error_sub_type(mce_log);
> +
> + switch (mce_log->error_type) {
> case MC_ERROR_TYPE_UE:
> mce_err.error_type = MCE_ERROR_TYPE_UE;
> mce_common_process_ue(regs, &mce_err);
> @@ -692,41 +664,45 @@ static int mce_handle_err_virtmode(struct pt_regs *regs,
> mce_err.error_type = MCE_ERROR_TYPE_DCACHE;
> break;
> case MC_ERROR_TYPE_I_CACHE:
> - mce_err.error_type = MCE_ERROR_TYPE_ICACHE;
> + mce_err.error_type = MCE_ERROR_TYPE_DCACHE;
> break;
And this one. Doesn't look right.
> case MC_ERROR_TYPE_UNKNOWN:
> default:
> mce_err.error_type = MCE_ERROR_TYPE_UNKNOWN;
> break;
> }
> +
> +#ifdef CONFIG_PPC_BOOK3S_64
> + if (disposition == RTAS_DISP_NOT_RECOVERED) {
> + switch (error_type) {
> + case MC_ERROR_TYPE_SLB:
> + case MC_ERROR_TYPE_ERAT:
> + /*
> + * Store the old slb content in paca before flushing.
> + * Print this when we go to virtual mode.
> + * There are chances that we may hit MCE again if there
> + * is a parity error on the SLB entry we trying to read
> + * for saving. Hence limit the slb saving to single
> + * level of recursion.
> + */
> + if (local_paca->in_mce == 1)
> + slb_save_contents(local_paca->mce_faulty_slbs);
> + flush_and_reload_slb();
> + disposition = RTAS_DISP_FULLY_RECOVERED;
> + break;
> + default:
> + break;
> + }
> + } else if (disposition == RTAS_DISP_LIMITED_RECOVERY) {
> + /* Platform corrected itself but could be degraded */
> + pr_err("MCE: limited recovery, system may be degraded\n");
> + disposition = RTAS_DISP_FULLY_RECOVERED;
> + }
I would prefer if you just keep the mce_handle_err_realmode function
(can rename it if you want). It's actually changed a bit since the
patch being reverted so we don't want to undo that.
Thanks,
Nick
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [PATCH v3 2/2] pseries/mce: Refactor the pseries mce handling code
2021-11-24 13:10 ` Nicholas Piggin
@ 2022-01-17 8:11 ` Ganesh
0 siblings, 0 replies; 4+ messages in thread
From: Ganesh @ 2022-01-17 8:11 UTC (permalink / raw)
To: Nicholas Piggin, linuxppc-dev, mpe; +Cc: mahesh, dja
[-- Attachment #1: Type: text/plain, Size: 5937 bytes --]
On 11/24/21 18:40, Nicholas Piggin wrote:
> Excerpts from Ganesh Goudar's message of November 24, 2021 7:55 pm:
>> Now that we are no longer switching on the mmu in realmode
>> mce handler, Revert the commit 4ff753feab02("powerpc/pseries:
>> Avoid using addr_to_pfn in real mode") partially, which
>> introduced functions mce_handle_err_virtmode/realmode() to
>> separate mce handler code which needed translation to enabled.
>>
>> Signed-off-by: Ganesh Goudar<ganeshgr@linux.ibm.com>
>> ---
>> arch/powerpc/platforms/pseries/ras.c | 122 +++++++++++----------------
>> 1 file changed, 49 insertions(+), 73 deletions(-)
>>
>> diff --git a/arch/powerpc/platforms/pseries/ras.c b/arch/powerpc/platforms/pseries/ras.c
>> index 8613f9cc5798..62e1519b8355 100644
>> --- a/arch/powerpc/platforms/pseries/ras.c
>> +++ b/arch/powerpc/platforms/pseries/ras.c
>> @@ -511,58 +511,17 @@ int pSeries_system_reset_exception(struct pt_regs *regs)
>> return 0; /* need to perform reset */
>> }
>>
>> -static int mce_handle_err_realmode(int disposition, u8 error_type)
>> -{
>> -#ifdef CONFIG_PPC_BOOK3S_64
>> - if (disposition == RTAS_DISP_NOT_RECOVERED) {
>> - switch (error_type) {
>> - case MC_ERROR_TYPE_ERAT:
>> - flush_erat();
>> - disposition = RTAS_DISP_FULLY_RECOVERED;
>> - break;
>> - case MC_ERROR_TYPE_SLB:
>> - /*
>> - * Store the old slb content in paca before flushing.
>> - * Print this when we go to virtual mode.
>> - * There are chances that we may hit MCE again if there
>> - * is a parity error on the SLB entry we trying to read
>> - * for saving. Hence limit the slb saving to single
>> - * level of recursion.
>> - */
>> - if (local_paca->in_mce == 1)
>> - slb_save_contents(local_paca->mce_faulty_slbs);
>> - flush_and_reload_slb();
>> - disposition = RTAS_DISP_FULLY_RECOVERED;
>> - break;
>> - default:
>> - break;
>> - }
>> - } else if (disposition == RTAS_DISP_LIMITED_RECOVERY) {
>> - /* Platform corrected itself but could be degraded */
>> - pr_err("MCE: limited recovery, system may be degraded\n");
>> - disposition = RTAS_DISP_FULLY_RECOVERED;
>> - }
>> -#endif
>> - return disposition;
>> -}
>> -
>> -static int mce_handle_err_virtmode(struct pt_regs *regs,
>> - struct rtas_error_log *errp,
>> - struct pseries_mc_errorlog *mce_log,
>> - int disposition)
>> +static int mce_handle_error(struct pt_regs *regs, struct rtas_error_log *errp)
>> {
>> struct mce_error_info mce_err = { 0 };
>> + unsigned long eaddr = 0, paddr = 0;
>> + struct pseries_errorlog *pseries_log;
>> + struct pseries_mc_errorlog *mce_log;
>> + int disposition = rtas_error_disposition(errp);
>> int initiator = rtas_error_initiator(errp);
>> int severity = rtas_error_severity(errp);
>> - unsigned long eaddr = 0, paddr = 0;
>> u8 error_type, err_sub_type;
>>
>> - if (!mce_log)
>> - goto out;
>> -
>> - error_type = mce_log->error_type;
>> - err_sub_type = rtas_mc_error_sub_type(mce_log);
>> -
>> if (initiator == RTAS_INITIATOR_UNKNOWN)
>> mce_err.initiator = MCE_INITIATOR_UNKNOWN;
>> else if (initiator == RTAS_INITIATOR_CPU)
>> @@ -588,6 +547,8 @@ static int mce_handle_err_virtmode(struct pt_regs *regs,
>> mce_err.severity = MCE_SEV_SEVERE;
>> else if (severity == RTAS_SEVERITY_ERROR)
>> mce_err.severity = MCE_SEV_SEVERE;
>> + else if (severity == RTAS_SEVERITY_FATAL)
>> + mce_err.severity = MCE_SEV_FATAL;
>> else
>> mce_err.severity = MCE_SEV_FATAL;
>>
> What's this hunk for?
>
>> @@ -599,7 +560,18 @@ static int mce_handle_err_virtmode(struct pt_regs *regs,
>> mce_err.error_type = MCE_ERROR_TYPE_UNKNOWN;
>> mce_err.error_class = MCE_ECLASS_UNKNOWN;
>>
>> - switch (error_type) {
>> + if (!rtas_error_extended(errp))
>> + goto out;
>> +
>> + pseries_log = get_pseries_errorlog(errp, PSERIES_ELOG_SECT_ID_MCE);
>> + if (!pseries_log)
>> + goto out;
>> +
>> + mce_log = (struct pseries_mc_errorlog *)pseries_log->data;
>> + error_type = mce_log->error_type;
>> + err_sub_type = rtas_mc_error_sub_type(mce_log);
>> +
>> + switch (mce_log->error_type) {
>> case MC_ERROR_TYPE_UE:
>> mce_err.error_type = MCE_ERROR_TYPE_UE;
>> mce_common_process_ue(regs, &mce_err);
>> @@ -692,41 +664,45 @@ static int mce_handle_err_virtmode(struct pt_regs *regs,
>> mce_err.error_type = MCE_ERROR_TYPE_DCACHE;
>> break;
>> case MC_ERROR_TYPE_I_CACHE:
>> - mce_err.error_type = MCE_ERROR_TYPE_ICACHE;
>> + mce_err.error_type = MCE_ERROR_TYPE_DCACHE;
>> break;
> And this one. Doesn't look right.
>
>> case MC_ERROR_TYPE_UNKNOWN:
>> default:
>> mce_err.error_type = MCE_ERROR_TYPE_UNKNOWN;
>> break;
>> }
>> +
>> +#ifdef CONFIG_PPC_BOOK3S_64
>> + if (disposition == RTAS_DISP_NOT_RECOVERED) {
>> + switch (error_type) {
>> + case MC_ERROR_TYPE_SLB:
>> + case MC_ERROR_TYPE_ERAT:
>> + /*
>> + * Store the old slb content in paca before flushing.
>> + * Print this when we go to virtual mode.
>> + * There are chances that we may hit MCE again if there
>> + * is a parity error on the SLB entry we trying to read
>> + * for saving. Hence limit the slb saving to single
>> + * level of recursion.
>> + */
>> + if (local_paca->in_mce == 1)
>> + slb_save_contents(local_paca->mce_faulty_slbs);
>> + flush_and_reload_slb();
>> + disposition = RTAS_DISP_FULLY_RECOVERED;
>> + break;
>> + default:
>> + break;
>> + }
>> + } else if (disposition == RTAS_DISP_LIMITED_RECOVERY) {
>> + /* Platform corrected itself but could be degraded */
>> + pr_err("MCE: limited recovery, system may be degraded\n");
>> + disposition = RTAS_DISP_FULLY_RECOVERED;
>> + }
> I would prefer if you just keep the mce_handle_err_realmode function
> (can rename it if you want). It's actually changed a bit since the
> patch being reverted so we don't want to undo that.
Ok, I will leave it as is for now, we can change it later.
>
> Thanks,
> Nick
[-- Attachment #2: Type: text/html, Size: 6507 bytes --]
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2022-01-17 10:14 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-11-25 22:03 [PATCH v3 2/2] pseries/mce: Refactor the pseries mce handling code kernel test robot
-- strict thread matches above, loose matches on Subject: below --
2021-11-24 9:54 [PATCH v3 1/2] powerpc/mce: Avoid using irq_work_queue() in realmode Ganesh Goudar
2021-11-24 9:55 ` [PATCH v3 2/2] pseries/mce: Refactor the pseries mce handling code Ganesh Goudar
2021-11-24 13:10 ` Nicholas Piggin
2022-01-17 8:11 ` Ganesh
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.