lkml.org 
[lkml]   [2017]   [Mar]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.12 50/60] s390/qdio: clear DSCI prior to scanning multiple input queues
    Date
    From: Julian Wiedmann <jwi@linux.vnet.ibm.com>

    3.12-stable review patch. If anyone has any objections, please let me know.

    ===============

    commit 1e4a382fdc0ba8d1a85b758c0811de3a3631085e upstream.

    For devices with multiple input queues, tiqdio_call_inq_handlers()
    iterates over all input queues and clears the device's DSCI
    during each iteration. If the DSCI is re-armed during one
    of the later iterations, we therefore do not scan the previous
    queues again.
    The re-arming also raises a new adapter interrupt. But its
    handler does not trigger a rescan for the device, as the DSCI
    has already been erroneously cleared.
    This can result in queue stalls on devices with multiple
    input queues.

    Fix it by clearing the DSCI just once, prior to scanning the queues.

    As the code is moved in front of the loop, we also need to access
    the DSCI directly (ie irq->dsci) instead of going via each queue's
    parent pointer to the same irq. This is not a functional change,
    and a follow-up patch will clean up the other users.

    In practice, this bug only affects CQ-enabled HiperSockets devices,
    ie. devices with sysfs-attribute "hsuid" set. Setting a hsuid is
    needed for AF_IUCV socket applications that use HiperSockets
    communication.

    Fixes: 104ea556ee7f ("qdio: support asynchronous delivery of storage blocks")
    Reviewed-by: Ursula Braun <ubraun@linux.vnet.ibm.com>
    Signed-off-by: Julian Wiedmann <jwi@linux.vnet.ibm.com>
    Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
    Signed-off-by: Jiri Slaby <jslaby@suse.cz>
    ---
    drivers/s390/cio/qdio_thinint.c | 8 ++++----
    1 file changed, 4 insertions(+), 4 deletions(-)

    diff --git a/drivers/s390/cio/qdio_thinint.c b/drivers/s390/cio/qdio_thinint.c
    index 5d06253c2a7a..30e9fbbff051 100644
    --- a/drivers/s390/cio/qdio_thinint.c
    +++ b/drivers/s390/cio/qdio_thinint.c
    @@ -147,11 +147,11 @@ static inline void tiqdio_call_inq_handlers(struct qdio_irq *irq)
    struct qdio_q *q;
    int i;

    - for_each_input_queue(irq, q, i) {
    - if (!references_shared_dsci(irq) &&
    - has_multiple_inq_on_dsci(irq))
    - xchg(q->irq_ptr->dsci, 0);
    + if (!references_shared_dsci(irq) &&
    + has_multiple_inq_on_dsci(irq))
    + xchg(irq->dsci, 0);

    + for_each_input_queue(irq, q, i) {
    if (q->u.in.queue_start_poll) {
    /* skip if polling is enabled or already in work */
    if (test_and_set_bit(QDIO_QUEUE_IRQS_DISABLED,
    --
    2.12.0
    \
     
     \ /
      Last update: 2017-03-14 14:19    [W:6.654 / U:0.296 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site