mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
RDMA/irdma: Suppress PF reset on HMC error
The irdma driver currently issues an unconditional PF reset whenever the
HMC Error interrupt (PFINT_OICR bit 26) fires:
if (event->reg & IRDMAPFINT_OICR_HMC_ERR_M) {
ibdev_err(&iwdev->ibdev, "HMC Error\n");
iwdev->rf->reset = true;
}
request_reset() issues an IIDC_PFR to ice. In practice a single HMC_ERR
can trigger cascading PF resets, IOMMU faults during teardown, and
teardown of every RDMA connection on the device.
i40e handles the identically-named interrupt by reading
PFHMC_ERRORINFO and PFHMC_ERRORDATA and logging them without touching
device state; see commit 9c010ee0ea ("i40e: Suppress HMC error to
Interrupt message level") which removed the reset as "not necessary".
This patch mirrors that handling on irdma.
With this change, repeated HMC_ERR no longer produces a reset storm and
RDMA traffic on the device continues uninterrupted.
Signed-off-by: Seyeong Kim <seyeong.kim@canonical.com>
Link: https://patch.msgid.link/20260619050044.1807044-1-seyeong.kim@canonical.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
This commit is contained in:
parent
f67d8a08f6
commit
4dc9c884c0
|
|
@ -29,7 +29,9 @@ static u32 i40iw_regs[IRDMA_MAX_REGS] = {
|
|||
I40E_PFHMC_PDINV,
|
||||
I40E_GLHMC_VFPDINV(0),
|
||||
I40E_GLPE_CRITERR,
|
||||
0xffffffff /* PFINT_RATEN not used in FPK */
|
||||
0xffffffff, /* PFINT_RATEN not used in FPK */
|
||||
0xffffffff, /* PFHMC_ERRORINFO not used in FPK */
|
||||
0xffffffff /* PFHMC_ERRORDATA not used in FPK */
|
||||
};
|
||||
|
||||
static u32 i40iw_stat_offsets[] = {
|
||||
|
|
|
|||
|
|
@ -29,6 +29,8 @@ static u32 icrdma_regs[IRDMA_MAX_REGS] = {
|
|||
GLHMC_VFPDINV(0),
|
||||
GLPE_CRITERR,
|
||||
GLINT_RATE(0),
|
||||
PFHMC_ERRORINFO,
|
||||
PFHMC_ERRORDATA,
|
||||
};
|
||||
|
||||
static u64 icrdma_masks[IRDMA_MAX_MASKS] = {
|
||||
|
|
|
|||
|
|
@ -40,6 +40,8 @@
|
|||
#define GLHMC_VFPDINV(_i) (0x00528300 + ((_i) * 4)) /* _i=0...31 */
|
||||
#define GLPE_CRITERR 0x00534000
|
||||
#define GLINT_RATE(_INT) (0x0015A000 + ((_INT) * 4)) /* _i=0...2047 */ /* Reset Source: CORER */
|
||||
#define PFHMC_ERRORINFO 0x00520400
|
||||
#define PFHMC_ERRORDATA 0x00520500
|
||||
|
||||
#define ICRDMA_DB_ADDR_OFFSET (8 * 1024 * 1024 - 64 * 1024)
|
||||
|
||||
|
|
|
|||
|
|
@ -91,8 +91,12 @@ static void icrdma_iidc_event_handler(struct iidc_rdma_core_dev_info *cdev_info,
|
|||
}
|
||||
}
|
||||
if (event->reg & IRDMAPFINT_OICR_HMC_ERR_M) {
|
||||
ibdev_err(&iwdev->ibdev, "HMC Error\n");
|
||||
iwdev->rf->reset = true;
|
||||
u32 hmc_errinfo = readl(iwdev->rf->sc_dev.hw_regs[IRDMA_PFHMC_ERRORINFO]);
|
||||
u32 hmc_errdata = readl(iwdev->rf->sc_dev.hw_regs[IRDMA_PFHMC_ERRORDATA]);
|
||||
|
||||
/* Log diagnostics; do not reset here. */
|
||||
ibdev_warn(&iwdev->ibdev, "HMC Error: errinfo=0x%08x errdata=0x%08x\n",
|
||||
hmc_errinfo, hmc_errdata);
|
||||
}
|
||||
if (event->reg & IRDMAPFINT_OICR_PE_PUSH_M) {
|
||||
ibdev_err(&iwdev->ibdev, "PE Push Error\n");
|
||||
|
|
|
|||
|
|
@ -66,6 +66,8 @@ enum irdma_registers {
|
|||
IRDMA_GLHMC_VFPDINV,
|
||||
IRDMA_GLPE_CRITERR,
|
||||
IRDMA_GLINT_RATE,
|
||||
IRDMA_PFHMC_ERRORINFO,
|
||||
IRDMA_PFHMC_ERRORDATA,
|
||||
IRDMA_MAX_REGS, /* Must be last entry */
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user