From patchwork Fri May 16 11:48:35 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxim Uvarov X-Patchwork-Id: 30323 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-ie0-f200.google.com (mail-ie0-f200.google.com [209.85.223.200]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 60EA720A25 for ; Fri, 16 May 2014 11:49:09 +0000 (UTC) Received: by mail-ie0-f200.google.com with SMTP id lx4sf753966iec.3 for ; Fri, 16 May 2014 04:49:08 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:from:to:date:message-id:subject :precedence:list-id:list-unsubscribe:list-archive:list-post :list-help:list-subscribe:mime-version:errors-to:sender :x-original-sender:x-original-authentication-results:mailing-list :content-type:content-transfer-encoding; bh=ikFjIyjbqYbdvR+CdNCvuyo9A7VmSqHOpxryN05B8Pg=; b=aTRG3oK47dAjnfb5727X7bQSGNZAvxNcpx/9ij605eI8mc+MteNGxryGV0lHkobhiT Rh0V4oqdjlP7/cvVn4MtECvtjL3shELFNvEGHNoCgh3ULFeyKO2mRBmQ5rVanVCUKotv vk+rXjAv7m+8vmMeYHTtzZNAAvhMNaq4ZAq2sJ1qqyKD1BQWcJMcKwA7uUyA7HHSZb1R Le504jiObp8OihLnIkziM9zURcv4+grpEtFoL1fP8kTgcHkZWzwBH9rmlmYnFWRYnEZ+ nZcZ1CFdUUt1mN0udoPnSp/GB9jLkWrfhTF3q0IaxnYDhZcoGiDZVfde2OxsSoZ36X/i 8qJQ== X-Gm-Message-State: ALoCoQlP3V6+7fC29+kcinrBRPOhi5Am3MiPSDSrost+E1dxXFiUVFoM5T+7SXoISSDHGVsnI3wT X-Received: by 10.42.187.198 with SMTP id cx6mr6743785icb.8.1400240948823; Fri, 16 May 2014 04:49:08 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.32.203 with SMTP id h69ls646807qgh.56.gmail; Fri, 16 May 2014 04:49:08 -0700 (PDT) X-Received: by 10.58.188.115 with SMTP id fz19mr392558vec.40.1400240948698; Fri, 16 May 2014 04:49:08 -0700 (PDT) Received: from mail-ve0-f175.google.com (mail-ve0-f175.google.com [209.85.128.175]) by mx.google.com with ESMTPS id iq2si1519025veb.73.2014.05.16.04.49.08 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 16 May 2014 04:49:08 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.128.175 as permitted sender) client-ip=209.85.128.175; Received: by mail-ve0-f175.google.com with SMTP id jw12so2879612veb.6 for ; Fri, 16 May 2014 04:49:08 -0700 (PDT) X-Received: by 10.52.141.74 with SMTP id rm10mr11518317vdb.6.1400240948562; Fri, 16 May 2014 04:49:08 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.220.221.72 with SMTP id ib8csp45857vcb; Fri, 16 May 2014 04:49:08 -0700 (PDT) X-Received: by 10.224.13.72 with SMTP id b8mr9420755qaa.4.1400240947707; Fri, 16 May 2014 04:49:07 -0700 (PDT) Received: from ip-10-141-164-156.ec2.internal (lists.linaro.org. [54.225.227.206]) by mx.google.com with ESMTPS id w18si4043053qgd.178.2014.05.16.04.49.06 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Fri, 16 May 2014 04:49:07 -0700 (PDT) Received-SPF: none (google.com: lng-odp-bounces@lists.linaro.org does not designate permitted sender hosts) client-ip=54.225.227.206; Received: from localhost ([127.0.0.1] helo=ip-10-141-164-156.ec2.internal) by ip-10-141-164-156.ec2.internal with esmtp (Exim 4.76) (envelope-from ) id 1WlGcV-0002vt-JC; Fri, 16 May 2014 11:48:11 +0000 Received: from mail-lb0-f175.google.com ([209.85.217.175]) by ip-10-141-164-156.ec2.internal with esmtp (Exim 4.76) (envelope-from ) id 1WlGcP-0002vo-9p for lng-odp@lists.linaro.org; Fri, 16 May 2014 11:48:05 +0000 Received: by mail-lb0-f175.google.com with SMTP id l4so1827074lbv.6 for ; Fri, 16 May 2014 04:48:54 -0700 (PDT) X-Received: by 10.152.6.131 with SMTP id b3mr11963104laa.9.1400240933862; Fri, 16 May 2014 04:48:53 -0700 (PDT) Received: from maxim-lap.localhost.onion ([92.39.133.154]) by mx.google.com with ESMTPSA id i10sm8314723lbc.16.2014.05.16.04.48.52 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 16 May 2014 04:48:52 -0700 (PDT) From: Maxim Uvarov To: lng-odp@lists.linaro.org Date: Fri, 16 May 2014 15:48:35 +0400 Message-Id: <1400240915-21184-1-git-send-email-maxim.uvarov@linaro.org> X-Mailer: git-send-email 1.8.5.1.163.gd7aced9 X-Topics: patch Subject: [lng-odp] [PATCH] hide packet i/o selection to the api X-BeenThere: lng-odp@lists.linaro.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: , List-Help: , List-Subscribe: , MIME-Version: 1.0 Errors-To: lng-odp-bounces@lists.linaro.org Sender: lng-odp-bounces@lists.linaro.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: maxim.uvarov@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.128.175 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 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 --- 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 #include #include -#ifdef ODP_HAVE_NETMAP -#include -#endif #include #include #include #include #include - #include #ifdef ODP_HAVE_NETMAP +#include #include #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 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]; /*