lkml.org 
[lkml]   [2020]   [Jun]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.7 143/388] s390/qdio: put thinint indicator after early error
    Date
    From: Julian Wiedmann <jwi@linux.ibm.com>

    [ Upstream commit 75e82bec6b2622c6f455b7a543fb5476a5d0eed7 ]

    qdio_establish() calls qdio_setup_thinint() via qdio_setup_irq().
    If the subsequent qdio_establish_thinint() fails, we miss to put the
    DSCI again. Thus the DSCI isn't available for re-use. Given enough of
    such errors, we could end up with having only the shared DSCI available.

    Merge qdio_setup_thinint() into qdio_establish_thinint(), and deal with
    such an error internally.

    Fixes: 779e6e1c724d ("[S390] qdio: new qdio driver.")
    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>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/s390/cio/qdio.h | 1 -
    drivers/s390/cio/qdio_setup.c | 1 -
    drivers/s390/cio/qdio_thinint.c | 14 ++++++++------
    3 files changed, 8 insertions(+), 8 deletions(-)

    diff --git a/drivers/s390/cio/qdio.h b/drivers/s390/cio/qdio.h
    index 3cf223bc1d5f..a2afd7bc100b 100644
    --- a/drivers/s390/cio/qdio.h
    +++ b/drivers/s390/cio/qdio.h
    @@ -364,7 +364,6 @@ static inline int multicast_outbound(struct qdio_q *q)
    extern u64 last_ai_time;

    /* prototypes for thin interrupt */
    -void qdio_setup_thinint(struct qdio_irq *irq_ptr);
    int qdio_establish_thinint(struct qdio_irq *irq_ptr);
    void qdio_shutdown_thinint(struct qdio_irq *irq_ptr);
    void tiqdio_add_device(struct qdio_irq *irq_ptr);
    diff --git a/drivers/s390/cio/qdio_setup.c b/drivers/s390/cio/qdio_setup.c
    index d12f094db056..8edfa0982221 100644
    --- a/drivers/s390/cio/qdio_setup.c
    +++ b/drivers/s390/cio/qdio_setup.c
    @@ -480,7 +480,6 @@ int qdio_setup_irq(struct qdio_irq *irq_ptr, struct qdio_initialize *init_data)
    }

    setup_qib(irq_ptr, init_data);
    - qdio_setup_thinint(irq_ptr);
    set_impl_params(irq_ptr, init_data->qib_param_field_format,
    init_data->qib_param_field,
    init_data->input_slib_elements,
    diff --git a/drivers/s390/cio/qdio_thinint.c b/drivers/s390/cio/qdio_thinint.c
    index ae50373617cd..0faa0ad21732 100644
    --- a/drivers/s390/cio/qdio_thinint.c
    +++ b/drivers/s390/cio/qdio_thinint.c
    @@ -227,17 +227,19 @@ int __init tiqdio_register_thinints(void)

    int qdio_establish_thinint(struct qdio_irq *irq_ptr)
    {
    + int rc;
    +
    if (!is_thinint_irq(irq_ptr))
    return 0;
    - return set_subchannel_ind(irq_ptr, 0);
    -}

    -void qdio_setup_thinint(struct qdio_irq *irq_ptr)
    -{
    - if (!is_thinint_irq(irq_ptr))
    - return;
    irq_ptr->dsci = get_indicator();
    DBF_HEX(&irq_ptr->dsci, sizeof(void *));
    +
    + rc = set_subchannel_ind(irq_ptr, 0);
    + if (rc)
    + put_indicator(irq_ptr->dsci);
    +
    + return rc;
    }

    void qdio_shutdown_thinint(struct qdio_irq *irq_ptr)
    --
    2.25.1
    \
     
     \ /
      Last update: 2020-06-18 04:45    [W:4.195 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site