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 3CD09A04F3; Fri, 3 Jan 2020 13:49:20 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 9D8661D181; Fri, 3 Jan 2020 13:49:19 +0100 (CET) Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by dpdk.org (Postfix) with ESMTP id C4D251D17C for ; Fri, 3 Jan 2020 13:49:17 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 03 Jan 2020 04:49:16 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,390,1571727600"; d="scan'208";a="216765776" Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by fmsmga008.fm.intel.com with ESMTP; 03 Jan 2020 04:49:16 -0800 Received: from fmsmsx157.amr.corp.intel.com (10.18.116.73) by FMSMSX105.amr.corp.intel.com (10.18.124.203) with Microsoft SMTP Server (TLS) id 14.3.439.0; Fri, 3 Jan 2020 04:49:16 -0800 Received: from FMSEDG001.ED.cps.intel.com (10.1.192.133) by FMSMSX157.amr.corp.intel.com (10.18.116.73) with Microsoft SMTP Server (TLS) id 14.3.439.0; Fri, 3 Jan 2020 04:49:15 -0800 Received: from NAM12-DM6-obe.outbound.protection.outlook.com (104.47.59.176) by edgegateway.intel.com (192.55.55.68) with Microsoft SMTP Server (TLS) id 14.3.439.0; Fri, 3 Jan 2020 04:49:15 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=fqXyaQ6FeipwVAAHSU3LrDNOzcDRLPuD4t+jxiKwRiP6jMEDPsbKVN/wICE1fRODZd9aurQ0EFxWg36i8z3Vu9k5tm5te1IAcKst/8aw2Wc2R8XOjF+bVG88kQgEPL4XOisY6u24QuvCf+eym1J5WELtCb48ow+4ytXqvDRyAGWqhYN/FMWKlr+iPwVdxKn1cYnh3jyFOApvedtAELkDUHcvRVkKM3jbeMi6kAbhz/MzzGAMOBRGQ8DViTDjoZx/KlqWJeiz4eL73i4iQVj9u4aCRL4w4LJxz60a2wSeUH6FEYjyGa7mwXSBkhu2nWdOfCE1HMo77D04rZjUZOOuDg== 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=P9CP3rUJan7CL7Ok9UzrubuVqaKtl3RI/ZYM07xoN6Q=; b=W/ZqQAriW/nLFVNS5MMFp0HzSNLz7EUzRzQf0UTTsntZ9Mj8DDfZAE0v/r6aB40RwNjRZOkAHnh0lr6pIe33v1P5a5hodCe2wfqbP3NfOEYnkB48m56sNPpqWXGnx7L5kwMhzpiBKXzNEAwi6Dcu1rNzOPKJfHLxlBbOFT5ckRX11aawwv4V6qcjvvFd/92tpwFiVKjzpJ8LYHRN2TqUZEbZh7b966bPiB6oqXUR2HxwfET22ZXtgG8z4thO/P0bdgD8k1XJpERT1iGjbGyiGDRmeWq6dAy1hkGJfmjxmZmChrHf6VFEIadJtgnkau+gaC0wasbhmai73LYCEhPdcA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel.onmicrosoft.com; s=selector2-intel-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=P9CP3rUJan7CL7Ok9UzrubuVqaKtl3RI/ZYM07xoN6Q=; b=yC/u1RJGXbCTGcWCbo4KfltYjaJ92c05S03bNluUPhkZ2DC10yEyjuKz8wc5LMac91poVo/i4uzZE6O96Raf/QnH2M5gjG8YzERpB21Y9r4yVUThSHqKubHQioxg7CT3r71Cwo7nJFLDREo1AtP2OmUOa54oaVRNbhU6C+ZpaIk= Received: from SN6PR11MB2558.namprd11.prod.outlook.com (52.135.94.19) by SN6PR11MB2541.namprd11.prod.outlook.com (52.135.91.28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2602.11; Fri, 3 Jan 2020 12:49:13 +0000 Received: from SN6PR11MB2558.namprd11.prod.outlook.com ([fe80::4d86:362a:13c3:8386]) by SN6PR11MB2558.namprd11.prod.outlook.com ([fe80::4d86:362a:13c3:8386%7]) with mapi id 15.20.2602.012; Fri, 3 Jan 2020 12:49:13 +0000 From: "Ananyev, Konstantin" To: "pbhagavatula@marvell.com" , "jerinj@marvell.com" , "Kovacevic, Marko" , Ori Kam , "Richardson, Bruce" , "Nicolau, Radu" , Akhil Goyal , "Kantecki, Tomasz" , Sunil Kumar Kori CC: "dev@dpdk.org" Thread-Topic: [dpdk-dev] [PATCH v2 01/11] examples/l3fwd: add framework for event device Thread-Index: AQHVqrFyV9/tRySbxki5txAAEqnJT6fZD6/g Date: Fri, 3 Jan 2020 12:49:13 +0000 Message-ID: References: <20191204144345.5736-1-pbhagavatula@marvell.com> <20191204144345.5736-2-pbhagavatula@marvell.com> In-Reply-To: <20191204144345.5736-2-pbhagavatula@marvell.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiNDIwYWU4ZjktMDc5Mi00MmY5LTlmZmItNjNjZjFmMDhkYjQ1IiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoiODhsZm91dEdQaVlwQWkrQXMxNTIzRUxsUmhYOTN4ZzJ6Ung3clRnSlJVYlpaTVptNDZiNG5ZOVNQamRUc2FKVSJ9 dlp-product: dlpe-windows dlp-reaction: no-action dlp-version: 11.2.0.6 x-ctpclassification: CTP_NT authentication-results: spf=none (sender IP is ) smtp.mailfrom=konstantin.ananyev@intel.com; x-originating-ip: [192.198.151.189] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: c7f2793a-4f77-40d9-d88f-08d7904b55ca x-ms-traffictypediagnostic: SN6PR11MB2541: x-ld-processed: 46c98d88-e344-4ed4-8496-4ed7712e255d,ExtAddr x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:8882; x-forefront-prvs: 0271483E06 x-forefront-antispam-report: SFV:NSPM; SFS:(10019020)(136003)(366004)(346002)(39860400002)(376002)(396003)(189003)(199004)(110136005)(9686003)(55016002)(316002)(2906002)(86362001)(71200400001)(5660300002)(52536014)(4326008)(186003)(8936002)(81156014)(81166006)(26005)(478600001)(76116006)(7696005)(66946007)(64756008)(66476007)(66446008)(33656002)(6506007)(66556008)(921003)(1121003); DIR:OUT; SFP:1102; SCL:1; SRVR:SN6PR11MB2541; H:SN6PR11MB2558.namprd11.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: Gx+pYYRtsCMetSPRWIAzmLFHcfnXZQK84gnS1QAnZwRX0ab135DJxwZkqUNDpLxxwioxqZKpzH8U0i3PMoguwVy8e/hBykeb3SV873NqwGGBxjCgcmh05qthc8fPxQ0XKf1eJmK9YyA6kkXSzd07MboiyZDvycc5ZWbT6QMC2Zjme2OM0jRgFodlh4iKsERHy/rzuYqgGb9v2s6FC+tJ6Odv8qEcyQapz9ObsfciTsuRxJu1+cKjF5AgdpMgIkKw64zafqPPnucOqB2Wt7YAkzWWe/nUUfUONtSWofnf3rkbTtLUQnKA6gov7cicWIFckcXnWY5YNW6Q9m/gguHoqivYbtAgMzvuzF2MeHb1b0BW2bnrxw9cwP65JZ3x5BQh/tV0ODrFy+aaDoSRtqHZVA8EnNaJH/n3VeQKieuOJckcfJRv4sv2dfUVxsPh/F9T6jB8GzjYFti2IlEoeJzA1u9NHfavjplWkk6qibnWVe5AI1W6p9+Bg5jfaqIuVU7e Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-MS-Exchange-CrossTenant-Network-Message-Id: c7f2793a-4f77-40d9-d88f-08d7904b55ca X-MS-Exchange-CrossTenant-originalarrivaltime: 03 Jan 2020 12:49:13.0819 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: n43ewT1qoyKbQc7kOG5v0CuWDbH9vXkvsvL1SylfRv5FPr0mwXmuMQza6CCZUKCKg3uAg+1gj9jHAN6OLGHyYlo8CIfartjlK/DUSStpZgw= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN6PR11MB2541 X-OriginatorOrg: intel.com Subject: Re: [dpdk-dev] [PATCH v2 01/11] examples/l3fwd: add framework for event device 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" > Add framework to enable event device as a producer of packets. > To switch between event mode and poll mode the following options > have been added: > `--mode=3D"eventdev"` or `--mode=3D"poll"` > Also, allow the user to select the schedule type to be either > RTE_SCHED_TYPE_ORDERED, RTE_SCHED_TYPE_ATOMIC or RTE_SCHED_TYPE_PARALLEL > through: > `--eventq-sched=3D"ordered"` or `--eventq-sched=3D"atomic"` or > `--eventq-sched=3D"parallel"` >=20 > Poll mode is still the default operation mode. >=20 > Signed-off-by: Sunil Kumar Kori > --- > examples/l3fwd/Makefile | 2 +- > examples/l3fwd/l3fwd.h | 6 +++ > examples/l3fwd/l3fwd_event.c | 75 ++++++++++++++++++++++++++++++++++++ > examples/l3fwd/l3fwd_event.h | 54 ++++++++++++++++++++++++++ > examples/l3fwd/main.c | 41 +++++++++++++++++--- > examples/l3fwd/meson.build | 4 +- > 6 files changed, 174 insertions(+), 8 deletions(-) > create mode 100644 examples/l3fwd/l3fwd_event.c > create mode 100644 examples/l3fwd/l3fwd_event.h >=20 > diff --git a/examples/l3fwd/Makefile b/examples/l3fwd/Makefile > index b2dbf2607..c892b867b 100644 > --- a/examples/l3fwd/Makefile > +++ b/examples/l3fwd/Makefile > @@ -5,7 +5,7 @@ > APP =3D l3fwd >=20 > # all source are stored in SRCS-y > -SRCS-y :=3D main.c l3fwd_lpm.c l3fwd_em.c > +SRCS-y :=3D main.c l3fwd_lpm.c l3fwd_em.c l3fwd_event.c >=20 > # Build using pkg-config variables if possible > ifeq ($(shell pkg-config --exists libdpdk && echo 0),0) > diff --git a/examples/l3fwd/l3fwd.h b/examples/l3fwd/l3fwd.h > index 293fb1fa2..cd17a41b3 100644 > --- a/examples/l3fwd/l3fwd.h > +++ b/examples/l3fwd/l3fwd.h > @@ -5,6 +5,9 @@ > #ifndef __L3_FWD_H__ > #define __L3_FWD_H__ >=20 > +#include > + Why do we need it here? > +#include > #include >=20 > #define DO_RFC_1812_CHECKS > @@ -169,6 +172,9 @@ is_valid_ipv4_pkt(struct rte_ipv4_hdr *pkt, uint32_t = link_len) > } > #endif /* DO_RFC_1812_CHECKS */ >=20 > +void > +print_usage(const char *prgname); > + > /* Function pointers for LPM or EM functionality. */ > void > setup_lpm(const int socketid); > diff --git a/examples/l3fwd/l3fwd_event.c b/examples/l3fwd/l3fwd_event.c > new file mode 100644 > index 000000000..3892720be > --- /dev/null > +++ b/examples/l3fwd/l3fwd_event.c > @@ -0,0 +1,75 @@ > +/* SPDX-License-Identifier: BSD-3-Clause > + * Copyright(C) 2019 Marvell International Ltd. > + */ > + > +#include > +#include > + > +#include "l3fwd.h" > +#include "l3fwd_event.h" > + > +static void > +parse_mode(const char *optarg) > +{ > + struct l3fwd_event_resources *evt_rsrc =3D l3fwd_get_eventdev_rsrc(); > + > + if (!strncmp(optarg, "poll", 4)) That looks a bit clumsy and error-prone. Just strcmp(optarg, "poll") seems enough here. Same for other similar places. > + evt_rsrc->enabled =3D false; > + else if (!strncmp(optarg, "eventdev", 8)) > + evt_rsrc->enabled =3D true; > +} > + > +static void > +parse_eventq_sync(const char *optarg) > +{ > + struct l3fwd_event_resources *evt_rsrc =3D l3fwd_get_eventdev_rsrc(); > + > + if (!strncmp(optarg, "ordered", 7)) > + evt_rsrc->sched_type =3D RTE_SCHED_TYPE_ORDERED; > + if (!strncmp(optarg, "atomic", 6)) > + evt_rsrc->sched_type =3D RTE_SCHED_TYPE_ATOMIC; > + if (!strncmp(optarg, "parallel", 8)) > + evt_rsrc->sched_type =3D RTE_SCHED_TYPE_PARALLEL; > +} > + > +static void > +l3fwd_parse_eventdev_args(char **argv, int argc) > +{ > + const struct option eventdev_lgopts[] =3D { > + {CMD_LINE_OPT_MODE, 1, 0, CMD_LINE_OPT_MODE_NUM}, > + {CMD_LINE_OPT_EVENTQ_SYNC, 1, 0, CMD_LINE_OPT_EVENTQ_SYNC_NUM}, > + {NULL, 0, 0, 0} > + }; > + char *prgname =3D argv[0]; > + char **argvopt =3D argv; > + int32_t option_index; > + int32_t opt; > + > + while ((opt =3D getopt_long(argc, argvopt, "", eventdev_lgopts, > + &option_index)) !=3D EOF) { > + switch (opt) { > + case CMD_LINE_OPT_MODE_NUM: > + parse_mode(optarg); > + break; > + > + case CMD_LINE_OPT_EVENTQ_SYNC_NUM: > + parse_eventq_sync(optarg); > + break; > + > + default: > + print_usage(prgname); > + exit(1); > + } > + } > +} > + > +void > +l3fwd_event_resource_setup(void) > +{ > + struct l3fwd_event_resources *evt_rsrc =3D l3fwd_get_eventdev_rsrc(); > + > + /* Parse eventdev command line options */ > + l3fwd_parse_eventdev_args(evt_rsrc->args, evt_rsrc->nb_args); > + if (!evt_rsrc->enabled) > + return; > +} > diff --git a/examples/l3fwd/l3fwd_event.h b/examples/l3fwd/l3fwd_event.h > new file mode 100644 > index 000000000..c95296c38 > --- /dev/null > +++ b/examples/l3fwd/l3fwd_event.h > @@ -0,0 +1,54 @@ > +/* SPDX-License-Identifier: BSD-3-Clause > + * Copyright(C) 2019 Marvell International Ltd. > + */ > + > +#ifndef __L3FWD_EVENTDEV_H__ > +#define __L3FWD_EVENTDEV_H__ > + > +#include > +#include > +#include > + > +#include "l3fwd.h" > + > +#define CMD_LINE_OPT_MODE "mode" > +#define CMD_LINE_OPT_EVENTQ_SYNC "eventq-sched" > + > +enum { > + CMD_LINE_OPT_MODE_NUM =3D 265, > + CMD_LINE_OPT_EVENTQ_SYNC_NUM, > +}; > + > +struct l3fwd_event_resources { > + uint8_t sched_type; > + uint8_t enabled; > + uint8_t nb_args; > + char **args; > +}; > + > +static inline struct l3fwd_event_resources * > +l3fwd_get_eventdev_rsrc(void) > +{ > + static const char name[RTE_MEMZONE_NAMESIZE] =3D "l3fwd_event_rsrc"; > + const struct rte_memzone *mz; > + > + mz =3D rte_memzone_lookup(name); > + > + if (mz !=3D NULL) > + return mz->addr; > + > + mz =3D rte_memzone_reserve(name, sizeof(struct l3fwd_event_resources), > + 0, 0); > + if (mz !=3D NULL) { > + memset(mz->addr, 0, sizeof(struct l3fwd_event_resources)); > + return mz->addr; > + } > + > + rte_exit(EXIT_FAILURE, "Unable to allocate memory for eventdev cfg\n"); > + > + return NULL; > +} Does this function really need to be inline? It wouldn't be fast anyway. Another question - do you really need memzone here? Wouldn't just rte_malloc() be enough? > + > +void l3fwd_event_resource_setup(void); > + > +#endif /* __L3FWD_EVENTDEV_H__ */ > diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c > index 4dea12a65..19ca4483c 100644 > --- a/examples/l3fwd/main.c > +++ b/examples/l3fwd/main.c > @@ -13,12 +13,12 @@ > #include > #include > #include > -#include >=20 > #include > #include > #include > #include > +#include > #include > #include > #include > @@ -33,7 +33,6 @@ > #include > #include > #include > -#include > #include > #include > #include > @@ -46,6 +45,7 @@ > #include >=20 > #include "l3fwd.h" > +#include "l3fwd_event.h" >=20 > /* > * Configurable number of RX/TX ring descriptors > @@ -274,7 +274,7 @@ init_lcore_rx_queues(void) > } >=20 > /* display usage */ > -static void > +void > print_usage(const char *prgname) > { > fprintf(stderr, "%s [EAL options] --" > @@ -289,7 +289,9 @@ print_usage(const char *prgname) > " [--hash-entry-num]" > " [--ipv6]" > " [--parse-ptype]" > - " [--per-port-pool]\n\n" > + " [--per-port-pool]" > + " [--mode]" > + " [--eventq-sched]\n\n" >=20 > " -p PORTMASK: Hexadecimal bitmask of ports to configure\n" > " -P : Enable promiscuous mode\n" > @@ -304,7 +306,13 @@ print_usage(const char *prgname) > " --hash-entry-num: Specify the hash entry number in hexadecimal to b= e setup\n" > " --ipv6: Set if running ipv6 packets\n" > " --parse-ptype: Set to use software to analyze packet type\n" > - " --per-port-pool: Use separate buffer pool per port\n\n", > + " --per-port-pool: Use separate buffer pool per port\n" > + " --mode: Packet transfer mode for I/O, poll or eventdev\n" > + " Default mode =3D poll\n" > + " --eventq-sched: Event queue synchronization method " > + " ordered, atomic or parallel.\n\t\t" > + " Default: atomic\n\t\t" > + " Valid only if --mode=3Deventdev\n\n", > prgname); > } >=20 > @@ -504,11 +512,19 @@ static const struct option lgopts[] =3D { > static int > parse_args(int argc, char **argv) > { > + struct l3fwd_event_resources *evt_rsrc; > int opt, ret; > char **argvopt; > int option_index; > char *prgname =3D argv[0]; >=20 > + evt_rsrc =3D l3fwd_get_eventdev_rsrc(); > + evt_rsrc->args =3D rte_zmalloc("l3fwd_event_args", sizeof(char *), 0); > + if (evt_rsrc->args =3D=3D NULL) > + rte_exit(EXIT_FAILURE, > + "Unable to allocate memory for eventdev arg"); > + evt_rsrc->args[0] =3D argv[0]; > + evt_rsrc->nb_args++; > argvopt =3D argv; >=20 > /* Error or normal output strings. */ > @@ -538,6 +554,15 @@ parse_args(int argc, char **argv) > l3fwd_lpm_on =3D 1; > break; >=20 > + case '?': > + /* Eventdev options are encountered skip for > + * now and processed later. > + */ > + evt_rsrc->args[evt_rsrc->nb_args] =3D > + argv[optind - 1]; > + evt_rsrc->nb_args++; > + break; > + All this construction with first allocating space for eventdev specific par= ams copying them and parsing in a special function - looks like an overkill to = me. Why not just to call parse_mode()/parse_eventq.. functions straight from he= re?=20 > /* long options */ > case CMD_LINE_OPT_CONFIG_NUM: > ret =3D parse_config(optarg); > @@ -811,6 +836,7 @@ prepare_ptype_parser(uint16_t portid, uint16_t queuei= d) > int > main(int argc, char **argv) > { > + struct l3fwd_event_resources *evt_rsrc; > struct lcore_conf *qconf; > struct rte_eth_dev_info dev_info; > struct rte_eth_txconf *txconf; > @@ -839,11 +865,16 @@ main(int argc, char **argv) > *(uint64_t *)(val_eth + portid) =3D dest_eth_addr[portid]; > } >=20 > + evt_rsrc =3D l3fwd_get_eventdev_rsrc(); > + RTE_SET_USED(evt_rsrc); > /* parse application arguments (after the EAL ones) */ > ret =3D parse_args(argc, argv); > if (ret < 0) > rte_exit(EXIT_FAILURE, "Invalid L3FWD parameters\n"); >=20 > + /* Configure eventdev parameters if user has requested */ > + l3fwd_event_resource_setup(); > + > if (check_lcore_params() < 0) > rte_exit(EXIT_FAILURE, "check_lcore_params failed\n"); >=20 > diff --git a/examples/l3fwd/meson.build b/examples/l3fwd/meson.build > index 6dd4b9022..864327c7b 100644 > --- a/examples/l3fwd/meson.build > +++ b/examples/l3fwd/meson.build > @@ -6,7 +6,7 @@ > # To build this example as a standalone application with an already-inst= alled > # DPDK instance, use 'make' >=20 > -deps +=3D ['hash', 'lpm'] > +deps +=3D ['hash', 'lpm', 'eventdev'] > sources =3D files( > - 'l3fwd_em.c', 'l3fwd_lpm.c', 'main.c' > + 'l3fwd_em.c', 'l3fwd_lpm.c', 'l3fwd_event.c', 'main.c' > ) > -- > 2.17.1