mbuf: extend meaning of QinQ stripped bit
[dpdk.git] / lib / librte_mbuf / rte_mbuf_dyn.c
index 13d6da6..538a43f 100644 (file)
@@ -67,13 +67,16 @@ process_score(void)
                        shm->free_space[i] = 1;
        }
 
-       for (off = 0; off < sizeof(struct rte_mbuf); off++) {
+       off = 0;
+       while (off < sizeof(struct rte_mbuf)) {
                /* get the size of the free zone */
                for (size = 0; (off + size) < sizeof(struct rte_mbuf) &&
                             shm->free_space[off + size]; size++)
                        ;
-               if (size == 0)
+               if (size == 0) {
+                       off++;
                        continue;
+               }
 
                /* get the alignment of biggest object that can fit in
                 * the zone at this offset.
@@ -84,8 +87,10 @@ process_score(void)
                        ;
 
                /* save it in free_space[] */
-               for (i = off; i < off + size; i++)
+               for (i = off; i < off + align; i++)
                        shm->free_space[i] = RTE_MAX(align, shm->free_space[i]);
+
+               off += align;
        }
 }
 
@@ -278,12 +283,15 @@ __rte_mbuf_dynfield_register_offset(const struct rte_mbuf_dynfield *params,
                mbuf_dynfield_tailq.head, mbuf_dynfield_list);
 
        te = rte_zmalloc("MBUF_DYNFIELD_TAILQ_ENTRY", sizeof(*te), 0);
-       if (te == NULL)
+       if (te == NULL) {
+               rte_errno = ENOMEM;
                return -1;
+       }
 
        mbuf_dynfield = rte_zmalloc("mbuf_dynfield", sizeof(*mbuf_dynfield), 0);
        if (mbuf_dynfield == NULL) {
                rte_free(te);
+               rte_errno = ENOMEM;
                return -1;
        }
 
@@ -456,12 +464,15 @@ __rte_mbuf_dynflag_register_bitnum(const struct rte_mbuf_dynflag *params,
                mbuf_dynflag_tailq.head, mbuf_dynflag_list);
 
        te = rte_zmalloc("MBUF_DYNFLAG_TAILQ_ENTRY", sizeof(*te), 0);
-       if (te == NULL)
+       if (te == NULL) {
+               rte_errno = ENOMEM;
                return -1;
+       }
 
        mbuf_dynflag = rte_zmalloc("mbuf_dynflag", sizeof(*mbuf_dynflag), 0);
        if (mbuf_dynflag == NULL) {
                rte_free(te);
+               rte_errno = ENOMEM;
                return -1;
        }
 
@@ -541,12 +552,20 @@ void rte_mbuf_dyn_dump(FILE *out)
                        dynflag->params.name, dynflag->bitnum,
                        dynflag->params.flags);
        }
-       fprintf(out, "Free space in mbuf (0 = free, value = zone alignment):\n");
+       fprintf(out, "Free space in mbuf (0 = occupied, value = free zone alignment):\n");
        for (i = 0; i < sizeof(struct rte_mbuf); i++) {
                if ((i % 8) == 0)
                        fprintf(out, "  %4.4zx: ", i);
                fprintf(out, "%2.2x%s", shm->free_space[i],
                        (i % 8 != 7) ? " " : "\n");
        }
+       fprintf(out, "Free bit in mbuf->ol_flags (0 = occupied, 1 = free):\n");
+       for (i = 0; i < sizeof(uint64_t) * CHAR_BIT; i++) {
+               if ((i % 8) == 0)
+                       fprintf(out, "  %4.4zx: ", i);
+               fprintf(out, "%1.1x%s", (shm->free_flags & (1ULL << i)) ? 1 : 0,
+                       (i % 8 != 7) ? " " : "\n");
+       }
+
        rte_mcfg_tailq_write_unlock();
 }