mirror of https://gitee.com/openkylin/linux.git
IB/ehca: In case of lost interrupts, trigger EOI to reenable interrupts
During corner case testing, we noticed that some versions of ehca do not properly transition to interrupt done in special load situations. This can be resolved by periodically triggering EOI through H_EOI, if EQEs are pending. Signed-off-by: Stefan Roscher <stefan.roscher@de.ibm.com> Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:
parent
3e255eac56
commit
6f7bc01a73
|
@ -531,7 +531,7 @@ void ehca_process_eq(struct ehca_shca *shca, int is_irq)
|
||||||
{
|
{
|
||||||
struct ehca_eq *eq = &shca->eq;
|
struct ehca_eq *eq = &shca->eq;
|
||||||
struct ehca_eqe_cache_entry *eqe_cache = eq->eqe_cache;
|
struct ehca_eqe_cache_entry *eqe_cache = eq->eqe_cache;
|
||||||
u64 eqe_value;
|
u64 eqe_value, ret;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int eqe_cnt, i;
|
int eqe_cnt, i;
|
||||||
int eq_empty = 0;
|
int eq_empty = 0;
|
||||||
|
@ -583,8 +583,13 @@ void ehca_process_eq(struct ehca_shca *shca, int is_irq)
|
||||||
ehca_dbg(&shca->ib_device,
|
ehca_dbg(&shca->ib_device,
|
||||||
"No eqe found for irq event");
|
"No eqe found for irq event");
|
||||||
goto unlock_irq_spinlock;
|
goto unlock_irq_spinlock;
|
||||||
} else if (!is_irq)
|
} else if (!is_irq) {
|
||||||
|
ret = hipz_h_eoi(eq->ist);
|
||||||
|
if (ret != H_SUCCESS)
|
||||||
|
ehca_err(&shca->ib_device,
|
||||||
|
"bad return code EOI -rc = %ld\n", ret);
|
||||||
ehca_dbg(&shca->ib_device, "deadman found %x eqe", eqe_cnt);
|
ehca_dbg(&shca->ib_device, "deadman found %x eqe", eqe_cnt);
|
||||||
|
}
|
||||||
if (unlikely(eqe_cnt == EHCA_EQE_CACHE_SIZE))
|
if (unlikely(eqe_cnt == EHCA_EQE_CACHE_SIZE))
|
||||||
ehca_dbg(&shca->ib_device, "too many eqes for one irq event");
|
ehca_dbg(&shca->ib_device, "too many eqes for one irq event");
|
||||||
/* enable irq for new packets */
|
/* enable irq for new packets */
|
||||||
|
|
|
@ -933,3 +933,13 @@ u64 hipz_h_error_data(const struct ipz_adapter_handle adapter_handle,
|
||||||
r_cb,
|
r_cb,
|
||||||
0, 0, 0, 0);
|
0, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u64 hipz_h_eoi(int irq)
|
||||||
|
{
|
||||||
|
unsigned long xirr;
|
||||||
|
|
||||||
|
iosync();
|
||||||
|
xirr = (0xffULL << 24) | irq;
|
||||||
|
|
||||||
|
return plpar_hcall_norets(H_EOI, xirr);
|
||||||
|
}
|
||||||
|
|
|
@ -260,5 +260,6 @@ u64 hipz_h_error_data(const struct ipz_adapter_handle adapter_handle,
|
||||||
const u64 ressource_handle,
|
const u64 ressource_handle,
|
||||||
void *rblock,
|
void *rblock,
|
||||||
unsigned long *byte_count);
|
unsigned long *byte_count);
|
||||||
|
u64 hipz_h_eoi(int irq);
|
||||||
|
|
||||||
#endif /* __HCP_IF_H__ */
|
#endif /* __HCP_IF_H__ */
|
||||||
|
|
Loading…
Reference in New Issue