Commit d2e46004 authored by Julian Wiedmann's avatar Julian Wiedmann Committed by David S. Miller

s390/qeth: make qeth_qdio_handle_aob() more robust

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: default avatarJulian Wiedmann <jwi@linux.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 75cf3854
...@@ -546,6 +546,7 @@ static void qeth_qdio_handle_aob(struct qeth_card *card, ...@@ -546,6 +546,7 @@ static void qeth_qdio_handle_aob(struct qeth_card *card,
if (data && buffer->is_header[i]) if (data && buffer->is_header[i])
kmem_cache_free(qeth_core_header_cache, data); kmem_cache_free(qeth_core_header_cache, data);
buffer->is_header[i] = 0;
} }
atomic_set(&buffer->state, QETH_QDIO_BUF_EMPTY); atomic_set(&buffer->state, QETH_QDIO_BUF_EMPTY);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment