Skip to content

Commit

Permalink
Avoid embedding struct mbuf in other structures
Browse files Browse the repository at this point in the history
struct mbuf uses a C99 open char array to allow inlining data. Inlining
this in another structure is however a GNU extension. The inlines used
so far in struct Slirp were actually only needed as head of struct
mbuf lists. This replaces these inline with mere struct quehead,
and use casts as appropriate.

Signed-off-by: Samuel Thibault <[email protected]>
Reviewed-by: Peter Maydell <[email protected]>
  • Loading branch information
sthibaul committed Mar 22, 2016
1 parent c17c072 commit 67e3eee
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 30 deletions.
27 changes: 14 additions & 13 deletions slirp/if.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@ ifs_remque(struct mbuf *ifm)
void
if_init(Slirp *slirp)
{
slirp->if_fastq.ifq_next = slirp->if_fastq.ifq_prev = &slirp->if_fastq;
slirp->if_batchq.ifq_next = slirp->if_batchq.ifq_prev = &slirp->if_batchq;
slirp->next_m = &slirp->if_batchq;
slirp->if_fastq.qh_link = slirp->if_fastq.qh_rlink = &slirp->if_fastq;
slirp->if_batchq.qh_link = slirp->if_batchq.qh_rlink = &slirp->if_batchq;
slirp->next_m = (struct mbuf *) &slirp->if_batchq;
}

/*
Expand Down Expand Up @@ -74,7 +74,8 @@ if_output(struct socket *so, struct mbuf *ifm)
* We mustn't put this packet back on the fastq (or we'll send it out of order)
* XXX add cache here?
*/
for (ifq = slirp->if_batchq.ifq_prev; ifq != &slirp->if_batchq;
for (ifq = (struct mbuf *) slirp->if_batchq.qh_rlink;
(struct quehead *) ifq != &slirp->if_batchq;
ifq = ifq->ifq_prev) {
if (so == ifq->ifq_so) {
/* A match! */
Expand All @@ -86,7 +87,7 @@ if_output(struct socket *so, struct mbuf *ifm)

/* No match, check which queue to put it on */
if (so && (so->so_iptos & IPTOS_LOWDELAY)) {
ifq = slirp->if_fastq.ifq_prev;
ifq = (struct mbuf *) slirp->if_fastq.qh_rlink;
on_fastq = 1;
/*
* Check if this packet is a part of the last
Expand All @@ -98,9 +99,9 @@ if_output(struct socket *so, struct mbuf *ifm)
goto diddit;
}
} else {
ifq = slirp->if_batchq.ifq_prev;
ifq = (struct mbuf *) slirp->if_batchq.qh_rlink;
/* Set next_m if the queue was empty so far */
if (slirp->next_m == &slirp->if_batchq) {
if ((struct quehead *) slirp->next_m == &slirp->if_batchq) {
slirp->next_m = ifm;
}
}
Expand Down Expand Up @@ -166,10 +167,10 @@ void if_start(Slirp *slirp)
}
slirp->if_start_busy = true;

if (slirp->if_fastq.ifq_next != &slirp->if_fastq) {
ifm_next = slirp->if_fastq.ifq_next;
if (slirp->if_fastq.qh_link != &slirp->if_fastq) {
ifm_next = (struct mbuf *) slirp->if_fastq.qh_link;
next_from_batchq = false;
} else if (slirp->next_m != &slirp->if_batchq) {
} else if ((struct quehead *) slirp->next_m != &slirp->if_batchq) {
/* Nothing on fastq, pick up from batchq via next_m */
ifm_next = slirp->next_m;
next_from_batchq = true;
Expand All @@ -182,12 +183,12 @@ void if_start(Slirp *slirp)
from_batchq = next_from_batchq;

ifm_next = ifm->ifq_next;
if (ifm_next == &slirp->if_fastq) {
if ((struct quehead *) ifm_next == &slirp->if_fastq) {
/* No more packets in fastq, switch to batchq */
ifm_next = slirp->next_m;
next_from_batchq = true;
}
if (ifm_next == &slirp->if_batchq) {
if ((struct quehead *) ifm_next == &slirp->if_batchq) {
/* end of batchq */
ifm_next = NULL;
}
Expand Down Expand Up @@ -218,7 +219,7 @@ void if_start(Slirp *slirp)
/* Next packet in fastq is from the same session */
ifm_next = next;
next_from_batchq = false;
} else if (slirp->next_m == &slirp->if_batchq) {
} else if ((struct quehead *) slirp->next_m == &slirp->if_batchq) {
/* Set next_m and ifm_next if the session packet is now the
* only one on batchq */
slirp->next_m = ifm_next = next;
Expand Down
19 changes: 10 additions & 9 deletions slirp/mbuf.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,25 +29,25 @@
void
m_init(Slirp *slirp)
{
slirp->m_freelist.m_next = slirp->m_freelist.m_prev = &slirp->m_freelist;
slirp->m_usedlist.m_next = slirp->m_usedlist.m_prev = &slirp->m_usedlist;
slirp->m_freelist.qh_link = slirp->m_freelist.qh_rlink = &slirp->m_freelist;
slirp->m_usedlist.qh_link = slirp->m_usedlist.qh_rlink = &slirp->m_usedlist;
}

void m_cleanup(Slirp *slirp)
{
struct mbuf *m, *next;

m = slirp->m_usedlist.m_next;
while (m != &slirp->m_usedlist) {
m = (struct mbuf *) slirp->m_usedlist.qh_link;
while ((struct quehead *) m != &slirp->m_usedlist) {
next = m->m_next;
if (m->m_flags & M_EXT) {
free(m->m_ext);
}
free(m);
m = next;
}
m = slirp->m_freelist.m_next;
while (m != &slirp->m_freelist) {
m = (struct mbuf *) slirp->m_freelist.qh_link;
while ((struct quehead *) m != &slirp->m_freelist) {
next = m->m_next;
free(m);
m = next;
Expand All @@ -70,15 +70,15 @@ m_get(Slirp *slirp)

DEBUG_CALL("m_get");

if (slirp->m_freelist.m_next == &slirp->m_freelist) {
if (slirp->m_freelist.qh_link == &slirp->m_freelist) {
m = (struct mbuf *)malloc(SLIRP_MSIZE);
if (m == NULL) goto end_error;
slirp->mbuf_alloced++;
if (slirp->mbuf_alloced > MBUF_THRESH)
flags = M_DOFREE;
m->slirp = slirp;
} else {
m = slirp->m_freelist.m_next;
m = (struct mbuf *) slirp->m_freelist.qh_link;
remque(m);
}

Expand Down Expand Up @@ -225,7 +225,8 @@ dtom(Slirp *slirp, void *dat)
DEBUG_ARG("dat = %p", dat);

/* bug corrected for M_EXT buffers */
for (m = slirp->m_usedlist.m_next; m != &slirp->m_usedlist;
for (m = (struct mbuf *) slirp->m_usedlist.qh_link;
(struct quehead *) m != &slirp->m_usedlist;
m = m->m_next) {
if (m->m_flags & M_EXT) {
if( (char *)dat>=m->m_ext && (char *)dat<(m->m_ext + m->m_size) )
Expand Down
5 changes: 0 additions & 5 deletions slirp/misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,6 @@
int slirp_debug = DBG_CALL|DBG_MISC|DBG_ERROR;
#endif

struct quehead {
struct quehead *qh_link;
struct quehead *qh_rlink;
};

inline void
insque(void *a, void *b)
{
Expand Down
5 changes: 5 additions & 0 deletions slirp/misc.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,11 @@ struct emu_t {
struct emu_t *next;
};

struct slirp_quehead {
struct slirp_quehead *qh_link;
struct slirp_quehead *qh_rlink;
};

void slirp_insque(void *, void *);
void slirp_remque(void *);
int add_exec(struct ex_list **, int, char *, struct in_addr, int);
Expand Down
8 changes: 5 additions & 3 deletions slirp/slirp.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ void free(void *ptr);
have different prototypes. */
#define insque slirp_insque
#define remque slirp_remque
#define quehead slirp_quehead

#ifdef HAVE_SYS_STROPTS_H
#include <sys/stropts.h>
Expand Down Expand Up @@ -197,12 +198,13 @@ struct Slirp {
struct ex_list *exec_list;

/* mbuf states */
struct mbuf m_freelist, m_usedlist;
struct quehead m_freelist;
struct quehead m_usedlist;
int mbuf_alloced;

/* if states */
struct mbuf if_fastq; /* fast queue (for interactive data) */
struct mbuf if_batchq; /* queue for non-interactive data */
struct quehead if_fastq; /* fast queue (for interactive data) */
struct quehead 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 */

Expand Down

0 comments on commit 67e3eee

Please sign in to comment.