diff mbox

hide packet i/o selection to the api

Message ID 1400240915-21184-1-git-send-email-maxim.uvarov@linaro.org
State Superseded
Headers show

Commit Message

Maxim Uvarov May 16, 2014, 11:48 a.m. UTC
Ddp application should be independent of underlaying i/o type.
Propose is to use order of available i/o types and try to register
them.
Also use getenv() for hint which i/o type to select.

Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
---

 Proposed patch how we can choose packet I/O. Patch needs getevn() implementation.

 include/odp_packet_io.h                       |   3 +-
 platform/linux-generic/source/odp_packet_io.c | 143 +++++++++++---------------
 test/generator/odp_generator.c                |  11 +-
 test/packet/odp_example_pktio.c               |  26 +----
 test/packet_netmap/odp_example_pktio_netmap.c |  15 +--
 5 files changed, 64 insertions(+), 134 deletions(-)

Comments

Ola Liljedahl May 16, 2014, 12:33 p.m. UTC | #1
Why can't the implementation try the different mechanisms in order (from
fastest/lowest overhead to slowest/highest overhead) and choose the best
one that is supported by the kernel and by the driver for the specific
network interface?



On 16 May 2014 13:48, Maxim Uvarov <maxim.uvarov@linaro.org> wrote:

> Ddp application should be independent of underlaying i/o type.
> Propose is to use order of available i/o types and try to register
> them.
> Also use getenv() for hint which i/o type to select.
>
> Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
> ---
>
>  Proposed patch how we can choose packet I/O. Patch needs getevn()
> implementation.
>
>  include/odp_packet_io.h                       |   3 +-
>  platform/linux-generic/source/odp_packet_io.c | 143
> +++++++++++---------------
>  test/generator/odp_generator.c                |  11 +-
>  test/packet/odp_example_pktio.c               |  26 +----
>  test/packet_netmap/odp_example_pktio_netmap.c |  15 +--
>  5 files changed, 64 insertions(+), 134 deletions(-)
>
> diff --git a/include/odp_packet_io.h b/include/odp_packet_io.h
> index cfefac0..96d6039 100644
> --- a/include/odp_packet_io.h
> +++ b/include/odp_packet_io.h
> @@ -40,8 +40,7 @@ typedef uint32_t odp_pktio_t;
>   *
>   * @return ODP packet IO handle or ODP_PKTIO_INVALID on error
>   */
> -odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool,
> -                          odp_pktio_params_t *params);
> +odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool);
>
>  /**
>   * Close an ODP packet IO instance
> diff --git a/platform/linux-generic/source/odp_packet_io.c
> b/platform/linux-generic/source/odp_packet_io.c
> index 33ade10..9067fea 100644
> --- a/platform/linux-generic/source/odp_packet_io.c
> +++ b/platform/linux-generic/source/odp_packet_io.c
> @@ -13,17 +13,14 @@
>  #include <odp_spinlock.h>
>  #include <odp_shared_memory.h>
>  #include <odp_packet_socket.h>
> -#ifdef ODP_HAVE_NETMAP
> -#include <odp_packet_netmap.h>
> -#endif
>  #include <odp_hints.h>
>  #include <odp_config.h>
>  #include <odp_queue_internal.h>
>  #include <odp_schedule_internal.h>
>  #include <odp_debug.h>
> -
>  #include <odp_pktio_socket.h>
>  #ifdef ODP_HAVE_NETMAP
> +#include <odp_packet_netmap.h>
>  #include <odp_pktio_netmap.h>
>  #endif
>
> @@ -112,32 +109,13 @@ static void unlock_entry(pktio_entry_t *entry)
>         odp_spinlock_unlock(&entry->s.lock);
>  }
>
> -static void init_pktio_entry(pktio_entry_t *entry, odp_pktio_params_t
> *params)
> +static void init_pktio_entry(pktio_entry_t *entry)
>  {
>         set_taken(entry);
>         entry->s.inq_default = ODP_QUEUE_INVALID;
> -       switch (params->type) {
> -       case ODP_PKTIO_TYPE_SOCKET_BASIC:
> -       case ODP_PKTIO_TYPE_SOCKET_MMSG:
> -       case ODP_PKTIO_TYPE_SOCKET_MMAP:
> -               memset(&entry->s.pkt_sock, 0, sizeof(entry->s.pkt_sock));
> -               memset(&entry->s.pkt_sock_mmap, 0,
> -                     sizeof(entry->s.pkt_sock_mmap));
> -               break;
> -#ifdef ODP_HAVE_NETMAP
> -       case ODP_PKTIO_TYPE_NETMAP:
> -               memset(&entry->s.pkt_nm, 0, sizeof(entry->s.pkt_nm));
> -               break;
> -#endif
> -       default:
> -               ODP_ERR("Packet I/O type not supported. Please
> recompile\n");
> -               break;
> -       }
> -       /* Save pktio parameters, type is the most useful */
> -       memcpy(&entry->s.params, params, sizeof(*params));
>  }
>
> -static odp_pktio_t alloc_lock_pktio_entry(odp_pktio_params_t *params)
> +static odp_pktio_t alloc_lock_pktio_entry(void)
>  {
>         odp_pktio_t id;
>         pktio_entry_t *entry;
> @@ -148,7 +126,7 @@ static odp_pktio_t
> alloc_lock_pktio_entry(odp_pktio_params_t *params)
>                 if (is_free(entry)) {
>                         lock_entry(entry);
>                         if (is_free(entry)) {
> -                               init_pktio_entry(entry, params);
> +                               init_pktio_entry(entry);
>                                 id = i + 1;
>                                 return id; /* return with entry locked! */
>                         }
> @@ -171,35 +149,13 @@ static int free_pktio_entry(odp_pktio_t id)
>         return 0;
>  }
>
> -odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool,
> -                          odp_pktio_params_t *params)
> +odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool)
>  {
>         odp_pktio_t id;
>         pktio_entry_t *pktio_entry;
>         int res;
>
> -       if (params == NULL) {
> -               ODP_ERR("Invalid pktio params\n");
> -               return ODP_PKTIO_INVALID;
> -       }
> -
> -       switch (params->type) {
> -       case ODP_PKTIO_TYPE_SOCKET_BASIC:
> -       case ODP_PKTIO_TYPE_SOCKET_MMSG:
> -       case ODP_PKTIO_TYPE_SOCKET_MMAP:
> -               ODP_DBG("Allocating socket pktio\n");
> -               break;
> -#ifdef ODP_HAVE_NETMAP
> -       case ODP_PKTIO_TYPE_NETMAP:
> -               ODP_DBG("Allocating netmap pktio\n");
> -               break;
> -#endif
> -       default:
> -               ODP_ERR("Invalid pktio type: %02x\n", params->type);
> -               return ODP_PKTIO_INVALID;
> -       }
> -
> -       id = alloc_lock_pktio_entry(params);
> +       id = alloc_lock_pktio_entry();
>         if (id == ODP_PKTIO_INVALID) {
>                 ODP_ERR("No resources available.\n");
>                 return ODP_PKTIO_INVALID;
> @@ -208,44 +164,61 @@ odp_pktio_t odp_pktio_open(const char *dev,
> odp_buffer_pool_t pool,
>
>         pktio_entry = get_entry(id);
>
> -       switch (params->type) {
> -       case ODP_PKTIO_TYPE_SOCKET_BASIC:
> -       case ODP_PKTIO_TYPE_SOCKET_MMSG:
> -               res = setup_pkt_sock(&pktio_entry->s.pkt_sock, dev, pool);
> -               if (res == -1) {
> -                       close_pkt_sock(&pktio_entry->s.pkt_sock);
> -                       free_pktio_entry(id);
> -                       id = ODP_PKTIO_INVALID;
> -               }
> -               break;
> -       case ODP_PKTIO_TYPE_SOCKET_MMAP:
> -               res = setup_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap,
> dev,
> -                               pool, params->sock_params.fanout);
> -               if (res == -1) {
> -                       close_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap);
> -                       free_pktio_entry(id);
> -                       id = ODP_PKTIO_INVALID;
> -               }
> -               break;
> -#ifdef ODP_HAVE_NETMAP
> -       case ODP_PKTIO_TYPE_NETMAP:
> +       /* TODO: getenv() got get priority of packet I/O type */
>
> -               res = setup_pkt_netmap(&pktio_entry->s.pkt_nm, dev,
> -                               pool, &params->nm_params);
> -               if (res == -1) {
> -                       close_pkt_netmap(&pktio_entry->s.pkt_nm);
> -                       free_pktio_entry(id);
> -                       id = ODP_PKTIO_INVALID;
> -               }
> -               break;
> +       memset(&pktio_entry->s.pkt_sock, 0,
> sizeof(pktio_entry->s.pkt_sock));
> +       memset(&pktio_entry->s.pkt_sock_mmap, 0,
> sizeof(pktio_entry->s.pkt_sock_mmap));
> +#ifdef ODP_HAVE_NETMAP
> +       memset(&pktio_entry->s.pkt_nm, 0, sizeof(pktio_entry->s.pkt_nm));
> +
> +       pktio_entry->s.params.ns_params->type = ODP_PKTIO_TYPE_NETMAP;
> +       pktio_entry->s.params.nm_params->netmap_mode = ODP_NETMAP_MODE_SW;
> /*or ODP_NETMAP_MODE_HW, getenv()?*/
> +       pktio_entry->s.params.nm_params->ringid = 0;
> +       res = setup_pkt_netmap(&pktio_entry->s.pkt_nm, dev,
> +                       pool, params.nm_params);
> +       if (res != -1) {
> +               pktio_entry->s.params.type =
> pktio_entry->s.params.ns_params.type;
> +               goto done;
> +       } else
> +               close_pkt_netmap(&pktio_entry->s.pkt_nm);
>  #endif
> -       default:
> -               free_pktio_entry(id);
> -               id = ODP_PKTIO_INVALID;
> -               ODP_ERR("This type of I/O is not supported. Please
> recompile.\n");
> -               break;
> -       }
>
> +       free_pktio_entry(id);
> +       pktio_entry->s.params.sock_params.type =
> ODP_PKTIO_TYPE_SOCKET_BASIC;
> +       pktio_entry->s.params.sock_params.fanout = 1; /* TODO: getenv for
> this */
> +       res = setup_pkt_sock(&pktio_entry->s.pkt_sock, dev, pool);
> +       if (res != -1) {
> +               pktio_entry->s.params.type =
> pktio_entry->s.params.sock_params.type;
> +               goto done;
> +       } else
> +               close_pkt_sock(&pktio_entry->s.pkt_sock);
> +
> +       free_pktio_entry(id);
> +       pktio_entry->s.params.sock_params.type =
> ODP_PKTIO_TYPE_SOCKET_MMAP;
> +       pktio_entry->s.params.sock_params.fanout = 1; /* TODO: getenv for
> this */
> +       res = setup_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap, dev,
> +                       pool, 1); /* 1 fanout, should be from getenv() */
> +       if (res != -1) {
> +               pktio_entry->s.params.type =
> pktio_entry->s.params.sock_params.type;
> +               goto done;
> +       } else
> +               close_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap);
> +
> +       free_pktio_entry(id);
> +       pktio_entry->s.params.sock_params.type =
> ODP_PKTIO_TYPE_SOCKET_MMSG;
> +       pktio_entry->s.params.sock_params.fanout = 1; /* TODO: getenv for
> this */
> +       res = setup_pkt_sock(&pktio_entry->s.pkt_sock, dev, pool);
> +       if (res != -1) {
> +               pktio_entry->s.params.type =
> pktio_entry->s.params.sock_params.type;
> +               goto done;
> +       } else
> +               close_pkt_sock(&pktio_entry->s.pkt_sock);
> +
> +       free_pktio_entry(id);
> +       ODP_ERR("Unable to init any I/O type.\n");
> +       return ODP_PKTIO_INVALID;
> +
> +done:
>         unlock_entry(pktio_entry);
>         return id;
>  }
> diff --git a/test/generator/odp_generator.c
> b/test/generator/odp_generator.c
> index ca84e4c..c386418 100644
> --- a/test/generator/odp_generator.c
> +++ b/test/generator/odp_generator.c
> @@ -294,17 +294,13 @@ static void *gen_send_thread(void *arg)
>         odp_pktio_t pktio;
>         thread_args_t *thr_args;
>         odp_queue_t outq_def;
> -       odp_pktio_params_t params;
> -       socket_params_t *sock_params = &params.sock_params;
> -
>         odp_buffer_t buf;
>
>         thr = odp_thread_id();
>         thr_args = arg;
>
>         /* Open a packet IO instance for this thread */
> -       sock_params->type = 1;
> -       pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool,
> &params);
> +       pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool);
>         if (pktio == ODP_PKTIO_INVALID) {
>                 ODP_ERR("  [%02i] Error: pktio create failed\n", thr);
>                 return NULL;
> @@ -459,10 +455,8 @@ static void *gen_recv_thread(void *arg)
>         odp_pktio_t pktio;
>         thread_args_t *thr_args;
>         odp_queue_t inq_def;
> -       odp_pktio_params_t params;
>         char inq_name[ODP_QUEUE_NAME_LEN];
>         odp_queue_param_t qparam;
> -       socket_params_t *sock_params = &params.sock_params;
>
>         odp_packet_t pkt;
>         odp_buffer_t buf;
> @@ -471,8 +465,7 @@ static void *gen_recv_thread(void *arg)
>         thr_args = arg;
>
>         /* Open a packet IO instance for this thread */
> -       sock_params->type = 1;
> -       pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool,
> &params);
> +       pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool);
>         if (pktio == ODP_PKTIO_INVALID) {
>                 ODP_ERR("  [%02i] Error: pktio create failed\n", thr);
>                 return NULL;
> diff --git a/test/packet/odp_example_pktio.c
> b/test/packet/odp_example_pktio.c
> index 3acb1fb..14b4140 100644
> --- a/test/packet/odp_example_pktio.c
> +++ b/test/packet/odp_example_pktio.c
> @@ -98,8 +98,6 @@ static void *pktio_queue_thread(void *arg)
>         int ret;
>         unsigned long pkt_cnt = 0;
>         unsigned long err_cnt = 0;
> -       odp_pktio_params_t params;
> -       socket_params_t *sock_params = &params.sock_params;
>
>         thr = odp_thread_id();
>         thr_args = arg;
> @@ -115,9 +113,7 @@ static void *pktio_queue_thread(void *arg)
>         }
>
>         /* Open a packet IO instance for this thread */
> -       sock_params->type = thr_args->type;
> -       sock_params->fanout = thr_args->fanout;
> -       pktio = odp_pktio_open(thr_args->pktio_dev, pkt_pool, &params);
> +       pktio = odp_pktio_open(thr_args->pktio_dev, pkt_pool);
>         if (pktio == ODP_PKTIO_INVALID) {
>                 ODP_ERR("  [%02i] Error: pktio create failed\n", thr);
>                 return NULL;
> @@ -211,8 +207,6 @@ static void *pktio_ifburst_thread(void *arg)
>         unsigned long pkt_cnt = 0;
>         unsigned long err_cnt = 0;
>         unsigned long tmp = 0;
> -       odp_pktio_params_t params;
> -       socket_params_t *sock_params = &params.sock_params;
>
>         thr = odp_thread_id();
>         thr_args = arg;
> @@ -228,9 +222,7 @@ static void *pktio_ifburst_thread(void *arg)
>         }
>
>         /* Open a packet IO instance for this thread */
> -       sock_params->type = thr_args->type;
> -       sock_params->fanout = thr_args->fanout;
> -       pktio = odp_pktio_open(thr_args->pktio_dev, pkt_pool, &params);
> +       pktio = odp_pktio_open(thr_args->pktio_dev, pkt_pool);
>         if (pktio == ODP_PKTIO_INVALID) {
>                 ODP_ERR("  [%02i] Error: pktio create failed.\n", thr);
>                 return NULL;
> @@ -543,14 +535,6 @@ static void parse_args(int argc, char *argv[],
> appl_args_t *appl_args)
>                                 appl_args->mode = APPL_MODE_PKT_QUEUE;
>                         break;
>
> -               case 't':
> -                       appl_args->type = atoi(optarg);
> -                       break;
> -
> -               case 'f':
> -                       appl_args->fanout = atoi(optarg);
> -                       break;
> -
>                 case 'h':
>                         usage(argv[0]);
>                         exit(EXIT_SUCCESS);
> @@ -620,12 +604,6 @@ static void usage(char *progname)
>                "  -i, --interface Eth interfaces (comma-separated, no
> spaces)\n"
>                "  -m, --mode      0: Burst send&receive packets (no
> queues)\n"
>                "                  1: Send&receive packets through ODP
> queues.\n"
> -              " -t, --type   1: ODP_PKTIO_TYPE_SOCKET_BASIC\n"
> -              "              2: ODP_PKTIO_TYPE_SOCKET_MMSG\n"
> -              "              3: ODP_PKTIO_TYPE_SOCKET_MMAP\n"
> -              "              4: ODP_PKTIO_TYPE_NETMAP\n"
> -              "         Default: 3: ODP_PKTIO_TYPE_SOCKET_MMAP\n"
> -              " -f, --fanout 0: off 1: on (Default 1: on)\n"
>                "\n"
>                "Optional OPTIONS\n"
>                "  -c, --count <number> Core count.\n"
> diff --git a/test/packet_netmap/odp_example_pktio_netmap.c
> b/test/packet_netmap/odp_example_pktio_netmap.c
> index f50f764..acabd0b 100644
> --- a/test/packet_netmap/odp_example_pktio_netmap.c
> +++ b/test/packet_netmap/odp_example_pktio_netmap.c
> @@ -248,8 +248,6 @@ int main(int argc, char *argv[])
>         odp_buffer_pool_print(pool);
>
>         for (i = 0; i < 2 * args->appl.if_count; ++i) {
> -               odp_pktio_params_t params;
> -               netmap_params_t *nm_params = &params.nm_params;
>                 char inq_name[ODP_QUEUE_NAME_LEN];
>                 odp_queue_t inq_def;
>                 odp_queue_param_t qparam;
> @@ -260,18 +258,8 @@ int main(int argc, char *argv[])
>                  * the software ring associated with the physical interface
>                  */
>
> -               args->pktios[i].pktio_dev = args->appl.ifs[i / 2].if_name;
> -               memset(nm_params, 0, sizeof(*nm_params));
> -               nm_params->type = ODP_PKTIO_TYPE_NETMAP;
> -               if (i % 2) {
> -                       nm_params->netmap_mode = ODP_NETMAP_MODE_SW;
> -                       nm_params->ringid = 0;
> -               } else {
> -                       nm_params->netmap_mode = ODP_NETMAP_MODE_HW;
> -                       nm_params->ringid = 0;
> -               }
>                 pktio = odp_pktio_open(args->pktios[i].pktio_dev,
> -                                      pool, &params);
> +                                      pool);
>                 /* Open a packet IO instance for this thread */
>                 if (pktio == ODP_PKTIO_INVALID) {
>                         ODP_ERR("  [%02i] Err: pktio create\n", i);
> @@ -280,7 +268,6 @@ int main(int argc, char *argv[])
>
>                 args->pktios[i].pktio = pktio;
>                 args->pktios[i].pool = pool;
> -               args->pktios[i].netmap_mode = nm_params->netmap_mode;
>                 /* Save pktio_info in the lookup table */
>                 args->pktio_lt[pktio] = &args->pktios[i];
>                 /*
> --
> 1.8.5.1.163.gd7aced9
>
>
> _______________________________________________
> lng-odp mailing list
> lng-odp@lists.linaro.org
> http://lists.linaro.org/mailman/listinfo/lng-odp
>
Mike Holmes May 16, 2014, 12:59 p.m. UTC | #2
In the discussions from earlier in the week I thought we decided to worry
about the automation at a later date, right now the focus was to just clean
up the API.
We created https://cards.linaro.org/browse/LNG-483 in that meeting

Mike


On 16 May 2014 08:33, Ola Liljedahl <ola.liljedahl@linaro.org> wrote:

> Why can't the implementation try the different mechanisms in order (from
> fastest/lowest overhead to slowest/highest overhead) and choose the best
> one that is supported by the kernel and by the driver for the specific
> network interface?
>
>
>
> On 16 May 2014 13:48, Maxim Uvarov <maxim.uvarov@linaro.org> wrote:
>
>> Ddp application should be independent of underlaying i/o type.
>> Propose is to use order of available i/o types and try to register
>> them.
>> Also use getenv() for hint which i/o type to select.
>>
>> Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
>> ---
>>
>>  Proposed patch how we can choose packet I/O. Patch needs getevn()
>> implementation.
>>
>>  include/odp_packet_io.h                       |   3 +-
>>  platform/linux-generic/source/odp_packet_io.c | 143
>> +++++++++++---------------
>>  test/generator/odp_generator.c                |  11 +-
>>  test/packet/odp_example_pktio.c               |  26 +----
>>  test/packet_netmap/odp_example_pktio_netmap.c |  15 +--
>>  5 files changed, 64 insertions(+), 134 deletions(-)
>>
>> diff --git a/include/odp_packet_io.h b/include/odp_packet_io.h
>> index cfefac0..96d6039 100644
>> --- a/include/odp_packet_io.h
>> +++ b/include/odp_packet_io.h
>> @@ -40,8 +40,7 @@ typedef uint32_t odp_pktio_t;
>>   *
>>   * @return ODP packet IO handle or ODP_PKTIO_INVALID on error
>>   */
>> -odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool,
>> -                          odp_pktio_params_t *params);
>> +odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool);
>>
>>  /**
>>   * Close an ODP packet IO instance
>> diff --git a/platform/linux-generic/source/odp_packet_io.c
>> b/platform/linux-generic/source/odp_packet_io.c
>> index 33ade10..9067fea 100644
>> --- a/platform/linux-generic/source/odp_packet_io.c
>> +++ b/platform/linux-generic/source/odp_packet_io.c
>> @@ -13,17 +13,14 @@
>>  #include <odp_spinlock.h>
>>  #include <odp_shared_memory.h>
>>  #include <odp_packet_socket.h>
>> -#ifdef ODP_HAVE_NETMAP
>> -#include <odp_packet_netmap.h>
>> -#endif
>>  #include <odp_hints.h>
>>  #include <odp_config.h>
>>  #include <odp_queue_internal.h>
>>  #include <odp_schedule_internal.h>
>>  #include <odp_debug.h>
>> -
>>  #include <odp_pktio_socket.h>
>>  #ifdef ODP_HAVE_NETMAP
>> +#include <odp_packet_netmap.h>
>>  #include <odp_pktio_netmap.h>
>>  #endif
>>
>> @@ -112,32 +109,13 @@ static void unlock_entry(pktio_entry_t *entry)
>>         odp_spinlock_unlock(&entry->s.lock);
>>  }
>>
>> -static void init_pktio_entry(pktio_entry_t *entry, odp_pktio_params_t
>> *params)
>> +static void init_pktio_entry(pktio_entry_t *entry)
>>  {
>>         set_taken(entry);
>>         entry->s.inq_default = ODP_QUEUE_INVALID;
>> -       switch (params->type) {
>> -       case ODP_PKTIO_TYPE_SOCKET_BASIC:
>> -       case ODP_PKTIO_TYPE_SOCKET_MMSG:
>> -       case ODP_PKTIO_TYPE_SOCKET_MMAP:
>> -               memset(&entry->s.pkt_sock, 0, sizeof(entry->s.pkt_sock));
>> -               memset(&entry->s.pkt_sock_mmap, 0,
>> -                     sizeof(entry->s.pkt_sock_mmap));
>> -               break;
>> -#ifdef ODP_HAVE_NETMAP
>> -       case ODP_PKTIO_TYPE_NETMAP:
>> -               memset(&entry->s.pkt_nm, 0, sizeof(entry->s.pkt_nm));
>> -               break;
>> -#endif
>> -       default:
>> -               ODP_ERR("Packet I/O type not supported. Please
>> recompile\n");
>> -               break;
>> -       }
>> -       /* Save pktio parameters, type is the most useful */
>> -       memcpy(&entry->s.params, params, sizeof(*params));
>>  }
>>
>> -static odp_pktio_t alloc_lock_pktio_entry(odp_pktio_params_t *params)
>> +static odp_pktio_t alloc_lock_pktio_entry(void)
>>  {
>>         odp_pktio_t id;
>>         pktio_entry_t *entry;
>> @@ -148,7 +126,7 @@ static odp_pktio_t
>> alloc_lock_pktio_entry(odp_pktio_params_t *params)
>>                 if (is_free(entry)) {
>>                         lock_entry(entry);
>>                         if (is_free(entry)) {
>> -                               init_pktio_entry(entry, params);
>> +                               init_pktio_entry(entry);
>>                                 id = i + 1;
>>                                 return id; /* return with entry locked! */
>>                         }
>> @@ -171,35 +149,13 @@ static int free_pktio_entry(odp_pktio_t id)
>>         return 0;
>>  }
>>
>> -odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool,
>> -                          odp_pktio_params_t *params)
>> +odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool)
>>  {
>>         odp_pktio_t id;
>>         pktio_entry_t *pktio_entry;
>>         int res;
>>
>> -       if (params == NULL) {
>> -               ODP_ERR("Invalid pktio params\n");
>> -               return ODP_PKTIO_INVALID;
>> -       }
>> -
>> -       switch (params->type) {
>> -       case ODP_PKTIO_TYPE_SOCKET_BASIC:
>> -       case ODP_PKTIO_TYPE_SOCKET_MMSG:
>> -       case ODP_PKTIO_TYPE_SOCKET_MMAP:
>> -               ODP_DBG("Allocating socket pktio\n");
>> -               break;
>> -#ifdef ODP_HAVE_NETMAP
>> -       case ODP_PKTIO_TYPE_NETMAP:
>> -               ODP_DBG("Allocating netmap pktio\n");
>> -               break;
>> -#endif
>> -       default:
>> -               ODP_ERR("Invalid pktio type: %02x\n", params->type);
>> -               return ODP_PKTIO_INVALID;
>> -       }
>> -
>> -       id = alloc_lock_pktio_entry(params);
>> +       id = alloc_lock_pktio_entry();
>>         if (id == ODP_PKTIO_INVALID) {
>>                 ODP_ERR("No resources available.\n");
>>                 return ODP_PKTIO_INVALID;
>> @@ -208,44 +164,61 @@ odp_pktio_t odp_pktio_open(const char *dev,
>> odp_buffer_pool_t pool,
>>
>>         pktio_entry = get_entry(id);
>>
>> -       switch (params->type) {
>> -       case ODP_PKTIO_TYPE_SOCKET_BASIC:
>> -       case ODP_PKTIO_TYPE_SOCKET_MMSG:
>> -               res = setup_pkt_sock(&pktio_entry->s.pkt_sock, dev, pool);
>> -               if (res == -1) {
>> -                       close_pkt_sock(&pktio_entry->s.pkt_sock);
>> -                       free_pktio_entry(id);
>> -                       id = ODP_PKTIO_INVALID;
>> -               }
>> -               break;
>> -       case ODP_PKTIO_TYPE_SOCKET_MMAP:
>> -               res = setup_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap,
>> dev,
>> -                               pool, params->sock_params.fanout);
>> -               if (res == -1) {
>> -
>> close_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap);
>> -                       free_pktio_entry(id);
>> -                       id = ODP_PKTIO_INVALID;
>> -               }
>> -               break;
>> -#ifdef ODP_HAVE_NETMAP
>> -       case ODP_PKTIO_TYPE_NETMAP:
>> +       /* TODO: getenv() got get priority of packet I/O type */
>>
>> -               res = setup_pkt_netmap(&pktio_entry->s.pkt_nm, dev,
>> -                               pool, &params->nm_params);
>> -               if (res == -1) {
>> -                       close_pkt_netmap(&pktio_entry->s.pkt_nm);
>> -                       free_pktio_entry(id);
>> -                       id = ODP_PKTIO_INVALID;
>> -               }
>> -               break;
>> +       memset(&pktio_entry->s.pkt_sock, 0,
>> sizeof(pktio_entry->s.pkt_sock));
>> +       memset(&pktio_entry->s.pkt_sock_mmap, 0,
>> sizeof(pktio_entry->s.pkt_sock_mmap));
>> +#ifdef ODP_HAVE_NETMAP
>> +       memset(&pktio_entry->s.pkt_nm, 0, sizeof(pktio_entry->s.pkt_nm));
>> +
>> +       pktio_entry->s.params.ns_params->type = ODP_PKTIO_TYPE_NETMAP;
>> +       pktio_entry->s.params.nm_params->netmap_mode =
>> ODP_NETMAP_MODE_SW; /*or ODP_NETMAP_MODE_HW, getenv()?*/
>> +       pktio_entry->s.params.nm_params->ringid = 0;
>> +       res = setup_pkt_netmap(&pktio_entry->s.pkt_nm, dev,
>> +                       pool, params.nm_params);
>> +       if (res != -1) {
>> +               pktio_entry->s.params.type =
>> pktio_entry->s.params.ns_params.type;
>> +               goto done;
>> +       } else
>> +               close_pkt_netmap(&pktio_entry->s.pkt_nm);
>>  #endif
>> -       default:
>> -               free_pktio_entry(id);
>> -               id = ODP_PKTIO_INVALID;
>> -               ODP_ERR("This type of I/O is not supported. Please
>> recompile.\n");
>> -               break;
>> -       }
>>
>> +       free_pktio_entry(id);
>> +       pktio_entry->s.params.sock_params.type =
>> ODP_PKTIO_TYPE_SOCKET_BASIC;
>> +       pktio_entry->s.params.sock_params.fanout = 1; /* TODO: getenv for
>> this */
>> +       res = setup_pkt_sock(&pktio_entry->s.pkt_sock, dev, pool);
>> +       if (res != -1) {
>> +               pktio_entry->s.params.type =
>> pktio_entry->s.params.sock_params.type;
>> +               goto done;
>> +       } else
>> +               close_pkt_sock(&pktio_entry->s.pkt_sock);
>> +
>> +       free_pktio_entry(id);
>> +       pktio_entry->s.params.sock_params.type =
>> ODP_PKTIO_TYPE_SOCKET_MMAP;
>> +       pktio_entry->s.params.sock_params.fanout = 1; /* TODO: getenv for
>> this */
>> +       res = setup_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap, dev,
>> +                       pool, 1); /* 1 fanout, should be from getenv() */
>> +       if (res != -1) {
>> +               pktio_entry->s.params.type =
>> pktio_entry->s.params.sock_params.type;
>> +               goto done;
>> +       } else
>> +               close_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap);
>> +
>> +       free_pktio_entry(id);
>> +       pktio_entry->s.params.sock_params.type =
>> ODP_PKTIO_TYPE_SOCKET_MMSG;
>> +       pktio_entry->s.params.sock_params.fanout = 1; /* TODO: getenv for
>> this */
>> +       res = setup_pkt_sock(&pktio_entry->s.pkt_sock, dev, pool);
>> +       if (res != -1) {
>> +               pktio_entry->s.params.type =
>> pktio_entry->s.params.sock_params.type;
>> +               goto done;
>> +       } else
>> +               close_pkt_sock(&pktio_entry->s.pkt_sock);
>> +
>> +       free_pktio_entry(id);
>> +       ODP_ERR("Unable to init any I/O type.\n");
>> +       return ODP_PKTIO_INVALID;
>> +
>> +done:
>>         unlock_entry(pktio_entry);
>>         return id;
>>  }
>> diff --git a/test/generator/odp_generator.c
>> b/test/generator/odp_generator.c
>> index ca84e4c..c386418 100644
>> --- a/test/generator/odp_generator.c
>> +++ b/test/generator/odp_generator.c
>> @@ -294,17 +294,13 @@ static void *gen_send_thread(void *arg)
>>         odp_pktio_t pktio;
>>         thread_args_t *thr_args;
>>         odp_queue_t outq_def;
>> -       odp_pktio_params_t params;
>> -       socket_params_t *sock_params = &params.sock_params;
>> -
>>         odp_buffer_t buf;
>>
>>         thr = odp_thread_id();
>>         thr_args = arg;
>>
>>         /* Open a packet IO instance for this thread */
>> -       sock_params->type = 1;
>> -       pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool,
>> &params);
>> +       pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool);
>>         if (pktio == ODP_PKTIO_INVALID) {
>>                 ODP_ERR("  [%02i] Error: pktio create failed\n", thr);
>>                 return NULL;
>> @@ -459,10 +455,8 @@ static void *gen_recv_thread(void *arg)
>>         odp_pktio_t pktio;
>>         thread_args_t *thr_args;
>>         odp_queue_t inq_def;
>> -       odp_pktio_params_t params;
>>         char inq_name[ODP_QUEUE_NAME_LEN];
>>         odp_queue_param_t qparam;
>> -       socket_params_t *sock_params = &params.sock_params;
>>
>>         odp_packet_t pkt;
>>         odp_buffer_t buf;
>> @@ -471,8 +465,7 @@ static void *gen_recv_thread(void *arg)
>>         thr_args = arg;
>>
>>         /* Open a packet IO instance for this thread */
>> -       sock_params->type = 1;
>> -       pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool,
>> &params);
>> +       pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool);
>>         if (pktio == ODP_PKTIO_INVALID) {
>>                 ODP_ERR("  [%02i] Error: pktio create failed\n", thr);
>>                 return NULL;
>> diff --git a/test/packet/odp_example_pktio.c
>> b/test/packet/odp_example_pktio.c
>> index 3acb1fb..14b4140 100644
>> --- a/test/packet/odp_example_pktio.c
>> +++ b/test/packet/odp_example_pktio.c
>> @@ -98,8 +98,6 @@ static void *pktio_queue_thread(void *arg)
>>         int ret;
>>         unsigned long pkt_cnt = 0;
>>         unsigned long err_cnt = 0;
>> -       odp_pktio_params_t params;
>> -       socket_params_t *sock_params = &params.sock_params;
>>
>>         thr = odp_thread_id();
>>         thr_args = arg;
>> @@ -115,9 +113,7 @@ static void *pktio_queue_thread(void *arg)
>>         }
>>
>>         /* Open a packet IO instance for this thread */
>> -       sock_params->type = thr_args->type;
>> -       sock_params->fanout = thr_args->fanout;
>> -       pktio = odp_pktio_open(thr_args->pktio_dev, pkt_pool, &params);
>> +       pktio = odp_pktio_open(thr_args->pktio_dev, pkt_pool);
>>         if (pktio == ODP_PKTIO_INVALID) {
>>                 ODP_ERR("  [%02i] Error: pktio create failed\n", thr);
>>                 return NULL;
>> @@ -211,8 +207,6 @@ static void *pktio_ifburst_thread(void *arg)
>>         unsigned long pkt_cnt = 0;
>>         unsigned long err_cnt = 0;
>>         unsigned long tmp = 0;
>> -       odp_pktio_params_t params;
>> -       socket_params_t *sock_params = &params.sock_params;
>>
>>         thr = odp_thread_id();
>>         thr_args = arg;
>> @@ -228,9 +222,7 @@ static void *pktio_ifburst_thread(void *arg)
>>         }
>>
>>         /* Open a packet IO instance for this thread */
>> -       sock_params->type = thr_args->type;
>> -       sock_params->fanout = thr_args->fanout;
>> -       pktio = odp_pktio_open(thr_args->pktio_dev, pkt_pool, &params);
>> +       pktio = odp_pktio_open(thr_args->pktio_dev, pkt_pool);
>>         if (pktio == ODP_PKTIO_INVALID) {
>>                 ODP_ERR("  [%02i] Error: pktio create failed.\n", thr);
>>                 return NULL;
>> @@ -543,14 +535,6 @@ static void parse_args(int argc, char *argv[],
>> appl_args_t *appl_args)
>>                                 appl_args->mode = APPL_MODE_PKT_QUEUE;
>>                         break;
>>
>> -               case 't':
>> -                       appl_args->type = atoi(optarg);
>> -                       break;
>> -
>> -               case 'f':
>> -                       appl_args->fanout = atoi(optarg);
>> -                       break;
>> -
>>                 case 'h':
>>                         usage(argv[0]);
>>                         exit(EXIT_SUCCESS);
>> @@ -620,12 +604,6 @@ static void usage(char *progname)
>>                "  -i, --interface Eth interfaces (comma-separated, no
>> spaces)\n"
>>                "  -m, --mode      0: Burst send&receive packets (no
>> queues)\n"
>>                "                  1: Send&receive packets through ODP
>> queues.\n"
>> -              " -t, --type   1: ODP_PKTIO_TYPE_SOCKET_BASIC\n"
>> -              "              2: ODP_PKTIO_TYPE_SOCKET_MMSG\n"
>> -              "              3: ODP_PKTIO_TYPE_SOCKET_MMAP\n"
>> -              "              4: ODP_PKTIO_TYPE_NETMAP\n"
>> -              "         Default: 3: ODP_PKTIO_TYPE_SOCKET_MMAP\n"
>> -              " -f, --fanout 0: off 1: on (Default 1: on)\n"
>>                "\n"
>>                "Optional OPTIONS\n"
>>                "  -c, --count <number> Core count.\n"
>> diff --git a/test/packet_netmap/odp_example_pktio_netmap.c
>> b/test/packet_netmap/odp_example_pktio_netmap.c
>> index f50f764..acabd0b 100644
>> --- a/test/packet_netmap/odp_example_pktio_netmap.c
>> +++ b/test/packet_netmap/odp_example_pktio_netmap.c
>> @@ -248,8 +248,6 @@ int main(int argc, char *argv[])
>>         odp_buffer_pool_print(pool);
>>
>>         for (i = 0; i < 2 * args->appl.if_count; ++i) {
>> -               odp_pktio_params_t params;
>> -               netmap_params_t *nm_params = &params.nm_params;
>>                 char inq_name[ODP_QUEUE_NAME_LEN];
>>                 odp_queue_t inq_def;
>>                 odp_queue_param_t qparam;
>> @@ -260,18 +258,8 @@ int main(int argc, char *argv[])
>>                  * the software ring associated with the physical
>> interface
>>                  */
>>
>> -               args->pktios[i].pktio_dev = args->appl.ifs[i / 2].if_name;
>> -               memset(nm_params, 0, sizeof(*nm_params));
>> -               nm_params->type = ODP_PKTIO_TYPE_NETMAP;
>> -               if (i % 2) {
>> -                       nm_params->netmap_mode = ODP_NETMAP_MODE_SW;
>> -                       nm_params->ringid = 0;
>> -               } else {
>> -                       nm_params->netmap_mode = ODP_NETMAP_MODE_HW;
>> -                       nm_params->ringid = 0;
>> -               }
>>                 pktio = odp_pktio_open(args->pktios[i].pktio_dev,
>> -                                      pool, &params);
>> +                                      pool);
>>                 /* Open a packet IO instance for this thread */
>>                 if (pktio == ODP_PKTIO_INVALID) {
>>                         ODP_ERR("  [%02i] Err: pktio create\n", i);
>> @@ -280,7 +268,6 @@ int main(int argc, char *argv[])
>>
>>                 args->pktios[i].pktio = pktio;
>>                 args->pktios[i].pool = pool;
>> -               args->pktios[i].netmap_mode = nm_params->netmap_mode;
>>                 /* Save pktio_info in the lookup table */
>>                 args->pktio_lt[pktio] = &args->pktios[i];
>>                 /*
>> --
>> 1.8.5.1.163.gd7aced9
>>
>>
>> _______________________________________________
>> lng-odp mailing list
>> lng-odp@lists.linaro.org
>> http://lists.linaro.org/mailman/listinfo/lng-odp
>>
>
>
> _______________________________________________
> lng-odp mailing list
> lng-odp@lists.linaro.org
> http://lists.linaro.org/mailman/listinfo/lng-odp
>
>
Maxim Uvarov May 16, 2014, 1:06 p.m. UTC | #3
On 05/16/2014 04:33 PM, Ola Liljedahl wrote:
> Why can't the implementation try the different mechanisms in order 
> (from fastest/lowest overhead to slowest/highest overhead) and choose 
> the best one that is supported by the kernel and by the driver for the 
> specific network interface?
>
Ola for linux generic I did the following logic in patch:

if NETMAP use netmap;
  if BASIC use basic;
    if MMAP use MMAP;
       if MMSG use MMSG;

this might be not really clear from patch, but it's so :)

Maxim.

>
>
> On 16 May 2014 13:48, Maxim Uvarov <maxim.uvarov@linaro.org 
> <mailto:maxim.uvarov@linaro.org>> wrote:
>
>     Ddp application should be independent of underlaying i/o type.
>     Propose is to use order of available i/o types and try to register
>     them.
>     Also use getenv() for hint which i/o type to select.
>
>     Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org
>     <mailto:maxim.uvarov@linaro.org>>
>     ---
>
>      Proposed patch how we can choose packet I/O. Patch needs getevn()
>     implementation.
>
>      include/odp_packet_io.h                       |   3 +-
>      platform/linux-generic/source/odp_packet_io.c | 143
>     +++++++++++---------------
>      test/generator/odp_generator.c                |  11 +-
>      test/packet/odp_example_pktio.c               |  26 +----
>      test/packet_netmap/odp_example_pktio_netmap.c |  15 +--
>      5 files changed, 64 insertions(+), 134 deletions(-)
>
>     diff --git a/include/odp_packet_io.h b/include/odp_packet_io.h
>     index cfefac0..96d6039 100644
>     --- a/include/odp_packet_io.h
>     +++ b/include/odp_packet_io.h
>     @@ -40,8 +40,7 @@ typedef uint32_t odp_pktio_t;
>       *
>       * @return ODP packet IO handle or ODP_PKTIO_INVALID on error
>       */
>     -odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool,
>     -                          odp_pktio_params_t *params);
>     +odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool);
>
>      /**
>       * Close an ODP packet IO instance
>     diff --git a/platform/linux-generic/source/odp_packet_io.c
>     b/platform/linux-generic/source/odp_packet_io.c
>     index 33ade10..9067fea 100644
>     --- a/platform/linux-generic/source/odp_packet_io.c
>     +++ b/platform/linux-generic/source/odp_packet_io.c
>     @@ -13,17 +13,14 @@
>      #include <odp_spinlock.h>
>      #include <odp_shared_memory.h>
>      #include <odp_packet_socket.h>
>     -#ifdef ODP_HAVE_NETMAP
>     -#include <odp_packet_netmap.h>
>     -#endif
>      #include <odp_hints.h>
>      #include <odp_config.h>
>      #include <odp_queue_internal.h>
>      #include <odp_schedule_internal.h>
>      #include <odp_debug.h>
>     -
>      #include <odp_pktio_socket.h>
>      #ifdef ODP_HAVE_NETMAP
>     +#include <odp_packet_netmap.h>
>      #include <odp_pktio_netmap.h>
>      #endif
>
>     @@ -112,32 +109,13 @@ static void unlock_entry(pktio_entry_t *entry)
>             odp_spinlock_unlock(&entry->s.lock);
>      }
>
>     -static void init_pktio_entry(pktio_entry_t *entry,
>     odp_pktio_params_t *params)
>     +static void init_pktio_entry(pktio_entry_t *entry)
>      {
>             set_taken(entry);
>             entry->s.inq_default = ODP_QUEUE_INVALID;
>     -       switch (params->type) {
>     -       case ODP_PKTIO_TYPE_SOCKET_BASIC:
>     -       case ODP_PKTIO_TYPE_SOCKET_MMSG:
>     -       case ODP_PKTIO_TYPE_SOCKET_MMAP:
>     -               memset(&entry->s.pkt_sock, 0,
>     sizeof(entry->s.pkt_sock));
>     -               memset(&entry->s.pkt_sock_mmap, 0,
>     -                     sizeof(entry->s.pkt_sock_mmap));
>     -               break;
>     -#ifdef ODP_HAVE_NETMAP
>     -       case ODP_PKTIO_TYPE_NETMAP:
>     -               memset(&entry->s.pkt_nm, 0, sizeof(entry->s.pkt_nm));
>     -               break;
>     -#endif
>     -       default:
>     -               ODP_ERR("Packet I/O type not supported. Please
>     recompile\n");
>     -               break;
>     -       }
>     -       /* Save pktio parameters, type is the most useful */
>     -       memcpy(&entry->s.params, params, sizeof(*params));
>      }
>
>     -static odp_pktio_t alloc_lock_pktio_entry(odp_pktio_params_t *params)
>     +static odp_pktio_t alloc_lock_pktio_entry(void)
>      {
>             odp_pktio_t id;
>             pktio_entry_t *entry;
>     @@ -148,7 +126,7 @@ static odp_pktio_t
>     alloc_lock_pktio_entry(odp_pktio_params_t *params)
>                     if (is_free(entry)) {
>                             lock_entry(entry);
>                             if (is_free(entry)) {
>     -                               init_pktio_entry(entry, params);
>     +                               init_pktio_entry(entry);
>                                     id = i + 1;
>                                     return id; /* return with entry
>     locked! */
>                             }
>     @@ -171,35 +149,13 @@ static int free_pktio_entry(odp_pktio_t id)
>             return 0;
>      }
>
>     -odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool,
>     -                          odp_pktio_params_t *params)
>     +odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool)
>      {
>             odp_pktio_t id;
>             pktio_entry_t *pktio_entry;
>             int res;
>
>     -       if (params == NULL) {
>     -               ODP_ERR("Invalid pktio params\n");
>     -               return ODP_PKTIO_INVALID;
>     -       }
>     -
>     -       switch (params->type) {
>     -       case ODP_PKTIO_TYPE_SOCKET_BASIC:
>     -       case ODP_PKTIO_TYPE_SOCKET_MMSG:
>     -       case ODP_PKTIO_TYPE_SOCKET_MMAP:
>     -               ODP_DBG("Allocating socket pktio\n");
>     -               break;
>     -#ifdef ODP_HAVE_NETMAP
>     -       case ODP_PKTIO_TYPE_NETMAP:
>     -               ODP_DBG("Allocating netmap pktio\n");
>     -               break;
>     -#endif
>     -       default:
>     -               ODP_ERR("Invalid pktio type: %02x\n", params->type);
>     -               return ODP_PKTIO_INVALID;
>     -       }
>     -
>     -       id = alloc_lock_pktio_entry(params);
>     +       id = alloc_lock_pktio_entry();
>             if (id == ODP_PKTIO_INVALID) {
>                     ODP_ERR("No resources available.\n");
>                     return ODP_PKTIO_INVALID;
>     @@ -208,44 +164,61 @@ odp_pktio_t odp_pktio_open(const char *dev,
>     odp_buffer_pool_t pool,
>
>             pktio_entry = get_entry(id);
>
>     -       switch (params->type) {
>     -       case ODP_PKTIO_TYPE_SOCKET_BASIC:
>     -       case ODP_PKTIO_TYPE_SOCKET_MMSG:
>     -               res = setup_pkt_sock(&pktio_entry->s.pkt_sock,
>     dev, pool);
>     -               if (res == -1) {
>     - close_pkt_sock(&pktio_entry->s.pkt_sock);
>     -                       free_pktio_entry(id);
>     -                       id = ODP_PKTIO_INVALID;
>     -               }
>     -               break;
>     -       case ODP_PKTIO_TYPE_SOCKET_MMAP:
>     -               res =
>     setup_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap, dev,
>     -                               pool, params->sock_params.fanout);
>     -               if (res == -1) {
>     - close_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap);
>     -                       free_pktio_entry(id);
>     -                       id = ODP_PKTIO_INVALID;
>     -               }
>     -               break;
>     -#ifdef ODP_HAVE_NETMAP
>     -       case ODP_PKTIO_TYPE_NETMAP:
>     +       /* TODO: getenv() got get priority of packet I/O type */
>
>     -               res = setup_pkt_netmap(&pktio_entry->s.pkt_nm, dev,
>     -                               pool, &params->nm_params);
>     -               if (res == -1) {
>     - close_pkt_netmap(&pktio_entry->s.pkt_nm);
>     -                       free_pktio_entry(id);
>     -                       id = ODP_PKTIO_INVALID;
>     -               }
>     -               break;
>     +       memset(&pktio_entry->s.pkt_sock, 0,
>     sizeof(pktio_entry->s.pkt_sock));
>     +       memset(&pktio_entry->s.pkt_sock_mmap, 0,
>     sizeof(pktio_entry->s.pkt_sock_mmap));
>     +#ifdef ODP_HAVE_NETMAP
>     +       memset(&pktio_entry->s.pkt_nm, 0,
>     sizeof(pktio_entry->s.pkt_nm));
>     +
>     +       pktio_entry->s.params.ns_params->type = ODP_PKTIO_TYPE_NETMAP;
>     +       pktio_entry->s.params.nm_params->netmap_mode =
>     ODP_NETMAP_MODE_SW; /*or ODP_NETMAP_MODE_HW, getenv()?*/
>     +       pktio_entry->s.params.nm_params->ringid = 0;
>     +       res = setup_pkt_netmap(&pktio_entry->s.pkt_nm, dev,
>     +                       pool, params.nm_params);
>     +       if (res != -1) {
>     +               pktio_entry->s.params.type =
>     pktio_entry->s.params.ns_params.type;
>     +               goto done;
>     +       } else
>     + close_pkt_netmap(&pktio_entry->s.pkt_nm);
>      #endif
>     -       default:
>     -               free_pktio_entry(id);
>     -               id = ODP_PKTIO_INVALID;
>     -               ODP_ERR("This type of I/O is not supported. Please
>     recompile.\n");
>     -               break;
>     -       }
>
>     +       free_pktio_entry(id);
>     +       pktio_entry->s.params.sock_params.type =
>     ODP_PKTIO_TYPE_SOCKET_BASIC;
>     +       pktio_entry->s.params.sock_params.fanout = 1; /* TODO:
>     getenv for this */
>     +       res = setup_pkt_sock(&pktio_entry->s.pkt_sock, dev, pool);
>     +       if (res != -1) {
>     +               pktio_entry->s.params.type =
>     pktio_entry->s.params.sock_params.type;
>     +               goto done;
>     +       } else
>     + close_pkt_sock(&pktio_entry->s.pkt_sock);
>     +
>     +       free_pktio_entry(id);
>     +       pktio_entry->s.params.sock_params.type =
>     ODP_PKTIO_TYPE_SOCKET_MMAP;
>     +       pktio_entry->s.params.sock_params.fanout = 1; /* TODO:
>     getenv for this */
>     +       res = setup_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap, dev,
>     +                       pool, 1); /* 1 fanout, should be from
>     getenv() */
>     +       if (res != -1) {
>     +               pktio_entry->s.params.type =
>     pktio_entry->s.params.sock_params.type;
>     +               goto done;
>     +       } else
>     + close_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap);
>     +
>     +       free_pktio_entry(id);
>     +       pktio_entry->s.params.sock_params.type =
>     ODP_PKTIO_TYPE_SOCKET_MMSG;
>     +       pktio_entry->s.params.sock_params.fanout = 1; /* TODO:
>     getenv for this */
>     +       res = setup_pkt_sock(&pktio_entry->s.pkt_sock, dev, pool);
>     +       if (res != -1) {
>     +               pktio_entry->s.params.type =
>     pktio_entry->s.params.sock_params.type;
>     +               goto done;
>     +       } else
>     + close_pkt_sock(&pktio_entry->s.pkt_sock);
>     +
>     +       free_pktio_entry(id);
>     +       ODP_ERR("Unable to init any I/O type.\n");
>     +       return ODP_PKTIO_INVALID;
>     +
>     +done:
>             unlock_entry(pktio_entry);
>             return id;
>      }
>     diff --git a/test/generator/odp_generator.c
>     b/test/generator/odp_generator.c
>     index ca84e4c..c386418 100644
>     --- a/test/generator/odp_generator.c
>     +++ b/test/generator/odp_generator.c
>     @@ -294,17 +294,13 @@ static void *gen_send_thread(void *arg)
>             odp_pktio_t pktio;
>             thread_args_t *thr_args;
>             odp_queue_t outq_def;
>     -       odp_pktio_params_t params;
>     -       socket_params_t *sock_params = &params.sock_params;
>     -
>             odp_buffer_t buf;
>
>             thr = odp_thread_id();
>             thr_args = arg;
>
>             /* Open a packet IO instance for this thread */
>     -       sock_params->type = 1;
>     -       pktio = odp_pktio_open(thr_args->pktio_dev,
>     thr_args->pool, &params);
>     +       pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool);
>             if (pktio == ODP_PKTIO_INVALID) {
>                     ODP_ERR("  [%02i] Error: pktio create failed\n", thr);
>                     return NULL;
>     @@ -459,10 +455,8 @@ static void *gen_recv_thread(void *arg)
>             odp_pktio_t pktio;
>             thread_args_t *thr_args;
>             odp_queue_t inq_def;
>     -       odp_pktio_params_t params;
>             char inq_name[ODP_QUEUE_NAME_LEN];
>             odp_queue_param_t qparam;
>     -       socket_params_t *sock_params = &params.sock_params;
>
>             odp_packet_t pkt;
>             odp_buffer_t buf;
>     @@ -471,8 +465,7 @@ static void *gen_recv_thread(void *arg)
>             thr_args = arg;
>
>             /* Open a packet IO instance for this thread */
>     -       sock_params->type = 1;
>     -       pktio = odp_pktio_open(thr_args->pktio_dev,
>     thr_args->pool, &params);
>     +       pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool);
>             if (pktio == ODP_PKTIO_INVALID) {
>                     ODP_ERR("  [%02i] Error: pktio create failed\n", thr);
>                     return NULL;
>     diff --git a/test/packet/odp_example_pktio.c
>     b/test/packet/odp_example_pktio.c
>     index 3acb1fb..14b4140 100644
>     --- a/test/packet/odp_example_pktio.c
>     +++ b/test/packet/odp_example_pktio.c
>     @@ -98,8 +98,6 @@ static void *pktio_queue_thread(void *arg)
>             int ret;
>             unsigned long pkt_cnt = 0;
>             unsigned long err_cnt = 0;
>     -       odp_pktio_params_t params;
>     -       socket_params_t *sock_params = &params.sock_params;
>
>             thr = odp_thread_id();
>             thr_args = arg;
>     @@ -115,9 +113,7 @@ static void *pktio_queue_thread(void *arg)
>             }
>
>             /* Open a packet IO instance for this thread */
>     -       sock_params->type = thr_args->type;
>     -       sock_params->fanout = thr_args->fanout;
>     -       pktio = odp_pktio_open(thr_args->pktio_dev, pkt_pool,
>     &params);
>     +       pktio = odp_pktio_open(thr_args->pktio_dev, pkt_pool);
>             if (pktio == ODP_PKTIO_INVALID) {
>                     ODP_ERR("  [%02i] Error: pktio create failed\n", thr);
>                     return NULL;
>     @@ -211,8 +207,6 @@ static void *pktio_ifburst_thread(void *arg)
>             unsigned long pkt_cnt = 0;
>             unsigned long err_cnt = 0;
>             unsigned long tmp = 0;
>     -       odp_pktio_params_t params;
>     -       socket_params_t *sock_params = &params.sock_params;
>
>             thr = odp_thread_id();
>             thr_args = arg;
>     @@ -228,9 +222,7 @@ static void *pktio_ifburst_thread(void *arg)
>             }
>
>             /* Open a packet IO instance for this thread */
>     -       sock_params->type = thr_args->type;
>     -       sock_params->fanout = thr_args->fanout;
>     -       pktio = odp_pktio_open(thr_args->pktio_dev, pkt_pool,
>     &params);
>     +       pktio = odp_pktio_open(thr_args->pktio_dev, pkt_pool);
>             if (pktio == ODP_PKTIO_INVALID) {
>                     ODP_ERR("  [%02i] Error: pktio create failed.\n",
>     thr);
>                     return NULL;
>     @@ -543,14 +535,6 @@ static void parse_args(int argc, char
>     *argv[], appl_args_t *appl_args)
>                                     appl_args->mode = APPL_MODE_PKT_QUEUE;
>                             break;
>
>     -               case 't':
>     -                       appl_args->type = atoi(optarg);
>     -                       break;
>     -
>     -               case 'f':
>     -                       appl_args->fanout = atoi(optarg);
>     -                       break;
>     -
>                     case 'h':
>                             usage(argv[0]);
>                             exit(EXIT_SUCCESS);
>     @@ -620,12 +604,6 @@ static void usage(char *progname)
>                    "  -i, --interface Eth interfaces (comma-separated,
>     no spaces)\n"
>                    "  -m, --mode      0: Burst send&receive packets
>     (no queues)\n"
>                    "                  1: Send&receive packets through
>     ODP queues.\n"
>     -              " -t, --type   1: ODP_PKTIO_TYPE_SOCKET_BASIC\n"
>     -              "              2: ODP_PKTIO_TYPE_SOCKET_MMSG\n"
>     -              "              3: ODP_PKTIO_TYPE_SOCKET_MMAP\n"
>     -              "              4: ODP_PKTIO_TYPE_NETMAP\n"
>     -              "         Default: 3: ODP_PKTIO_TYPE_SOCKET_MMAP\n"
>     -              " -f, --fanout 0: off 1: on (Default 1: on)\n"
>                    "\n"
>                    "Optional OPTIONS\n"
>                    "  -c, --count <number> Core count.\n"
>     diff --git a/test/packet_netmap/odp_example_pktio_netmap.c
>     b/test/packet_netmap/odp_example_pktio_netmap.c
>     index f50f764..acabd0b 100644
>     --- a/test/packet_netmap/odp_example_pktio_netmap.c
>     +++ b/test/packet_netmap/odp_example_pktio_netmap.c
>     @@ -248,8 +248,6 @@ int main(int argc, char *argv[])
>             odp_buffer_pool_print(pool);
>
>             for (i = 0; i < 2 * args->appl.if_count; ++i) {
>     -               odp_pktio_params_t params;
>     -               netmap_params_t *nm_params = &params.nm_params;
>                     char inq_name[ODP_QUEUE_NAME_LEN];
>                     odp_queue_t inq_def;
>                     odp_queue_param_t qparam;
>     @@ -260,18 +258,8 @@ int main(int argc, char *argv[])
>                      * the software ring associated with the physical
>     interface
>                      */
>
>     -               args->pktios[i].pktio_dev = args->appl.ifs[i /
>     2].if_name;
>     -               memset(nm_params, 0, sizeof(*nm_params));
>     -               nm_params->type = ODP_PKTIO_TYPE_NETMAP;
>     -               if (i % 2) {
>     -                       nm_params->netmap_mode = ODP_NETMAP_MODE_SW;
>     -                       nm_params->ringid = 0;
>     -               } else {
>     -                       nm_params->netmap_mode = ODP_NETMAP_MODE_HW;
>     -                       nm_params->ringid = 0;
>     -               }
>                     pktio = odp_pktio_open(args->pktios[i].pktio_dev,
>     -                                      pool, &params);
>     +                                      pool);
>                     /* Open a packet IO instance for this thread */
>                     if (pktio == ODP_PKTIO_INVALID) {
>                             ODP_ERR("  [%02i] Err: pktio create\n", i);
>     @@ -280,7 +268,6 @@ int main(int argc, char *argv[])
>
>                     args->pktios[i].pktio = pktio;
>                     args->pktios[i].pool = pool;
>     -               args->pktios[i].netmap_mode = nm_params->netmap_mode;
>                     /* Save pktio_info in the lookup table */
>                     args->pktio_lt[pktio] = &args->pktios[i];
>                     /*
>     --
>     1.8.5.1.163.gd7aced9
>
>
>     _______________________________________________
>     lng-odp mailing list
>     lng-odp@lists.linaro.org <mailto:lng-odp@lists.linaro.org>
>     http://lists.linaro.org/mailman/listinfo/lng-odp
>
>
Stuart Haslam May 16, 2014, 1:16 p.m. UTC | #4
On Fri, May 16, 2014 at 02:06:33PM +0100, Maxim Uvarov wrote:
> On 05/16/2014 04:33 PM, Ola Liljedahl wrote:
> > Why can't the implementation try the different mechanisms in order
> > (from fastest/lowest overhead to slowest/highest overhead) and choose
> > the best one that is supported by the kernel and by the driver for the
> > specific network interface?
> >
> Ola for linux generic I did the following logic in patch:
> 
> if NETMAP use netmap;
>   if BASIC use basic;
>     if MMAP use MMAP;
>        if MMSG use MMSG;
> 

That order of preference doesn't seem right. SOCKET_BASIC is the method
most likely to succeed, so chances are you would never attempt to
use _MMAP or _MMSG. Also, at socket open time there is no difference
between _BASIC and _MMSG.

--
Stuart.
Maxim Uvarov May 16, 2014, 1:52 p.m. UTC | #5
On 05/16/2014 05:16 PM, Stuart Haslam wrote:
> On Fri, May 16, 2014 at 02:06:33PM +0100, Maxim Uvarov wrote:
>> On 05/16/2014 04:33 PM, Ola Liljedahl wrote:
>>> Why can't the implementation try the different mechanisms in order
>>> (from fastest/lowest overhead to slowest/highest overhead) and choose
>>> the best one that is supported by the kernel and by the driver for the
>>> specific network interface?
>>>
>> Ola for linux generic I did the following logic in patch:
>>
>> if NETMAP use netmap;
>>    if BASIC use basic;
>>      if MMAP use MMAP;
>>         if MMSG use MMSG;
>>
> That order of preference doesn't seem right. SOCKET_BASIC is the method
> most likely to succeed, so chances are you would never attempt to
> use _MMAP or _MMSG. Also, at socket open time there is no difference
> between _BASIC and _MMSG.
>
> --
> Stuart.
>
Agree, changed order in v2 patch. Please take a look.

Thanks,
Maxim.
diff mbox

Patch

diff --git a/include/odp_packet_io.h b/include/odp_packet_io.h
index cfefac0..96d6039 100644
--- a/include/odp_packet_io.h
+++ b/include/odp_packet_io.h
@@ -40,8 +40,7 @@  typedef uint32_t odp_pktio_t;
  *
  * @return ODP packet IO handle or ODP_PKTIO_INVALID on error
  */
-odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool,
-			   odp_pktio_params_t *params);
+odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool);
 
 /**
  * Close an ODP packet IO instance
diff --git a/platform/linux-generic/source/odp_packet_io.c b/platform/linux-generic/source/odp_packet_io.c
index 33ade10..9067fea 100644
--- a/platform/linux-generic/source/odp_packet_io.c
+++ b/platform/linux-generic/source/odp_packet_io.c
@@ -13,17 +13,14 @@ 
 #include <odp_spinlock.h>
 #include <odp_shared_memory.h>
 #include <odp_packet_socket.h>
-#ifdef ODP_HAVE_NETMAP
-#include <odp_packet_netmap.h>
-#endif
 #include <odp_hints.h>
 #include <odp_config.h>
 #include <odp_queue_internal.h>
 #include <odp_schedule_internal.h>
 #include <odp_debug.h>
-
 #include <odp_pktio_socket.h>
 #ifdef ODP_HAVE_NETMAP
+#include <odp_packet_netmap.h>
 #include <odp_pktio_netmap.h>
 #endif
 
@@ -112,32 +109,13 @@  static void unlock_entry(pktio_entry_t *entry)
 	odp_spinlock_unlock(&entry->s.lock);
 }
 
-static void init_pktio_entry(pktio_entry_t *entry, odp_pktio_params_t *params)
+static void init_pktio_entry(pktio_entry_t *entry)
 {
 	set_taken(entry);
 	entry->s.inq_default = ODP_QUEUE_INVALID;
-	switch (params->type) {
-	case ODP_PKTIO_TYPE_SOCKET_BASIC:
-	case ODP_PKTIO_TYPE_SOCKET_MMSG:
-	case ODP_PKTIO_TYPE_SOCKET_MMAP:
-		memset(&entry->s.pkt_sock, 0, sizeof(entry->s.pkt_sock));
-		memset(&entry->s.pkt_sock_mmap, 0,
-		      sizeof(entry->s.pkt_sock_mmap));
-		break;
-#ifdef ODP_HAVE_NETMAP
-	case ODP_PKTIO_TYPE_NETMAP:
-		memset(&entry->s.pkt_nm, 0, sizeof(entry->s.pkt_nm));
-		break;
-#endif
-	default:
-		ODP_ERR("Packet I/O type not supported. Please recompile\n");
-		break;
-	}
-	/* Save pktio parameters, type is the most useful */
-	memcpy(&entry->s.params, params, sizeof(*params));
 }
 
-static odp_pktio_t alloc_lock_pktio_entry(odp_pktio_params_t *params)
+static odp_pktio_t alloc_lock_pktio_entry(void)
 {
 	odp_pktio_t id;
 	pktio_entry_t *entry;
@@ -148,7 +126,7 @@  static odp_pktio_t alloc_lock_pktio_entry(odp_pktio_params_t *params)
 		if (is_free(entry)) {
 			lock_entry(entry);
 			if (is_free(entry)) {
-				init_pktio_entry(entry, params);
+				init_pktio_entry(entry);
 				id = i + 1;
 				return id; /* return with entry locked! */
 			}
@@ -171,35 +149,13 @@  static int free_pktio_entry(odp_pktio_t id)
 	return 0;
 }
 
-odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool,
-			   odp_pktio_params_t *params)
+odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool)
 {
 	odp_pktio_t id;
 	pktio_entry_t *pktio_entry;
 	int res;
 
-	if (params == NULL) {
-		ODP_ERR("Invalid pktio params\n");
-		return ODP_PKTIO_INVALID;
-	}
-
-	switch (params->type) {
-	case ODP_PKTIO_TYPE_SOCKET_BASIC:
-	case ODP_PKTIO_TYPE_SOCKET_MMSG:
-	case ODP_PKTIO_TYPE_SOCKET_MMAP:
-		ODP_DBG("Allocating socket pktio\n");
-		break;
-#ifdef ODP_HAVE_NETMAP
-	case ODP_PKTIO_TYPE_NETMAP:
-		ODP_DBG("Allocating netmap pktio\n");
-		break;
-#endif
-	default:
-		ODP_ERR("Invalid pktio type: %02x\n", params->type);
-		return ODP_PKTIO_INVALID;
-	}
-
-	id = alloc_lock_pktio_entry(params);
+	id = alloc_lock_pktio_entry();
 	if (id == ODP_PKTIO_INVALID) {
 		ODP_ERR("No resources available.\n");
 		return ODP_PKTIO_INVALID;
@@ -208,44 +164,61 @@  odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool,
 
 	pktio_entry = get_entry(id);
 
-	switch (params->type) {
-	case ODP_PKTIO_TYPE_SOCKET_BASIC:
-	case ODP_PKTIO_TYPE_SOCKET_MMSG:
-		res = setup_pkt_sock(&pktio_entry->s.pkt_sock, dev, pool);
-		if (res == -1) {
-			close_pkt_sock(&pktio_entry->s.pkt_sock);
-			free_pktio_entry(id);
-			id = ODP_PKTIO_INVALID;
-		}
-		break;
-	case ODP_PKTIO_TYPE_SOCKET_MMAP:
-		res = setup_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap, dev,
-				pool, params->sock_params.fanout);
-		if (res == -1) {
-			close_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap);
-			free_pktio_entry(id);
-			id = ODP_PKTIO_INVALID;
-		}
-		break;
-#ifdef ODP_HAVE_NETMAP
-	case ODP_PKTIO_TYPE_NETMAP:
+	/* TODO: getenv() got get priority of packet I/O type */
 
-		res = setup_pkt_netmap(&pktio_entry->s.pkt_nm, dev,
-				pool, &params->nm_params);
-		if (res == -1) {
-			close_pkt_netmap(&pktio_entry->s.pkt_nm);
-			free_pktio_entry(id);
-			id = ODP_PKTIO_INVALID;
-		}
-		break;
+	memset(&pktio_entry->s.pkt_sock, 0, sizeof(pktio_entry->s.pkt_sock));
+	memset(&pktio_entry->s.pkt_sock_mmap, 0, sizeof(pktio_entry->s.pkt_sock_mmap));
+#ifdef ODP_HAVE_NETMAP
+	memset(&pktio_entry->s.pkt_nm, 0, sizeof(pktio_entry->s.pkt_nm));
+
+	pktio_entry->s.params.ns_params->type = ODP_PKTIO_TYPE_NETMAP;
+	pktio_entry->s.params.nm_params->netmap_mode = ODP_NETMAP_MODE_SW; /*or ODP_NETMAP_MODE_HW, getenv()?*/
+	pktio_entry->s.params.nm_params->ringid = 0;
+	res = setup_pkt_netmap(&pktio_entry->s.pkt_nm, dev,
+			pool, params.nm_params);
+	if (res != -1) {
+		pktio_entry->s.params.type = pktio_entry->s.params.ns_params.type;
+		goto done;
+	} else
+		close_pkt_netmap(&pktio_entry->s.pkt_nm);
 #endif
-	default:
-		free_pktio_entry(id);
-		id = ODP_PKTIO_INVALID;
-		ODP_ERR("This type of I/O is not supported. Please recompile.\n");
-		break;
-	}
 
+	free_pktio_entry(id);
+	pktio_entry->s.params.sock_params.type = ODP_PKTIO_TYPE_SOCKET_BASIC;
+	pktio_entry->s.params.sock_params.fanout = 1; /* TODO: getenv for this */
+	res = setup_pkt_sock(&pktio_entry->s.pkt_sock, dev, pool);
+	if (res != -1) {
+		pktio_entry->s.params.type = pktio_entry->s.params.sock_params.type;
+		goto done;
+	} else
+		close_pkt_sock(&pktio_entry->s.pkt_sock);
+
+	free_pktio_entry(id);
+	pktio_entry->s.params.sock_params.type = ODP_PKTIO_TYPE_SOCKET_MMAP;
+	pktio_entry->s.params.sock_params.fanout = 1; /* TODO: getenv for this */
+	res = setup_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap, dev,
+			pool, 1); /* 1 fanout, should be from getenv() */
+	if (res != -1) {
+		pktio_entry->s.params.type = pktio_entry->s.params.sock_params.type;
+		goto done;
+	} else
+		close_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap);
+
+	free_pktio_entry(id);
+	pktio_entry->s.params.sock_params.type = ODP_PKTIO_TYPE_SOCKET_MMSG;
+	pktio_entry->s.params.sock_params.fanout = 1; /* TODO: getenv for this */
+	res = setup_pkt_sock(&pktio_entry->s.pkt_sock, dev, pool);
+	if (res != -1) {
+		pktio_entry->s.params.type = pktio_entry->s.params.sock_params.type;
+		goto done;
+	} else
+		close_pkt_sock(&pktio_entry->s.pkt_sock);
+
+	free_pktio_entry(id);
+	ODP_ERR("Unable to init any I/O type.\n");
+	return ODP_PKTIO_INVALID;
+
+done:
 	unlock_entry(pktio_entry);
 	return id;
 }
diff --git a/test/generator/odp_generator.c b/test/generator/odp_generator.c
index ca84e4c..c386418 100644
--- a/test/generator/odp_generator.c
+++ b/test/generator/odp_generator.c
@@ -294,17 +294,13 @@  static void *gen_send_thread(void *arg)
 	odp_pktio_t pktio;
 	thread_args_t *thr_args;
 	odp_queue_t outq_def;
-	odp_pktio_params_t params;
-	socket_params_t *sock_params = &params.sock_params;
-
 	odp_buffer_t buf;
 
 	thr = odp_thread_id();
 	thr_args = arg;
 
 	/* Open a packet IO instance for this thread */
-	sock_params->type = 1;
-	pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool, &params);
+	pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool);
 	if (pktio == ODP_PKTIO_INVALID) {
 		ODP_ERR("  [%02i] Error: pktio create failed\n", thr);
 		return NULL;
@@ -459,10 +455,8 @@  static void *gen_recv_thread(void *arg)
 	odp_pktio_t pktio;
 	thread_args_t *thr_args;
 	odp_queue_t inq_def;
-	odp_pktio_params_t params;
 	char inq_name[ODP_QUEUE_NAME_LEN];
 	odp_queue_param_t qparam;
-	socket_params_t *sock_params = &params.sock_params;
 
 	odp_packet_t pkt;
 	odp_buffer_t buf;
@@ -471,8 +465,7 @@  static void *gen_recv_thread(void *arg)
 	thr_args = arg;
 
 	/* Open a packet IO instance for this thread */
-	sock_params->type = 1;
-	pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool, &params);
+	pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool);
 	if (pktio == ODP_PKTIO_INVALID) {
 		ODP_ERR("  [%02i] Error: pktio create failed\n", thr);
 		return NULL;
diff --git a/test/packet/odp_example_pktio.c b/test/packet/odp_example_pktio.c
index 3acb1fb..14b4140 100644
--- a/test/packet/odp_example_pktio.c
+++ b/test/packet/odp_example_pktio.c
@@ -98,8 +98,6 @@  static void *pktio_queue_thread(void *arg)
 	int ret;
 	unsigned long pkt_cnt = 0;
 	unsigned long err_cnt = 0;
-	odp_pktio_params_t params;
-	socket_params_t *sock_params = &params.sock_params;
 
 	thr = odp_thread_id();
 	thr_args = arg;
@@ -115,9 +113,7 @@  static void *pktio_queue_thread(void *arg)
 	}
 
 	/* Open a packet IO instance for this thread */
-	sock_params->type = thr_args->type;
-	sock_params->fanout = thr_args->fanout;
-	pktio = odp_pktio_open(thr_args->pktio_dev, pkt_pool, &params);
+	pktio = odp_pktio_open(thr_args->pktio_dev, pkt_pool);
 	if (pktio == ODP_PKTIO_INVALID) {
 		ODP_ERR("  [%02i] Error: pktio create failed\n", thr);
 		return NULL;
@@ -211,8 +207,6 @@  static void *pktio_ifburst_thread(void *arg)
 	unsigned long pkt_cnt = 0;
 	unsigned long err_cnt = 0;
 	unsigned long tmp = 0;
-	odp_pktio_params_t params;
-	socket_params_t *sock_params = &params.sock_params;
 
 	thr = odp_thread_id();
 	thr_args = arg;
@@ -228,9 +222,7 @@  static void *pktio_ifburst_thread(void *arg)
 	}
 
 	/* Open a packet IO instance for this thread */
-	sock_params->type = thr_args->type;
-	sock_params->fanout = thr_args->fanout;
-	pktio = odp_pktio_open(thr_args->pktio_dev, pkt_pool, &params);
+	pktio = odp_pktio_open(thr_args->pktio_dev, pkt_pool);
 	if (pktio == ODP_PKTIO_INVALID) {
 		ODP_ERR("  [%02i] Error: pktio create failed.\n", thr);
 		return NULL;
@@ -543,14 +535,6 @@  static void parse_args(int argc, char *argv[], appl_args_t *appl_args)
 				appl_args->mode = APPL_MODE_PKT_QUEUE;
 			break;
 
-		case 't':
-			appl_args->type = atoi(optarg);
-			break;
-
-		case 'f':
-			appl_args->fanout = atoi(optarg);
-			break;
-
 		case 'h':
 			usage(argv[0]);
 			exit(EXIT_SUCCESS);
@@ -620,12 +604,6 @@  static void usage(char *progname)
 	       "  -i, --interface Eth interfaces (comma-separated, no spaces)\n"
 	       "  -m, --mode      0: Burst send&receive packets (no queues)\n"
 	       "                  1: Send&receive packets through ODP queues.\n"
-	       " -t, --type   1: ODP_PKTIO_TYPE_SOCKET_BASIC\n"
-	       "	      2: ODP_PKTIO_TYPE_SOCKET_MMSG\n"
-	       "	      3: ODP_PKTIO_TYPE_SOCKET_MMAP\n"
-	       "	      4: ODP_PKTIO_TYPE_NETMAP\n"
-	       "	 Default: 3: ODP_PKTIO_TYPE_SOCKET_MMAP\n"
-	       " -f, --fanout 0: off 1: on (Default 1: on)\n"
 	       "\n"
 	       "Optional OPTIONS\n"
 	       "  -c, --count <number> Core count.\n"
diff --git a/test/packet_netmap/odp_example_pktio_netmap.c b/test/packet_netmap/odp_example_pktio_netmap.c
index f50f764..acabd0b 100644
--- a/test/packet_netmap/odp_example_pktio_netmap.c
+++ b/test/packet_netmap/odp_example_pktio_netmap.c
@@ -248,8 +248,6 @@  int main(int argc, char *argv[])
 	odp_buffer_pool_print(pool);
 
 	for (i = 0; i < 2 * args->appl.if_count; ++i) {
-		odp_pktio_params_t params;
-		netmap_params_t *nm_params = &params.nm_params;
 		char inq_name[ODP_QUEUE_NAME_LEN];
 		odp_queue_t inq_def;
 		odp_queue_param_t qparam;
@@ -260,18 +258,8 @@  int main(int argc, char *argv[])
 		 * the software ring associated with the physical interface
 		 */
 
-		args->pktios[i].pktio_dev = args->appl.ifs[i / 2].if_name;
-		memset(nm_params, 0, sizeof(*nm_params));
-		nm_params->type = ODP_PKTIO_TYPE_NETMAP;
-		if (i % 2) {
-			nm_params->netmap_mode = ODP_NETMAP_MODE_SW;
-			nm_params->ringid = 0;
-		} else {
-			nm_params->netmap_mode = ODP_NETMAP_MODE_HW;
-			nm_params->ringid = 0;
-		}
 		pktio = odp_pktio_open(args->pktios[i].pktio_dev,
-				       pool, &params);
+				       pool);
 		/* Open a packet IO instance for this thread */
 		if (pktio == ODP_PKTIO_INVALID) {
 			ODP_ERR("  [%02i] Err: pktio create\n", i);
@@ -280,7 +268,6 @@  int main(int argc, char *argv[])
 
 		args->pktios[i].pktio = pktio;
 		args->pktios[i].pool = pool;
-		args->pktios[i].netmap_mode = nm_params->netmap_mode;
 		/* Save pktio_info in the lookup table */
 		args->pktio_lt[pktio] = &args->pktios[i];
 		/*