From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM02-CY1-obe.outbound.protection.outlook.com (mail-cys01nam02on0075.outbound.protection.outlook.com [104.47.37.75]) by dpdk.org (Postfix) with ESMTP id DF4FA1CB51 for ; Thu, 5 Apr 2018 13:54:01 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=NvFjnBBkjJM3lne4J3+lbOoqaYNrs3JLT5+PwPjlhSk=; b=GiTpLeTjfBw2+17dfOxDe91la8+kLcElMEcgJ88+H1momXqYssExQlZjM3JPNd33M7I5EnzLUCdZXKnF3QEk6CRwl7cOlbkddql8OkmuEUVFR0vUeu8bAWuWczHiP7kQAb3U7a/XPlR2ZdIOlYaEGHWr8P2J3Ls+73L9YfnCEh8= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Pavan.Bhagavatula@cavium.com; Received: from ltp-pvn.caveonetworks.com (111.93.218.67) by BN6PR07MB3458.namprd07.prod.outlook.com (2603:10b6:405:64::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.653.12; Thu, 5 Apr 2018 11:53:59 +0000 From: Pavan Nikhilesh To: jerin.jacob@caviumnetworks.com, santosh.shukla@caviumnetworks.com, erik.g.carrillo@intel.com Cc: dev@dpdk.org, Pavan Nikhilesh Date: Thu, 5 Apr 2018 17:23:27 +0530 Message-Id: <20180405115329.22372-2-pbhagavatula@caviumnetworks.com> X-Mailer: git-send-email 2.16.3 In-Reply-To: <20180405115329.22372-1-pbhagavatula@caviumnetworks.com> References: <20180318131216.11699-1-pbhagavatula@caviumnetworks.com> <20180405115329.22372-1-pbhagavatula@caviumnetworks.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [111.93.218.67] X-ClientProxiedBy: PN1PR0101CA0053.INDPRD01.PROD.OUTLOOK.COM (2603:1096:c00:d::15) To BN6PR07MB3458.namprd07.prod.outlook.com (2603:10b6:405:64::21) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 2caa611e-b0f5-4cb5-0b26-08d59aebebe4 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(5600026)(4604075)(2017052603328)(7153060)(7193020); SRVR:BN6PR07MB3458; X-Microsoft-Exchange-Diagnostics: 1; BN6PR07MB3458; 3:9TlnZALf3GsedE/QG9mrtQ2h0ttvLJGiiVoPtKtUTE6YrLkWy5jzt3lhhAHGo8LfnvRjgSkErZX0YstmjzHJDccuWs34lhLnWtmq4QkHYFnLL0Cm/8/T8mdbDRQfcFVom6mlnWAKVABD56VQ2pdxNpvp1stAW2C6vbpDsCTWQnfAm/g/JZlBfDBr2Dk+j+4sgIr90/mmkpDFrZxSPwEGevPlpvmJ/Sd5k0I6/++FSb/hC4koZxkP2GS0uXL4xoeB; 25:yhoiFzMNgB7Xm9TsVWI250q6Or+PiTg03uTreaUxCxshd1YvxjCSVC9IjY3YdvUHmb9PyJ2K8SmWU8aq2KpJDsSRH/5qR7ZxD8nOCcTc6NxlPObZccqH7jdlkWCyrnICzLVoasEDZVV3OzScJkXqH3wYWJtAgluFFHMd22gaNheze7OX/rY2nOUt1I9RHZNNoT5LF+9c0odnrkgQ4y6S+0QvH4aJ7+t4ofnvknT56mrpKxTdrk8A65omX4RSI+EjpqXNRplE1uRPTJzCJYR//3l0g47EfI7l8ALrQmhWAWkZR4G4IPnYLKK5FXzNwZdI3hqINkYNQP6zF2EVYfkEMA==; 31:6hO2VoG2iokbF6ZlnMX4IExwquJHV+k9RZUbxAB0W0XlldOVwxLfdhs8/xoZICy/p+I/5uiAHi1J+EUncXrEm8BWKw104i/Ce/HhYD1oLHG+Ukz1ukS78TqEuwnI13OMBvM1sIYSDNbMxirdIF95GNIIKI8ciC7zQ1XyO18oUdHhtylm2vEIiczMTC/Rbu5wHFlOFWCrxUC2FAuW14WBiec8m4oGX+R5aGLWAcMTYNc= X-MS-TrafficTypeDiagnostic: BN6PR07MB3458: X-Microsoft-Exchange-Diagnostics: 1; BN6PR07MB3458; 20:udEEblTU4eW0FBB6nEnRD+B5MfwqRJ9Ilq0cH7PWty52t5G4M4kng1YvjzrQ74ZxxLlCSH5jXLeCtGHQDR+jFccgLzxhLJZm5Yc14qtcVsQLrPH2Z/vKnlMVNLiRcb2JHsFl0COorFahQjZfAljlQlrx5GKEe6gJKAJRP959blGv4TNorCz1y4plLGkX0qlCQtgS+Gkg2Ejo02Qdif4GtqYfhHS0TI9rpJloQBAhJwSCbKRfx/NvcMsvb5qoowaan5WeEfyzqTJF08pi1FNRJLWij8Gd4WiTAxyEF+BC57h5bpkt5N7r60H/lyh5c47rv7zbfiOmxYbszSAC2JX7mgbC7vnDUD+j9oHQ1lYfiiB0YDh5GwqdPvh/kQn8XqHmRLM2OdVwmyMriiMnYv984nDI2Asol3+MMblwaMpveMPBR3WmGXFNXkJqfX60x5LgSOglt0QHlulMv7H4Rn7k+2YXijqwANrhsNk3p+Vp4+F1AAdh8a7nmrlDLvtYJr/lerdJ/igyYB0EioGd3dSICYbpr79SFwImCAXbGpCDhYdxZAtNUQhQ8CqaXxwj5Hoo5Q5CID7zAiKNIL0BaQP6M5qIGk5VH0rseCmo3zQ/55k=; 4:HFfrYUr7s734xCKMO+Hu27QNYdDdaaIhqI8dHUdmDe0ufQP0swwJUSdkeBLL60zpx37WopNb24uTCSIy3VKx5a+ppr6vkTqC1takLhPiP6rjR5JCl7gcdggBmQaJdUJkcFWS7agGbfzU9YMzRYnyLWophH1e0Va+Sm5wuF87GfUyAbJRWG6b9Hv4NG3vgk+luvqBeXDVcoqzIiCv/Kit5bkIDXZDg/62Xnqz2Dz8JKw9NI7loiQPM0eEF4cJuPsrmcLbJLrGdVRKn/x6eevzGA== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(93006095)(10201501046)(3002001)(3231221)(944501327)(52105095)(6041310)(20161123564045)(20161123558120)(20161123560045)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(6072148)(201708071742011); SRVR:BN6PR07MB3458; BCL:0; PCL:0; RULEID:; SRVR:BN6PR07MB3458; X-Forefront-PRVS: 06339BAE63 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(346002)(366004)(39380400002)(376002)(396003)(39860400002)(189003)(199004)(956004)(72206003)(42882007)(575784001)(476003)(53936002)(2616005)(50226002)(2906002)(486006)(68736007)(4326008)(52116002)(6486002)(76176011)(107886003)(11346002)(25786009)(6512007)(51416003)(6506007)(81166006)(81156014)(446003)(69596002)(8676002)(386003)(8936002)(316002)(3846002)(16586007)(1857600001)(7736002)(106356001)(1076002)(26005)(6116002)(97736004)(50466002)(48376002)(36756003)(5660300001)(66066001)(6666003)(105586002)(53416004)(47776003)(5009440100003)(305945005)(478600001)(16526019)(42262002); DIR:OUT; SFP:1101; SCL:1; SRVR:BN6PR07MB3458; H:ltp-pvn.caveonetworks.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; Received-SPF: None (protection.outlook.com: cavium.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BN6PR07MB3458; 23:pCGaQGQy915Yc79Bin8P/ZiClrjL/uyqEYaJgsQqR?= =?us-ascii?Q?tTy8SJrNpEv1zQB8Z/GHotpOHaleL17pg/7GychWHRKM9ak02Mmo737ehGFE?= =?us-ascii?Q?IAHcU38P9NOP+dv45CeFcFW1zf3pkc3l/zxzJLGbOeBopVc3e7R0otjdBvUI?= =?us-ascii?Q?yxLWL+KvX4PFUDNfEla936EENfYhIFgY71YnlldFos5S1UVrbE87nf7h4gmt?= =?us-ascii?Q?tyxzx2Zs5VzMBF/IxLN7C65poRx1Iq6fYBVHnTpcqQ0CAYprUeTjLqzOOZQl?= =?us-ascii?Q?f0WP6JLhIGy3zIK6ao3E2Sj7H7Bsc6efKJI8Z/ybNIyWFuqci+ACv/1KDak/?= =?us-ascii?Q?jgFl7UQlCEr1NEPr9N037JCa8abAFsmFqj93Dol5PubvKJAhbjjoNc2OwWbp?= =?us-ascii?Q?fCybjmSAaRCHDlGcLwyFxunaqw9DJ5xQUXKWdVtizo6kdCi4lI35XQ/BBgnJ?= =?us-ascii?Q?kbDmMsVx6Vp2URupmiLqSIc8Qztbg8AQfdwHRFejyTbQIfc5nN8257UbKZyG?= =?us-ascii?Q?l7V95UlpuzHpTl6iN7G9+MR+tsu5fAgJp14oINwQQPCMrFiPHSf8IilvMNEd?= =?us-ascii?Q?dbX+WuOVpS82cJ8HaAgmpwewkQTnG4FI0SOVgWSzqx9WUutoLVGy9BwaApkz?= =?us-ascii?Q?z2GATStgP75zVkIgZ5W6V3ysFTxd7/8tyYMKyXwkwDAlwRiQSSn4Pj0GzQBw?= =?us-ascii?Q?30TMc+VFsETsT+Ge7C+AhKhaNzTvJARFKntc6mKgKHgv4Yh0Gkuf56lTbQ4p?= =?us-ascii?Q?emBpGwKvCD/ew3gLN51J8snVl8WyU0lWNv4eUt9PN8cFW5XCfbWM0IQDO+LV?= =?us-ascii?Q?kSA5zKW/bSCAjWLT/Ug+0TH085Cf1DH9b6CPOuNTnhkg+XKEIfqLb711ZdbP?= =?us-ascii?Q?83W2mZ5SHccXAFSKtzfGjF2a1/V5aupvgHd5NBEHn/FZQYI8Xsaj/ii8W8nO?= =?us-ascii?Q?x9+vegg8OkfMcCKyH5wOuqnBThRnXd3J6n9MKFcIRoM6XSAOU2JV8venisC4?= =?us-ascii?Q?oq8kxNtN/P6nplIUxgjyMMerUpGBQrCHBNOVscKnrJOQGeKZGFu/2TFOwe8A?= =?us-ascii?Q?TexnU3yp76D7y7k3qRTfFmV4Ac9yO+5yCjF8+fHsm5VshuKjzVNM76fEm2ir?= =?us-ascii?Q?V9GyadWos/Y1bWDsUstniKpFXtUFv7A8BwCE9+tz3gkX70u+V5lwSTnyovOe?= =?us-ascii?Q?9ATCfaKkDxUfxoGApTU/On1a8LhUYiZG3FsKPGilAmuJR1hKxxRldMWn8Tyt?= =?us-ascii?Q?GDrEoCvwmYHRuTJpl67oobMQfeec+sD1LPXh1PoILFsNd9gJi2tIu9gTIezS?= =?us-ascii?Q?pqORcusu6PtzP6lYuOIEmaiZtChlz4dKiX68i870ZQDKcL2rEkgpiIXeHqwd?= =?us-ascii?Q?I3uPw=3D=3D?= X-Microsoft-Antispam-Message-Info: izfW+pAlV6kxCIWcb3h+gFKGLYyOAJcz0SO69ODxRql+9WUX2fxI2edJ1rS05XRDIZ3ur9dusHDc062A2KK0Zu3JB6QTZ5hPYLU8usnwbg8HL2bnTVSCT3WTiPw3bYckOMZabSbU+eXfC3BuRFtxLfWxQ2W+1eDSLVf4O460VAjEtPwc+Pxp0p3q+RGmyCZJ X-Microsoft-Exchange-Diagnostics: 1; BN6PR07MB3458; 6:69lQtaJJoosS+F+p/YL/4fUDGdSJj/Fk9z6/ckTV1OLkZATRMDAAcjzt3jhLxdsSeVTAHeQQGwAUOGIb2Q+wHuHJWoM2m+v7Qxvh38eiHQujaRMjDik4lnZzUNjZl2W1hevpc0AFYOV3RrRs8pRL/XY9ULdCG9P4+/je7M0cp1pNuuvNgE0KWBXRCQzJd4ou42BRDyIKrLdK8XdopPvLSs4JCifpBDYjw8ewNY2Lc2l32nuA7as298m2rFSwUBi1rWCNFCyANrzYr7Y68tTfluwBWmoto+NZbgSUbY5lWiuFLc5WtXeNxPXU7P0XVBEunuCC4eP7dGnAbfAf/5Y64cv52ipNggZP7PwX8FS9M9HSJO+UNxpwzxEZ5WVv26i/JcFk7VmlwVeSzVQmlkCNLt6Y5AJB+UDbx2W5V9FTm4CdLlbGVH2Kwjp/szLEh2W2QHu/GBQ/bbqeuA9wV2L9qA==; 5:LwjFzf6itPe0MLclOem1DpQllCn5uk2DbxhRUZMPLJSNuriQSgIVsBVe2ndHWwT9xxodG0aXam20EoFoH0dh7ZzbhCnmVnEloSUrt4eaVD+GMioOFALa2kIM9673qfWtYjGzcdlJzr/G44+UQ8uCLxHOq7IOnShZRYIyXTFxMrk=; 24:9WA2DYblBbrvaPwQF63OCoRHF607eFu2IZUI7Q+jiYRjVyX0kPLoB6jYTVH3bch5Yc5xllHa8HH7OSt9ibj6fCZeMbXumaK4l3MfV3LygEo= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BN6PR07MB3458; 7:bV7GFudR0RD85fpm2B5H71iDuK/qe/jZHrdhI7CSO544FRflR3FSre0zh+aVUivxtD12SA9AJqXddXPpYjdWgb+KLlzDjqzujyO6ZkkLJwQhAVjU+s7SjU6QPKyxF+kQuhGDvGg8xt2a7UQmG2VUw5OG+h5jP1DcBLedfTTq6zs8eKh9H9j1+8BLgK9vaHYkt7a1DcUdsP8FsQFVxl8RR+8hxVaEQrWvkL6iBV5Iu6B4qf1k2NVeqWWyPslfmPJn X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Apr 2018 11:53:59.2554 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 2caa611e-b0f5-4cb5-0b26-08d59aebebe4 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 711e4ccf-2e9b-4bcf-a551-4094005b6194 X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN6PR07MB3458 Subject: [dpdk-dev] [PATCH v3 2/4] app/eventdev: add burst mode for event timer adapter X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 05 Apr 2018 11:54:02 -0000 Add burst mode for event timer adapter that can be selected by passing --prod_type_timerdev_burst. Signed-off-by: Pavan Nikhilesh --- app/test-eventdev/evt_options.c | 13 +++++++ app/test-eventdev/evt_options.h | 8 ++++- app/test-eventdev/test_perf_common.c | 66 +++++++++++++++++++++++++++++++++++- 3 files changed, 85 insertions(+), 2 deletions(-) diff --git a/app/test-eventdev/evt_options.c b/app/test-eventdev/evt_options.c index 49cd9c419..05d6de88b 100644 --- a/app/test-eventdev/evt_options.c +++ b/app/test-eventdev/evt_options.c @@ -98,6 +98,15 @@ evt_parse_timer_prod_type(struct evt_options *opt, const char *arg __rte_unused) return 0; } +static int +evt_parse_timer_prod_type_burst(struct evt_options *opt, + const char *arg __rte_unused) +{ + opt->prod_type = EVT_PROD_TYPE_EVENT_TIMER_ADPTR; + opt->timdev_use_burst = 1; + return 0; +} + static int evt_parse_test_name(struct evt_options *opt, const char *arg) { @@ -185,6 +194,8 @@ usage(char *program) "\t--prod_type_timerdev : use event timer device as producer.\n" "\t x * bkt_tck_nsec would be the timeout\n" "\t in ns.\n" + "\t--prod_type_timerdev_burst : use timer device as producer\n" + "\t burst mode.\n" ); printf("available tests:\n"); evt_test_dump_names(); @@ -247,6 +258,7 @@ static struct option lgopts[] = { { EVT_QUEUE_PRIORITY, 0, 0, 0 }, { EVT_PROD_ETHDEV, 0, 0, 0 }, { EVT_PROD_TIMERDEV, 0, 0, 0 }, + { EVT_PROD_TIMERDEV_BURST, 0, 0, 0 }, { EVT_HELP, 0, 0, 0 }, { NULL, 0, 0, 0 } }; @@ -272,6 +284,7 @@ evt_opts_parse_long(int opt_idx, struct evt_options *opt) { EVT_QUEUE_PRIORITY, evt_parse_queue_priority}, { EVT_PROD_ETHDEV, evt_parse_eth_prod_type}, { EVT_PROD_TIMERDEV, evt_parse_timer_prod_type}, + { EVT_PROD_TIMERDEV_BURST, evt_parse_timer_prod_type_burst}, }; for (i = 0; i < RTE_DIM(parsermap); i++) { diff --git a/app/test-eventdev/evt_options.h b/app/test-eventdev/evt_options.h index 1fb340ac9..2884e0d91 100644 --- a/app/test-eventdev/evt_options.h +++ b/app/test-eventdev/evt_options.h @@ -33,6 +33,7 @@ #define EVT_QUEUE_PRIORITY ("queue_priority") #define EVT_PROD_ETHDEV ("prod_type_ethdev") #define EVT_PROD_TIMERDEV ("prod_type_timerdev") +#define EVT_PROD_TIMERDEV_BURST ("prod_type_timerdev_burst") #define EVT_HELP ("help") enum evt_prod_type { @@ -66,6 +67,7 @@ struct evt_options { uint32_t fwd_latency:1; uint32_t q_priority:1; enum evt_prod_type prod_type; + uint8_t timdev_use_burst; uint8_t timdev_cnt; }; @@ -275,7 +277,11 @@ evt_dump_producer_type(struct evt_options *opt) evt_dump("nb_ethdev", "%d", rte_eth_dev_count()); break; case EVT_PROD_TYPE_EVENT_TIMER_ADPTR: - snprintf(name, EVT_PROD_MAX_NAME_LEN, + if (opt->timdev_use_burst) + snprintf(name, EVT_PROD_MAX_NAME_LEN, + "Event timer adapter burst mode producer"); + else + snprintf(name, EVT_PROD_MAX_NAME_LEN, "Event timer adapter producer"); evt_dump("nb_timer_adapters", "%d", opt->nb_timer_adptrs); evt_dump("max_tmo_nsec", "%"PRIu64"", opt->max_tmo_nsec); diff --git a/app/test-eventdev/test_perf_common.c b/app/test-eventdev/test_perf_common.c index 39072eb5d..6d0db1dc5 100644 --- a/app/test-eventdev/test_perf_common.c +++ b/app/test-eventdev/test_perf_common.c @@ -132,6 +132,66 @@ perf_event_timer_producer(void *arg) return 0; } +static inline int +perf_event_timer_producer_burst(void *arg) +{ + int i; + struct prod_data *p = arg; + struct test_perf *t = p->t; + struct evt_options *opt = t->opt; + uint32_t flow_counter = 0; + uint64_t count = 0; + uint64_t arm_latency = 0; + const uint8_t nb_timer_adptrs = opt->nb_timer_adptrs; + const uint32_t nb_flows = t->nb_flows; + const uint64_t nb_timers = opt->nb_timers; + struct rte_mempool *pool = t->pool; + struct perf_elt *m[BURST_SIZE + 1] = {NULL}; + struct rte_event_timer_adapter **adptr = t->timer_adptr; + uint64_t timeout_ticks = opt->optm_bkt_tck_nsec ? + (opt->nb_bkt_tcks * opt->bkt_tck_nsec) + / opt->optm_bkt_tck_nsec : opt->nb_bkt_tcks; + + timeout_ticks += timeout_ticks ? 0 : 1; + const struct rte_event_timer tim = { + .ev.op = RTE_EVENT_OP_NEW, + .ev.queue_id = p->queue_id, + .ev.sched_type = t->opt->sched_type_list[0], + .ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL, + .ev.event_type = RTE_EVENT_TYPE_TIMER, + .state = RTE_EVENT_TIMER_NOT_ARMED, + .timeout_ticks = timeout_ticks, + }; + + if (opt->verbose_level > 1) + printf("%s(): lcore %d\n", __func__, rte_lcore_id()); + + while (count < nb_timers && t->done == false) { + if (rte_mempool_get_bulk(pool, (void **)m, BURST_SIZE) < 0) + continue; + for (i = 0; i < BURST_SIZE; i++) { + rte_prefetch0(m[i + 1]); + m[i]->tim = tim; + m[i]->tim.ev.flow_id = flow_counter++ % nb_flows; + m[i]->tim.ev.event_ptr = m[i]; + m[i]->timestamp = rte_get_timer_cycles(); + } + rte_event_timer_arm_tmo_tick_burst( + adptr[flow_counter % nb_timer_adptrs], + (struct rte_event_timer **)m, + tim.timeout_ticks, + BURST_SIZE); + arm_latency += rte_get_timer_cycles() - m[i - 1]->timestamp; + count += BURST_SIZE; + } + fflush(stdout); + rte_delay_ms(1000); + printf("%s(): lcore %d Average event timer arm latency = %.3f us\n", + __func__, rte_lcore_id(), (float)(arm_latency / count) / + (rte_get_timer_hz() / 1000000)); + return 0; +} + static int perf_producer_wrapper(void *arg) { @@ -140,8 +200,12 @@ perf_producer_wrapper(void *arg) /* Launch the producer function only in case of synthetic producer. */ if (t->opt->prod_type == EVT_PROD_TYPE_SYNT) return perf_producer(arg); - else if (t->opt->prod_type == EVT_PROD_TYPE_EVENT_TIMER_ADPTR) + else if (t->opt->prod_type == EVT_PROD_TYPE_EVENT_TIMER_ADPTR && + !t->opt->timdev_use_burst) return perf_event_timer_producer(arg); + else if (t->opt->prod_type == EVT_PROD_TYPE_EVENT_TIMER_ADPTR && + t->opt->timdev_use_burst) + return perf_event_timer_producer_burst(arg); return 0; } -- 2.16.2