From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bruce Richardson Subject: [RFC PATCH 3/4] add support for a ring to be a pktdev Date: Fri, 17 Apr 2015 16:16:43 +0100 Message-ID: <1429283804-28087-4-git-send-email-bruce.richardson@intel.com> References: <1428954274-26944-1-git-send-email-keith.wiles@intel.com> <1429283804-28087-1-git-send-email-bruce.richardson@intel.com> To: dev-VfR2kkLFssw@public.gmane.org, keith.wiles-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org Return-path: In-Reply-To: <1429283804-28087-1-git-send-email-bruce.richardson-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org> List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces-VfR2kkLFssw@public.gmane.org Sender: "dev" Add a new public API function, and two internal wrapper functions so we can use ring as a pktdev. --- lib/librte_ring/rte_ring.c | 41 +++++++++++++++++++++++++++++++++++++++++ lib/librte_ring/rte_ring.h | 3 +++ 2 files changed, 44 insertions(+) diff --git a/lib/librte_ring/Makefile b/lib/librte_ring/Makefile index 84ad3d3..bc5dd09 100644 --- a/lib/librte_ring/Makefile +++ b/lib/librte_ring/Makefile @@ -47,6 +47,6 @@ SRCS-$(CONFIG_RTE_LIBRTE_RING) := rte_ring.c SYMLINK-$(CONFIG_RTE_LIBRTE_RING)-include := rte_ring.h # this lib needs eal and rte_malloc -DEPDIRS-$(CONFIG_RTE_LIBRTE_RING) += lib/librte_eal lib/librte_malloc +DEPDIRS-$(CONFIG_RTE_LIBRTE_RING) += lib/librte_eal lib/librte_malloc lib/librte_pktdev include $(RTE_SDK)/mk/rte.lib.mk diff --git a/lib/librte_ring/rte_ring.c b/lib/librte_ring/rte_ring.c index c9e59d4..424da20 100644 --- a/lib/librte_ring/rte_ring.c +++ b/lib/librte_ring/rte_ring.c @@ -86,6 +86,7 @@ #include #include #include +#include #include "rte_ring.h" @@ -208,6 +208,47 @@ rte_ring_create(const char *name, unsigned count, int socket_id, return r; } +static uint16_t +dev_rx(void *r, struct rte_mbuf **pkts, uint16_t max_pkts) +{ + return rte_ring_dequeue_burst(r, (void *)pkts, max_pkts); +} + +static uint16_t +dev_tx(void *r, struct rte_mbuf **pkts, uint16_t max_pkts) +{ + return rte_ring_enqueue_burst(r, (void *)pkts, max_pkts); +} + +#define rte_ring_dev_data rte_pkt_dev_data + +struct rte_pkt_dev * +rte_ring_get_dev(struct rte_ring *r) +{ + struct ring_as_pktdev { + RTE_PKT_DEV_HDR(rte_ring_dev); + struct rte_ring_dev_data dev_data; + void *ring; + } *p; + if (r == NULL || + (p = rte_zmalloc(NULL, sizeof(*p), 0)) == NULL) + return NULL; + + p->ring = r; + p->rx_pkt_burst = dev_rx; + p->tx_pkt_burst = dev_tx; + p->data = &p->dev_data; + + snprintf(p->dev_data.name, sizeof(p->dev_data.name), "%s", r->name); + p->dev_data.nb_rx_queues = 1; + p->dev_data.nb_tx_queues = 1; + p->dev_data.rx_queues = &p->ring; + p->dev_data.tx_queues = &p->ring; + + return (void *)p; +} + + /* * change the high water mark. If *count* is 0, water marking is * disabled diff --git a/lib/librte_ring/rte_ring.h b/lib/librte_ring/rte_ring.h index af68888..c2f28be 100644 --- a/lib/librte_ring/rte_ring.h +++ b/lib/librte_ring/rte_ring.h @@ -301,6 +302,10 @@ int rte_ring_init(struct rte_ring *r, const char *name, unsigned count, struct rte_ring *rte_ring_create(const char *name, unsigned count, int socket_id, unsigned flags); +struct rte_pkt_dev; + +struct rte_pkt_dev *rte_ring_get_dev(struct rte_ring *r); + /** * Change the high water mark. * -- 2.1.0