X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_mbuf%2Frte_mbuf_dyn.c;h=7d5e942bf0d8c72cc30f6b5094fa44a608f998a8;hb=f2cdd95f2d3f09ed84d33ba62d275e590b10fd67;hp=fd51e1b68e29ddc1a0c8cf4c0965069053e71d38;hpb=3a7fb882fdf32e1b50faac2331b2a48d89b4212e;p=dpdk.git diff --git a/lib/librte_mbuf/rte_mbuf_dyn.c b/lib/librte_mbuf/rte_mbuf_dyn.c index fd51e1b68e..7d5e942bf0 100644 --- a/lib/librte_mbuf/rte_mbuf_dyn.c +++ b/lib/librte_mbuf/rte_mbuf_dyn.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -172,7 +173,7 @@ __mbuf_dynfield_lookup(const char *name) break; } - if (te == NULL) { + if (te == NULL || mbuf_dynfield == NULL) { rte_errno = ENOENT; return NULL; } @@ -185,19 +186,15 @@ rte_mbuf_dynfield_lookup(const char *name, struct rte_mbuf_dynfield *params) { struct mbuf_dynfield_elt *mbuf_dynfield; - if (shm == NULL) { - rte_errno = ENOENT; - return -1; - } - rte_mcfg_tailq_read_lock(); - mbuf_dynfield = __mbuf_dynfield_lookup(name); + if (shm == NULL && init_shared_mem() < 0) + mbuf_dynfield = NULL; + else + mbuf_dynfield = __mbuf_dynfield_lookup(name); rte_mcfg_tailq_read_unlock(); - if (mbuf_dynfield == NULL) { - rte_errno = ENOENT; + if (mbuf_dynfield == NULL) return -1; - } if (params != NULL) memcpy(params, &mbuf_dynfield->params, sizeof(*params)); @@ -384,19 +381,15 @@ rte_mbuf_dynflag_lookup(const char *name, { struct mbuf_dynflag_elt *mbuf_dynflag; - if (shm == NULL) { - rte_errno = ENOENT; - return -1; - } - rte_mcfg_tailq_read_lock(); - mbuf_dynflag = __mbuf_dynflag_lookup(name); + if (shm == NULL && init_shared_mem() < 0) + mbuf_dynflag = NULL; + else + mbuf_dynflag = __mbuf_dynflag_lookup(name); rte_mcfg_tailq_read_unlock(); - if (mbuf_dynflag == NULL) { - rte_errno = ENOENT; + if (mbuf_dynflag == NULL) return -1; - } if (params != NULL) memcpy(params, &mbuf_dynflag->params, sizeof(*params)); @@ -552,12 +545,69 @@ 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(); } + +static int +rte_mbuf_dyn_timestamp_register(int *field_offset, uint64_t *flag, + const char *direction, const char *flag_name) +{ + static const struct rte_mbuf_dynfield field_desc = { + .name = RTE_MBUF_DYNFIELD_TIMESTAMP_NAME, + .size = sizeof(rte_mbuf_timestamp_t), + .align = __alignof__(rte_mbuf_timestamp_t), + }; + struct rte_mbuf_dynflag flag_desc = {}; + int offset; + + offset = rte_mbuf_dynfield_register(&field_desc); + if (offset < 0) { + RTE_LOG(ERR, MBUF, + "Failed to register mbuf field for timestamp\n"); + return -1; + } + if (field_offset != NULL) + *field_offset = offset; + + strlcpy(flag_desc.name, flag_name, sizeof(flag_desc.name)); + offset = rte_mbuf_dynflag_register(&flag_desc); + if (offset < 0) { + RTE_LOG(ERR, MBUF, + "Failed to register mbuf flag for %s timestamp\n", + direction); + return -1; + } + if (flag != NULL) + *flag = RTE_BIT64(offset); + + return 0; +} + +int +rte_mbuf_dyn_rx_timestamp_register(int *field_offset, uint64_t *rx_flag) +{ + return rte_mbuf_dyn_timestamp_register(field_offset, rx_flag, + "Rx", RTE_MBUF_DYNFLAG_RX_TIMESTAMP_NAME); +} + +int +rte_mbuf_dyn_tx_timestamp_register(int *field_offset, uint64_t *tx_flag) +{ + return rte_mbuf_dyn_timestamp_register(field_offset, tx_flag, + "Tx", RTE_MBUF_DYNFLAG_TX_TIMESTAMP_NAME); +}