From: Francisco Triviño Date: Fri, 9 Sep 2016 11:46:49 +0000 (+0200) Subject: sif: eq: Add max irq handling time to the sysfs eq table X-Git-Tag: v4.1.12-92~67^2~38 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=c68eef78818485acf1493123701f49196ea284f3;p=users%2Fjedix%2Flinux-maple.git sif: eq: Add max irq handling time to the sysfs eq table Track the max time (in ms) that has been recorded for dispatching events (dispatch_eq) on interrupt handling (sif_intr). Orabug: 24657844 Signed-off-by: Francisco Triviño Reviewed-by: Knut Omang --- diff --git a/drivers/infiniband/hw/sif/sif_dev.h b/drivers/infiniband/hw/sif/sif_dev.h index ce2f81fb80d3..5f1ba9b1a945 100644 --- a/drivers/infiniband/hw/sif/sif_dev.h +++ b/drivers/infiniband/hw/sif/sif_dev.h @@ -226,6 +226,7 @@ struct sif_eq { char name[SIF_EQ_NAME_LEN+1]; /* Storage for name visible from /proc/interrupts */ struct sif_irq_ch irq_ch; /* Per channel interrupt coalescing settings */ cpumask_var_t affinity_mask; /* cpu affinity_mask for set_irq_hints. */ + unsigned int max_intr_ms; /* Max recorded time in msec on interrupt handling */ }; /* Driver specific per instance data */ diff --git a/drivers/infiniband/hw/sif/sif_eq.c b/drivers/infiniband/hw/sif/sif_eq.c index 92c24003c28f..8a936a9e6f26 100644 --- a/drivers/infiniband/hw/sif/sif_eq.c +++ b/drivers/infiniband/hw/sif/sif_eq.c @@ -338,6 +338,8 @@ static void sif_eq_table_deinit(struct sif_dev *sdev, struct sif_eps *es, u16 eq static irqreturn_t sif_intr(int irq, void *d) { + ulong start_time = jiffies; + ulong elapsed; u32 nreqs; struct sif_eq *eq = (struct sif_eq *)d; struct sif_dev *sdev = eq->ba.sdev; @@ -358,6 +360,11 @@ static irqreturn_t sif_intr(int irq, void *d) /* Note: this feature does not check the EPSA* interrupt queues */ } + elapsed = jiffies_to_msecs(jiffies - start_time); + + if (eq->max_intr_ms < elapsed) + eq->max_intr_ms = elapsed; + return IRQ_HANDLED; } @@ -1096,18 +1103,19 @@ void sif_dfs_print_eq(struct seq_file *s, struct sif_dev *sdev, "# niu = (index of) next software index update\n#\n" "# ni = Number of events seen\n" "# wi = Number of events handled in work queue\n" - "# Name index entries ext.%9s vec# IRQ# %9s %9s %9s %9s\n", - "n.seq", "#ni", "#wi", "sii", "niu"); + "# ms = Max recorded time in msec on interrupt handling\n" + "# Name index entries ext.%9s vec# IRQ# %9s %9s %9s %9s %9s\n", + "n.seq", "#ni", "#wi", "sii", "niu", "ms"); return; } eq = &sdev->es[sdev->mbox_epsc].eqs.eq[pos]; - seq_printf(s, "%-12s%3u %9u %4u %9u %4d %4d %9u %9u %9u %9u\n", + seq_printf(s, "%-12s%3u %9u %4u %9u %4d %4d %9u %9u %9u %9u %9d\n", eq->name, eq->index, eq->entries, eq->extent, eq->next_seq, eq->intr_vec, sdev->msix_entries[eq->intr_vec].vector, atomic_read(&eq->intr_cnt), atomic_read(&eq->work_cnt), - eq->sw_index_interval, eq->sw_index_next_update); + eq->sw_index_interval, eq->sw_index_next_update, eq->max_intr_ms); } void sif_dfs_print_irq_ch(struct seq_file *s, struct sif_dev *sdev,