X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_mbuf%2Frte_mbuf_dyn.c;h=538a43f6959f61a1eb58200cc2557ab71f152b9f;hb=97742c7b0ab3634a4d5e6215eae5f897a00d3296;hp=953e3ec31cf70b5a551fce7b3d5d0a5454b87e67;hpb=c67a423c53e9f891204fafcd9481ee1db0ec3b80;p=dpdk.git diff --git a/lib/librte_mbuf/rte_mbuf_dyn.c b/lib/librte_mbuf/rte_mbuf_dyn.c index 953e3ec31c..538a43f695 100644 --- a/lib/librte_mbuf/rte_mbuf_dyn.c +++ b/lib/librte_mbuf/rte_mbuf_dyn.c @@ -67,12 +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; shm->free_space[off + size]; size++) + 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. @@ -83,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; } } @@ -277,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; } @@ -455,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; } @@ -540,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(); }