On Mon, Jan 5, 2015 at 9:19 PM, Zoltan Kiss <[email protected]> wrote:
> This is only compile tested, and there are a few questions in the patch.
>
> Signed-off-by: Zoltan Kiss <[email protected]>
> ---
> diff --git a/lib/netdev-odp.c b/lib/netdev-odp.c
> index 96126a1..571b66e 100644
> --- a/lib/netdev-odp.c
> +++ b/lib/netdev-odp.c
> @@ -45,7 +45,7 @@
> #include "unaligned.h"
> #include "timeval.h"
> #include "unixctl.h"
> -#include "vlog.h"
> +#include "openvswitch/vlog.h"
>
> VLOG_DEFINE_THIS_MODULE(odp);
>
> @@ -94,7 +94,7 @@ struct netdev_rxq_odp {
> void
> free_odp_buf(struct ofpbuf *b)
> {
> - odph_packet_free(b->odp_pkt);
> + odp_packet_free(b->odp_pkt);
> odp_buffer_free(b->odp_ofpbuf);
> }
>
> @@ -129,26 +129,26 @@ odp_init(int argc, char *argv[])
> static int
> odp_class_init(void)
> {
> - void *pool_base;
> odp_shm_t shm;
> + odp_buffer_pool_param_t params;
> int result = 0;
>
> /* create packet pool */
> shm = odp_shm_reserve("shm_packet_pool", SHM_PKT_POOL_SIZE,
> ODP_CACHE_LINE_SIZE, 0);
> - pool_base = odp_shm_addr(shm);
>
> - if (odp_unlikely(pool_base == NULL)) {
> + if (odp_unlikely(shm == ODP_SHM_INVALID)) {
> VLOG_ERR("Error: ODP packet pool mem alloc failed\n");
> out_of_memory();
> return -1;
> }
>
> - pool = odp_buffer_pool_create("packet_pool", pool_base,
> - SHM_PKT_POOL_SIZE,
> - SHM_PKT_POOL_BUF_SIZE,
> - ODP_CACHE_LINE_SIZE,
> - ODP_BUFFER_TYPE_PACKET);
> + params.buf_size = SHM_PKT_POOL_BUF_SIZE;
> + params.buf_align = ODP_CACHE_LINE_SIZE;
> + params.num_bufs = SHM_PKT_POOL_SIZE / SHM_PKT_POOL_BUF_SIZE;
> + params.buf_type = ODP_BUFFER_TYPE_PACKET;
> +
> + pool = odp_buffer_pool_create("packet_pool", shm, ¶ms);
>
> if (pool == ODP_BUFFER_POOL_INVALID) {
> VLOG_ERR("Error: packet pool create failed.\n");
> @@ -159,19 +159,18 @@ odp_class_init(void)
> /* create ofpbuf pool */
> shm = odp_shm_reserve("shm_ofpbuf_pool", SHM_OFPBUF_POOL_SIZE,
> ODP_CACHE_LINE_SIZE, 0);
> - pool_base = odp_shm_addr(shm);
>
> - if (odp_unlikely(pool_base == NULL)) {
> + if (odp_unlikely(shm == ODP_SHM_INVALID)) {
> VLOG_ERR("Error: ODP packet pool mem alloc failed\n");
> out_of_memory();
> return -1;
> }
>
> - ofpbuf_pool = odp_buffer_pool_create("ofpbuf_pool", pool_base,
> - SHM_OFPBUF_POOL_SIZE,
> - SHM_OFPBUF_POOL_BUF_SIZE,
> - ODP_CACHE_LINE_SIZE,
> - ODP_BUFFER_TYPE_RAW);
> + params.buf_size = SHM_OFPBUF_POOL_BUF_SIZE;
> + params.num_bufs = SHM_OFPBUF_POOL_SIZE / SHM_OFPBUF_POOL_BUF_SIZE;
> + params.buf_type = ODP_BUFFER_TYPE_RAW;
> +
> + ofpbuf_pool = odp_buffer_pool_create("ofpbuf_pool", shm, ¶ms);
>
> if (ofpbuf_pool == ODP_BUFFER_POOL_INVALID) {
> VLOG_ERR("Error: ofpbuf pool create failed.\n");
> @@ -182,19 +181,17 @@ odp_class_init(void)
> /* create pool for structures */
> shm = odp_shm_reserve("shm_struct_pool", SHM_STRUCT_POOL_SIZE,
> ODP_CACHE_LINE_SIZE, 0);
> - pool_base = odp_shm_addr(shm);
>
> - if (odp_unlikely(pool_base == NULL)) {
> + if (odp_unlikely(shm == ODP_SHM_INVALID)) {
> VLOG_ERR("Error: ODP packet pool mem alloc failed\n");
> out_of_memory();
> return -1;
> }
>
> - struct_pool = odp_buffer_pool_create("struct_pool", pool_base,
> - SHM_STRUCT_POOL_SIZE,
> - SHM_STRUCT_POOL_BUF_SIZE,
> - ODP_CACHE_LINE_SIZE,
> - ODP_BUFFER_TYPE_RAW);
> + params.buf_size = SHM_STRUCT_POOL_BUF_SIZE;
> + params.num_bufs = SHM_STRUCT_POOL_SIZE / SHM_STRUCT_POOL_BUF_SIZE;
> +
> + struct_pool = odp_buffer_pool_create("struct_pool", shm, ¶ms);
>
> if (struct_pool == ODP_BUFFER_POOL_INVALID) {
> VLOG_ERR("Error: packet pool create failed.\n");
> @@ -247,15 +244,15 @@ netdev_odp_construct(struct netdev *netdev_)
> }
>
> netdev->pkt_pool = pool;
> - pkt = odph_packet_alloc(netdev->pkt_pool);
> - if (!odph_packet_is_valid(pkt)) {
> + pkt = odp_packet_alloc(netdev->pkt_pool, 0);
> + if (!odp_packet_is_valid(pkt)) {
> out_of_memory();
> goto out_err;
> }
>
> - netdev->max_frame_len = odph_packet_buf_size(pkt);
> + netdev->max_frame_len = odp_buffer_size(odp_packet_to_buffer(pkt));
>
> - odph_packet_free(pkt);
> + odp_packet_free(pkt);
>
> ovs_mutex_init(&netdev->mutex);
>
> @@ -304,7 +301,7 @@ static int drop_err_pkts(odp_packet_t pkt_tbl[], unsigned
> len)
> pkt = pkt_tbl[i];
>
> if (odp_unlikely(odp_packet_error(pkt))) {
> - odph_packet_free(pkt); /* Drop */
> + odp_packet_free(pkt); /* Drop */
> pkt_cnt--;
> } else if (odp_unlikely(i != j++)) {
> pkt_tbl[j-1] = pkt;
> @@ -334,19 +331,21 @@ clone_pkts(struct netdev_odp *dev, struct dpif_packet
> **pkts,
> dropped++;
> continue;
> }
> - pkt = odph_packet_alloc(dev->pkt_pool);
> + pkt = odp_packet_alloc(dev->pkt_pool, size);
>
> - if (OVS_UNLIKELY(!odph_packet_is_valid(pkt))) {
> + if (OVS_UNLIKELY(pkt == ODP_PACKET_INVALID)) {
> VLOG_WARN_RL(&rl, "Could not allocate packet");
> dropped += cnt -i;
> break;
> }
>
> - odp_packet_init(pkt);
> - odp_packet_set_l2_offset(pkt, 0);
> + odp_packet_reset(pkt, 0);
> + odp_packet_l2_offset_set(pkt, 0);
>
> - memcpy(odp_packet_l2(pkt), ofpbuf_data(&pkts[i]->ofpbuf), size);
> - odp_packet_parse(pkt, size, 0);
> + memcpy(odp_packet_l2_ptr(pkt, NULL), ofpbuf_data(&pkts[i]->ofpbuf),
> + size);
> + /* TODO: is this OK? */
> + _odp_packet_parse(pkt);
You actually don't need this call, _odp_packet_parse is called
automatically by the implementation on both odp_schedule and
odp_pktio_recv. Just remove it, it should be fine,
>
> odp_pkts[newcnt] = pkt;
> newcnt++;
> @@ -386,7 +385,7 @@ netdev_odp_send(struct netdev *netdev, struct dpif_packet
> **pkts, int cnt,
> } else {
> for (i = 0; i < cnt; i++) {
> odp_pkts[i] = pkts[i]->ofpbuf.odp_pkt;
> - odph_packet_free(pkts[i]->ofpbuf.odp_ofpbuf);
> + odp_packet_free(pkts[i]->ofpbuf.odp_ofpbuf);
> }
> pkts_ok = cnt;
> }
> @@ -396,7 +395,7 @@ netdev_odp_send(struct netdev *netdev, struct dpif_packet
> **pkts, int cnt,
> ovs_mutex_lock(&dev->mutex);
> dev->stats.tx_packets += pkts_ok;
> for (i = 0; i < pkts_ok; i++) {
> - dev->stats.tx_bytes += odp_packet_get_len(odp_pkts[i]);
> + dev->stats.tx_bytes += odp_packet_len(odp_pkts[i]);
> }
> ovs_mutex_unlock(&dev->mutex);
>
> @@ -649,10 +648,12 @@ netdev_odp_rxq_recv(struct netdev_rxq *rxq_, struct
> dpif_packet **packets,
> out_of_memory();
> }
> packets[i] = (struct dpif_packet*) odp_buffer_addr(buf);
> - ofpbuf_init_odp(&packets[i]->ofpbuf,
> odph_packet_buf_size(pkt_tbl[i]));
> + ofpbuf_init_odp(&packets[i]->ofpbuf,
> + odp_buffer_size(odp_packet_to_buffer(pkt_tbl[i])));
> + /* ^^^ Is this
> OK?*/
> packets[i]->ofpbuf.odp_pkt = pkt_tbl[i];
> packets[i]->ofpbuf.odp_ofpbuf = buf;
> - rx_bytes += odp_packet_get_len(pkt_tbl[i]);
> + rx_bytes += odp_packet_len(pkt_tbl[i]);
> }
>
> *c = pkts_ok;
> diff --git a/lib/netdev-odp.h b/lib/netdev-odp.h
> index 9f521da..6162dd4 100644
> --- a/lib/netdev-odp.h
> +++ b/lib/netdev-odp.h
> @@ -9,7 +9,7 @@
> #include <odp.h>
> #include <odph_eth.h>
> #include <odph_ip.h>
> -#include <odph_packet.h>
> +#include <odp_packet.h>
>
> /* This function is not exported, we need another way to deal with
> creating a packet from an ofpbuf */
> diff --git a/lib/ofpbuf.c b/lib/ofpbuf.c
> index d216917..764a799 100644
> --- a/lib/ofpbuf.c
> +++ b/lib/ofpbuf.c
> @@ -154,7 +154,7 @@ ofpbuf_uninit(struct ofpbuf *b)
> #endif
> } else if (b->source == OFPBUF_ODP) {
> #ifdef ODP_NETDEV
> - odph_packet_free(b->odp_pkt);
> + odp_packet_free(b->odp_pkt);
> odp_buffer_free(b->odp_ofpbuf);
> #else
> ovs_assert(b->source != OFPBUF_ODP);
> diff --git a/lib/ofpbuf.h b/lib/ofpbuf.h
> index 1c5166f..47cee29 100644
> --- a/lib/ofpbuf.h
> +++ b/lib/ofpbuf.h
> @@ -429,7 +429,7 @@ static inline void * ofpbuf_data(const struct ofpbuf *b)
> {
> #ifdef ODP_NETDEV
> if (b->source == OFPBUF_ODP)
> - return odp_packet_l2(b->odp_pkt);
> + return odp_packet_l2_ptr(b->odp_pkt, NULL);
> #endif
>
> return b->data_;
> @@ -439,8 +439,7 @@ static inline void ofpbuf_set_data(struct ofpbuf *b, void
> *d)
> {
> #ifdef ODP_NETDEV
> if (b->source == OFPBUF_ODP) {
> - ODP_ERR("ODP: Invalid use of ofpbuf_set_data\n");
> - ovs_abort(0, "Invalid function call\n");
> + ovs_abort(0, "ODP: Invalid use of ofpbuf_set_data\n");
> }
> #endif
>
> @@ -451,8 +450,7 @@ static inline void * ofpbuf_base(const struct ofpbuf *b)
> {
> #ifdef ODP_NETDEV
> if (b->source == OFPBUF_ODP) {
> - ODP_ERR("ODP: Invalid use of ofpbuf_base\n");
> - ovs_abort(0, "Invalid function call\n");
> + ovs_abort(0, "ODP: Invalid use of ofpbuf_base\n");
> }
> #endif
>
> @@ -463,8 +461,7 @@ static inline void ofpbuf_set_base(struct ofpbuf *b, void
> *d)
> {
> #ifdef ODP_NETDEV
> if (b->source == OFPBUF_ODP) {
> - ODP_ERR("ODP: Invalid use of ofpbuf_set_base\n");
> - ovs_abort(0, "Invalid function call\n");
> + ovs_abort(0, "ODP: Invalid use of ofpbuf_set_base\n\n");
> }
> #endif
>
> @@ -475,7 +472,7 @@ static inline uint32_t ofpbuf_size(const struct ofpbuf *b)
> {
> #ifdef ODP_NETDEV
> if (b->source == OFPBUF_ODP)
> - return odp_packet_get_len(b->odp_pkt);
> + return odp_packet_len(b->odp_pkt);
> #endif
>
> return b->size_;
> @@ -485,8 +482,7 @@ static inline void ofpbuf_set_size(struct ofpbuf *b,
> uint32_t v)
> {
> #ifdef ODP_NETDEV
> if (b->source == OFPBUF_ODP) {
> - ODP_ERR("ODP: Invalid use of ofpbuf_set_size\n");
> - ovs_abort(0, "Invalid function call\n");
> + ovs_abort(0, "ODP: Invalid use of ofpbuf_set_size\n");
> }
> #endif
>
>
> _______________________________________________
> lng-odp mailing list
> [email protected]
> http://lists.linaro.org/mailman/listinfo/lng-odp
_______________________________________________
lng-odp mailing list
[email protected]
http://lists.linaro.org/mailman/listinfo/lng-odp