From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id F0A7DA0562; Wed, 14 Apr 2021 11:48:53 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 6F1D91618F1; Wed, 14 Apr 2021 11:48:53 +0200 (CEST) Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by mails.dpdk.org (Postfix) with ESMTP id 9A6541618EF for ; Wed, 14 Apr 2021 11:48:51 +0200 (CEST) IronPort-SDR: O8ESMaQbjZE8zqllBSK6KtWI3YjGSwOgglsIhMNxNs3Y6GktnrVBRQDTohD4BWk7jTnTMm+UQX keDH5PSuJrow== X-IronPort-AV: E=McAfee;i="6200,9189,9953"; a="181727308" X-IronPort-AV: E=Sophos;i="5.82,221,1613462400"; d="scan'208";a="181727308" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Apr 2021 02:48:50 -0700 IronPort-SDR: PPx5MDvNgj1zOpOwm3Y34hY1M6yroYhZX2pW3jNl7QRFbNXVZ3tCEkzX53fF3jZJVW9P2oFijr VFeUgVfWeEeA== X-IronPort-AV: E=Sophos;i="5.82,221,1613462400"; d="scan'208";a="424654932" Received: from bricha3-mobl.ger.corp.intel.com ([10.252.7.48]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-SHA; 14 Apr 2021 02:48:45 -0700 Date: Wed, 14 Apr 2021 10:48:41 +0100 From: Bruce Richardson To: Juraj =?utf-8?Q?Linke=C5=A1?= Cc: "Ruifeng.Wang@arm.com" , "Honnappa.Nagarahalli@arm.com" , "Phil.Yang@arm.com" , "vcchunga@amazon.com" , "Dharmik.Thakkar@arm.com" , "jerinjacobk@gmail.com" , "hemant.agrawal@nxp.com" , "ajit.khaparde@broadcom.com" , "ferruh.yigit@intel.com" , "aboyer@pensando.io" , "dev@dpdk.org" Message-ID: <20210414094841.GA500@bricha3-MOBL.ger.corp.intel.com> References: <1617950146-7307-1-git-send-email-juraj.linkes@pantheon.tech> <1617957679-7751-1-git-send-email-juraj.linkes@pantheon.tech> <1617957679-7751-2-git-send-email-juraj.linkes@pantheon.tech> <20210409100250.GA1367@bricha3-MOBL.ger.corp.intel.com> <993da86b3e0b4b52b5df9e6176d8ce73@pantheon.tech> <20210409143131.GC1381@bricha3-MOBL.ger.corp.intel.com> <08e584d671164f73a7751c4b96c5e677@pantheon.tech> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <08e584d671164f73a7751c4b96c5e677@pantheon.tech> Subject: Re: [dpdk-dev] [PATCH v19 1/3] build: disable/enable drivers in Arm builds X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 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 Wed, Apr 14, 2021 at 09:02:16AM +0000, Juraj Linkeš wrote: > > > > -----Original Message----- > > From: Bruce Richardson > > Sent: Friday, April 9, 2021 4:32 PM > > To: Juraj Linkeš > > Cc: Ruifeng.Wang@arm.com; Honnappa.Nagarahalli@arm.com; > > Phil.Yang@arm.com; vcchunga@amazon.com; Dharmik.Thakkar@arm.com; > > jerinjacobk@gmail.com; hemant.agrawal@nxp.com; > > ajit.khaparde@broadcom.com; ferruh.yigit@intel.com; aboyer@pensando.io; > > dev@dpdk.org > > Subject: Re: [PATCH v19 1/3] build: disable/enable drivers in Arm builds > > > > On Fri, Apr 09, 2021 at 02:10:08PM +0000, Juraj Linkeš wrote: > > > > > > > > > > -----Original Message----- > > > > From: Bruce Richardson > > > > Sent: Friday, April 9, 2021 12:03 PM > > > > To: Juraj Linkeš > > > > Cc: Ruifeng.Wang@arm.com; Honnappa.Nagarahalli@arm.com; > > > > Phil.Yang@arm.com; vcchunga@amazon.com; Dharmik.Thakkar@arm.com; > > > > jerinjacobk@gmail.com; hemant.agrawal@nxp.com; > > > > ajit.khaparde@broadcom.com; ferruh.yigit@intel.com; > > > > aboyer@pensando.io; dev@dpdk.org > > > > Subject: Re: [PATCH v19 1/3] build: disable/enable drivers in Arm > > > > builds > > > > > > > > On Fri, Apr 09, 2021 at 10:41:17AM +0200, Juraj Linkeš wrote: > > > > > Add support for enabling or disabling drivers for Arm cross build. > > > > > Do not implement any enable/disable lists yet. > > > > > > > > > > Enabling drivers is useful when building for an SoC where we only > > > > > want to build a few drivers. That way the list won't be too long. > > > > > > > > > > Similarly, disabling drivers is useful when we want to disable > > > > > only a few drivers. > > > > > > > > > > Both of these are advantageous mainly in aarch64 -> aarch64 (or > > > > > arch > > > > > -> same arch) builds, where the build machine may have the > > > > > -> required > > > > > driver dependencies, yet we don't want to build drivers for a specific SoC. > > > > > > > > > > By default, build all drivers for which dependencies are found. If > > > > > enabled_drivers is a non-empty list, build only those drivers. If > > > > > disabled_drivers is non-empty list, build all drivers except those > > > > > in disabled_drivers. Error out if both are specified (i.e. do not > > > > > support that case). > > > > > > > > > > There are two drivers, bus/pci and bus/vdev, which break the build > > > > > if not enabled. Address this by always enabling these if the user > > > > > disables them or doesn't specify in their allowlist. > > > > > > > > > > Also remove the old Makefile arm configuration options which don't > > > > > do anything in Meson. > > > > > > > > > > Signed-off-by: Juraj Linkeš > > > > > Acked-by: Bruce Richardson > > > > > > > > I think this patch has changed since I last acked it. Further review below. > > > > > > > > > Reviewed-by: Honnappa Nagarahalli > > > > > Reviewed-by: Ruifeng Wang > > > > > --- > > > > > config/arm/meson.build | 4 -- > > > > > .../linux_gsg/cross_build_dpdk_for_arm64.rst | 8 +++ > > > > > drivers/meson.build | 49 +++++++++++++++++-- > > > > > meson.build | 2 + > > > > > meson_options.txt | 2 + > > > > > 5 files changed, 56 insertions(+), 9 deletions(-) > > > > > > > > > > diff --git a/config/arm/meson.build b/config/arm/meson.build index > > > > > 00bc4610a3..a241c45d13 100644 > > > > > --- a/config/arm/meson.build > > > > > +++ b/config/arm/meson.build > > > > > @@ -16,9 +16,6 @@ flags_common = [ > > > > > # ['RTE_ARM64_MEMCPY_ALIGN_MASK', 0xF], > > > > > # ['RTE_ARM64_MEMCPY_STRICT_ALIGN', false], > > > > > > > > > > - ['RTE_NET_FM10K', false], > > > > > - ['RTE_NET_AVP', false], > > > > > - > > > > > ['RTE_SCHED_VECTOR', false], > > > > > ['RTE_ARM_USE_WFE', false], > > > > > ['RTE_ARCH_ARM64', true], > > > > > @@ -125,7 +122,6 @@ implementer_cavium = { > > > > > ['RTE_MACHINE', '"octeontx2"'], > > > > > ['RTE_ARM_FEATURE_ATOMICS', true], > > > > > ['RTE_USE_C11_MEM_MODEL', true], > > > > > - ['RTE_EAL_IGB_UIO', false], > > > > > ['RTE_MAX_LCORE', 36], > > > > > ['RTE_MAX_NUMA_NODES', 1] > > > > > ] > > > > > diff --git a/doc/guides/linux_gsg/cross_build_dpdk_for_arm64.rst > > > > > b/doc/guides/linux_gsg/cross_build_dpdk_for_arm64.rst > > > > > index faaf24b95b..1504dbfef0 100644 > > > > > --- a/doc/guides/linux_gsg/cross_build_dpdk_for_arm64.rst > > > > > +++ b/doc/guides/linux_gsg/cross_build_dpdk_for_arm64.rst > > > > > @@ -234,3 +234,11 @@ There are other options you may specify in a > > > > > cross > > > > file to tailor the build:: > > > > > numa = false # set to false to force building for a non-NUMA > > system > > > > > # if not set or set to true, the build system will build for a NUMA > > > > > # system only if libnuma is installed > > > > > + > > > > > + disabled_drivers = ['bus/dpaa', 'crypto/*'] # add disabled drivers > > > > > + # valid values are dir/subdirs in the drivers directory > > > > > + # wildcards are allowed > > > > > + > > > > > + enabled_drivers = ['common/*', 'bus/*'] # build only these drivers > > > > > + # valid values are dir/subdirs in the drivers directory > > > > > + # wildcards are allowed > > > > > diff --git a/drivers/meson.build b/drivers/meson.build index > > > > > 9c8eded697..be5fd2df88 100644 > > > > > --- a/drivers/meson.build > > > > > +++ b/drivers/meson.build > > > > > @@ -19,8 +19,39 @@ subdirs = [ > > > > > 'baseband', # depends on common and bus. > > > > > ] > > > > > > > > > > -disabled_drivers = run_command(list_dir_globs, > > get_option('disable_drivers'), > > > > > - ).stdout().split() > > > > > +always_enabled = ['bus/pci', 'bus/vdev'] > > > > > + > > > > > +if meson.is_cross_build() > > > > > + disabled_drivers += meson.get_cross_property('disabled_drivers', []) > > > > > + enabled_drivers += meson.get_cross_property('enabled_drivers', > > > > > +[]) endif > > > > > > > > I don't think "+=" is correct here. This is the first use of the > > > > disabled_drivers variable. [Sorry, correction, I see you've added a > > > > new definition of it in the top- level meson.build. I think it's > > > > better to move that to this file] > > > > > > > > > > This need not be true. It's added in config/arm/meson.build in the subsequent > > patch, which comes before drivers/meson.build, which is why I structured it this > > way - I don't think there's a reason to move the initialization around in the same > > series, but I could do that. > > > > Ok, I did not realise that. I need to look at how they are used in that file. > > > > > > > > > Also, would it not be better to have the cross-file option the same > > > > as that used in the parameter option? Right now you have the > > > > cross-file option as "disabled_drivers" vs cmdline option > > > > "disable_drivers" and the types being list and string respectively > > > > too. Why not have the cross-file option be a string called > > > > "disable_drivers" too? It would save some joining an array/string conversion > > below and simplify things. > > > > > > > > > > The name can be the same. The reason I have two different types is that it > > struck me as more user friendly - specifying something in code is more intuitive > > as list as opposed to comma-delimited string, whereas it's more intuitive as > > comma-delimited string on cmdline. It's possible that having a comma-delimited > > string everywhere is actually better anyway - I'll change it. > > > > > > > > + > > > > > +# add cmdline disabled drivers (comma separated string) # and > > > > > +meson disabled drivers (list) # together into a comma separated > > > > > +string disabled_drivers = > > > > > +','.join([get_option('disable_drivers'), > > > > > +','.join(disabled_drivers)]).strip(',') > > > > > > > > Do we need the string at the end here? I would think that join never > > > > adds a trailing comma? As stated above if these were both strings it > > > > might make things shorter and easier. > > > > > > > > > > If we're joining two empty strings (which happens when neither the cmdline > > nor the code list is specified), then we'll end up with a singular comma instead of > > an empty string. > > > > > > Even then both of these are strings (which I'll change), we'll still need the strip, > > as the above scenario would still happen. > > > > Ok, didn't realise that the trailing "," will still be present. However, I think a > > better fix for this, and the issue below with "." being printed in the empty case is > > to add the following to buildtools/list-dir-globs.py: > > > > @@ -14,6 +14,8 @@ > > os.getenv('MESON_SUBDIR', '.')) > > > > for path in sys.argv[1].split(','): > > + if not path: > > + continue > > for p in iglob(os.path.join(root, path)): > > if os.path.isdir(p): > > print(os.path.relpath(p)) > > > > With that added, we don't need to worry about null strings or and trailing > > commas and can just do: > > disabled_drivers += ',' + get_option('disable_drivers') > > > > Great, this is the sort of review I was hoping to get. This is much more elegant. > > > > > > > > > +if disabled_drivers != '' > > > > > + disabled_drivers = run_command(list_dir_globs, > > > > > + disabled_drivers).stdout().split() > > > > > +else > > > > > + disabled_drivers = [] > > > > > +endif > > > > > > > > Don't think we need the "if/else" here. The existing code works fine > > > > with taking an empty array. > > > > > > > > > > An empty string results in ['.'], not in []. I ran into problems with allowlists > > when ['.'] is returned - I'm assuming that the allowlist is either empty or > > whathever is in the allowlist means something and '.' is meaningless since it's not > > a driver. This was the most straightforward solution I found. For disabled drivers > > we don't need this, but I did the same thing for consistency. > > > > > > > I think the above two-line change to the globs script should fix this. > > > > Right, it should. > > > > > > + > > > > > +# add cmdline enabled drivers (comma separated string) # and > > > > > +meson enabled drivers (list) # together into a comma separated > > > > > +string enabled_drivers = ','.join([get_option('enable_drivers'), > > > > > +','.join(enabled_drivers)]).strip(',') > > > > > +if enabled_drivers != '' > > > > > + enabled_drivers = run_command(list_dir_globs, > > > > > + enabled_drivers).stdout().split() else > > > > > + enabled_drivers = [] > > > > > +endif > > > > > + > > > > > +if disabled_drivers != [] and enabled_drivers != [] > > > > > + error('Simultaneous disabled drivers and enabled drivers ' + > > > > > + 'configuration is not supported.') endif > > > > > > > > For use in cross-files this makes sense, but I'm not sure it's the > > > > correct approach for when a cross-file specifies enable and the user > > > > specifies disable on the cmdline. In that case, the enable list > > > > should just have the disabled values removed from it. Therefore, I > > > > suggest having this check only in the cross-build section. > > > > > > > > > > Do you want to distinguish between enabling/disabling driver when cross > > compiling and when doing a regular build? From the previous discussion, I > > thought we didn't want to mix enable/disable lists no matter what the build or > > source is. The different scenarios in my mind are combinations of: > > > 1. cross/regular build > > > 2. no list, just enable list, just disable list, both lists 3. where a > > > list is specified - cmdline or meson code (soc config or cross file) > > > > > > These give us quite a number of different scenarios. When do we want to > > allow the mixing of enable/disable lists and when not? It's not clear to me from > > your description, but it seems that specifying a list on the cmdline should > > overwrite or supplement either an enable or disable list specified in code - we > > would allow just one of these in code and then augment that with cmdline. > > > > > > > It's got quite a complicated number of scenarios, I admit. > > One thought, though not sure if it would work, is to always check > > enabled_drivers and disabled_drivers. If no enable_drivers option in cross-file or > > cmdline, we initialize the value to "list_dir_globs *.*", i.e. everything enabled. > > Similarly, if no disable_driver options provided, we use an empty list. > > > > Thereafter in the main loop we just check for each driver that it is in the enable > > list and not in the disabled one. > > > > Does that seem like it would work? > > I think it would work and it would mean that we'd allow using both enable lists and disable lists for all scenarios. Is that intentional? > I think it's necessary to have sane behaviour myself. However, we can still limit the use to not both together if it causes problems. My main concern is how to manage overriding via options any values in the cross-files, ideally without modifying the files, and this seemed a good way. /Bruce