From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id D76C3A0350; Fri, 29 May 2020 15:20:15 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id EF7FB1DA97; Fri, 29 May 2020 15:20:14 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id EA0D31DA93 for ; Fri, 29 May 2020 15:20:13 +0200 (CEST) Received: from pps.filterd (m0045851.ppops.net [127.0.0.1]) by mx0b-0016f401.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 04TDEc6e016019; Fri, 29 May 2020 06:20:13 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=date : from : to : cc : subject : message-id : references : content-type : in-reply-to : mime-version; s=pfpt0818; bh=79+bVcLXbv0IDC9a6pR+vP+IXt0sWHlfLOhYUTqCCvI=; b=mzgbZysdWell9ifkOm3koM5BTorpqiYglCGbOfKAeMWHxItm+Y8A5ffXEzTZ7BY4YW4y WfH0velT7Ca8i0dpqmY+GVDrlEJgmbuFHXqt+vVMipcWMg6knIbZ1e5JL5wsPHivELHD wZwohodJFVtg1ZvQaRjacotvx9Iv53CwfPIgHYYs5csjids1WRF9l8YjjUL2ZtXz0/xR UzD4+JM4iQGXghFvorwZB47yh1G9n6LplPiDrfpRZ3iywZOMofmJ7lIIHGmR6f+EnZ4X gbkXtWdhX0QFZKzXzAxOgojjRCmMFXPyTuzuQBxyuMXTMadeGU3QimwzanhoaxPH0z3M tg== Received: from sc-exch02.marvell.com ([199.233.58.182]) by mx0b-0016f401.pphosted.com with ESMTP id 3173bp6ncs-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Fri, 29 May 2020 06:20:12 -0700 Received: from SC-EXCH04.marvell.com (10.93.176.84) by SC-EXCH02.marvell.com (10.93.176.82) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Fri, 29 May 2020 06:20:11 -0700 Received: from NAM11-BN8-obe.outbound.protection.outlook.com (104.47.58.176) by SC-EXCH04.marvell.com (10.93.176.84) with Microsoft SMTP Server (TLS) id 15.0.1497.2 via Frontend Transport; Fri, 29 May 2020 06:20:11 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=L3DdX5EybqVUoBxBpvOmVbNuEEXP56NClOjIrji7e9yjomEy/H3LE/SmhKdx7ndThXYGJ8KmpvKc0O5pRaNtCGq/RYrsIw/CXK9dpLxaE0aPgmBUbWk/OtLkC/6/aUTYN9SWhUXnsM6YIqq66GWg9nXTRVOviEPc+t7cVMEMfADXkkOg2otx35sMw0S8x7kLaKkc9wfGCnMJX8bxkSX6xeDY1ilkPKVzAMOhpQrc2bi2zGjocFVS9Dvc8PrwoCVjpfT2V4WLsUSV5y+sKgedNYncmG1Cc2VxB+jaq9c4ysAyDa6wxs8oBPVZvMxobvwFcVNOWNS8LkgidGjtnPetkw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=79+bVcLXbv0IDC9a6pR+vP+IXt0sWHlfLOhYUTqCCvI=; b=Y72IExMRlLiObYrpgfPR0zV9XY6uNx7AtuYBmG/mHtrHVUAWTenGHC8Uo9s+04po2tZjIYyT7pH++CQ1xYYoRYxqRUYpPQvjPZldVdOKYmvn+lAQ0t+Vsv57BoXu0CJudTz0UBvpk5HKvj8RhAj2APp75J486bAR9VEGXIuIsI0swCKpBIe52p4kHBwGhyurJSL3CjMwsluFwwQj6HHtKx3G6iIhEogP2Qiyzz/ANRemRNhdObPsg1v7a1mtp+DGFbeN0qViUGxCkinb6v97rHrH2GeWsn5CR85LvewbosIfFIVpiOw1CsjqT+qUOyfjYyWipa11SToXjW5RY3LPLQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=marvell.com; dmarc=pass action=none header.from=marvell.com; dkim=pass header.d=marvell.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.onmicrosoft.com; s=selector1-marvell-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=79+bVcLXbv0IDC9a6pR+vP+IXt0sWHlfLOhYUTqCCvI=; b=oaSUL5pR4lHQHp1RHh1P97fY8PNLBca8Bfg20izHVR2q+D6X53K+M7CiHKIoZHASV4zATP+4y5Xq5kfYQH6lshZfYMoKBRyJ0q/CARVMqNaZNFZE5b4lBXiARN/hTOgGq0xPDT+1sd0cul3Hcw2LXAj4BxKWKY/NP4ocHMxY+ug= Authentication-Results: intel.com; dkim=none (message not signed) header.d=none;intel.com; dmarc=none action=none header.from=marvell.com; Received: from MN2PR18MB2848.namprd18.prod.outlook.com (2603:10b6:208:38::19) by MN2PR18MB3294.namprd18.prod.outlook.com (2603:10b6:208:162::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3045.19; Fri, 29 May 2020 13:20:09 +0000 Received: from MN2PR18MB2848.namprd18.prod.outlook.com ([fe80::a8b1:45c4:b84:9c02]) by MN2PR18MB2848.namprd18.prod.outlook.com ([fe80::a8b1:45c4:b84:9c02%7]) with mapi id 15.20.3021.030; Fri, 29 May 2020 13:20:09 +0000 Date: Fri, 29 May 2020 18:49:56 +0530 From: Harman Kalra To: Anatoly Burakov CC: , David Hunt , , Message-ID: <20200529131955.GA83122@outlook.office365.com> References: Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.10.0 (2018-05-17) X-ClientProxiedBy: BMXPR01CA0038.INDPRD01.PROD.OUTLOOK.COM (2603:1096:b00:c::24) To MN2PR18MB2848.namprd18.prod.outlook.com (2603:10b6:208:38::19) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from outlook.office365.com (115.113.156.2) by BMXPR01CA0038.INDPRD01.PROD.OUTLOOK.COM (2603:1096:b00:c::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3045.19 via Frontend Transport; Fri, 29 May 2020 13:20:07 +0000 X-Originating-IP: [115.113.156.2] X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 059b9b9a-e33d-4cf6-38d8-08d803d30296 X-MS-TrafficTypeDiagnostic: MN2PR18MB3294: X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:8882; X-Forefront-PRVS: 04180B6720 X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: OpnNQYZo0j5DHWapj5SOuYMNddhoTVU4gF3KnKt2D9wdNZaz2kT8tTPcvQ4l1LmCnL7v60zmORNfT/xheZcbUBEdxfIy/QXpFFMN7XWfAf06LLngMKh7zuO00WLie5QkJicR0RMGkecRqHW9TLLQ36D06uRiCN1ATbizYXjA+y3NHq3d1tNZUHRVrS/ARcfVnS5wokb1XO+5HrvTEFZBdGKsG/ALtI4yZVMz1L7oZLuMOWgH5UEM3UM24grhU6Gf6lFk4i4WzJYK5PlJONKJdcBW/0iW5lSlB+1J+Guaylu2zlA2/nxnY7hTDkJwdgT8kwuP1YEGKlxwiHvlvdTWYFIIA95cHUcwfWBKPH27UfQJ9F09/cJIy9IMtGmAXDiP X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:MN2PR18MB2848.namprd18.prod.outlook.com; PTR:; CAT:NONE; SFTY:; SFS:(4636009)(376002)(366004)(346002)(136003)(39860400002)(396003)(30864003)(1076003)(478600001)(66556008)(5660300002)(186003)(66946007)(66476007)(16526019)(33656002)(4326008)(9686003)(8676002)(2906002)(55016002)(956004)(6666004)(316002)(8936002)(7696005)(26005)(86362001)(6506007)(52116002)(83380400001)(55236004)(6916009)(32563001); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData: Dwg4Ue/9pY4FHbCsm+EaXgRoDRiXvmoO4WBMFYOnEMXJ8PAgaLMDtwOEzMMUfPv5PuQSnarOO6QaJ2VlrloOXNNBfZJ4OYY5ajON77ewLYPj3pg+k4kMF8XxzKvnGLOLo6eNMyQ2QP2ud/dxas9UEhAlGIYMBm8bZEJ/lgwAfPT0a3jHQlcciJomi4qj4Xo/v7ajHuAWCRpB7uT3ic2jxILNaa9h9ruDUeciEK1ZAA5Strs1EnxJjCLD8Qrr9AGHMdtp597IJKa4qaSrrLYw3TUT7P/lEFuA2aqF+K8bAWZLG25ulPBo70+d89ulmlCgnzmiw5xaUDgvnBZi9K9TlagIUOuA1SCeASr7INT+TUps84jIgato3+URY7VGO3IllsUuqRYaLkHZOltEC01mp+AbS0b1dPwsztaLMhkePmD4130DsqQ2W1UHovrx5vNKaiuVPJWz98A98A8+nbz7TOa/zVnFbcDF4tEFXxGv9zI= X-MS-Exchange-CrossTenant-Network-Message-Id: 059b9b9a-e33d-4cf6-38d8-08d803d30296 X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 May 2020 13:20:09.3904 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 70e1fb47-1155-421d-87fc-2e58f638b6e0 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: jIOUG/UE2QR+LTFdj69fnLJbwFacQPzSRRxNkuiSHDSAR09NYYxMzY9KGx7GQvRSKFKPH1VsYpTvtcuVjgnNdA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN2PR18MB3294 X-OriginatorOrg: marvell.com X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.216, 18.0.687 definitions=2020-05-29_07:2020-05-28, 2020-05-29 signatures=0 Subject: Re: [dpdk-dev] [PATCH 3/3] l3fwd-power: add interrupt-only mode 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" On Thu, May 28, 2020 at 10:13:51AM +0100, Anatoly Burakov wrote: > In addition to existing modes, add a mode which is very similar to > legacy mode, but does not do frequency scaling, and thus does not > depend on the power library. > > Signed-off-by: Anatoly Burakov > --- > examples/l3fwd-power/main.c | 215 +++++++++++++++++++++++++++++++++--- > 1 file changed, 202 insertions(+), 13 deletions(-) > > diff --git a/examples/l3fwd-power/main.c b/examples/l3fwd-power/main.c > index 5cee9d5387..4161e01974 100644 > --- a/examples/l3fwd-power/main.c > +++ b/examples/l3fwd-power/main.c > @@ -195,9 +195,11 @@ static int parse_ptype; /**< Parse packet type using rx callback, and */ > /**< disabled by default */ > > enum appmode { > - APP_MODE_LEGACY = 0, > + APP_MODE_DEFAULT = 0, > + APP_MODE_LEGACY, > APP_MODE_EMPTY_POLL, > - APP_MODE_TELEMETRY > + APP_MODE_TELEMETRY, > + APP_MODE_INTERRUPT > }; > > enum appmode app_mode; > @@ -900,6 +902,170 @@ static int event_register(struct lcore_conf *qconf) > > return 0; > } > + > +/* main processing loop */ > +static int main_intr_loop(__rte_unused void *dummy) > +{ > + struct rte_mbuf *pkts_burst[MAX_PKT_BURST]; > + unsigned int lcore_id; > + uint64_t prev_tsc, diff_tsc, cur_tsc; > + int i, j, nb_rx; > + uint8_t queueid; > + uint16_t portid; > + struct lcore_conf *qconf; > + struct lcore_rx_queue *rx_queue; > + uint32_t lcore_rx_idle_count = 0; > + uint32_t lcore_idle_hint = 0; > + int intr_en = 0; > + > + const uint64_t drain_tsc = (rte_get_tsc_hz() + US_PER_S - 1) / > + US_PER_S * BURST_TX_DRAIN_US; > + > + prev_tsc = 0; > + > + lcore_id = rte_lcore_id(); > + qconf = &lcore_conf[lcore_id]; > + > + if (qconf->n_rx_queue == 0) { > + RTE_LOG(INFO, L3FWD_POWER, "lcore %u has nothing to do\n", > + lcore_id); > + return 0; > + } > + > + RTE_LOG(INFO, L3FWD_POWER, "entering main interrupt loop on lcore %u\n", > + lcore_id); > + > + for (i = 0; i < qconf->n_rx_queue; i++) { > + portid = qconf->rx_queue_list[i].port_id; > + queueid = qconf->rx_queue_list[i].queue_id; > + RTE_LOG(INFO, L3FWD_POWER, > + " -- lcoreid=%u portid=%u rxqueueid=%hhu\n", > + lcore_id, portid, queueid); > + } > + > + /* add into event wait list */ > + if (event_register(qconf) == 0) > + intr_en = 1; > + else > + RTE_LOG(INFO, L3FWD_POWER, "RX interrupt won't enable.\n"); > + > + while (!is_done()) { > + stats[lcore_id].nb_iteration_looped++; > + > + cur_tsc = rte_rdtsc(); > + > + /* > + * TX burst queue drain > + */ > + diff_tsc = cur_tsc - prev_tsc; > + if (unlikely(diff_tsc > drain_tsc)) { > + for (i = 0; i < qconf->n_tx_port; ++i) { > + portid = qconf->tx_port_id[i]; > + rte_eth_tx_buffer_flush(portid, > + qconf->tx_queue_id[portid], > + qconf->tx_buffer[portid]); > + } > + prev_tsc = cur_tsc; > + } > + > +start_rx: > + /* > + * Read packet from RX queues > + */ > + lcore_rx_idle_count = 0; > + for (i = 0; i < qconf->n_rx_queue; ++i) { > + rx_queue = &(qconf->rx_queue_list[i]); > + rx_queue->idle_hint = 0; > + portid = rx_queue->port_id; > + queueid = rx_queue->queue_id; > + > + nb_rx = rte_eth_rx_burst(portid, queueid, pkts_burst, > + MAX_PKT_BURST); > + > + stats[lcore_id].nb_rx_processed += nb_rx; > + if (unlikely(nb_rx == 0)) { > + /** > + * no packet received from rx queue, try to > + * sleep for a while forcing CPU enter deeper > + * C states. > + */ > + rx_queue->zero_rx_packet_count++; > + > + if (rx_queue->zero_rx_packet_count <= > + MIN_ZERO_POLL_COUNT) > + continue; > + > + rx_queue->idle_hint = power_idle_heuristic( > + rx_queue->zero_rx_packet_count); > + lcore_rx_idle_count++; > + } else { > + rx_queue->zero_rx_packet_count = 0; > + } > + > + /* Prefetch first packets */ > + for (j = 0; j < PREFETCH_OFFSET && j < nb_rx; j++) { > + rte_prefetch0(rte_pktmbuf_mtod( > + pkts_burst[j], void *)); > + } > + > + /* Prefetch and forward already prefetched packets */ > + for (j = 0; j < (nb_rx - PREFETCH_OFFSET); j++) { > + rte_prefetch0(rte_pktmbuf_mtod( > + pkts_burst[j + PREFETCH_OFFSET], > + void *)); > + l3fwd_simple_forward( > + pkts_burst[j], portid, qconf); > + } > + > + /* Forward remaining prefetched packets */ > + for (; j < nb_rx; j++) { > + l3fwd_simple_forward( > + pkts_burst[j], portid, qconf); > + } > + } > + > + if (unlikely(lcore_rx_idle_count == qconf->n_rx_queue)) { > + /** > + * All Rx queues empty in recent consecutive polls, > + * sleep in a conservative manner, meaning sleep as > + * less as possible. > + */ > + for (i = 1, > + lcore_idle_hint = qconf->rx_queue_list[0].idle_hint; > + i < qconf->n_rx_queue; ++i) { > + rx_queue = &(qconf->rx_queue_list[i]); > + if (rx_queue->idle_hint < lcore_idle_hint) > + lcore_idle_hint = rx_queue->idle_hint; > + } > + > + if (lcore_idle_hint < SUSPEND_THRESHOLD) > + /** > + * execute "pause" instruction to avoid context > + * switch which generally take hundred of > + * microseconds for short sleep. > + */ > + rte_delay_us(lcore_idle_hint); > + else { > + /* suspend until rx interrupt triggers */ > + if (intr_en) { > + turn_on_off_intr(qconf, 1); > + sleep_until_rx_interrupt( > + qconf->n_rx_queue); > + turn_on_off_intr(qconf, 0); > + /** > + * start receiving packets immediately > + */ > + if (likely(!is_done())) > + goto start_rx; > + } > + } > + stats[lcore_id].sleep_time += lcore_idle_hint; > + } > + } > + > + return 0; > +} > + > /* main processing loop */ > static int > main_telemetry_loop(__rte_unused void *dummy) > @@ -1126,7 +1292,7 @@ main_empty_poll_loop(__rte_unused void *dummy) > } > /* main processing loop */ > static int > -main_loop(__rte_unused void *dummy) > +main_legacy_loop(__rte_unused void *dummy) > { > struct rte_mbuf *pkts_burst[MAX_PKT_BURST]; > unsigned lcore_id; > @@ -1438,7 +1604,8 @@ print_usage(const char *prgname) > " --empty-poll: enable empty poll detection" > " follow (training_flag, high_threshold, med_threshold)\n" > " --telemetry: enable telemetry mode, to update" > - " empty polls, full polls, and core busyness to telemetry\n", > + " empty polls, full polls, and core busyness to telemetry\n" > + " --interrupt-only: enable interrupt-only mode\n", > prgname); > } > > @@ -1582,6 +1749,7 @@ parse_ep_config(const char *q_arg) > } > #define CMD_LINE_OPT_PARSE_PTYPE "parse-ptype" > #define CMD_LINE_OPT_TELEMETRY "telemetry" > +#define CMD_LINE_OPT_INTERRUPT_ONLY "interrupt-only" > > /* Parse the argument given in the command line of the application */ > static int > @@ -1601,6 +1769,7 @@ parse_args(int argc, char **argv) > {"empty-poll", 1, 0, 0}, > {CMD_LINE_OPT_PARSE_PTYPE, 0, 0, 0}, > {CMD_LINE_OPT_TELEMETRY, 0, 0, 0}, > + {CMD_LINE_OPT_INTERRUPT_ONLY, 0, 0, 0}, > {NULL, 0, 0, 0} > }; > > @@ -1674,8 +1843,8 @@ parse_args(int argc, char **argv) > > if (!strncmp(lgopts[option_index].name, > "empty-poll", 10)) { > - if (app_mode == APP_MODE_TELEMETRY) { > - printf(" empty-poll cannot be enabled as telemetry mode is enabled\n"); > + if (app_mode != APP_MODE_DEFAULT) { > + printf(" empty-poll mode is mutually exclusive with other modes\n"); > return -1; > } > app_mode = APP_MODE_EMPTY_POLL; > @@ -1692,14 +1861,25 @@ parse_args(int argc, char **argv) > if (!strncmp(lgopts[option_index].name, > CMD_LINE_OPT_TELEMETRY, > sizeof(CMD_LINE_OPT_TELEMETRY))) { > - if (app_mode == APP_MODE_EMPTY_POLL) { > - printf("telemetry mode cannot be enabled as empty poll mode is enabled\n"); > + if (app_mode != APP_MODE_DEFAULT) { > + printf(" telemetry mode is mutually exclusive with other modes\n"); > return -1; > } > app_mode = APP_MODE_TELEMETRY; > printf("telemetry mode is enabled\n"); > } > > + if (!strncmp(lgopts[option_index].name, > + CMD_LINE_OPT_INTERRUPT_ONLY, > + sizeof(CMD_LINE_OPT_INTERRUPT_ONLY))) { > + if (app_mode != APP_MODE_DEFAULT) { > + printf(" interrupt-only mode is mutually exclusive with other modes\n"); > + return -1; > + } > + app_mode = APP_MODE_INTERRUPT; > + printf("interrupt-only mode is enabled\n"); > + } > + > if (!strncmp(lgopts[option_index].name, > "enable-jumbo", 12)) { > struct option lenopts = > @@ -2253,7 +2433,12 @@ main(int argc, char **argv) > if (ret < 0) > rte_exit(EXIT_FAILURE, "Invalid L3FWD parameters\n"); > > - if (app_mode != APP_MODE_TELEMETRY && init_power_library()) > + if (app_mode == APP_MODE_DEFAULT) > + app_mode = APP_MODE_LEGACY; > + > + /* only legacy and empty poll mode rely on power library */ > + if ((app_mode == APP_MODE_LEGACY || app_mode == APP_MODE_EMPTY_POLL) && > + init_power_library()) > rte_exit(EXIT_FAILURE, "init_power_library failed\n"); > Hi, Rather than just exiting from here can we have a else condition to automatically enter into the "interrupt only" mode. Please correct me if I am missing something. Thanks Harman > if (update_lcore_params() < 0) > @@ -2277,7 +2462,8 @@ main(int argc, char **argv) > RTE_ETH_FOREACH_DEV(portid) { > struct rte_eth_conf local_port_conf = port_conf; > /* not all app modes need interrupts */ > - bool need_intr = app_mode == APP_MODE_LEGACY; > + bool need_intr = app_mode == APP_MODE_LEGACY || > + app_mode == APP_MODE_INTERRUPT; > > /* skip ports that are not enabled */ > if ((enabled_port_mask & (1 << portid)) == 0) { > @@ -2526,12 +2712,12 @@ main(int argc, char **argv) > > /* launch per-lcore init on every lcore */ > if (app_mode == APP_MODE_LEGACY) { > - rte_eal_mp_remote_launch(main_loop, NULL, CALL_MASTER); > + rte_eal_mp_remote_launch(main_legacy_loop, NULL, CALL_MASTER); > } else if (app_mode == APP_MODE_EMPTY_POLL) { > empty_poll_stop = false; > rte_eal_mp_remote_launch(main_empty_poll_loop, NULL, > SKIP_MASTER); > - } else { > + } else if (app_mode == APP_MODE_TELEMETRY) { > unsigned int i; > > /* Init metrics library */ > @@ -2555,6 +2741,8 @@ main(int argc, char **argv) > "Returns global power stats. Parameters: None"); > rte_eal_mp_remote_launch(main_telemetry_loop, NULL, > SKIP_MASTER); > + } else if (app_mode == APP_MODE_INTERRUPT) { > + rte_eal_mp_remote_launch(main_intr_loop, NULL, CALL_MASTER); > } > > if (app_mode == APP_MODE_EMPTY_POLL || app_mode == APP_MODE_TELEMETRY) > @@ -2577,7 +2765,8 @@ main(int argc, char **argv) > if (app_mode == APP_MODE_EMPTY_POLL) > rte_power_empty_poll_stat_free(); > > - if (app_mode != APP_MODE_TELEMETRY && deinit_power_library()) > + if ((app_mode == APP_MODE_LEGACY || app_mode == APP_MODE_EMPTY_POLL) && > + deinit_power_library()) > rte_exit(EXIT_FAILURE, "deinit_power_library failed\n"); > > if (rte_eal_cleanup() < 0) > -- > 2.17.1