]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
sif: eq: Add max irq handling time to the sysfs eq table
authorFrancisco Triviño <francisco.trivino@oracle.com>
Fri, 9 Sep 2016 11:46:49 +0000 (13:46 +0200)
committerKnut Omang <knut.omang@oracle.com>
Mon, 3 Oct 2016 12:02:18 +0000 (14:02 +0200)
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 <francisco.trivino@oracle.com>
Reviewed-by: Knut Omang <knut.omang@oracle.com>
drivers/infiniband/hw/sif/sif_dev.h
drivers/infiniband/hw/sif/sif_eq.c

index ce2f81fb80d3050124b3db565a2678b147547fd1..5f1ba9b1a9458b5cada9d850fcda18f5140a7dce 100644 (file)
@@ -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 */
index 92c24003c28f67648cdf328643ea3b292b61d118..8a936a9e6f2668e5bff02dd29a7ad096379fc70d 100644 (file)
@@ -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,