From patchwork Fri May 20 16:30:21 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christophe Milard X-Patchwork-Id: 68254 Delivered-To: patch@linaro.org Received: by 10.140.92.199 with SMTP id b65csp3847414qge; Fri, 20 May 2016 08:35:59 -0700 (PDT) X-Received: by 10.55.11.151 with SMTP id 145mr4239947qkl.160.1463758559449; Fri, 20 May 2016 08:35:59 -0700 (PDT) Return-Path: Received: from lists.linaro.org (lists.linaro.org. [54.225.227.206]) by mx.google.com with ESMTP id t45si18631277qgd.70.2016.05.20.08.35.59; Fri, 20 May 2016 08:35:59 -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 25FE2618E3; Fri, 20 May 2016 15:35:59 +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 61BA461808; Fri, 20 May 2016 15:32:23 +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 7516261588; Fri, 20 May 2016 15:32:07 +0000 (UTC) Received: from mail-lb0-f169.google.com (mail-lb0-f169.google.com [209.85.217.169]) by lists.linaro.org (Postfix) with ESMTPS id 2D47761588 for ; Fri, 20 May 2016 15:32:06 +0000 (UTC) Received: by mail-lb0-f169.google.com with SMTP id h1so36542109lbj.3 for ; Fri, 20 May 2016 08:32:06 -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=zUPT5pxyQjZNBpd2gGx4bthGZHOUmzFT8IyG+OJ2QTc=; b=PjIDuY7GuI+/dwB1U4FNi7KFEsO7gmgMRXzb1wxhFMH7k0pSN5g9+YGEh+h4pBeSuE DRLgd4A2CwVJBg5kacmFERr/zs5T3yiFKPFhX6tg8yficZjR8E1Ckuj8gxvrOoAc8FY7 wzN7v5w//SfrjIgVkBaUYmkO1epUDfM3hQT8mlvv9h0b9vJpdYl8knZTfhAMxMChPorQ 61JZcPZyDLIHshu7zdSROwWH54pH6VG/AMudoq46KQXQ9AzJKLkoqjEvmC8Ku1ecRf/E CP1pOhDSsV5IEkczm1FXiYFfvYZCpK6GRJ/3ZI+h+cZ1XXpFpk8GDtYnJ3tlajSlyI4f uxYQ== X-Gm-Message-State: AOPr4FWDNY7NfTirGJWO630cU7xrr6x4N9s3wqkB/P1sUEz9ufCWhpHFmeb8eg5l8RkrbUv2M5U= X-Received: by 10.112.189.73 with SMTP id gg9mr1165605lbc.109.1463758324967; Fri, 20 May 2016 08:32:04 -0700 (PDT) Received: from erachmi-ericsson.ki.sw.ericsson.se (c-83-233-90-46.cust.bredband2.com. [83.233.90.46]) by smtp.gmail.com with ESMTPSA id tg1sm3348847lbb.7.2016.05.20.08.32.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 20 May 2016 08:32:04 -0700 (PDT) From: Christophe Milard To: maxim.uvarov@linaro.com, lng-odp@lists.linaro.org Date: Fri, 20 May 2016 18:30:21 +0200 Message-Id: <1463761851-37121-6-git-send-email-christophe.milard@linaro.org> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1463761851-37121-1-git-send-email-christophe.milard@linaro.org> References: <1463761851-37121-1-git-send-email-christophe.milard@linaro.org> X-Topics: patch Subject: [lng-odp] [PATCHv9 05/35] helper: test: adding odpthread functions tests 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" Simple tests testing odph_odpthreads_create() and odph_odpthreads_join() are added. A single test binary, odpthreads, is added. This program creates odp threads as pthreads or linux processes, dependng on its calling args. Two calling scripts are added to create ODP threads as either processes, or threads. Signed-off-by: Christophe Milard --- helper/test/.gitignore | 1 + helper/test/Makefile.am | 7 ++- helper/test/odpthreads.c | 100 ++++++++++++++++++++++++++++++++++++ helper/test/odpthreads_as_processes | 14 +++++ helper/test/odpthreads_as_pthreads | 14 +++++ 5 files changed, 134 insertions(+), 2 deletions(-) create mode 100644 helper/test/odpthreads.c create mode 100755 helper/test/odpthreads_as_processes create mode 100755 helper/test/odpthreads_as_pthreads diff --git a/helper/test/.gitignore b/helper/test/.gitignore index e232753..5ce3c3b 100644 --- a/helper/test/.gitignore +++ b/helper/test/.gitignore @@ -1,6 +1,7 @@ *.trs *.log chksum +odpthreads parse process table diff --git a/helper/test/Makefile.am b/helper/test/Makefile.am index 7f0b67d..8e65948 100644 --- a/helper/test/Makefile.am +++ b/helper/test/Makefile.am @@ -11,9 +11,10 @@ EXECUTABLES = chksum$(EXEEXT) \ process$(EXEEXT)\ table$(EXEEXT) -COMPILE_ONLY = +COMPILE_ONLY = odpthreads -TESTSCRIPTS = +TESTSCRIPTS = odpthreads_as_processes \ + odpthreads_as_pthreads if test_helper TESTS = $(EXECUTABLES) $(TESTSCRIPTS) @@ -25,6 +26,8 @@ bin_PROGRAMS = $(EXECUTABLES) $(COMPILE_ONLY) dist_chksum_SOURCES = chksum.c +dist_odpthreads_SOURCES = odpthreads.c +odpthreads_LDADD = $(LIB)/libodphelper-linux.la $(LIB)/libodp-linux.la dist_thread_SOURCES = thread.c thread_LDADD = $(LIB)/libodphelper-linux.la $(LIB)/libodp-linux.la dist_process_SOURCES = process.c diff --git a/helper/test/odpthreads.c b/helper/test/odpthreads.c new file mode 100644 index 0000000..bba4fa5 --- /dev/null +++ b/helper/test/odpthreads.c @@ -0,0 +1,100 @@ +/* Copyright (c) 2016, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * This program tests the ability of the linux helper to create ODP threads, + * either implemented as linux pthreads or as linux processes, depending on + * the option passed to the program (--odph_proc, --odph_thread or both) + */ + +#include +#include +#include + +#define NUMBER_WORKERS 16 +static int worker_fn(void *arg TEST_UNUSED) +{ + /* depend on the odp helper to call odp_init_local */ + + printf("Worker thread on CPU %d\n", odp_cpu_id()); + + /* depend on the odp helper to call odp_term_local */ + + return 0; +} + +/* Create additional dataplane opdthreads */ +int main(int argc, char *argv[]) +{ + odp_instance_t instance; + odph_odpthread_params_t thr_params; + odph_odpthread_t thread_tbl[NUMBER_WORKERS]; + odp_cpumask_t cpu_mask; + int num_workers; + int cpu; + int ret; + char cpumaskstr[ODP_CPUMASK_STR_SIZE]; + + /* let helper collect its own arguments (e.g. --odph_proc) */ + odph_parse_options(argc, argv, NULL, NULL); + + if (odp_init_global(&instance, NULL, NULL)) { + LOG_ERR("Error: ODP global init failed.\n"); + exit(EXIT_FAILURE); + } + + if (odp_init_local(instance, ODP_THREAD_CONTROL)) { + LOG_ERR("Error: ODP local init failed.\n"); + exit(EXIT_FAILURE); + } + + /* discover how many opdthreads this system can support */ + num_workers = odp_cpumask_default_worker(&cpu_mask, NUMBER_WORKERS); + if (num_workers < NUMBER_WORKERS) { + printf("System can only support %d threads and not the %d requested\n", + num_workers, NUMBER_WORKERS); + } + + /* generate a summary for the user */ + (void)odp_cpumask_to_str(&cpu_mask, cpumaskstr, sizeof(cpumaskstr)); + printf("default cpu mask: %s\n", cpumaskstr); + printf("default num worker threads: %i\n", num_workers); + + cpu = odp_cpumask_first(&cpu_mask); + printf("the first CPU: %i\n", cpu); + + /* reserve cpu 0 for the control plane so remove it from + * the default mask */ + odp_cpumask_clr(&cpu_mask, 0); + num_workers = odp_cpumask_count(&cpu_mask); + (void)odp_cpumask_to_str(&cpu_mask, cpumaskstr, sizeof(cpumaskstr)); + printf("new cpu mask: %s\n", cpumaskstr); + printf("new num worker threads: %i\n\n", num_workers); + + memset(&thr_params, 0, sizeof(thr_params)); + thr_params.start = worker_fn; + thr_params.arg = NULL; + thr_params.thr_type = ODP_THREAD_WORKER; + thr_params.instance = instance; + + odph_odpthreads_create(&thread_tbl[0], &cpu_mask, &thr_params); + + ret = odph_odpthreads_join(thread_tbl); + if (ret < 0) + exit(EXIT_FAILURE); + + if (odp_term_local()) { + LOG_ERR("Error: ODP local term failed.\n"); + exit(EXIT_FAILURE); + } + + if (odp_term_global(instance)) { + LOG_ERR("Error: ODP global term failed.\n"); + exit(EXIT_FAILURE); + } + + return 0; +} diff --git a/helper/test/odpthreads_as_processes b/helper/test/odpthreads_as_processes new file mode 100755 index 0000000..89405f3 --- /dev/null +++ b/helper/test/odpthreads_as_processes @@ -0,0 +1,14 @@ +#!/bin/sh +# +# Copyright (c) 2016, Linaro Limited +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause +# + +PATH=$(dirname $0):$PATH +PATH=.:$PATH + +# The odpthreads test recognise the "--odph_proc" option to create +# odp threads as linux processes: +odpthreads --odph_proc diff --git a/helper/test/odpthreads_as_pthreads b/helper/test/odpthreads_as_pthreads new file mode 100755 index 0000000..ef569c3 --- /dev/null +++ b/helper/test/odpthreads_as_pthreads @@ -0,0 +1,14 @@ +#!/bin/sh +# +# Copyright (c) 2016, Linaro Limited +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause +# + +PATH=$(dirname $0):$PATH +PATH=.:$PATH + +# The odpthreads test without the "--odph_proc" option defaults to create +# odp threads as linux pthreads: +odpthreads