Skip to content

Commit

Permalink
s390/qdio: track time of last data IRQ for each device
Browse files Browse the repository at this point in the history
We currently track the time of the most recent QDIO Adapter Interrupt.
This is a system-wide timestamp (as such interrupts are not bound to
one specific qdio device).

If interrupt processing stalls on one device but is functional for a
different device, the timestamp continues to be updated and is of no
help for problem diagnosis.
So for debugging purposes also track the time of the last Data IRQ on
a per-device level. Collect this data in the legacy non-AI path as well.

Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com>
Reviewed-by: Benjamin Block <bblock@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
  • Loading branch information
Julian Wiedmann authored and Vasily Gorbik committed Feb 9, 2021
1 parent 954d623 commit bd83917
Show file tree
Hide file tree
Showing 4 changed files with 8 additions and 3 deletions.
1 change: 1 addition & 0 deletions drivers/s390/cio/qdio.h
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,7 @@ struct qdio_irq {
struct ccw_device *cdev;
struct list_head entry; /* list of thinint devices */
struct dentry *debugfs_dev;
u64 last_data_irq_time;

unsigned long int_parm;
struct subchannel_id schid;
Expand Down
5 changes: 3 additions & 2 deletions drivers/s390/cio/qdio_debug.c
Original file line number Diff line number Diff line change
Expand Up @@ -105,8 +105,9 @@ static int qstat_show(struct seq_file *m, void *v)
if (!q)
return 0;

seq_printf(m, "Timestamp: %Lx Last AI: %Lx\n",
q->timestamp, last_ai_time);
seq_printf(m, "Timestamp: %llx\n", q->timestamp);
seq_printf(m, "Last Data IRQ: %llx Last AI: %llx\n",
q->irq_ptr->last_data_irq_time, last_ai_time);
seq_printf(m, "nr_used: %d ftc: %d\n",
atomic_read(&q->nr_buf_used), q->first_to_check);
if (q->is_input_q) {
Expand Down
1 change: 1 addition & 0 deletions drivers/s390/cio/qdio_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -804,6 +804,7 @@ static void qdio_int_handler_pci(struct qdio_irq *irq_ptr)
return;

qdio_deliver_irq(irq_ptr);
irq_ptr->last_data_irq_time = S390_lowcore.int_clock;

if (!pci_out_supported(irq_ptr) || !irq_ptr->scan_threshold)
return;
Expand Down
4 changes: 3 additions & 1 deletion drivers/s390/cio/qdio_thinint.c
Original file line number Diff line number Diff line change
Expand Up @@ -97,10 +97,11 @@ static inline u32 clear_shared_ind(void)
*/
static void tiqdio_thinint_handler(struct airq_struct *airq, bool floating)
{
u64 irq_time = S390_lowcore.int_clock;
u32 si_used = clear_shared_ind();
struct qdio_irq *irq;

last_ai_time = S390_lowcore.int_clock;
last_ai_time = irq_time;
inc_irq_stat(IRQIO_QAI);

/* protect tiq_list entries, only changed in activate or shutdown */
Expand All @@ -119,6 +120,7 @@ static void tiqdio_thinint_handler(struct airq_struct *airq, bool floating)
}

qdio_deliver_irq(irq);
irq->last_data_irq_time = irq_time;

QDIO_PERF_STAT_INC(irq, adapter_int);
}
Expand Down

0 comments on commit bd83917

Please sign in to comment.