net/i40e: fix bitmap free
[dpdk.git] / lib / librte_pdump / rte_pdump.c
index ac94fea..b3c8d5c 100644 (file)
 #include "rte_pdump.h"
 
 #define DEVICE_ID_SIZE 64
-/* Macros for printing using RTE_LOG */
-#define RTE_LOGTYPE_PDUMP RTE_LOGTYPE_USER1
+
+RTE_LOG_REGISTER(pdump_logtype, lib.pdump, NOTICE);
+
+/* Macro for printing using RTE_LOG */
+#define PDUMP_LOG(level, fmt, args...)                         \
+       rte_log(RTE_LOG_ ## level, pdump_logtype, "%s(): " fmt, \
+               __func__, ## args)
 
 /* Used for the multi-process communication */
 #define PDUMP_MP       "mp_pdump"
@@ -64,73 +69,6 @@ static struct pdump_rxtx_cbs {
 } rx_cbs[RTE_MAX_ETHPORTS][RTE_MAX_QUEUES_PER_PORT],
 tx_cbs[RTE_MAX_ETHPORTS][RTE_MAX_QUEUES_PER_PORT];
 
-static inline int
-pdump_pktmbuf_copy_data(struct rte_mbuf *seg, const struct rte_mbuf *m)
-{
-       if (rte_pktmbuf_tailroom(seg) < m->data_len) {
-               RTE_LOG(ERR, PDUMP,
-                       "User mempool: insufficient data_len of mbuf\n");
-               return -EINVAL;
-       }
-
-       seg->port = m->port;
-       seg->vlan_tci = m->vlan_tci;
-       seg->hash = m->hash;
-       seg->tx_offload = m->tx_offload;
-       seg->ol_flags = m->ol_flags;
-       seg->packet_type = m->packet_type;
-       seg->vlan_tci_outer = m->vlan_tci_outer;
-       seg->data_len = m->data_len;
-       seg->pkt_len = seg->data_len;
-       rte_memcpy(rte_pktmbuf_mtod(seg, void *),
-                       rte_pktmbuf_mtod(m, void *),
-                       rte_pktmbuf_data_len(seg));
-
-       return 0;
-}
-
-static inline struct rte_mbuf *
-pdump_pktmbuf_copy(struct rte_mbuf *m, struct rte_mempool *mp)
-{
-       struct rte_mbuf *m_dup, *seg, **prev;
-       uint32_t pktlen;
-       uint16_t nseg;
-
-       m_dup = rte_pktmbuf_alloc(mp);
-       if (unlikely(m_dup == NULL))
-               return NULL;
-
-       seg = m_dup;
-       prev = &seg->next;
-       pktlen = m->pkt_len;
-       nseg = 0;
-
-       do {
-               nseg++;
-               if (pdump_pktmbuf_copy_data(seg, m) < 0) {
-                       if (seg != m_dup)
-                               rte_pktmbuf_free_seg(seg);
-                       rte_pktmbuf_free(m_dup);
-                       return NULL;
-               }
-               *prev = seg;
-               prev = &seg->next;
-       } while ((m = m->next) != NULL &&
-                       (seg = rte_pktmbuf_alloc(mp)) != NULL);
-
-       *prev = NULL;
-       m_dup->nb_segs = nseg;
-       m_dup->pkt_len = pktlen;
-
-       /* Allocation of new indirect segment failed */
-       if (unlikely(seg == NULL)) {
-               rte_pktmbuf_free(m_dup);
-               return NULL;
-       }
-
-       __rte_mbuf_sanity_check(m_dup, 1);
-       return m_dup;
-}
 
 static inline void
 pdump_copy(struct rte_mbuf **pkts, uint16_t nb_pkts, void *user_params)
@@ -148,14 +86,14 @@ pdump_copy(struct rte_mbuf **pkts, uint16_t nb_pkts, void *user_params)
        ring = cbs->ring;
        mp = cbs->mp;
        for (i = 0; i < nb_pkts; i++) {
-               p = pdump_pktmbuf_copy(pkts[i], mp);
+               p = rte_pktmbuf_copy(pkts[i], mp, 0, UINT32_MAX);
                if (p)
                        dup_bufs[d_pkts++] = p;
        }
 
        ring_enq = rte_ring_enqueue_burst(ring, (void *)dup_bufs, d_pkts, NULL);
        if (unlikely(ring_enq < d_pkts)) {
-               RTE_LOG(DEBUG, PDUMP,
+               PDUMP_LOG(DEBUG,
                        "only %d of packets enqueued to ring\n", ring_enq);
                do {
                        rte_pktmbuf_free(dup_bufs[ring_enq]);
@@ -194,7 +132,7 @@ pdump_register_rx_callbacks(uint16_t end_q, uint16_t port, uint16_t queue,
                cbs = &rx_cbs[port][qid];
                if (cbs && operation == ENABLE) {
                        if (cbs->cb) {
-                               RTE_LOG(ERR, PDUMP,
+                               PDUMP_LOG(ERR,
                                        "failed to add rx callback for port=%d "
                                        "and queue=%d, callback already exists\n",
                                        port, qid);
@@ -205,7 +143,7 @@ pdump_register_rx_callbacks(uint16_t end_q, uint16_t port, uint16_t queue,
                        cbs->cb = rte_eth_add_first_rx_callback(port, qid,
                                                                pdump_rx, cbs);
                        if (cbs->cb == NULL) {
-                               RTE_LOG(ERR, PDUMP,
+                               PDUMP_LOG(ERR,
                                        "failed to add rx callback, errno=%d\n",
                                        rte_errno);
                                return rte_errno;
@@ -215,7 +153,7 @@ pdump_register_rx_callbacks(uint16_t end_q, uint16_t port, uint16_t queue,
                        int ret;
 
                        if (cbs->cb == NULL) {
-                               RTE_LOG(ERR, PDUMP,
+                               PDUMP_LOG(ERR,
                                        "failed to delete non existing rx "
                                        "callback for port=%d and queue=%d\n",
                                        port, qid);
@@ -223,7 +161,7 @@ pdump_register_rx_callbacks(uint16_t end_q, uint16_t port, uint16_t queue,
                        }
                        ret = rte_eth_remove_rx_callback(port, qid, cbs->cb);
                        if (ret < 0) {
-                               RTE_LOG(ERR, PDUMP,
+                               PDUMP_LOG(ERR,
                                        "failed to remove rx callback, errno=%d\n",
                                        -ret);
                                return ret;
@@ -249,7 +187,7 @@ pdump_register_tx_callbacks(uint16_t end_q, uint16_t port, uint16_t queue,
                cbs = &tx_cbs[port][qid];
                if (cbs && operation == ENABLE) {
                        if (cbs->cb) {
-                               RTE_LOG(ERR, PDUMP,
+                               PDUMP_LOG(ERR,
                                        "failed to add tx callback for port=%d "
                                        "and queue=%d, callback already exists\n",
                                        port, qid);
@@ -260,7 +198,7 @@ pdump_register_tx_callbacks(uint16_t end_q, uint16_t port, uint16_t queue,
                        cbs->cb = rte_eth_add_tx_callback(port, qid, pdump_tx,
                                                                cbs);
                        if (cbs->cb == NULL) {
-                               RTE_LOG(ERR, PDUMP,
+                               PDUMP_LOG(ERR,
                                        "failed to add tx callback, errno=%d\n",
                                        rte_errno);
                                return rte_errno;
@@ -270,7 +208,7 @@ pdump_register_tx_callbacks(uint16_t end_q, uint16_t port, uint16_t queue,
                        int ret;
 
                        if (cbs->cb == NULL) {
-                               RTE_LOG(ERR, PDUMP,
+                               PDUMP_LOG(ERR,
                                        "failed to delete non existing tx "
                                        "callback for port=%d and queue=%d\n",
                                        port, qid);
@@ -278,7 +216,7 @@ pdump_register_tx_callbacks(uint16_t end_q, uint16_t port, uint16_t queue,
                        }
                        ret = rte_eth_remove_tx_callback(port, qid, cbs->cb);
                        if (ret < 0) {
-                               RTE_LOG(ERR, PDUMP,
+                               PDUMP_LOG(ERR,
                                        "failed to remove tx callback, errno=%d\n",
                                        -ret);
                                return ret;
@@ -307,7 +245,7 @@ set_pdump_rxtx_cbs(const struct pdump_request *p)
                ret = rte_eth_dev_get_port_by_name(p->data.en_v1.device,
                                &port);
                if (ret < 0) {
-                       RTE_LOG(ERR, PDUMP,
+                       PDUMP_LOG(ERR,
                                "failed to get port id for device id=%s\n",
                                p->data.en_v1.device);
                        return -EINVAL;
@@ -319,7 +257,7 @@ set_pdump_rxtx_cbs(const struct pdump_request *p)
                ret = rte_eth_dev_get_port_by_name(p->data.dis_v1.device,
                                &port);
                if (ret < 0) {
-                       RTE_LOG(ERR, PDUMP,
+                       PDUMP_LOG(ERR,
                                "failed to get port id for device id=%s\n",
                                p->data.dis_v1.device);
                        return -EINVAL;
@@ -335,7 +273,7 @@ set_pdump_rxtx_cbs(const struct pdump_request *p)
 
                ret = rte_eth_dev_info_get(port, &dev_info);
                if (ret != 0) {
-                       RTE_LOG(ERR, PDUMP,
+                       PDUMP_LOG(ERR,
                                "Error during getting device (port %u) info: %s\n",
                                port, strerror(-ret));
                        return ret;
@@ -344,18 +282,18 @@ set_pdump_rxtx_cbs(const struct pdump_request *p)
                nb_rx_q = dev_info.nb_rx_queues;
                nb_tx_q = dev_info.nb_tx_queues;
                if (nb_rx_q == 0 && flags & RTE_PDUMP_FLAG_RX) {
-                       RTE_LOG(ERR, PDUMP,
+                       PDUMP_LOG(ERR,
                                "number of rx queues cannot be 0\n");
                        return -EINVAL;
                }
                if (nb_tx_q == 0 && flags & RTE_PDUMP_FLAG_TX) {
-                       RTE_LOG(ERR, PDUMP,
+                       PDUMP_LOG(ERR,
                                "number of tx queues cannot be 0\n");
                        return -EINVAL;
                }
                if ((nb_tx_q == 0 || nb_rx_q == 0) &&
                        flags == RTE_PDUMP_FLAG_RXTX) {
-                       RTE_LOG(ERR, PDUMP,
+                       PDUMP_LOG(ERR,
                                "both tx&rx queues must be non zero\n");
                        return -EINVAL;
                }
@@ -391,7 +329,7 @@ pdump_server(const struct rte_mp_msg *mp_msg, const void *peer)
 
        /* recv client requests */
        if (mp_msg->len_param != sizeof(*cli_req)) {
-               RTE_LOG(ERR, PDUMP, "failed to recv from client\n");
+               PDUMP_LOG(ERR, "failed to recv from client\n");
                resp->err_value = -EINVAL;
        } else {
                cli_req = (const struct pdump_request *)mp_msg->param;
@@ -404,8 +342,8 @@ pdump_server(const struct rte_mp_msg *mp_msg, const void *peer)
        mp_resp.len_param = sizeof(*resp);
        mp_resp.num_fds = 0;
        if (rte_mp_reply(&mp_resp, peer) < 0) {
-               RTE_LOG(ERR, PDUMP, "failed to send to client:%s, %s:%d\n",
-                       strerror(rte_errno), __func__, __LINE__);
+               PDUMP_LOG(ERR, "failed to send to client:%s\n",
+                         strerror(rte_errno));
                return -1;
        }
 
@@ -433,19 +371,18 @@ static int
 pdump_validate_ring_mp(struct rte_ring *ring, struct rte_mempool *mp)
 {
        if (ring == NULL || mp == NULL) {
-               RTE_LOG(ERR, PDUMP, "NULL ring or mempool are passed %s:%d\n",
-                       __func__, __LINE__);
+               PDUMP_LOG(ERR, "NULL ring or mempool\n");
                rte_errno = EINVAL;
                return -1;
        }
        if (mp->flags & MEMPOOL_F_SP_PUT || mp->flags & MEMPOOL_F_SC_GET) {
-               RTE_LOG(ERR, PDUMP, "mempool with either SP or SC settings"
+               PDUMP_LOG(ERR, "mempool with either SP or SC settings"
                " is not valid for pdump, should have MP and MC settings\n");
                rte_errno = EINVAL;
                return -1;
        }
-       if (ring->prod.single || ring->cons.single) {
-               RTE_LOG(ERR, PDUMP, "ring with either SP or SC settings"
+       if (rte_ring_is_prod_single(ring) || rte_ring_is_cons_single(ring)) {
+               PDUMP_LOG(ERR, "ring with either SP or SC settings"
                " is not valid for pdump, should have MP and MC settings\n");
                rte_errno = EINVAL;
                return -1;
@@ -459,7 +396,7 @@ pdump_validate_flags(uint32_t flags)
 {
        if (flags != RTE_PDUMP_FLAG_RX && flags != RTE_PDUMP_FLAG_TX &&
                flags != RTE_PDUMP_FLAG_RXTX) {
-               RTE_LOG(ERR, PDUMP,
+               PDUMP_LOG(ERR,
                        "invalid flags, should be either rx/tx/rxtx\n");
                rte_errno = EINVAL;
                return -1;
@@ -474,17 +411,15 @@ pdump_validate_port(uint16_t port, char *name)
        int ret = 0;
 
        if (port >= RTE_MAX_ETHPORTS) {
-               RTE_LOG(ERR, PDUMP, "Invalid port id %u, %s:%d\n", port,
-                       __func__, __LINE__);
+               PDUMP_LOG(ERR, "Invalid port id %u\n", port);
                rte_errno = EINVAL;
                return -1;
        }
 
        ret = rte_eth_dev_get_name_by_port(port, name);
        if (ret < 0) {
-               RTE_LOG(ERR, PDUMP,
-                       "port id to name mapping failed for port id=%u, %s:%d\n",
-                       port, __func__, __LINE__);
+               PDUMP_LOG(ERR, "port %u to name mapping failed\n",
+                         port);
                rte_errno = EINVAL;
                return -1;
        }
@@ -539,7 +474,7 @@ pdump_prepare_client_request(char *device, uint16_t queue,
        }
 
        if (ret < 0)
-               RTE_LOG(ERR, PDUMP,
+               PDUMP_LOG(ERR,
                        "client request for pdump enable/disable failed\n");
        return ret;
 }