From patchwork Wed Apr 20 16:02:32 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxim Uvarov X-Patchwork-Id: 66216 Delivered-To: patch@linaro.org Received: by 10.140.93.198 with SMTP id d64csp2534087qge; Wed, 20 Apr 2016 09:03:31 -0700 (PDT) X-Received: by 10.55.165.22 with SMTP id o22mr2818978qke.0.1461168211493; Wed, 20 Apr 2016 09:03:31 -0700 (PDT) Return-Path: Received: from lists.linaro.org (lists.linaro.org. [54.225.227.206]) by mx.google.com with ESMTP id f205si7882981qhf.50.2016.04.20.09.03.31; Wed, 20 Apr 2016 09:03:31 -0700 (PDT) Received-SPF: pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.225.227.206 as permitted sender) client-ip=54.225.227.206; Authentication-Results: mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.225.227.206 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=pass (p=NONE dis=NONE) header.from=linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id 257D568A24; Wed, 20 Apr 2016 16:03:31 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on ip-10-142-244-252 X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, URIBL_BLOCKED autolearn=disabled version=3.4.0 Received: from [127.0.0.1] (localhost [127.0.0.1]) by lists.linaro.org (Postfix) with ESMTP id 6C60768A27; Wed, 20 Apr 2016 16:02:54 +0000 (UTC) X-Original-To: lng-odp@lists.linaro.org Delivered-To: lng-odp@lists.linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id B7C8368A22; Wed, 20 Apr 2016 16:02:45 +0000 (UTC) Received: from mail-lf0-f47.google.com (mail-lf0-f47.google.com [209.85.215.47]) by lists.linaro.org (Postfix) with ESMTPS id 60194686B2 for ; Wed, 20 Apr 2016 16:02:43 +0000 (UTC) Received: by mail-lf0-f47.google.com with SMTP id e190so43930977lfe.0 for ; Wed, 20 Apr 2016 09:02:43 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Z5WljP6wo6scmMmZ/+3rR8Gw3uyux9sPFAD5dylynpg=; b=a1YuQN3NuNNXluP4wkGCtk905vx2j2tiH2q46hlTU7BXfKYcqhxe89ovg+fp14ISFs iV9EZmKc273YOcrKVT8JgR0lj9XfChbA64LTopCIcgY3EwvH/pHn2Q7cJs2J4b9npoEe VSjrUQd5x32EIQHJP5QxSliUqr9CghqGQLsmOxg5phzVOg34IDawbfuAiLnO9hpl54Hh z5XkXcVrvAKYHIAPs1v45dCTvDRlgyNk6UL/A/ijgi/sqGPTAOaqxJ6sPCcyzysJ1u+I h/Qm444Tco6Wp+rmfVr/dnQdLf/litnbBY32RqZ9Zu0kuFiM7jGnw9LZnzqtmvm4TpRE 7P9w== X-Gm-Message-State: AOPr4FWn2F1WV/0q5YXJSE51Vgn4IYY45EFxu4HwwY+HtUzJk9Kz8xdSmIcWNzxtF9Syblykl4Y= X-Received: by 10.25.138.7 with SMTP id m7mr4002517lfd.153.1461168162243; Wed, 20 Apr 2016 09:02:42 -0700 (PDT) Received: from localhost.localdomain (ppp91-77-173-31.pppoe.mtu-net.ru. [91.77.173.31]) by smtp.gmail.com with ESMTPSA id 31sm902362lfu.48.2016.04.20.09.02.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 20 Apr 2016 09:02:41 -0700 (PDT) From: Maxim Uvarov To: lng-odp@lists.linaro.org Date: Wed, 20 Apr 2016 19:02:32 +0300 Message-Id: <1461168154-6285-2-git-send-email-maxim.uvarov@linaro.org> X-Mailer: git-send-email 2.7.1.250.gff4ea60 In-Reply-To: <1461168154-6285-1-git-send-email-maxim.uvarov@linaro.org> References: <1461168154-6285-1-git-send-email-maxim.uvarov@linaro.org> X-Topics: patch Subject: [lng-odp] [PATCHv2 1/2] example: packet: add odp_term_global X-BeenThere: lng-odp@lists.linaro.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: "The OpenDataPlane \(ODP\) List" 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" Add odp_term_global and comment that it will never be called. https://bugs.linaro.org/show_bug.cgi?id=1706 Signed-off-by: Maxim Uvarov --- example/packet/odp_pktio.c | 56 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 14 deletions(-) diff --git a/example/packet/odp_pktio.c b/example/packet/odp_pktio.c index dd3e8e3..7110123 100644 --- a/example/packet/odp_pktio.c +++ b/example/packet/odp_pktio.c @@ -69,6 +69,7 @@ typedef struct { char **if_names; /**< Array of pointers to interface names */ int mode; /**< Packet IO mode */ char *if_str; /**< Storage for interface names */ + int time; /**< Time to run app */ } appl_args_t; /** @@ -77,6 +78,7 @@ typedef struct { typedef struct { char *pktio_dev; /**< Interface name to use */ int mode; /**< Thread mode */ + int *exit; /**< Exit the thread */ } thread_args_t; /** @@ -98,6 +100,7 @@ static void swap_pkt_addrs(odp_packet_t pkt_tbl[], unsigned len); static void parse_args(int argc, char *argv[], appl_args_t *appl_args); static void print_info(char *progname, appl_args_t *appl_args); static void usage(char *progname); +static int exit_threads; /** * Create a pktio handle, optionally associating a default input queue. @@ -177,6 +180,7 @@ static void *pktio_queue_thread(void *arg) odp_event_t ev; unsigned long pkt_cnt = 0; unsigned long err_cnt = 0; + uint64_t sched_wait = odp_schedule_wait_time(ODP_TIME_MSEC_IN_NS * 100); thr = odp_thread_id(); thr_args = arg; @@ -203,18 +207,20 @@ static void *pktio_queue_thread(void *arg) } /* Loop packets */ - for (;;) { + while (!exit_threads) { odp_pktio_t pktio_tmp; - if (inq != ODP_QUEUE_INVALID) { + if (inq != ODP_QUEUE_INVALID) ev = odp_queue_deq(inq); - pkt = odp_packet_from_event(ev); - if (!odp_packet_is_valid(pkt)) - continue; - } else { - ev = odp_schedule(NULL, ODP_SCHED_WAIT); - pkt = odp_packet_from_event(ev); - } + else + ev = odp_schedule(NULL, sched_wait); + + if (ev == ODP_EVENT_INVALID) + continue; + + pkt = odp_packet_from_event(ev); + if (!odp_packet_is_valid(pkt)) + continue; /* Drop packets with errors */ if (odp_unlikely(drop_err_pkts(&pkt, 1) == 0)) { @@ -246,7 +252,6 @@ static void *pktio_queue_thread(void *arg) } } -/* unreachable */ return NULL; } @@ -292,7 +297,7 @@ static void *pktio_ifburst_thread(void *arg) } /* Loop packets */ - for (;;) { + while (!exit_threads) { pkts = odp_pktin_recv(pktin, pkt_tbl, MAX_PKT_BURST); if (pkts > 0) { /* Drop packets with errors */ @@ -329,7 +334,6 @@ static void *pktio_ifburst_thread(void *arg) } } -/* unreachable */ return NULL; } @@ -416,6 +420,7 @@ int main(int argc, char *argv[]) args->thread[i].pktio_dev = args->appl.if_names[if_idx]; args->thread[i].mode = args->appl.mode; + args->thread[i].exit = &exit_threads; if (args->appl.mode == APPL_MODE_PKT_BURST) thr_run_func = pktio_ifburst_thread; @@ -435,15 +440,31 @@ int main(int argc, char *argv[]) cpu = odp_cpumask_next(&cpumask, cpu); } + if (args->appl.time) { + sleep(args->appl.time); + for (i = 0; i < num_workers; ++i) { + odp_pktio_t pktio; + + pktio = odp_pktio_lookup(args->thread[i].pktio_dev); + odp_pktio_stop(pktio); + } + sleep(1); /* use simple delay to let workers clean up queues */ + exit_threads = 1; + } + /* Master thread waits for other threads to exit */ odph_linux_pthread_join(thread_tbl, num_workers); + for (i = 0; i < num_workers; ++i) + odp_pktio_close(odp_pktio_lookup(args->thread[i].pktio_dev)); + free(args->appl.if_names); free(args->appl.if_str); free(args); - printf("Exit\n\n"); - return 0; + odp_pool_destroy(pool); + odp_term_local(); + return odp_term_global(); } /** @@ -529,8 +550,10 @@ static void parse_args(int argc, char *argv[], appl_args_t *appl_args) char *token; size_t len; int i; + static struct option longopts[] = { {"count", required_argument, NULL, 'c'}, + {"time", required_argument, NULL, 't'}, {"interface", required_argument, NULL, 'i'}, /* return 'i' */ {"mode", required_argument, NULL, 'm'}, /* return 'm' */ {"help", no_argument, NULL, 'h'}, /* return 'h' */ @@ -538,6 +561,7 @@ static void parse_args(int argc, char *argv[], appl_args_t *appl_args) }; appl_args->mode = APPL_MODE_PKT_SCHED; + appl_args->time = 0; /**< loop forever */ while (1) { opt = getopt_long(argc, argv, "+c:i:+m:t:h", @@ -550,6 +574,9 @@ static void parse_args(int argc, char *argv[], appl_args_t *appl_args) case 'c': appl_args->cpu_count = atoi(optarg); break; + case 't': + appl_args->time = atoi(optarg); + break; /* parse packet-io interface names */ case 'i': len = strlen(optarg); @@ -685,6 +712,7 @@ static void usage(char *progname) "\n" "Optional OPTIONS\n" " -c, --count CPU count.\n" + " -t, --time Number of seconds to run.\n" " -m, --mode 0: Receive and send directly (no queues)\n" " 1: Receive and send via queues.\n" " 2: Receive via scheduler, send via queues.\n"