aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Wang <jasowang@redhat.com>2020-07-22 16:57:46 +0800
committerJason Wang <jasowang@redhat.com>2020-07-28 16:57:58 +0800
commit22dc8663d9fc7baa22100544c600b6285a63c7a3 (patch)
tree629ff8639cff438df773019e1f092b9dc851e972
parentc546ecf27da1114d0274abe600cc6bde6584e659 (diff)
downloadqemu-22dc8663d9fc7baa22100544c600b6285a63c7a3.zip
qemu-22dc8663d9fc7baa22100544c600b6285a63c7a3.tar.gz
qemu-22dc8663d9fc7baa22100544c600b6285a63c7a3.tar.bz2
net: forbid the reentrant RX
The memory API allows DMA into NIC's MMIO area. This means the NIC's RX routine must be reentrant. Instead of auditing all the NIC, we can simply detect the reentrancy and return early. The queue->delivering is set and cleared by qemu_net_queue_deliver() for other queue helpers to know whether the delivering in on going (NIC's receive is being called). We can check it and return early in qemu_net_queue_flush() to forbid reentrant RX. Signed-off-by: Jason Wang <jasowang@redhat.com>
-rw-r--r--net/queue.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/net/queue.c b/net/queue.c
index 0164727..19e32c8 100644
--- a/net/queue.c
+++ b/net/queue.c
@@ -250,6 +250,9 @@ void qemu_net_queue_purge(NetQueue *queue, NetClientState *from)
bool qemu_net_queue_flush(NetQueue *queue)
{
+ if (queue->delivering)
+ return false;
+
while (!QTAILQ_EMPTY(&queue->packets)) {
NetPacket *packet;
int ret;