Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Sebastian Ott and committed by
Martin Schwidefsky
30e63ef2 0a9fddfa

+10 -10
+1 -1
arch/s390/include/asm/airq.h
··· 14 14 15 15 struct airq_struct { 16 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 18 u8 *lsi_ptr; /* Local-Summary-Indicator pointer */ 19 19 u8 lsi_mask; /* Local-Summary-Indicator mask */ 20 20 u8 isc; /* Interrupt-subclass */
+1 -1
arch/s390/kvm/interrupt.c
··· 3194 3194 } 3195 3195 EXPORT_SYMBOL_GPL(kvm_s390_gisc_unregister); 3196 3196 3197 - static void gib_alert_irq_handler(struct airq_struct *airq) 3197 + static void gib_alert_irq_handler(struct airq_struct *airq, bool floating) 3198 3198 { 3199 3199 inc_irq_stat(IRQIO_GAL); 3200 3200 process_gib_alert_list();
+1 -1
arch/s390/pci/pci_irq.c
··· 56 56 .irq_mask = pci_msi_mask_irq, 57 57 }; 58 58 59 - static void zpci_irq_handler(struct airq_struct *airq) 59 + static void zpci_irq_handler(struct airq_struct *airq, bool floating) 60 60 { 61 61 unsigned long si, ai; 62 62 struct airq_iv *aibv;
+1 -1
drivers/s390/cio/airq.c
··· 95 95 rcu_read_lock(); 96 96 hlist_for_each_entry_rcu(airq, head, list) 97 97 if ((*airq->lsi_ptr & airq->lsi_mask) != 0) 98 - airq->handler(airq); 98 + airq->handler(airq, !tpi_info->directed_irq); 99 99 rcu_read_unlock(); 100 100 101 101 return IRQ_HANDLED;
+1 -1
drivers/s390/cio/cio.h
··· 51 51 struct subchannel_id schid; 52 52 u32 intparm; 53 53 u32 adapter_IO:1; 54 - u32 :1; 54 + u32 directed_irq:1; 55 55 u32 isc:3; 56 56 u32 :27; 57 57 u32 type:3;
+2 -2
drivers/s390/cio/qdio_thinint.c
··· 40 40 static DEFINE_MUTEX(tiq_list_lock); 41 41 42 42 /* Adapter interrupt definitions */ 43 - static void tiqdio_thinint_handler(struct airq_struct *airq); 43 + static void tiqdio_thinint_handler(struct airq_struct *airq, bool floating); 44 44 45 45 static struct airq_struct tiqdio_airq = { 46 46 .handler = tiqdio_thinint_handler, ··· 179 179 * tiqdio_thinint_handler - thin interrupt handler for qdio 180 180 * @airq: pointer to adapter interrupt descriptor 181 181 */ 182 - static void tiqdio_thinint_handler(struct airq_struct *airq) 182 + static void tiqdio_thinint_handler(struct airq_struct *airq, bool floating) 183 183 { 184 184 u32 si_used = clear_shared_ind(); 185 185 struct qdio_q *q;
+2 -2
drivers/s390/crypto/ap_bus.c
··· 116 116 static struct bus_type ap_bus_type; 117 117 118 118 /* Adapter interrupt definitions */ 119 - static void ap_interrupt_handler(struct airq_struct *airq); 119 + static void ap_interrupt_handler(struct airq_struct *airq, bool floating); 120 120 121 121 static int ap_airq_flag; 122 122 ··· 393 393 * ap_interrupt_handler() - Schedule ap_tasklet on interrupt 394 394 * @airq: pointer to adapter interrupt descriptor 395 395 */ 396 - static void ap_interrupt_handler(struct airq_struct *airq) 396 + static void ap_interrupt_handler(struct airq_struct *airq, bool floating) 397 397 { 398 398 inc_irq_stat(IRQIO_APB); 399 399 if (!ap_suspend_flag)
+1 -1
drivers/s390/virtio/virtio_ccw.c
··· 182 182 write_unlock_irqrestore(&info->lock, flags); 183 183 } 184 184 185 - static void virtio_airq_handler(struct airq_struct *airq) 185 + static void virtio_airq_handler(struct airq_struct *airq, bool floating) 186 186 { 187 187 struct airq_info *info = container_of(airq, struct airq_info, airq); 188 188 unsigned long ai;