s390/qeth: make qeth_qdio_handle_aob() more robust
authorJulian Wiedmann <jwi@linux.ibm.com>
Mon, 7 Dec 2020 13:12:33 +0000 (14:12 +0100)
committerDavid S. Miller <davem@davemloft.net>
Mon, 7 Dec 2020 14:55:21 +0000 (06:55 -0800)
When qeth_qdio_handle_aob() frees dangling allocations in the notified
TX buffer, there are rare tear-down cases where
qeth_drain_output_queue() would later call qeth_clear_output_buffer()
for the same buffer - and thus end up walking the buffer a second time
to check for dangling kmem_cache allocations.

Luckily current code previously scrubs such a buffer, so
qeth_clear_output_buffer() would find buf->buffer->element[i].addr as
NULL and not do anything. But this is fragile, and we can easily improve
it by consistently clearing the ->is_header flag after freeing the
allocation.

Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/s390/net/qeth_core_main.c

index da27ef451d05ad731406af5ddf523b2081b8be23..f4b60294a9695205c9bff6887c008382cd569bd3 100644 (file)
@@ -546,6 +546,7 @@ static void qeth_qdio_handle_aob(struct qeth_card *card,
 
                        if (data && buffer->is_header[i])
                                kmem_cache_free(qeth_core_header_cache, data);
+                       buffer->is_header[i] = 0;
                }
 
                atomic_set(&buffer->state, QETH_QDIO_BUF_EMPTY);