From d6536b2c971f7323e58dfbe1e6f3b7c7c0c4edf3 Mon Sep 17 00:00:00 2001 From: Jan Kiszka Date: Wed, 29 Feb 2012 09:27:33 +0100 Subject: [PATCH] slirp: Keep next_m always valid Make sure that next_m always points to a packet if batchq is non-empty. This will simplify walking the queues in if_start. CC: Fabien Chouteau CC: Zhi Yong Wu CC: Stefan Weil Signed-off-by: Jan Kiszka --- slirp/if.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/slirp/if.c b/slirp/if.c index 33f08e1..14fdef1 100644 --- a/slirp/if.c +++ b/slirp/if.c @@ -96,8 +96,13 @@ if_output(struct socket *so, struct mbuf *ifm) ifs_insque(ifm, ifq->ifs_prev); goto diddit; } - } else + } else { ifq = slirp->if_batchq.ifq_prev; + /* Set next_m if the queue was empty so far */ + if (slirp->next_m == &slirp->if_batchq) { + slirp->next_m = ifm; + } + } /* Create a new doubly linked list for this session */ ifm->ifq_so = so; @@ -170,13 +175,8 @@ void if_start(Slirp *slirp) if (slirp->if_fastq.ifq_next != &slirp->if_fastq) { ifm = slirp->if_fastq.ifq_next; } else { - /* Nothing on fastq, see if next_m is valid */ - if (slirp->next_m != &slirp->if_batchq) { - ifm = slirp->next_m; - } else { - ifm = slirp->if_batchq.ifq_next; - } - + /* Nothing on fastq, pick up from batchq via next_m */ + ifm = slirp->next_m; from_batchq = true; } @@ -202,6 +202,12 @@ void if_start(Slirp *slirp) if (ifm->ifs_next != ifm) { insque(ifm->ifs_next, ifqt); ifs_remque(ifm); + /* Set next_m if the session packet is now the only one on + * batchq */ + if (ifqt == &slirp->if_batchq && + slirp->next_m == &slirp->if_batchq) { + slirp->next_m = ifm->ifs_next; + } } /* Update so_queued */ -- 2.7.4