]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
s390/qeth: fix notification for pending buffers during teardown
authorJulian Wiedmann <jwi@linux.ibm.com>
Tue, 9 Mar 2021 16:52:21 +0000 (17:52 +0100)
committerSeth Forshee <seth.forshee@canonical.com>
Wed, 17 Mar 2021 18:37:43 +0000 (13:37 -0500)
BugLink: https://bugs.launchpad.net/bugs/1919492
commit 7eefda7f353ef86ad82a2dc8329e8a3538c08ab6 upstream.

The cited commit reworked the state machine for pending TX buffers.
In qeth_iqd_tx_complete() it turned PENDING into a transient state, and
uses NEED_QAOB for buffers that get parked while waiting for their QAOB
completion.

But it missed to adjust the check in qeth_tx_complete_buf(). So if
qeth_tx_complete_pending_bufs() is called during teardown to drain
the parked TX buffers, we no longer raise a notification for af_iucv.

Instead of updating the checked state, just move this code into
qeth_tx_complete_pending_bufs() itself. This also gets rid of the
special-case in the common TX completion path.

Fixes: 8908f36d20d8 ("s390/qeth: fix af_iucv notification race")
Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
drivers/s390/net/qeth_core_main.c

index 6abb8cc7dffa7e129db38d7310c2a9573b83ac99..5e4dcc9aae1b690f10e43015a591af6be90247b1 100644 (file)
@@ -1386,9 +1386,6 @@ static void qeth_tx_complete_buf(struct qeth_qdio_out_buffer *buf, bool error,
        struct qeth_qdio_out_q *queue = buf->q;
        struct sk_buff *skb;
 
-       if (atomic_read(&buf->state) == QETH_QDIO_BUF_PENDING)
-               qeth_notify_skbs(queue, buf, TX_NOTIFY_GENERALERROR);
-
        /* Empty buffer? */
        if (buf->next_element_to_fill == 0)
                return;
@@ -1461,6 +1458,9 @@ static void qeth_tx_complete_pending_bufs(struct qeth_card *card,
                        QETH_CARD_TEXT(card, 5, "fp");
                        QETH_CARD_TEXT_(card, 5, "%lx", (long) buf);
 
+                       if (drain)
+                               qeth_notify_skbs(queue, buf,
+                                                TX_NOTIFY_GENERALERROR);
                        qeth_tx_complete_buf(buf, drain, 0);
 
                        list_del(&buf->list_entry);