lkml.org 
[lkml]   [2018]   [Sep]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 093/107] s390/qdio: reset old sbal_state flags
    Date
    4.9-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Julian Wiedmann <jwi@linux.ibm.com>

    commit 64e03ff72623b8c2ea89ca3cb660094e019ed4ae upstream.

    When allocating a new AOB fails, handle_outbound() is still capable of
    transmitting the selected buffer (just without async completion).

    But if a previous transfer on this queue slot used async completion, its
    sbal_state flags field is still set to QDIO_OUTBUF_STATE_FLAG_PENDING.
    So when the upper layer driver sees this stale flag, it expects an async
    completion that never happens.

    Fix this by unconditionally clearing the flags field.

    Fixes: 104ea556ee7f ("qdio: support asynchronous delivery of storage blocks")
    Cc: <stable@vger.kernel.org> #v3.2+
    Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com>
    Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    arch/s390/include/asm/qdio.h | 1 -
    drivers/s390/cio/qdio_main.c | 5 ++---
    2 files changed, 2 insertions(+), 4 deletions(-)

    --- a/arch/s390/include/asm/qdio.h
    +++ b/arch/s390/include/asm/qdio.h
    @@ -261,7 +261,6 @@ struct qdio_outbuf_state {
    void *user;
    };

    -#define QDIO_OUTBUF_STATE_FLAG_NONE 0x00
    #define QDIO_OUTBUF_STATE_FLAG_PENDING 0x01

    #define CHSC_AC1_INITIATE_INPUTQ 0x80
    --- a/drivers/s390/cio/qdio_main.c
    +++ b/drivers/s390/cio/qdio_main.c
    @@ -640,21 +640,20 @@ static inline unsigned long qdio_aob_for
    unsigned long phys_aob = 0;

    if (!q->use_cq)
    - goto out;
    + return 0;

    if (!q->aobs[bufnr]) {
    struct qaob *aob = qdio_allocate_aob();
    q->aobs[bufnr] = aob;
    }
    if (q->aobs[bufnr]) {
    - q->sbal_state[bufnr].flags = QDIO_OUTBUF_STATE_FLAG_NONE;
    q->sbal_state[bufnr].aob = q->aobs[bufnr];
    q->aobs[bufnr]->user1 = (u64) q->sbal_state[bufnr].user;
    phys_aob = virt_to_phys(q->aobs[bufnr]);
    WARN_ON_ONCE(phys_aob & 0xFF);
    }

    -out:
    + q->sbal_state[bufnr].flags = 0;
    return phys_aob;
    }


    \
     
     \ /
      Last update: 2018-09-03 19:10    [W:3.490 / U:0.076 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site