]> git.proxmox.com Git - mirror_qemu.git/commitdiff
Avoid embedding struct mbuf in other structures
authorSamuel Thibault <samuel.thibault@ens-lyon.org>
Mon, 22 Feb 2016 21:29:21 +0000 (22:29 +0100)
committerSamuel Thibault <samuel.thibault@ens-lyon.org>
Tue, 22 Mar 2016 23:57:01 +0000 (00:57 +0100)
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 <samuel.thibault@ens-lyon.org>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
slirp/if.c
slirp/mbuf.c
slirp/misc.c
slirp/misc.h
slirp/slirp.h

index 2e21f438e84d10e8b4f3fcd32c808dab60fff2be..9b02180db03ae605fdcb2e0976e62dfb15e73829 100644 (file)
@@ -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;
 }
 
 /*
@@ -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! */
@@ -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
@@ -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;
                 }
         }
@@ -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;
@@ -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;
         }
@@ -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;
index d688dd43f7b853b5b3838160732941e810e945f9..d13698839764b992822b5e6bc84fa30c6490e8d1 100644 (file)
 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);
@@ -46,8 +46,8 @@ void m_cleanup(Slirp *slirp)
         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;
@@ -70,7 +70,7 @@ 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++;
@@ -78,7 +78,7 @@ m_get(Slirp *slirp)
                        flags = M_DOFREE;
                m->slirp = slirp;
        } else {
-               m = slirp->m_freelist.m_next;
+               m = (struct mbuf *) slirp->m_freelist.qh_link;
                remque(m);
        }
 
@@ -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) )
index e2eea2e4b319c5966ceb83e8acf6abc3f5150ef8..2fbd04856aaa70c7d92f993645af7283cc2aa88e 100644 (file)
 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)
 {
index 41a32583daad25ca0df4125dab87748df9873c4b..0d0c059e6b9c87676e43e41e2bb726df139e63aa 100644 (file)
@@ -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);
index 9ad88e7df791a10e57d20d7e27b9c69c719d8f15..1abbcc6c32420c786e884a4832077c0e4894ddb7 100644 (file)
@@ -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>
@@ -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 */