aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Ott <sebott@linux.ibm.com>2018-10-28 06:51:56 -0400
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2019-04-29 04:47:01 -0400
commit30e63ef2ef43f014bf2039bd57cc917780d6a44b (patch)
tree9cdcede18e3b4465dd20f4baf5e9d9e01c4bea52
parent0a9fddfaa8ea0f66564329ce89390c8dd38b2df0 (diff)
s390/airq: recognize directed interrupts
Add an extra parameter for airq handlers to recognize floating vs. directed interrupts. Signed-off-by: Sebastian Ott <sebott@linux.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
-rw-r--r--arch/s390/include/asm/airq.h2
-rw-r--r--arch/s390/kvm/interrupt.c2
-rw-r--r--arch/s390/pci/pci_irq.c2
-rw-r--r--drivers/s390/cio/airq.c2
-rw-r--r--drivers/s390/cio/cio.h2
-rw-r--r--drivers/s390/cio/qdio_thinint.c4
-rw-r--r--drivers/s390/crypto/ap_bus.c4
-rw-r--r--drivers/s390/virtio/virtio_ccw.c2
8 files changed, 10 insertions, 10 deletions
diff --git a/arch/s390/include/asm/airq.h b/arch/s390/include/asm/airq.h
index fcf539efb32f..91e78df365c7 100644
--- a/arch/s390/include/asm/airq.h
+++ b/arch/s390/include/asm/airq.h
@@ -14,7 +14,7 @@
14 14
15struct airq_struct { 15struct airq_struct {
16 struct hlist_node list; /* Handler queueing. */ 16 struct hlist_node list; /* Handler queueing. */
17 void (*handler)(struct airq_struct *); /* Thin-interrupt handler */ 17 void (*handler)(struct airq_struct *airq, bool floating);
18 u8 *lsi_ptr; /* Local-Summary-Indicator pointer */ 18 u8 *lsi_ptr; /* Local-Summary-Indicator pointer */
19 u8 lsi_mask; /* Local-Summary-Indicator mask */ 19 u8 lsi_mask; /* Local-Summary-Indicator mask */
20 u8 isc; /* Interrupt-subclass */ 20 u8 isc; /* Interrupt-subclass */
diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c
index 82162867f378..37503ae62486 100644
--- a/arch/s390/kvm/interrupt.c
+++ b/arch/s390/kvm/interrupt.c
@@ -3194,7 +3194,7 @@ out:
3194} 3194}
3195EXPORT_SYMBOL_GPL(kvm_s390_gisc_unregister); 3195EXPORT_SYMBOL_GPL(kvm_s390_gisc_unregister);
3196 3196
3197static void gib_alert_irq_handler(struct airq_struct *airq) 3197static void gib_alert_irq_handler(struct airq_struct *airq, bool floating)
3198{ 3198{
3199 inc_irq_stat(IRQIO_GAL); 3199 inc_irq_stat(IRQIO_GAL);
3200 process_gib_alert_list(); 3200 process_gib_alert_list();
diff --git a/arch/s390/pci/pci_irq.c b/arch/s390/pci/pci_irq.c
index 3b129cd35b6e..55e22e392376 100644
--- a/arch/s390/pci/pci_irq.c
+++ b/arch/s390/pci/pci_irq.c
@@ -56,7 +56,7 @@ static struct irq_chip zpci_irq_chip = {
56 .irq_mask = pci_msi_mask_irq, 56 .irq_mask = pci_msi_mask_irq,
57}; 57};
58 58
59static void zpci_irq_handler(struct airq_struct *airq) 59static void zpci_irq_handler(struct airq_struct *airq, bool floating)
60{ 60{
61 unsigned long si, ai; 61 unsigned long si, ai;
62 struct airq_iv *aibv; 62 struct airq_iv *aibv;
diff --git a/drivers/s390/cio/airq.c b/drivers/s390/cio/airq.c
index a45011e4529e..e045e79f061c 100644
--- a/drivers/s390/cio/airq.c
+++ b/drivers/s390/cio/airq.c
@@ -95,7 +95,7 @@ static irqreturn_t do_airq_interrupt(int irq, void *dummy)
95 rcu_read_lock(); 95 rcu_read_lock();
96 hlist_for_each_entry_rcu(airq, head, list) 96 hlist_for_each_entry_rcu(airq, head, list)
97 if ((*airq->lsi_ptr & airq->lsi_mask) != 0) 97 if ((*airq->lsi_ptr & airq->lsi_mask) != 0)
98 airq->handler(airq); 98 airq->handler(airq, !tpi_info->directed_irq);
99 rcu_read_unlock(); 99 rcu_read_unlock();
100 100
101 return IRQ_HANDLED; 101 return IRQ_HANDLED;
diff --git a/drivers/s390/cio/cio.h b/drivers/s390/cio/cio.h
index 92eabbb5f18d..06a91743335a 100644
--- a/drivers/s390/cio/cio.h
+++ b/drivers/s390/cio/cio.h
@@ -51,7 +51,7 @@ struct tpi_info {
51 struct subchannel_id schid; 51 struct subchannel_id schid;
52 u32 intparm; 52 u32 intparm;
53 u32 adapter_IO:1; 53 u32 adapter_IO:1;
54 u32 :1; 54 u32 directed_irq:1;
55 u32 isc:3; 55 u32 isc:3;
56 u32 :27; 56 u32 :27;
57 u32 type:3; 57 u32 type:3;
diff --git a/drivers/s390/cio/qdio_thinint.c b/drivers/s390/cio/qdio_thinint.c
index 07dea602205b..28d59ac2204c 100644
--- a/drivers/s390/cio/qdio_thinint.c
+++ b/drivers/s390/cio/qdio_thinint.c
@@ -40,7 +40,7 @@ static LIST_HEAD(tiq_list);
40static DEFINE_MUTEX(tiq_list_lock); 40static DEFINE_MUTEX(tiq_list_lock);
41 41
42/* Adapter interrupt definitions */ 42/* Adapter interrupt definitions */
43static void tiqdio_thinint_handler(struct airq_struct *airq); 43static void tiqdio_thinint_handler(struct airq_struct *airq, bool floating);
44 44
45static struct airq_struct tiqdio_airq = { 45static struct airq_struct tiqdio_airq = {
46 .handler = tiqdio_thinint_handler, 46 .handler = tiqdio_thinint_handler,
@@ -179,7 +179,7 @@ static inline void tiqdio_call_inq_handlers(struct qdio_irq *irq)
179 * tiqdio_thinint_handler - thin interrupt handler for qdio 179 * tiqdio_thinint_handler - thin interrupt handler for qdio
180 * @airq: pointer to adapter interrupt descriptor 180 * @airq: pointer to adapter interrupt descriptor
181 */ 181 */
182static void tiqdio_thinint_handler(struct airq_struct *airq) 182static void tiqdio_thinint_handler(struct airq_struct *airq, bool floating)
183{ 183{
184 u32 si_used = clear_shared_ind(); 184 u32 si_used = clear_shared_ind();
185 struct qdio_q *q; 185 struct qdio_q *q;
diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c
index 1546389d71db..cc30e4f07fff 100644
--- a/drivers/s390/crypto/ap_bus.c
+++ b/drivers/s390/crypto/ap_bus.c
@@ -116,7 +116,7 @@ static int user_set_domain;
116static struct bus_type ap_bus_type; 116static struct bus_type ap_bus_type;
117 117
118/* Adapter interrupt definitions */ 118/* Adapter interrupt definitions */
119static void ap_interrupt_handler(struct airq_struct *airq); 119static void ap_interrupt_handler(struct airq_struct *airq, bool floating);
120 120
121static int ap_airq_flag; 121static int ap_airq_flag;
122 122
@@ -393,7 +393,7 @@ static enum hrtimer_restart ap_poll_timeout(struct hrtimer *unused)
393 * ap_interrupt_handler() - Schedule ap_tasklet on interrupt 393 * ap_interrupt_handler() - Schedule ap_tasklet on interrupt
394 * @airq: pointer to adapter interrupt descriptor 394 * @airq: pointer to adapter interrupt descriptor
395 */ 395 */
396static void ap_interrupt_handler(struct airq_struct *airq) 396static void ap_interrupt_handler(struct airq_struct *airq, bool floating)
397{ 397{
398 inc_irq_stat(IRQIO_APB); 398 inc_irq_stat(IRQIO_APB);
399 if (!ap_suspend_flag) 399 if (!ap_suspend_flag)
diff --git a/drivers/s390/virtio/virtio_ccw.c b/drivers/s390/virtio/virtio_ccw.c
index 74c328321889..991420caa4f2 100644
--- a/drivers/s390/virtio/virtio_ccw.c
+++ b/drivers/s390/virtio/virtio_ccw.c
@@ -182,7 +182,7 @@ static void drop_airq_indicator(struct virtqueue *vq, struct airq_info *info)
182 write_unlock_irqrestore(&info->lock, flags); 182 write_unlock_irqrestore(&info->lock, flags);
183} 183}
184 184
185static void virtio_airq_handler(struct airq_struct *airq) 185static void virtio_airq_handler(struct airq_struct *airq, bool floating)
186{ 186{
187 struct airq_info *info = container_of(airq, struct airq_info, airq); 187 struct airq_info *info = container_of(airq, struct airq_info, airq);
188 unsigned long ai; 188 unsigned long ai;