Message ID | 1400248156-7686-1-git-send-email-maxim.uvarov@linaro.org |
---|---|
State | Superseded |
Headers | show |
Hi, On Fri, May 16, 2014 at 4:49 PM, 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> > --- > v2: implement getenv() to allow linux-generic turn off types of packets > I/O. > This is needed mainly for testing all code paths. > > include/odp_packet_io.h | 3 +- > platform/linux-generic/source/odp_packet_io.c | 155 > ++++++++++------------ > platform/linux-generic/source/odp_packet_netmap.c | 10 +- > test/generator/odp_generator.c | 11 +- > test/packet/odp_example_pktio.c | 31 +---- > test/packet_netmap/odp_example_pktio_netmap.c | 15 +-- > 6 files changed, 88 insertions(+), 137 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..1b2e025 100644 > --- a/platform/linux-generic/source/odp_packet_io.c > +++ b/platform/linux-generic/source/odp_packet_io.c > @@ -13,21 +13,19 @@ > #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 > > #include <string.h> > +#include <stdlib.h> > > typedef struct { > pktio_entry_t entries[ODP_CONFIG_PKTIO_ENTRIES]; > @@ -112,32 +110,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 +127,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 +150,14 @@ 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; > + int fanout = 0; > > - 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 +166,77 @@ 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: > + if (getenv("ODP_PKTIO_USE_FANOUT")) > + fanout = 1; > + ODP_DBG("ODP_PKTIO_USE_FANOUT: %d\n", fanout); > > - res = setup_pkt_netmap(&pktio_entry->s.pkt_nm, dev, > - pool, ¶ms->nm_params); > - if (res == -1) { > + 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)); > + > + if (getenv("ODP_PKTIO_DISABLE_NETMAP") == NULL) { > + pktio_entry->s.params.ns_params->type = > ODP_PKTIO_TYPE_NETMAP; > + if (getenv("ODP_NETMAP_MODE_HW") > + pktio_entry->s.params.nm_params->netmap_mode = > ODP_NETMAP_MODE_HW; > + else > + pktio_entry->s.params.nm_params->netmap_mode = > ODP_NETMAP_MODE_SW; > Almost good, but for our purpose of removing pktio type awareness from ODP APIs we need to give up using ODP_NETMAP_MODE_SW, there is no correspondent for it in socket operation mode. Instead, only physical interfaces will be polled, just like raw sockets do. There is also a problem with multiple pktios of netmap type on the same interface, I have to look into that. > + pktio_entry->s.params.nm_params->ringid = 0; > + res = setup_pkt_netmap(&pktio_entry->s.pkt_nm, dev, pool); > + if (res != -1) { > + pktio_entry->s.params.type = > pktio_entry->s.params.ns_params.type; > + ODP_DBG("IO type: ODP_PKTIO_TYPE_NETMAP\n"); > + goto done; > + } else > close_pkt_netmap(&pktio_entry->s.pkt_nm); > - free_pktio_entry(id); > - id = ODP_PKTIO_INVALID; > - } > - break; > + } > #endif > - default: > + > + if (getenv("ODP_PKTIO_DISABLE_SOCKET_MMAP") == NULL) { > free_pktio_entry(id); > - id = ODP_PKTIO_INVALID; > - ODP_ERR("This type of I/O is not supported. Please > recompile.\n"); > - break; > + pktio_entry->s.params.sock_params.type = > ODP_PKTIO_TYPE_SOCKET_MMAP; > + pktio_entry->s.params.sock_params.fanout = fanout; > + res = setup_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap, > dev, > + pool, fanout); > + if (res != -1) { > + pktio_entry->s.params.type = > pktio_entry->s.params.sock_params.type; > + ODP_DBG("IO type: ODP_PKTIO_TYPE_SOCKET_MMAP\n"); > + goto done; > + } else > + close_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap); > + } > + > + if (getenv("ODP_PKTIO_DISABLE_SOCKET_MMSG") == NULL) { > + free_pktio_entry(id); > + pktio_entry->s.params.sock_params.type = > ODP_PKTIO_TYPE_SOCKET_MMSG; > + pktio_entry->s.params.sock_params.fanout = fanout; > + 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; > + ODP_DBG("IO type: ODP_PKTIO_TYPE_SOCKET_MMSG\n"); > + goto done; > + } else > + close_pkt_sock(&pktio_entry->s.pkt_sock); > + } > + > + if (getenv("ODP_PKTIO_DISABLE_SOCKET_BASIC") == NULL) { > + free_pktio_entry(id); > + pktio_entry->s.params.sock_params.type = > ODP_PKTIO_TYPE_SOCKET_BASIC; > + pktio_entry->s.params.sock_params.fanout = fanout; > + 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; > + ODP_DBG("IO type: ODP_PKTIO_TYPE_SOCKET_BASIC\n"); > + 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/platform/linux-generic/source/odp_packet_netmap.c > b/platform/linux-generic/source/odp_packet_netmap.c > index e2215ab..027a338 100644 > --- a/platform/linux-generic/source/odp_packet_netmap.c > +++ b/platform/linux-generic/source/odp_packet_netmap.c > @@ -105,7 +105,7 @@ done: > } > > int setup_pkt_netmap(pkt_netmap_t * const pkt_nm, const char *netdev, > - odp_buffer_pool_t pool, netmap_params_t *nm_params) > + odp_buffer_pool_t pool) > { > char qname[ODP_QUEUE_NAME_LEN]; > char ifname[32]; > @@ -132,12 +132,10 @@ int setup_pkt_netmap(pkt_netmap_t * const pkt_nm, > const char *netdev, > pkt_nm->buf_size = odp_packet_buf_size(pkt); > /* max frame len taking into account the l2-offset */ > pkt_nm->max_frame_len = pkt_nm->buf_size - pkt_nm->frame_offset; > - /* save netmap_mode for later use */ > - pkt_nm->netmap_mode = nm_params->netmap_mode; > > odp_packet_free(pkt); > > - if (nm_params->netmap_mode == ODP_NETMAP_MODE_SW) > + if (pkt_nm->netmap_mode == ODP_NETMAP_MODE_SW) > ringid = NETMAP_SW_RING; > else > ringid = nm_params->ringid; > @@ -153,7 +151,7 @@ int setup_pkt_netmap(pkt_netmap_t * const pkt_nm, > const char *netdev, > > ODP_DBG("thread %d mode %s mmap addr %p\n", > odp_thread_id(), > - nm_params->netmap_mode == ODP_NETMAP_MODE_SW ? "SW" : "HW", > + pkt_nm->netmap_mode == ODP_NETMAP_MODE_SW ? "SW" : "HW", > pkt_nm->nm_desc->mem); > > if (nm_params->netmap_mode == ODP_NETMAP_MODE_SW) { > @@ -178,7 +176,7 @@ int setup_pkt_netmap(pkt_netmap_t * const pkt_nm, > const char *netdev, > } > > /* Set TX checksumming if hardware rings */ > - if (nm_params->netmap_mode == ODP_NETMAP_MODE_HW) { > + if (pkt_nm->netmap_mode == ODP_NETMAP_MODE_HW) { > ret = nm_do_ioctl(pkt_nm, SIOCGIFFLAGS, 0); > if (ret) > return ret; > 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..0d23bd6 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,16 +604,15 @@ 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" > " -h, --help Display help and exit.\n" > + " environment variables: ODP_PKTIO_DISABLE_NETMAP" > + " ODP_PKTIO_DISABLE_SOCKET_MMAP\n" > + " ODP_PKTIO_DISABLE_SOCKET_MMSG\n" > + " ODP_PKTIO_DISABLE_SOCKET_BASIC\n" > + " can be used to advance packet I/O selection for > linux-generic\n" > "\n", NO_PATH(progname), NO_PATH(progname) > ); > } > 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]; > /* > The rest looks good to me, pretty much what I had in mind, except I didn't think about the get_env part too much. I can take it up from here, do some testing with netmap and send a new version of the patch. /Ciprian > -- > 1.8.5.1.163.gd7aced9 > > > _______________________________________________ > lng-odp mailing list > lng-odp@lists.linaro.org > http://lists.linaro.org/mailman/listinfo/lng-odp >
On Fri, May 16, 2014 at 5:17 PM, Ciprian Barbu <ciprian.barbu@linaro.org>wrote: > Hi, > > > On Fri, May 16, 2014 at 4:49 PM, 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> >> --- >> v2: implement getenv() to allow linux-generic turn off types of packets >> I/O. >> This is needed mainly for testing all code paths. >> >> include/odp_packet_io.h | 3 +- >> platform/linux-generic/source/odp_packet_io.c | 155 >> ++++++++++------------ >> platform/linux-generic/source/odp_packet_netmap.c | 10 +- >> test/generator/odp_generator.c | 11 +- >> test/packet/odp_example_pktio.c | 31 +---- >> test/packet_netmap/odp_example_pktio_netmap.c | 15 +-- >> 6 files changed, 88 insertions(+), 137 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..1b2e025 100644 >> --- a/platform/linux-generic/source/odp_packet_io.c >> +++ b/platform/linux-generic/source/odp_packet_io.c >> @@ -13,21 +13,19 @@ >> #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 >> >> #include <string.h> >> +#include <stdlib.h> >> >> typedef struct { >> pktio_entry_t entries[ODP_CONFIG_PKTIO_ENTRIES]; >> @@ -112,32 +110,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 +127,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 +150,14 @@ 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; >> + int fanout = 0; >> >> - 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 +166,77 @@ 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: >> + if (getenv("ODP_PKTIO_USE_FANOUT")) >> + fanout = 1; >> + ODP_DBG("ODP_PKTIO_USE_FANOUT: %d\n", fanout); >> >> - res = setup_pkt_netmap(&pktio_entry->s.pkt_nm, dev, >> - pool, ¶ms->nm_params); >> - if (res == -1) { >> + 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)); >> + >> + if (getenv("ODP_PKTIO_DISABLE_NETMAP") == NULL) { >> + pktio_entry->s.params.ns_params->type = >> ODP_PKTIO_TYPE_NETMAP; >> > Typo: no member named ns_params and nm_params is not a pointer so you have to replace nm_params->type with nm_params.type So the patch needs a bit of reworking anyhow. I will take care of them. > + if (getenv("ODP_NETMAP_MODE_HW") >> + pktio_entry->s.params.nm_params->netmap_mode = >> ODP_NETMAP_MODE_HW; >> + else >> + pktio_entry->s.params.nm_params->netmap_mode = >> ODP_NETMAP_MODE_SW; >> > > Almost good, but for our purpose of removing pktio type awareness from ODP > APIs we need to give up using ODP_NETMAP_MODE_SW, there is no correspondent > for it in socket operation mode. Instead, only physical interfaces will be > polled, just like raw sockets do. There is also a problem with multiple > pktios of netmap type on the same interface, I have to look into that. > > >> + pktio_entry->s.params.nm_params->ringid = 0; >> + res = setup_pkt_netmap(&pktio_entry->s.pkt_nm, dev, pool); >> + if (res != -1) { >> + pktio_entry->s.params.type = >> pktio_entry->s.params.ns_params.type; >> + ODP_DBG("IO type: ODP_PKTIO_TYPE_NETMAP\n"); >> + goto done; >> + } else >> close_pkt_netmap(&pktio_entry->s.pkt_nm); >> - free_pktio_entry(id); >> - id = ODP_PKTIO_INVALID; >> - } >> - break; >> + } >> #endif >> - default: >> + >> + if (getenv("ODP_PKTIO_DISABLE_SOCKET_MMAP") == NULL) { >> free_pktio_entry(id); >> - id = ODP_PKTIO_INVALID; >> - ODP_ERR("This type of I/O is not supported. Please >> recompile.\n"); >> - break; >> + pktio_entry->s.params.sock_params.type = >> ODP_PKTIO_TYPE_SOCKET_MMAP; >> + pktio_entry->s.params.sock_params.fanout = fanout; >> + res = setup_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap, >> dev, >> + pool, fanout); >> + if (res != -1) { >> + pktio_entry->s.params.type = >> pktio_entry->s.params.sock_params.type; >> + ODP_DBG("IO type: ODP_PKTIO_TYPE_SOCKET_MMAP\n"); >> + goto done; >> + } else >> + >> close_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap); >> + } >> + >> + if (getenv("ODP_PKTIO_DISABLE_SOCKET_MMSG") == NULL) { >> + free_pktio_entry(id); >> + pktio_entry->s.params.sock_params.type = >> ODP_PKTIO_TYPE_SOCKET_MMSG; >> + pktio_entry->s.params.sock_params.fanout = fanout; >> + 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; >> + ODP_DBG("IO type: ODP_PKTIO_TYPE_SOCKET_MMSG\n"); >> + goto done; >> + } else >> + close_pkt_sock(&pktio_entry->s.pkt_sock); >> + } >> + >> + if (getenv("ODP_PKTIO_DISABLE_SOCKET_BASIC") == NULL) { >> + free_pktio_entry(id); >> + pktio_entry->s.params.sock_params.type = >> ODP_PKTIO_TYPE_SOCKET_BASIC; >> + pktio_entry->s.params.sock_params.fanout = fanout; >> + 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; >> + ODP_DBG("IO type: ODP_PKTIO_TYPE_SOCKET_BASIC\n"); >> + 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/platform/linux-generic/source/odp_packet_netmap.c >> b/platform/linux-generic/source/odp_packet_netmap.c >> index e2215ab..027a338 100644 >> --- a/platform/linux-generic/source/odp_packet_netmap.c >> +++ b/platform/linux-generic/source/odp_packet_netmap.c >> @@ -105,7 +105,7 @@ done: >> } >> >> int setup_pkt_netmap(pkt_netmap_t * const pkt_nm, const char *netdev, >> - odp_buffer_pool_t pool, netmap_params_t *nm_params) >> + odp_buffer_pool_t pool) >> { >> char qname[ODP_QUEUE_NAME_LEN]; >> char ifname[32]; >> @@ -132,12 +132,10 @@ int setup_pkt_netmap(pkt_netmap_t * const pkt_nm, >> const char *netdev, >> pkt_nm->buf_size = odp_packet_buf_size(pkt); >> /* max frame len taking into account the l2-offset */ >> pkt_nm->max_frame_len = pkt_nm->buf_size - pkt_nm->frame_offset; >> - /* save netmap_mode for later use */ >> - pkt_nm->netmap_mode = nm_params->netmap_mode; >> >> odp_packet_free(pkt); >> >> - if (nm_params->netmap_mode == ODP_NETMAP_MODE_SW) >> + if (pkt_nm->netmap_mode == ODP_NETMAP_MODE_SW) >> ringid = NETMAP_SW_RING; >> else >> ringid = nm_params->ringid; >> @@ -153,7 +151,7 @@ int setup_pkt_netmap(pkt_netmap_t * const pkt_nm, >> const char *netdev, >> >> ODP_DBG("thread %d mode %s mmap addr %p\n", >> odp_thread_id(), >> - nm_params->netmap_mode == ODP_NETMAP_MODE_SW ? "SW" : >> "HW", >> + pkt_nm->netmap_mode == ODP_NETMAP_MODE_SW ? "SW" : "HW", >> pkt_nm->nm_desc->mem); >> >> if (nm_params->netmap_mode == ODP_NETMAP_MODE_SW) { >> @@ -178,7 +176,7 @@ int setup_pkt_netmap(pkt_netmap_t * const pkt_nm, >> const char *netdev, >> } >> >> /* Set TX checksumming if hardware rings */ >> - if (nm_params->netmap_mode == ODP_NETMAP_MODE_HW) { >> + if (pkt_nm->netmap_mode == ODP_NETMAP_MODE_HW) { >> ret = nm_do_ioctl(pkt_nm, SIOCGIFFLAGS, 0); >> if (ret) >> return ret; >> 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..0d23bd6 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,16 +604,15 @@ 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" >> " -h, --help Display help and exit.\n" >> + " environment variables: ODP_PKTIO_DISABLE_NETMAP" >> + " ODP_PKTIO_DISABLE_SOCKET_MMAP\n" >> + " ODP_PKTIO_DISABLE_SOCKET_MMSG\n" >> + " ODP_PKTIO_DISABLE_SOCKET_BASIC\n" >> + " can be used to advance packet I/O selection for >> linux-generic\n" >> "\n", NO_PATH(progname), NO_PATH(progname) >> ); >> } >> 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]; >> /* >> > > The rest looks good to me, pretty much what I had in mind, except I didn't > think about the get_env part too much. I can take it up from here, do some > testing with netmap and send a new version of the patch. > > /Ciprian > > >> -- >> 1.8.5.1.163.gd7aced9 >> >> >> _______________________________________________ >> lng-odp mailing list >> lng-odp@lists.linaro.org >> http://lists.linaro.org/mailman/listinfo/lng-odp >> > >
On Fri, May 16, 2014 at 02:49:16PM +0100, Maxim Uvarov 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> > --- > v2: implement getenv() to allow linux-generic turn off types of packets I/O. > This is needed mainly for testing all code paths. > > include/odp_packet_io.h | 3 +- > platform/linux-generic/source/odp_packet_io.c | 155 ++++++++++------------ > platform/linux-generic/source/odp_packet_netmap.c | 10 +- > test/generator/odp_generator.c | 11 +- > test/packet/odp_example_pktio.c | 31 +---- > test/packet_netmap/odp_example_pktio_netmap.c | 15 +-- > 6 files changed, 88 insertions(+), 137 deletions(-) > > @@ -208,44 +166,77 @@ 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: > + if (getenv("ODP_PKTIO_USE_FANOUT")) > + fanout = 1; > + ODP_DBG("ODP_PKTIO_USE_FANOUT: %d\n", fanout); > > - res = setup_pkt_netmap(&pktio_entry->s.pkt_nm, dev, > - pool, ¶ms->nm_params); > - if (res == -1) { > + 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)); > + > + if (getenv("ODP_PKTIO_DISABLE_NETMAP") == NULL) { > + pktio_entry->s.params.ns_params->type = ODP_PKTIO_TYPE_NETMAP; > + if (getenv("ODP_NETMAP_MODE_HW") > + pktio_entry->s.params.nm_params->netmap_mode = ODP_NETMAP_MODE_HW; > + else > + pktio_entry->s.params.nm_params->netmap_mode = ODP_NETMAP_MODE_SW; > + pktio_entry->s.params.nm_params->ringid = 0; > + res = setup_pkt_netmap(&pktio_entry->s.pkt_nm, dev, pool); > + if (res != -1) { > + pktio_entry->s.params.type = pktio_entry->s.params.ns_params.type; > + ODP_DBG("IO type: ODP_PKTIO_TYPE_NETMAP\n"); > + goto done; > + } else > close_pkt_netmap(&pktio_entry->s.pkt_nm); > - free_pktio_entry(id); > - id = ODP_PKTIO_INVALID; > - } > - break; > + } > #endif > - default: > + > + if (getenv("ODP_PKTIO_DISABLE_SOCKET_MMAP") == NULL) { > free_pktio_entry(id); This free shouldn't be here, as it stands id could be freed multiple times and then returned. > - id = ODP_PKTIO_INVALID; > - ODP_ERR("This type of I/O is not supported. Please recompile.\n"); > - break; > + pktio_entry->s.params.sock_params.type = ODP_PKTIO_TYPE_SOCKET_MMAP; > + pktio_entry->s.params.sock_params.fanout = fanout; > + res = setup_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap, dev, > + pool, fanout); > + if (res != -1) { > + pktio_entry->s.params.type = pktio_entry->s.params.sock_params.type; > + ODP_DBG("IO type: ODP_PKTIO_TYPE_SOCKET_MMAP\n"); > + goto done; > + } else > + close_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap); > + } > + > + if (getenv("ODP_PKTIO_DISABLE_SOCKET_MMSG") == NULL) { > + free_pktio_entry(id); ^ remove > + pktio_entry->s.params.sock_params.type = ODP_PKTIO_TYPE_SOCKET_MMSG; > + pktio_entry->s.params.sock_params.fanout = fanout; > + 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; > + ODP_DBG("IO type: ODP_PKTIO_TYPE_SOCKET_MMSG\n"); > + goto done; > + } else > + close_pkt_sock(&pktio_entry->s.pkt_sock); > + } > + > + if (getenv("ODP_PKTIO_DISABLE_SOCKET_BASIC") == NULL) { > + free_pktio_entry(id); ^ remove > + pktio_entry->s.params.sock_params.type = ODP_PKTIO_TYPE_SOCKET_BASIC; > + pktio_entry->s.params.sock_params.fanout = fanout; > + 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; > + ODP_DBG("IO type: ODP_PKTIO_TYPE_SOCKET_BASIC\n"); > + 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; > } Rather than disabling particular I/O types I think it would be better to explicitly select one. As it is I would need to know some implementation details in order to select a specific one (e.g. to force use of BASIC sockets I need to disable NETMAP, MMAP and MMSG). If the specified type isn't available then the _open call can just fail. The above method also doesn't allow selection on a per-device basis. Perhaps this selection could be done by augmenting the device name, e.g. "netmap:eth0" to force use of netmap or "eth0" to allow the implementation to chose. Anyway, I think the patch should be split into two with the first one just doing the dynamic auto-selection (similar to v1).
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..1b2e025 100644 --- a/platform/linux-generic/source/odp_packet_io.c +++ b/platform/linux-generic/source/odp_packet_io.c @@ -13,21 +13,19 @@ #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 #include <string.h> +#include <stdlib.h> typedef struct { pktio_entry_t entries[ODP_CONFIG_PKTIO_ENTRIES]; @@ -112,32 +110,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 +127,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 +150,14 @@ 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; + int fanout = 0; - 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 +166,77 @@ 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: + if (getenv("ODP_PKTIO_USE_FANOUT")) + fanout = 1; + ODP_DBG("ODP_PKTIO_USE_FANOUT: %d\n", fanout); - res = setup_pkt_netmap(&pktio_entry->s.pkt_nm, dev, - pool, ¶ms->nm_params); - if (res == -1) { + 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)); + + if (getenv("ODP_PKTIO_DISABLE_NETMAP") == NULL) { + pktio_entry->s.params.ns_params->type = ODP_PKTIO_TYPE_NETMAP; + if (getenv("ODP_NETMAP_MODE_HW") + pktio_entry->s.params.nm_params->netmap_mode = ODP_NETMAP_MODE_HW; + else + pktio_entry->s.params.nm_params->netmap_mode = ODP_NETMAP_MODE_SW; + pktio_entry->s.params.nm_params->ringid = 0; + res = setup_pkt_netmap(&pktio_entry->s.pkt_nm, dev, pool); + if (res != -1) { + pktio_entry->s.params.type = pktio_entry->s.params.ns_params.type; + ODP_DBG("IO type: ODP_PKTIO_TYPE_NETMAP\n"); + goto done; + } else close_pkt_netmap(&pktio_entry->s.pkt_nm); - free_pktio_entry(id); - id = ODP_PKTIO_INVALID; - } - break; + } #endif - default: + + if (getenv("ODP_PKTIO_DISABLE_SOCKET_MMAP") == NULL) { free_pktio_entry(id); - id = ODP_PKTIO_INVALID; - ODP_ERR("This type of I/O is not supported. Please recompile.\n"); - break; + pktio_entry->s.params.sock_params.type = ODP_PKTIO_TYPE_SOCKET_MMAP; + pktio_entry->s.params.sock_params.fanout = fanout; + res = setup_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap, dev, + pool, fanout); + if (res != -1) { + pktio_entry->s.params.type = pktio_entry->s.params.sock_params.type; + ODP_DBG("IO type: ODP_PKTIO_TYPE_SOCKET_MMAP\n"); + goto done; + } else + close_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap); + } + + if (getenv("ODP_PKTIO_DISABLE_SOCKET_MMSG") == NULL) { + free_pktio_entry(id); + pktio_entry->s.params.sock_params.type = ODP_PKTIO_TYPE_SOCKET_MMSG; + pktio_entry->s.params.sock_params.fanout = fanout; + 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; + ODP_DBG("IO type: ODP_PKTIO_TYPE_SOCKET_MMSG\n"); + goto done; + } else + close_pkt_sock(&pktio_entry->s.pkt_sock); + } + + if (getenv("ODP_PKTIO_DISABLE_SOCKET_BASIC") == NULL) { + free_pktio_entry(id); + pktio_entry->s.params.sock_params.type = ODP_PKTIO_TYPE_SOCKET_BASIC; + pktio_entry->s.params.sock_params.fanout = fanout; + 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; + ODP_DBG("IO type: ODP_PKTIO_TYPE_SOCKET_BASIC\n"); + 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/platform/linux-generic/source/odp_packet_netmap.c b/platform/linux-generic/source/odp_packet_netmap.c index e2215ab..027a338 100644 --- a/platform/linux-generic/source/odp_packet_netmap.c +++ b/platform/linux-generic/source/odp_packet_netmap.c @@ -105,7 +105,7 @@ done: } int setup_pkt_netmap(pkt_netmap_t * const pkt_nm, const char *netdev, - odp_buffer_pool_t pool, netmap_params_t *nm_params) + odp_buffer_pool_t pool) { char qname[ODP_QUEUE_NAME_LEN]; char ifname[32]; @@ -132,12 +132,10 @@ int setup_pkt_netmap(pkt_netmap_t * const pkt_nm, const char *netdev, pkt_nm->buf_size = odp_packet_buf_size(pkt); /* max frame len taking into account the l2-offset */ pkt_nm->max_frame_len = pkt_nm->buf_size - pkt_nm->frame_offset; - /* save netmap_mode for later use */ - pkt_nm->netmap_mode = nm_params->netmap_mode; odp_packet_free(pkt); - if (nm_params->netmap_mode == ODP_NETMAP_MODE_SW) + if (pkt_nm->netmap_mode == ODP_NETMAP_MODE_SW) ringid = NETMAP_SW_RING; else ringid = nm_params->ringid; @@ -153,7 +151,7 @@ int setup_pkt_netmap(pkt_netmap_t * const pkt_nm, const char *netdev, ODP_DBG("thread %d mode %s mmap addr %p\n", odp_thread_id(), - nm_params->netmap_mode == ODP_NETMAP_MODE_SW ? "SW" : "HW", + pkt_nm->netmap_mode == ODP_NETMAP_MODE_SW ? "SW" : "HW", pkt_nm->nm_desc->mem); if (nm_params->netmap_mode == ODP_NETMAP_MODE_SW) { @@ -178,7 +176,7 @@ int setup_pkt_netmap(pkt_netmap_t * const pkt_nm, const char *netdev, } /* Set TX checksumming if hardware rings */ - if (nm_params->netmap_mode == ODP_NETMAP_MODE_HW) { + if (pkt_nm->netmap_mode == ODP_NETMAP_MODE_HW) { ret = nm_do_ioctl(pkt_nm, SIOCGIFFLAGS, 0); if (ret) return ret; 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..0d23bd6 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,16 +604,15 @@ 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" " -h, --help Display help and exit.\n" + " environment variables: ODP_PKTIO_DISABLE_NETMAP" + " ODP_PKTIO_DISABLE_SOCKET_MMAP\n" + " ODP_PKTIO_DISABLE_SOCKET_MMSG\n" + " ODP_PKTIO_DISABLE_SOCKET_BASIC\n" + " can be used to advance packet I/O selection for linux-generic\n" "\n", NO_PATH(progname), NO_PATH(progname) ); } 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> --- v2: implement getenv() to allow linux-generic turn off types of packets I/O. This is needed mainly for testing all code paths. include/odp_packet_io.h | 3 +- platform/linux-generic/source/odp_packet_io.c | 155 ++++++++++------------ platform/linux-generic/source/odp_packet_netmap.c | 10 +- test/generator/odp_generator.c | 11 +- test/packet/odp_example_pktio.c | 31 +---- test/packet_netmap/odp_example_pktio_netmap.c | 15 +-- 6 files changed, 88 insertions(+), 137 deletions(-)