diff options
author | Peter Oberparleiter <peter.oberparleiter@de.ibm.com> | 2011-10-30 10:16:04 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2011-10-30 10:16:15 -0400 |
commit | de400d6b78d15a73023485f050bc6b1709dc7a79 (patch) | |
tree | 2d2e7233a76982db4cf12ff0859054a33e46a911 /drivers/s390 | |
parent | ce949717b559709423c1ef716a9db16d1dcadaed (diff) |
[S390] fix mismatch in summation of I/O IRQ statistics
Current IRQ statistics support does not show detail counts for I/O
interrupts which are processed internally only. The result is a
summation count which is way off such as this one:
CPU0 CPU1 CPU2
I/O: 1331 710 442
[...]
QAI: 15 16 16 [I/O] QDIO Adapter Interrupt
QDI: 1 0 0 [I/O] QDIO Interrupt
DAS: 706 645 381 [I/O] DASD
C15: 26 10 0 [I/O] 3215
C70: 0 0 0 [I/O] 3270
TAP: 0 0 0 [I/O] Tape
VMR: 0 0 0 [I/O] Unit Record Devices
LCS: 0 0 0 [I/O] LCS
CLW: 0 0 0 [I/O] CLAW
CTC: 0 0 0 [I/O] CTC
APB: 0 0 0 [I/O] AP Bus
Fix this by moving I/O interrupt accounting into the common I/O layer.
Signed-off-by: Peter Oberparleiter <peter.oberparleiter@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers/s390')
-rw-r--r-- | drivers/s390/block/dasd.c | 2 | ||||
-rw-r--r-- | drivers/s390/block/dasd_eckd.c | 1 | ||||
-rw-r--r-- | drivers/s390/block/dasd_fba.c | 1 | ||||
-rw-r--r-- | drivers/s390/char/con3215.c | 3 | ||||
-rw-r--r-- | drivers/s390/char/raw3270.c | 3 | ||||
-rw-r--r-- | drivers/s390/char/tape_34xx.c | 1 | ||||
-rw-r--r-- | drivers/s390/char/tape_3590.c | 1 | ||||
-rw-r--r-- | drivers/s390/char/tape_core.c | 2 | ||||
-rw-r--r-- | drivers/s390/char/vmur.c | 3 | ||||
-rw-r--r-- | drivers/s390/cio/cio.c | 17 | ||||
-rw-r--r-- | drivers/s390/cio/device.c | 13 | ||||
-rw-r--r-- | drivers/s390/cio/device.h | 13 | ||||
-rw-r--r-- | drivers/s390/cio/io_sch.h | 2 | ||||
-rw-r--r-- | drivers/s390/cio/qdio_main.c | 2 | ||||
-rw-r--r-- | drivers/s390/net/claw.c | 3 | ||||
-rw-r--r-- | drivers/s390/net/ctcm_main.c | 3 | ||||
-rw-r--r-- | drivers/s390/net/lcs.c | 3 |
17 files changed, 51 insertions, 22 deletions
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index a1d3ddba99cc..46054c75cf31 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c | |||
@@ -11,7 +11,6 @@ | |||
11 | #define KMSG_COMPONENT "dasd" | 11 | #define KMSG_COMPONENT "dasd" |
12 | #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt | 12 | #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt |
13 | 13 | ||
14 | #include <linux/kernel_stat.h> | ||
15 | #include <linux/kmod.h> | 14 | #include <linux/kmod.h> |
16 | #include <linux/init.h> | 15 | #include <linux/init.h> |
17 | #include <linux/interrupt.h> | 16 | #include <linux/interrupt.h> |
@@ -1594,7 +1593,6 @@ void dasd_int_handler(struct ccw_device *cdev, unsigned long intparm, | |||
1594 | unsigned long long now; | 1593 | unsigned long long now; |
1595 | int expires; | 1594 | int expires; |
1596 | 1595 | ||
1597 | kstat_cpu(smp_processor_id()).irqs[IOINT_DAS]++; | ||
1598 | if (IS_ERR(irb)) { | 1596 | if (IS_ERR(irb)) { |
1599 | switch (PTR_ERR(irb)) { | 1597 | switch (PTR_ERR(irb)) { |
1600 | case -EIO: | 1598 | case -EIO: |
diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c index 6e835c9fdfcb..0e9c4dcf1452 100644 --- a/drivers/s390/block/dasd_eckd.c +++ b/drivers/s390/block/dasd_eckd.c | |||
@@ -3998,6 +3998,7 @@ static struct ccw_driver dasd_eckd_driver = { | |||
3998 | .thaw = dasd_generic_restore_device, | 3998 | .thaw = dasd_generic_restore_device, |
3999 | .restore = dasd_generic_restore_device, | 3999 | .restore = dasd_generic_restore_device, |
4000 | .uc_handler = dasd_generic_uc_handler, | 4000 | .uc_handler = dasd_generic_uc_handler, |
4001 | .int_class = IOINT_DAS, | ||
4001 | }; | 4002 | }; |
4002 | 4003 | ||
4003 | /* | 4004 | /* |
diff --git a/drivers/s390/block/dasd_fba.c b/drivers/s390/block/dasd_fba.c index 4b71b1164868..a62a75358eb9 100644 --- a/drivers/s390/block/dasd_fba.c +++ b/drivers/s390/block/dasd_fba.c | |||
@@ -79,6 +79,7 @@ static struct ccw_driver dasd_fba_driver = { | |||
79 | .freeze = dasd_generic_pm_freeze, | 79 | .freeze = dasd_generic_pm_freeze, |
80 | .thaw = dasd_generic_restore_device, | 80 | .thaw = dasd_generic_restore_device, |
81 | .restore = dasd_generic_restore_device, | 81 | .restore = dasd_generic_restore_device, |
82 | .int_class = IOINT_DAS, | ||
82 | }; | 83 | }; |
83 | 84 | ||
84 | static void | 85 | static void |
diff --git a/drivers/s390/char/con3215.c b/drivers/s390/char/con3215.c index 694464c65fcd..934458ad55e5 100644 --- a/drivers/s390/char/con3215.c +++ b/drivers/s390/char/con3215.c | |||
@@ -9,7 +9,6 @@ | |||
9 | * Dan Morrison, IBM Corporation <dmorriso@cse.buffalo.edu> | 9 | * Dan Morrison, IBM Corporation <dmorriso@cse.buffalo.edu> |
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include <linux/kernel_stat.h> | ||
13 | #include <linux/module.h> | 12 | #include <linux/module.h> |
14 | #include <linux/types.h> | 13 | #include <linux/types.h> |
15 | #include <linux/kdev_t.h> | 14 | #include <linux/kdev_t.h> |
@@ -362,7 +361,6 @@ static void raw3215_irq(struct ccw_device *cdev, unsigned long intparm, | |||
362 | int cstat, dstat; | 361 | int cstat, dstat; |
363 | int count; | 362 | int count; |
364 | 363 | ||
365 | kstat_cpu(smp_processor_id()).irqs[IOINT_C15]++; | ||
366 | raw = dev_get_drvdata(&cdev->dev); | 364 | raw = dev_get_drvdata(&cdev->dev); |
367 | req = (struct raw3215_req *) intparm; | 365 | req = (struct raw3215_req *) intparm; |
368 | cstat = irb->scsw.cmd.cstat; | 366 | cstat = irb->scsw.cmd.cstat; |
@@ -776,6 +774,7 @@ static struct ccw_driver raw3215_ccw_driver = { | |||
776 | .freeze = &raw3215_pm_stop, | 774 | .freeze = &raw3215_pm_stop, |
777 | .thaw = &raw3215_pm_start, | 775 | .thaw = &raw3215_pm_start, |
778 | .restore = &raw3215_pm_start, | 776 | .restore = &raw3215_pm_start, |
777 | .int_class = IOINT_C15, | ||
779 | }; | 778 | }; |
780 | 779 | ||
781 | #ifdef CONFIG_TN3215_CONSOLE | 780 | #ifdef CONFIG_TN3215_CONSOLE |
diff --git a/drivers/s390/char/raw3270.c b/drivers/s390/char/raw3270.c index 810ac38631c3..e5cb9248a442 100644 --- a/drivers/s390/char/raw3270.c +++ b/drivers/s390/char/raw3270.c | |||
@@ -7,7 +7,6 @@ | |||
7 | * Copyright IBM Corp. 2003, 2009 | 7 | * Copyright IBM Corp. 2003, 2009 |
8 | */ | 8 | */ |
9 | 9 | ||
10 | #include <linux/kernel_stat.h> | ||
11 | #include <linux/module.h> | 10 | #include <linux/module.h> |
12 | #include <linux/err.h> | 11 | #include <linux/err.h> |
13 | #include <linux/init.h> | 12 | #include <linux/init.h> |
@@ -330,7 +329,6 @@ raw3270_irq (struct ccw_device *cdev, unsigned long intparm, struct irb *irb) | |||
330 | struct raw3270_request *rq; | 329 | struct raw3270_request *rq; |
331 | int rc; | 330 | int rc; |
332 | 331 | ||
333 | kstat_cpu(smp_processor_id()).irqs[IOINT_C70]++; | ||
334 | rp = dev_get_drvdata(&cdev->dev); | 332 | rp = dev_get_drvdata(&cdev->dev); |
335 | if (!rp) | 333 | if (!rp) |
336 | return; | 334 | return; |
@@ -1398,6 +1396,7 @@ static struct ccw_driver raw3270_ccw_driver = { | |||
1398 | .freeze = &raw3270_pm_stop, | 1396 | .freeze = &raw3270_pm_stop, |
1399 | .thaw = &raw3270_pm_start, | 1397 | .thaw = &raw3270_pm_start, |
1400 | .restore = &raw3270_pm_start, | 1398 | .restore = &raw3270_pm_start, |
1399 | .int_class = IOINT_C70, | ||
1401 | }; | 1400 | }; |
1402 | 1401 | ||
1403 | static int | 1402 | static int |
diff --git a/drivers/s390/char/tape_34xx.c b/drivers/s390/char/tape_34xx.c index 9eff2df70ddb..934ef33eb9a4 100644 --- a/drivers/s390/char/tape_34xx.c +++ b/drivers/s390/char/tape_34xx.c | |||
@@ -1330,6 +1330,7 @@ static struct ccw_driver tape_34xx_driver = { | |||
1330 | .set_online = tape_34xx_online, | 1330 | .set_online = tape_34xx_online, |
1331 | .set_offline = tape_generic_offline, | 1331 | .set_offline = tape_generic_offline, |
1332 | .freeze = tape_generic_pm_suspend, | 1332 | .freeze = tape_generic_pm_suspend, |
1333 | .int_class = IOINT_TAP, | ||
1333 | }; | 1334 | }; |
1334 | 1335 | ||
1335 | static int | 1336 | static int |
diff --git a/drivers/s390/char/tape_3590.c b/drivers/s390/char/tape_3590.c index a7d570728882..49c6aab7ad78 100644 --- a/drivers/s390/char/tape_3590.c +++ b/drivers/s390/char/tape_3590.c | |||
@@ -1762,6 +1762,7 @@ static struct ccw_driver tape_3590_driver = { | |||
1762 | .set_offline = tape_generic_offline, | 1762 | .set_offline = tape_generic_offline, |
1763 | .set_online = tape_3590_online, | 1763 | .set_online = tape_3590_online, |
1764 | .freeze = tape_generic_pm_suspend, | 1764 | .freeze = tape_generic_pm_suspend, |
1765 | .int_class = IOINT_TAP, | ||
1765 | }; | 1766 | }; |
1766 | 1767 | ||
1767 | /* | 1768 | /* |
diff --git a/drivers/s390/char/tape_core.c b/drivers/s390/char/tape_core.c index 7978a0adeaf3..b3a3e8e8656e 100644 --- a/drivers/s390/char/tape_core.c +++ b/drivers/s390/char/tape_core.c | |||
@@ -14,7 +14,6 @@ | |||
14 | #define KMSG_COMPONENT "tape" | 14 | #define KMSG_COMPONENT "tape" |
15 | #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt | 15 | #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt |
16 | 16 | ||
17 | #include <linux/kernel_stat.h> | ||
18 | #include <linux/module.h> | 17 | #include <linux/module.h> |
19 | #include <linux/init.h> // for kernel parameters | 18 | #include <linux/init.h> // for kernel parameters |
20 | #include <linux/kmod.h> // for requesting modules | 19 | #include <linux/kmod.h> // for requesting modules |
@@ -1115,7 +1114,6 @@ __tape_do_irq (struct ccw_device *cdev, unsigned long intparm, struct irb *irb) | |||
1115 | struct tape_request *request; | 1114 | struct tape_request *request; |
1116 | int rc; | 1115 | int rc; |
1117 | 1116 | ||
1118 | kstat_cpu(smp_processor_id()).irqs[IOINT_TAP]++; | ||
1119 | device = dev_get_drvdata(&cdev->dev); | 1117 | device = dev_get_drvdata(&cdev->dev); |
1120 | if (device == NULL) { | 1118 | if (device == NULL) { |
1121 | return; | 1119 | return; |
diff --git a/drivers/s390/char/vmur.c b/drivers/s390/char/vmur.c index f6b00c3df425..d291a54acfad 100644 --- a/drivers/s390/char/vmur.c +++ b/drivers/s390/char/vmur.c | |||
@@ -11,7 +11,6 @@ | |||
11 | #define KMSG_COMPONENT "vmur" | 11 | #define KMSG_COMPONENT "vmur" |
12 | #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt | 12 | #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt |
13 | 13 | ||
14 | #include <linux/kernel_stat.h> | ||
15 | #include <linux/cdev.h> | 14 | #include <linux/cdev.h> |
16 | #include <linux/slab.h> | 15 | #include <linux/slab.h> |
17 | 16 | ||
@@ -74,6 +73,7 @@ static struct ccw_driver ur_driver = { | |||
74 | .set_online = ur_set_online, | 73 | .set_online = ur_set_online, |
75 | .set_offline = ur_set_offline, | 74 | .set_offline = ur_set_offline, |
76 | .freeze = ur_pm_suspend, | 75 | .freeze = ur_pm_suspend, |
76 | .int_class = IOINT_VMR, | ||
77 | }; | 77 | }; |
78 | 78 | ||
79 | static DEFINE_MUTEX(vmur_mutex); | 79 | static DEFINE_MUTEX(vmur_mutex); |
@@ -305,7 +305,6 @@ static void ur_int_handler(struct ccw_device *cdev, unsigned long intparm, | |||
305 | { | 305 | { |
306 | struct urdev *urd; | 306 | struct urdev *urd; |
307 | 307 | ||
308 | kstat_cpu(smp_processor_id()).irqs[IOINT_VMR]++; | ||
309 | TRACE("ur_int_handler: intparm=0x%lx cstat=%02x dstat=%02x res=%u\n", | 308 | TRACE("ur_int_handler: intparm=0x%lx cstat=%02x dstat=%02x res=%u\n", |
310 | intparm, irb->scsw.cmd.cstat, irb->scsw.cmd.dstat, | 309 | intparm, irb->scsw.cmd.cstat, irb->scsw.cmd.dstat, |
311 | irb->scsw.cmd.count); | 310 | irb->scsw.cmd.count); |
diff --git a/drivers/s390/cio/cio.c b/drivers/s390/cio/cio.c index eb3140ee821e..5586c1376cb0 100644 --- a/drivers/s390/cio/cio.c +++ b/drivers/s390/cio/cio.c | |||
@@ -622,6 +622,7 @@ void __irq_entry do_IRQ(struct pt_regs *regs) | |||
622 | sch = (struct subchannel *)(unsigned long)tpi_info->intparm; | 622 | sch = (struct subchannel *)(unsigned long)tpi_info->intparm; |
623 | if (!sch) { | 623 | if (!sch) { |
624 | /* Clear pending interrupt condition. */ | 624 | /* Clear pending interrupt condition. */ |
625 | kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++; | ||
625 | tsch(tpi_info->schid, irb); | 626 | tsch(tpi_info->schid, irb); |
626 | continue; | 627 | continue; |
627 | } | 628 | } |
@@ -634,7 +635,10 @@ void __irq_entry do_IRQ(struct pt_regs *regs) | |||
634 | /* Call interrupt handler if there is one. */ | 635 | /* Call interrupt handler if there is one. */ |
635 | if (sch->driver && sch->driver->irq) | 636 | if (sch->driver && sch->driver->irq) |
636 | sch->driver->irq(sch); | 637 | sch->driver->irq(sch); |
637 | } | 638 | else |
639 | kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++; | ||
640 | } else | ||
641 | kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++; | ||
638 | spin_unlock(sch->lock); | 642 | spin_unlock(sch->lock); |
639 | /* | 643 | /* |
640 | * Are more interrupts pending? | 644 | * Are more interrupts pending? |
@@ -667,18 +671,23 @@ static int cio_tpi(void) | |||
667 | tpi_info = (struct tpi_info *)&S390_lowcore.subchannel_id; | 671 | tpi_info = (struct tpi_info *)&S390_lowcore.subchannel_id; |
668 | if (tpi(NULL) != 1) | 672 | if (tpi(NULL) != 1) |
669 | return 0; | 673 | return 0; |
674 | kstat_cpu(smp_processor_id()).irqs[IO_INTERRUPT]++; | ||
670 | if (tpi_info->adapter_IO) { | 675 | if (tpi_info->adapter_IO) { |
671 | do_adapter_IO(tpi_info->isc); | 676 | do_adapter_IO(tpi_info->isc); |
672 | return 1; | 677 | return 1; |
673 | } | 678 | } |
674 | irb = (struct irb *)&S390_lowcore.irb; | 679 | irb = (struct irb *)&S390_lowcore.irb; |
675 | /* Store interrupt response block to lowcore. */ | 680 | /* Store interrupt response block to lowcore. */ |
676 | if (tsch(tpi_info->schid, irb) != 0) | 681 | if (tsch(tpi_info->schid, irb) != 0) { |
677 | /* Not status pending or not operational. */ | 682 | /* Not status pending or not operational. */ |
683 | kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++; | ||
678 | return 1; | 684 | return 1; |
685 | } | ||
679 | sch = (struct subchannel *)(unsigned long)tpi_info->intparm; | 686 | sch = (struct subchannel *)(unsigned long)tpi_info->intparm; |
680 | if (!sch) | 687 | if (!sch) { |
688 | kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++; | ||
681 | return 1; | 689 | return 1; |
690 | } | ||
682 | irq_context = in_interrupt(); | 691 | irq_context = in_interrupt(); |
683 | if (!irq_context) | 692 | if (!irq_context) |
684 | local_bh_disable(); | 693 | local_bh_disable(); |
@@ -687,6 +696,8 @@ static int cio_tpi(void) | |||
687 | memcpy(&sch->schib.scsw, &irb->scsw, sizeof(union scsw)); | 696 | memcpy(&sch->schib.scsw, &irb->scsw, sizeof(union scsw)); |
688 | if (sch->driver && sch->driver->irq) | 697 | if (sch->driver && sch->driver->irq) |
689 | sch->driver->irq(sch); | 698 | sch->driver->irq(sch); |
699 | else | ||
700 | kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++; | ||
690 | spin_unlock(sch->lock); | 701 | spin_unlock(sch->lock); |
691 | irq_exit(); | 702 | irq_exit(); |
692 | if (!irq_context) | 703 | if (!irq_context) |
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c index 8e04c00cf0ad..d734f4a0ecac 100644 --- a/drivers/s390/cio/device.c +++ b/drivers/s390/cio/device.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/device.h> | 21 | #include <linux/device.h> |
22 | #include <linux/workqueue.h> | 22 | #include <linux/workqueue.h> |
23 | #include <linux/timer.h> | 23 | #include <linux/timer.h> |
24 | #include <linux/kernel_stat.h> | ||
24 | 25 | ||
25 | #include <asm/ccwdev.h> | 26 | #include <asm/ccwdev.h> |
26 | #include <asm/cio.h> | 27 | #include <asm/cio.h> |
@@ -747,6 +748,7 @@ static int io_subchannel_initialize_dev(struct subchannel *sch, | |||
747 | struct ccw_device *cdev) | 748 | struct ccw_device *cdev) |
748 | { | 749 | { |
749 | cdev->private->cdev = cdev; | 750 | cdev->private->cdev = cdev; |
751 | cdev->private->int_class = IOINT_CIO; | ||
750 | atomic_set(&cdev->private->onoff, 0); | 752 | atomic_set(&cdev->private->onoff, 0); |
751 | cdev->dev.parent = &sch->dev; | 753 | cdev->dev.parent = &sch->dev; |
752 | cdev->dev.release = ccw_device_release; | 754 | cdev->dev.release = ccw_device_release; |
@@ -1010,6 +1012,8 @@ static void io_subchannel_irq(struct subchannel *sch) | |||
1010 | CIO_TRACE_EVENT(6, dev_name(&sch->dev)); | 1012 | CIO_TRACE_EVENT(6, dev_name(&sch->dev)); |
1011 | if (cdev) | 1013 | if (cdev) |
1012 | dev_fsm_event(cdev, DEV_EVENT_INTERRUPT); | 1014 | dev_fsm_event(cdev, DEV_EVENT_INTERRUPT); |
1015 | else | ||
1016 | kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++; | ||
1013 | } | 1017 | } |
1014 | 1018 | ||
1015 | void io_subchannel_init_config(struct subchannel *sch) | 1019 | void io_subchannel_init_config(struct subchannel *sch) |
@@ -1621,6 +1625,7 @@ ccw_device_probe_console(void) | |||
1621 | memset(&console_private, 0, sizeof(struct ccw_device_private)); | 1625 | memset(&console_private, 0, sizeof(struct ccw_device_private)); |
1622 | console_cdev.private = &console_private; | 1626 | console_cdev.private = &console_private; |
1623 | console_private.cdev = &console_cdev; | 1627 | console_private.cdev = &console_cdev; |
1628 | console_private.int_class = IOINT_CIO; | ||
1624 | ret = ccw_device_console_enable(&console_cdev, sch); | 1629 | ret = ccw_device_console_enable(&console_cdev, sch); |
1625 | if (ret) { | 1630 | if (ret) { |
1626 | cio_release_console(); | 1631 | cio_release_console(); |
@@ -1702,11 +1707,18 @@ ccw_device_probe (struct device *dev) | |||
1702 | int ret; | 1707 | int ret; |
1703 | 1708 | ||
1704 | cdev->drv = cdrv; /* to let the driver call _set_online */ | 1709 | cdev->drv = cdrv; /* to let the driver call _set_online */ |
1710 | /* Note: we interpret class 0 in this context as an uninitialized | ||
1711 | * field since it translates to a non-I/O interrupt class. */ | ||
1712 | if (cdrv->int_class != 0) | ||
1713 | cdev->private->int_class = cdrv->int_class; | ||
1714 | else | ||
1715 | cdev->private->int_class = IOINT_CIO; | ||
1705 | 1716 | ||
1706 | ret = cdrv->probe ? cdrv->probe(cdev) : -ENODEV; | 1717 | ret = cdrv->probe ? cdrv->probe(cdev) : -ENODEV; |
1707 | 1718 | ||
1708 | if (ret) { | 1719 | if (ret) { |
1709 | cdev->drv = NULL; | 1720 | cdev->drv = NULL; |
1721 | cdev->private->int_class = IOINT_CIO; | ||
1710 | return ret; | 1722 | return ret; |
1711 | } | 1723 | } |
1712 | 1724 | ||
@@ -1740,6 +1752,7 @@ ccw_device_remove (struct device *dev) | |||
1740 | } | 1752 | } |
1741 | ccw_device_set_timeout(cdev, 0); | 1753 | ccw_device_set_timeout(cdev, 0); |
1742 | cdev->drv = NULL; | 1754 | cdev->drv = NULL; |
1755 | cdev->private->int_class = IOINT_CIO; | ||
1743 | return 0; | 1756 | return 0; |
1744 | } | 1757 | } |
1745 | 1758 | ||
diff --git a/drivers/s390/cio/device.h b/drivers/s390/cio/device.h index 0b7245c72d5e..179824b3082f 100644 --- a/drivers/s390/cio/device.h +++ b/drivers/s390/cio/device.h | |||
@@ -5,6 +5,7 @@ | |||
5 | #include <linux/atomic.h> | 5 | #include <linux/atomic.h> |
6 | #include <linux/wait.h> | 6 | #include <linux/wait.h> |
7 | #include <linux/notifier.h> | 7 | #include <linux/notifier.h> |
8 | #include <linux/kernel_stat.h> | ||
8 | #include "io_sch.h" | 9 | #include "io_sch.h" |
9 | 10 | ||
10 | /* | 11 | /* |
@@ -56,7 +57,17 @@ extern fsm_func_t *dev_jumptable[NR_DEV_STATES][NR_DEV_EVENTS]; | |||
56 | static inline void | 57 | static inline void |
57 | dev_fsm_event(struct ccw_device *cdev, enum dev_event dev_event) | 58 | dev_fsm_event(struct ccw_device *cdev, enum dev_event dev_event) |
58 | { | 59 | { |
59 | dev_jumptable[cdev->private->state][dev_event](cdev, dev_event); | 60 | int state = cdev->private->state; |
61 | |||
62 | if (dev_event == DEV_EVENT_INTERRUPT) { | ||
63 | if (state == DEV_STATE_ONLINE) | ||
64 | kstat_cpu(smp_processor_id()). | ||
65 | irqs[cdev->private->int_class]++; | ||
66 | else if (state != DEV_STATE_CMFCHANGE && | ||
67 | state != DEV_STATE_CMFUPDATE) | ||
68 | kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++; | ||
69 | } | ||
70 | dev_jumptable[state][dev_event](cdev, dev_event); | ||
60 | } | 71 | } |
61 | 72 | ||
62 | /* | 73 | /* |
diff --git a/drivers/s390/cio/io_sch.h b/drivers/s390/cio/io_sch.h index ba31ad88f4f7..2ebb492a5c17 100644 --- a/drivers/s390/cio/io_sch.h +++ b/drivers/s390/cio/io_sch.h | |||
@@ -4,6 +4,7 @@ | |||
4 | #include <linux/types.h> | 4 | #include <linux/types.h> |
5 | #include <asm/schid.h> | 5 | #include <asm/schid.h> |
6 | #include <asm/ccwdev.h> | 6 | #include <asm/ccwdev.h> |
7 | #include <asm/irq.h> | ||
7 | #include "css.h" | 8 | #include "css.h" |
8 | #include "orb.h" | 9 | #include "orb.h" |
9 | 10 | ||
@@ -157,6 +158,7 @@ struct ccw_device_private { | |||
157 | struct list_head cmb_list; /* list of measured devices */ | 158 | struct list_head cmb_list; /* list of measured devices */ |
158 | u64 cmb_start_time; /* clock value of cmb reset */ | 159 | u64 cmb_start_time; /* clock value of cmb reset */ |
159 | void *cmb_wait; /* deferred cmb enable/disable */ | 160 | void *cmb_wait; /* deferred cmb enable/disable */ |
161 | enum interruption_class int_class; | ||
160 | }; | 162 | }; |
161 | 163 | ||
162 | static inline int rsch(struct subchannel_id schid) | 164 | static inline int rsch(struct subchannel_id schid) |
diff --git a/drivers/s390/cio/qdio_main.c b/drivers/s390/cio/qdio_main.c index 6547ff469410..7ded1b26fd25 100644 --- a/drivers/s390/cio/qdio_main.c +++ b/drivers/s390/cio/qdio_main.c | |||
@@ -15,7 +15,6 @@ | |||
15 | #include <linux/delay.h> | 15 | #include <linux/delay.h> |
16 | #include <linux/gfp.h> | 16 | #include <linux/gfp.h> |
17 | #include <linux/io.h> | 17 | #include <linux/io.h> |
18 | #include <linux/kernel_stat.h> | ||
19 | #include <linux/atomic.h> | 18 | #include <linux/atomic.h> |
20 | #include <asm/debug.h> | 19 | #include <asm/debug.h> |
21 | #include <asm/qdio.h> | 20 | #include <asm/qdio.h> |
@@ -1128,7 +1127,6 @@ void qdio_int_handler(struct ccw_device *cdev, unsigned long intparm, | |||
1128 | return; | 1127 | return; |
1129 | } | 1128 | } |
1130 | 1129 | ||
1131 | kstat_cpu(smp_processor_id()).irqs[IOINT_QDI]++; | ||
1132 | if (irq_ptr->perf_stat_enabled) | 1130 | if (irq_ptr->perf_stat_enabled) |
1133 | irq_ptr->perf_stat.qdio_int++; | 1131 | irq_ptr->perf_stat.qdio_int++; |
1134 | 1132 | ||
diff --git a/drivers/s390/net/claw.c b/drivers/s390/net/claw.c index f1fa2483ae6b..b41fae37d3af 100644 --- a/drivers/s390/net/claw.c +++ b/drivers/s390/net/claw.c | |||
@@ -63,7 +63,6 @@ | |||
63 | 63 | ||
64 | #define KMSG_COMPONENT "claw" | 64 | #define KMSG_COMPONENT "claw" |
65 | 65 | ||
66 | #include <linux/kernel_stat.h> | ||
67 | #include <asm/ccwdev.h> | 66 | #include <asm/ccwdev.h> |
68 | #include <asm/ccwgroup.h> | 67 | #include <asm/ccwgroup.h> |
69 | #include <asm/debug.h> | 68 | #include <asm/debug.h> |
@@ -291,6 +290,7 @@ static struct ccw_driver claw_ccw_driver = { | |||
291 | .ids = claw_ids, | 290 | .ids = claw_ids, |
292 | .probe = ccwgroup_probe_ccwdev, | 291 | .probe = ccwgroup_probe_ccwdev, |
293 | .remove = ccwgroup_remove_ccwdev, | 292 | .remove = ccwgroup_remove_ccwdev, |
293 | .int_class = IOINT_CLW, | ||
294 | }; | 294 | }; |
295 | 295 | ||
296 | static ssize_t | 296 | static ssize_t |
@@ -645,7 +645,6 @@ claw_irq_handler(struct ccw_device *cdev, | |||
645 | struct claw_env *p_env; | 645 | struct claw_env *p_env; |
646 | struct chbk *p_ch_r=NULL; | 646 | struct chbk *p_ch_r=NULL; |
647 | 647 | ||
648 | kstat_cpu(smp_processor_id()).irqs[IOINT_CLW]++; | ||
649 | CLAW_DBF_TEXT(4, trace, "clawirq"); | 648 | CLAW_DBF_TEXT(4, trace, "clawirq"); |
650 | /* Bypass all 'unsolicited interrupts' */ | 649 | /* Bypass all 'unsolicited interrupts' */ |
651 | privptr = dev_get_drvdata(&cdev->dev); | 650 | privptr = dev_get_drvdata(&cdev->dev); |
diff --git a/drivers/s390/net/ctcm_main.c b/drivers/s390/net/ctcm_main.c index 426787efc492..5cb93a8e3403 100644 --- a/drivers/s390/net/ctcm_main.c +++ b/drivers/s390/net/ctcm_main.c | |||
@@ -24,7 +24,6 @@ | |||
24 | #define KMSG_COMPONENT "ctcm" | 24 | #define KMSG_COMPONENT "ctcm" |
25 | #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt | 25 | #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt |
26 | 26 | ||
27 | #include <linux/kernel_stat.h> | ||
28 | #include <linux/module.h> | 27 | #include <linux/module.h> |
29 | #include <linux/init.h> | 28 | #include <linux/init.h> |
30 | #include <linux/kernel.h> | 29 | #include <linux/kernel.h> |
@@ -1203,7 +1202,6 @@ static void ctcm_irq_handler(struct ccw_device *cdev, | |||
1203 | int cstat; | 1202 | int cstat; |
1204 | int dstat; | 1203 | int dstat; |
1205 | 1204 | ||
1206 | kstat_cpu(smp_processor_id()).irqs[IOINT_CTC]++; | ||
1207 | CTCM_DBF_TEXT_(TRACE, CTC_DBF_DEBUG, | 1205 | CTCM_DBF_TEXT_(TRACE, CTC_DBF_DEBUG, |
1208 | "Enter %s(%s)", CTCM_FUNTAIL, dev_name(&cdev->dev)); | 1206 | "Enter %s(%s)", CTCM_FUNTAIL, dev_name(&cdev->dev)); |
1209 | 1207 | ||
@@ -1769,6 +1767,7 @@ static struct ccw_driver ctcm_ccw_driver = { | |||
1769 | .ids = ctcm_ids, | 1767 | .ids = ctcm_ids, |
1770 | .probe = ccwgroup_probe_ccwdev, | 1768 | .probe = ccwgroup_probe_ccwdev, |
1771 | .remove = ccwgroup_remove_ccwdev, | 1769 | .remove = ccwgroup_remove_ccwdev, |
1770 | .int_class = IOINT_CTC, | ||
1772 | }; | 1771 | }; |
1773 | 1772 | ||
1774 | static struct ccwgroup_driver ctcm_group_driver = { | 1773 | static struct ccwgroup_driver ctcm_group_driver = { |
diff --git a/drivers/s390/net/lcs.c b/drivers/s390/net/lcs.c index fb246b944b16..05fb3f7c7289 100644 --- a/drivers/s390/net/lcs.c +++ b/drivers/s390/net/lcs.c | |||
@@ -26,7 +26,6 @@ | |||
26 | #define KMSG_COMPONENT "lcs" | 26 | #define KMSG_COMPONENT "lcs" |
27 | #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt | 27 | #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt |
28 | 28 | ||
29 | #include <linux/kernel_stat.h> | ||
30 | #include <linux/module.h> | 29 | #include <linux/module.h> |
31 | #include <linux/if.h> | 30 | #include <linux/if.h> |
32 | #include <linux/netdevice.h> | 31 | #include <linux/netdevice.h> |
@@ -1399,7 +1398,6 @@ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb) | |||
1399 | int rc, index; | 1398 | int rc, index; |
1400 | int cstat, dstat; | 1399 | int cstat, dstat; |
1401 | 1400 | ||
1402 | kstat_cpu(smp_processor_id()).irqs[IOINT_LCS]++; | ||
1403 | if (lcs_check_irb_error(cdev, irb)) | 1401 | if (lcs_check_irb_error(cdev, irb)) |
1404 | return; | 1402 | return; |
1405 | 1403 | ||
@@ -2399,6 +2397,7 @@ static struct ccw_driver lcs_ccw_driver = { | |||
2399 | .ids = lcs_ids, | 2397 | .ids = lcs_ids, |
2400 | .probe = ccwgroup_probe_ccwdev, | 2398 | .probe = ccwgroup_probe_ccwdev, |
2401 | .remove = ccwgroup_remove_ccwdev, | 2399 | .remove = ccwgroup_remove_ccwdev, |
2400 | .int_class = IOINT_LCS, | ||
2402 | }; | 2401 | }; |
2403 | 2402 | ||
2404 | /** | 2403 | /** |