ics = kvmppc_xics_find_ics(xics, new_irq, &src);
if (!ics) {
/* Unsafe increment, but this does not need to be accurate */
+ xics->err_noics++;
return;
}
state = &ics->irq_state[src];
icp = kvmppc_xics_find_server(xics->kvm, state->server);
if (!icp) {
/* Unsafe increment again*/
+ xics->err_noicp++;
goto out;
}
}
* separately here as well.
*/
if (resend) {
+ icp->n_check_resend++;
icp_rm_check_resend(xics, icp);
}
}
/* Handle reject in real mode */
if (reject && reject != XICS_IPI) {
+ this_icp->n_reject++;
icp_rm_deliver_irq(xics, icp, reject);
}
/* Handle resends in real mode */
if (resend) {
+ this_icp->n_check_resend++;
icp_rm_check_resend(xics, icp);
}
* attempt (see comments in icp_rm_deliver_irq).
*/
if (reject && reject != XICS_IPI) {
+ icp->n_reject++;
icp_rm_deliver_irq(xics, icp, reject);
}
bail:
/* Still asserted, resend it */
if (state->asserted) {
+ icp->n_reject++;
icp_rm_deliver_irq(xics, icp, irq);
}
unsigned long flags;
unsigned long t_rm_kick_vcpu, t_rm_check_resend;
unsigned long t_rm_reject, t_rm_notify_eoi;
+ unsigned long t_reject, t_check_resend;
if (!kvm)
return 0;
t_rm_notify_eoi = 0;
t_rm_check_resend = 0;
t_rm_reject = 0;
+ t_check_resend = 0;
+ t_reject = 0;
seq_printf(m, "=========\nICP state\n=========\n");
t_rm_notify_eoi += icp->n_rm_notify_eoi;
t_rm_check_resend += icp->n_rm_check_resend;
t_rm_reject += icp->n_rm_reject;
+ t_check_resend += icp->n_check_resend;
+ t_reject += icp->n_reject;
}
- seq_puts(m, "ICP Guest Real Mode exit totals: ");
- seq_printf(m, "\tkick_vcpu=%lu check_resend=%lu reject=%lu notify_eoi=%lu\n",
+ seq_printf(m, "ICP Guest->Host totals: kick_vcpu=%lu check_resend=%lu reject=%lu notify_eoi=%lu\n",
t_rm_kick_vcpu, t_rm_check_resend,
t_rm_reject, t_rm_notify_eoi);
+ seq_printf(m, "ICP Real Mode totals: check_resend=%lu resend=%lu\n",
+ t_check_resend, t_reject);
for (icsid = 0; icsid <= KVMPPC_XICS_MAX_ICS_ID; icsid++) {
struct kvmppc_ics *ics = xics->ics[icsid];
unsigned long n_rm_check_resend;
unsigned long n_rm_reject;
unsigned long n_rm_notify_eoi;
+ /* Counters for handling ICP processing in real mode */
+ unsigned long n_check_resend;
+ unsigned long n_reject;
/* Debug stuff for real mode */
union kvmppc_icp_state rm_dbgstate;
u32 max_icsid;
bool real_mode;
bool real_mode_dbg;
+ u32 err_noics;
+ u32 err_noicp;
struct kvmppc_ics *ics[KVMPPC_XICS_MAX_ICS_ID + 1];
};