lkml.org 
[lkml]   [2022]   [Apr]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 05/21] s390/airq: pass more TPI info to airq handlers
    Date
    A subsequent patch will introduce an airq handler that requires additional
    TPI information beyond directed vs floating, so pass the entire tpi_info
    structure via the handler. Only pci actually uses this information today,
    for the other airq handlers this is effectively a no-op.

    Reviewed-by: Eric Farman <farman@linux.ibm.com>
    Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
    Reviewed-by: Pierre Morel <pmorel@linux.ibm.com>
    Reviewed-by: Thomas Huth <thuth@redhat.com>
    Acked-by: Christian Borntraeger <borntraeger@linux.ibm.com>
    Acked-by: Cornelia Huck <cohuck@redhat.com>
    Signed-off-by: Matthew Rosato <mjrosato@linux.ibm.com>
    ---
    arch/s390/include/asm/airq.h | 3 ++-
    arch/s390/kvm/interrupt.c | 4 +++-
    arch/s390/pci/pci_irq.c | 9 +++++++--
    drivers/s390/cio/airq.c | 2 +-
    drivers/s390/cio/qdio_thinint.c | 6 ++++--
    drivers/s390/crypto/ap_bus.c | 9 ++++++---
    drivers/s390/virtio/virtio_ccw.c | 4 +++-
    7 files changed, 26 insertions(+), 11 deletions(-)

    diff --git a/arch/s390/include/asm/airq.h b/arch/s390/include/asm/airq.h
    index 01936fdfaddb..7918a7d09028 100644
    --- a/arch/s390/include/asm/airq.h
    +++ b/arch/s390/include/asm/airq.h
    @@ -12,10 +12,11 @@

    #include <linux/bit_spinlock.h>
    #include <linux/dma-mapping.h>
    +#include <asm/tpi.h>

    struct airq_struct {
    struct hlist_node list; /* Handler queueing. */
    - void (*handler)(struct airq_struct *airq, bool floating);
    + void (*handler)(struct airq_struct *airq, struct tpi_info *tpi_info);
    u8 *lsi_ptr; /* Local-Summary-Indicator pointer */
    u8 lsi_mask; /* Local-Summary-Indicator mask */
    u8 isc; /* Interrupt-subclass */
    diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c
    index 9b30beac904d..250119a26c60 100644
    --- a/arch/s390/kvm/interrupt.c
    +++ b/arch/s390/kvm/interrupt.c
    @@ -28,6 +28,7 @@
    #include <asm/switch_to.h>
    #include <asm/nmi.h>
    #include <asm/airq.h>
    +#include <asm/tpi.h>
    #include "kvm-s390.h"
    #include "gaccess.h"
    #include "trace-s390.h"
    @@ -3311,7 +3312,8 @@ int kvm_s390_gisc_unregister(struct kvm *kvm, u32 gisc)
    }
    EXPORT_SYMBOL_GPL(kvm_s390_gisc_unregister);

    -static void gib_alert_irq_handler(struct airq_struct *airq, bool floating)
    +static void gib_alert_irq_handler(struct airq_struct *airq,
    + struct tpi_info *tpi_info)
    {
    inc_irq_stat(IRQIO_GAL);
    process_gib_alert_list();
    diff --git a/arch/s390/pci/pci_irq.c b/arch/s390/pci/pci_irq.c
    index 500cd2dbdf53..b805c75252ed 100644
    --- a/arch/s390/pci/pci_irq.c
    +++ b/arch/s390/pci/pci_irq.c
    @@ -11,6 +11,7 @@

    #include <asm/isc.h>
    #include <asm/airq.h>
    +#include <asm/tpi.h>

    static enum {FLOATING, DIRECTED} irq_delivery;

    @@ -216,8 +217,11 @@ static void zpci_handle_fallback_irq(void)
    }
    }

    -static void zpci_directed_irq_handler(struct airq_struct *airq, bool floating)
    +static void zpci_directed_irq_handler(struct airq_struct *airq,
    + struct tpi_info *tpi_info)
    {
    + bool floating = !tpi_info->directed_irq;
    +
    if (floating) {
    inc_irq_stat(IRQIO_PCF);
    zpci_handle_fallback_irq();
    @@ -227,7 +231,8 @@ static void zpci_directed_irq_handler(struct airq_struct *airq, bool floating)
    }
    }

    -static void zpci_floating_irq_handler(struct airq_struct *airq, bool floating)
    +static void zpci_floating_irq_handler(struct airq_struct *airq,
    + struct tpi_info *tpi_info)
    {
    unsigned long si, ai;
    struct airq_iv *aibv;
    diff --git a/drivers/s390/cio/airq.c b/drivers/s390/cio/airq.c
    index c0ed364bf446..230eb5b5b64e 100644
    --- a/drivers/s390/cio/airq.c
    +++ b/drivers/s390/cio/airq.c
    @@ -99,7 +99,7 @@ static irqreturn_t do_airq_interrupt(int irq, void *dummy)
    rcu_read_lock();
    hlist_for_each_entry_rcu(airq, head, list)
    if ((*airq->lsi_ptr & airq->lsi_mask) != 0)
    - airq->handler(airq, !tpi_info->directed_irq);
    + airq->handler(airq, tpi_info);
    rcu_read_unlock();

    return IRQ_HANDLED;
    diff --git a/drivers/s390/cio/qdio_thinint.c b/drivers/s390/cio/qdio_thinint.c
    index 8e09bf3a2fcd..9b9335dd06db 100644
    --- a/drivers/s390/cio/qdio_thinint.c
    +++ b/drivers/s390/cio/qdio_thinint.c
    @@ -15,6 +15,7 @@
    #include <asm/qdio.h>
    #include <asm/airq.h>
    #include <asm/isc.h>
    +#include <asm/tpi.h>

    #include "cio.h"
    #include "ioasm.h"
    @@ -93,9 +94,10 @@ static inline u32 clear_shared_ind(void)
    /**
    * tiqdio_thinint_handler - thin interrupt handler for qdio
    * @airq: pointer to adapter interrupt descriptor
    - * @floating: flag to recognize floating vs. directed interrupts (unused)
    + * @tpi_info: interrupt information (e.g. floating vs directed -- unused)
    */
    -static void tiqdio_thinint_handler(struct airq_struct *airq, bool floating)
    +static void tiqdio_thinint_handler(struct airq_struct *airq,
    + struct tpi_info *tpi_info)
    {
    u64 irq_time = S390_lowcore.int_clock;
    u32 si_used = clear_shared_ind();
    diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c
    index fdf16cb70881..6cb8a2802ef8 100644
    --- a/drivers/s390/crypto/ap_bus.c
    +++ b/drivers/s390/crypto/ap_bus.c
    @@ -27,6 +27,7 @@
    #include <linux/kthread.h>
    #include <linux/mutex.h>
    #include <asm/airq.h>
    +#include <asm/tpi.h>
    #include <linux/atomic.h>
    #include <asm/isc.h>
    #include <linux/hrtimer.h>
    @@ -131,7 +132,8 @@ static int ap_max_adapter_id = 63;
    static struct bus_type ap_bus_type;

    /* Adapter interrupt definitions */
    -static void ap_interrupt_handler(struct airq_struct *airq, bool floating);
    +static void ap_interrupt_handler(struct airq_struct *airq,
    + struct tpi_info *tpi_info);

    static bool ap_irq_flag;

    @@ -452,9 +454,10 @@ static enum hrtimer_restart ap_poll_timeout(struct hrtimer *unused)
    /**
    * ap_interrupt_handler() - Schedule ap_tasklet on interrupt
    * @airq: pointer to adapter interrupt descriptor
    - * @floating: ignored
    + * @tpi_info: ignored
    */
    -static void ap_interrupt_handler(struct airq_struct *airq, bool floating)
    +static void ap_interrupt_handler(struct airq_struct *airq,
    + struct tpi_info *tpi_info)
    {
    inc_irq_stat(IRQIO_APB);
    tasklet_schedule(&ap_tasklet);
    diff --git a/drivers/s390/virtio/virtio_ccw.c b/drivers/s390/virtio/virtio_ccw.c
    index d35e7a3f7067..52c376d15978 100644
    --- a/drivers/s390/virtio/virtio_ccw.c
    +++ b/drivers/s390/virtio/virtio_ccw.c
    @@ -33,6 +33,7 @@
    #include <asm/virtio-ccw.h>
    #include <asm/isc.h>
    #include <asm/airq.h>
    +#include <asm/tpi.h>

    /*
    * virtio related functions
    @@ -203,7 +204,8 @@ static void drop_airq_indicator(struct virtqueue *vq, struct airq_info *info)
    write_unlock_irqrestore(&info->lock, flags);
    }

    -static void virtio_airq_handler(struct airq_struct *airq, bool floating)
    +static void virtio_airq_handler(struct airq_struct *airq,
    + struct tpi_info *tpi_info)
    {
    struct airq_info *info = container_of(airq, struct airq_info, airq);
    unsigned long ai;
    --
    2.27.0
    \
     
     \ /
      Last update: 2022-04-05 00:39    [W:2.503 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site