[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 2/5] slirp: Prevent recursion of if_start
From: |
Jan Kiszka |
Subject: |
[Qemu-devel] [PATCH v3 2/5] slirp: Prevent recursion of if_start |
Date: |
Thu, 8 Mar 2012 12:35:42 +0100 |
if_start can be called recursively via if_encap. Avoid this as our
scheme of dequeuing packets is not compatible with this.
CC: Fabien Chouteau <address@hidden>
CC: Zhi Yong Wu <address@hidden>
CC: Stefan Weil <address@hidden>
Signed-off-by: Jan Kiszka <address@hidden>
---
slirp/if.c | 11 ++++++++++-
slirp/slirp.h | 1 +
2 files changed, 11 insertions(+), 1 deletions(-)
diff --git a/slirp/if.c b/slirp/if.c
index 14fdef1..f7aebe9 100644
--- a/slirp/if.c
+++ b/slirp/if.c
@@ -163,10 +163,17 @@ void if_start(Slirp *slirp)
DEBUG_CALL("if_start");
+ if (slirp->if_start_busy) {
+ return;
+ }
+ slirp->if_start_busy = true;
+
while (slirp->if_queued) {
/* check if we can really output */
- if (!slirp_can_output(slirp->opaque))
+ if (!slirp_can_output(slirp->opaque)) {
+ slirp->if_start_busy = false;
return;
+ }
/*
* See which queue to get next packet from
@@ -221,4 +228,6 @@ void if_start(Slirp *slirp)
}
slirp->if_queued = requeued;
+
+ slirp->if_start_busy = false;
}
diff --git a/slirp/slirp.h b/slirp/slirp.h
index 28a5c03..416d44a 100644
--- a/slirp/slirp.h
+++ b/slirp/slirp.h
@@ -239,6 +239,7 @@ struct Slirp {
struct mbuf if_fastq; /* fast queue (for interactive data) */
struct mbuf if_batchq; /* queue for non-interactive data */
struct mbuf *next_m; /* pointer to next mbuf to output */
+ bool if_start_busy; /* avoid if_start recursion */
/* ip states */
struct ipq ipq; /* ip reass. queue */
--
1.7.3.4