Message ID | 1400240915-21184-1-git-send-email-maxim.uvarov@linaro.org |
---|---|
State | Superseded |
Headers | show |
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, ¶ms->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 = ¶ms.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, > ¶ms); > + 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 = ¶ms.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, > ¶ms); > + 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 = ¶ms.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, ¶ms); > + 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 = ¶ms.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, ¶ms); > + 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 = ¶ms.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, ¶ms); > + 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 >
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, ¶ms->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 = ¶ms.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, >> ¶ms); >> + 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 = ¶ms.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, >> ¶ms); >> + 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 = ¶ms.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, ¶ms); >> + 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 = ¶ms.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, ¶ms); >> + 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 = ¶ms.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, ¶ms); >> + 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 > >
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, ¶ms->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 = ¶ms.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, ¶ms); > + 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 = ¶ms.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, ¶ms); > + 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 = ¶ms.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, > ¶ms); > + 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 = ¶ms.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, > ¶ms); > + 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 = ¶ms.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, ¶ms); > + 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 > >
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.
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 --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, ¶ms->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 = ¶ms.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, ¶ms); + 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 = ¶ms.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, ¶ms); + 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 = ¶ms.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, ¶ms); + 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 = ¶ms.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, ¶ms); + 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 = ¶ms.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, ¶ms); + 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]; /*
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(-)