Received: by 10.192.165.156 with SMTP id m28csp1671078imm; Sat, 14 Apr 2018 03:57:16 -0700 (PDT) X-Google-Smtp-Source: AIpwx49ci4ZhvKetry6HQRTxCcf4qy/+voYKdPB3GqxLHXOuKd9+rRcafTmbuX2UC+LvqgHghAW3 X-Received: by 10.98.242.6 with SMTP id m6mr14806325pfh.170.1523703436571; Sat, 14 Apr 2018 03:57:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523703436; cv=none; d=google.com; s=arc-20160816; b=ZXNpvizQXl/r++5cFTluphyhUn58zPT/79oE5cW3G0Lzzy2Xd8gJ/oNxMdB7RMlmTV 9Kn2UJROuZ1q4H213/emPUz4LAx7a6Wd2fUD5Oopn+aa3UzwJ/Lh4Cwm0Bmq55SWek8h Gi7aCLg4VwyWcVOdmZpJNsig3qD+/LrTtLR8yZllID0D0Gg6EkZCKblIj0Bx+KAYvaGQ CWaKOg5+GeVH/oWp1QKejGRSXazetrzlF3j91UKiQUTSjyPN1lZHxj9x9TuWW5riQN1J d9jsqbzhQ11/Gmv50ZSC+WXlQ/lnIg3vtxiH/ypSU2OpMN0fUpjBWfkOGx/iqIcf3Nj4 rDpw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:arc-authentication-results; bh=/Gd6KtCsJai/9kgGV2vlsweznDYVatCtFqtopBaO9Po=; b=btp1xQZtvy/ab0Z9CGfVwSoHbijqgpGB2Kzg7FXwnLxsg1pnw2tbNX3jQKWuOLNTJM d31EU3NLRTiasOYoF55wzEffnRguf6t75aCAYbZZgnTtR3S0dnssnQlUgSqhQMUkzxWI yTDHlCIW4C7pFkoy4AOUrpk0pdNZ7YtlHyWWfD9rnD9PtC1tViEP7TF/baV+/AgNcJPW CXDW7pSaULmnzC3JbGvSFFRCowLMnms/AWoa8fccV3DLl2ClmQ7764jslLXffwfl28yd OHwGUvWwMmraKk4DG7FoBGdSw+exDCwvJI1hqJZY3ymtvA/bRqmgNr5mISEeUfUhH09z bRHg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id z9si2322664pgs.308.2018.04.14.03.57.02; Sat, 14 Apr 2018 03:57:16 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751060AbeDNKz5 (ORCPT + 99 others); Sat, 14 Apr 2018 06:55:57 -0400 Received: from anchovy3.45ru.net.au ([203.30.46.155]:53264 "EHLO anchovy3.45ru.net.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750912AbeDNKzz (ORCPT ); Sat, 14 Apr 2018 06:55:55 -0400 Received: (qmail 20075 invoked by uid 5089); 14 Apr 2018 10:55:52 -0000 Received: by simscan 1.2.0 ppid: 19983, pid: 19984, t: 0.0511s scanners: regex: 1.2.0 attach: 1.2.0 clamav: 0.88.3/m:40/d:1950 Received: from unknown (HELO ?192.168.0.10?) (preid@electromag.com.au@106.69.191.210) by anchovy2.45ru.net.au with ESMTPA; 14 Apr 2018 10:55:52 -0000 Subject: Re: [PATCHv4] gpio: Remove VLA from gpiolib To: Laura Abbott , Linus Walleij Cc: Kees Cook , Lukas Wunner , Rasmus Villemoes , "open list:GPIO SUBSYSTEM" , "linux-kernel@vger.kernel.org" , kernel-hardening@lists.openwall.com References: <20180411010352.17929-1-labbott@redhat.com> <0aea6c90-ba94-708c-5cad-836c50dadfe6@redhat.com> From: Phil Reid Message-ID: <20968086-4e27-6f71-707a-3c1b3d48390a@electromag.com.au> Date: Sat, 14 Apr 2018 18:55:44 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.7.0 MIME-Version: 1.0 In-Reply-To: <0aea6c90-ba94-708c-5cad-836c50dadfe6@redhat.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-AU Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 14/04/2018 05:10, Laura Abbott wrote: > On 04/12/2018 05:39 PM, Phil Reid wrote: >> On 12/04/2018 16:38, Linus Walleij wrote: >>> On Wed, Apr 11, 2018 at 3:03 AM, Laura Abbott wrote: >>> >>>> The new challenge is to remove VLAs from the kernel >>>> (see https://lkml.org/lkml/2018/3/7/621) to eventually >>>> turn on -Wvla. >>>> >>>> Using a kmalloc array is the easy way to fix this but kmalloc is still >>>> more expensive than stack allocation. Introduce a fast path with a >>>> fixed size stack array to cover most chip with gpios below some fixed >>>> amount. The slow path dynamically allocates an array to cover those >>>> chips with a large number of gpios. >>>> >>>> Reviewed-and-tested-by: Lukas Wunner >>>> Signed-off-by: Lukas Wunner >>>> Signed-off-by: Laura Abbott >>>> --- >>>> v4: Changed some local variables to avoid coccinelle warnings. Added a >>>> warning if the number of GPIOs exceeds the current fast path define. >>>> >>>> Lukas, I kept your Tested-by because the changes were pretty minimal. >>>> Let me know if you want to run the tests again. >>> >>> This patch is starting to look really good. >>> >>>> +/* >>>> + * Number of GPIOs to use for the fast path in set array >>>> + */ >>>> +#define FASTPATH_NGPIO 256 >>> >>> There is still some comment about this. >>> >>> And now that I am also tryint to think I wonder about it, we >>> have a global ARCH_NR_GPIOS that is typically 512. >>> Some archs set it up. >>> >>> This define is something of an abomination, in the ARM >>> case it comes from arch/arm/include/asm/gpio.h >>> where #define ARCH_NR_GPIOS CONFIG_ARCH_NR_GPIO >>> where the latter is a Kconfig option that is mostly 512 for >>> most ARM systems. >>> >>> Well, ARM looks like this: >>> >>> config ARCH_NR_GPIO >>>          int >>>          default 2048 if ARCH_SOCFPGA >>>          default 1024 if ARCH_BRCMSTB || ARCH_SHMOBILE || ARCH_TEGRA || \ >>>                  ARCH_ZYNQ >>>          default 512 if ARCH_EXYNOS || ARCH_KEYSTONE || SOC_OMAP5 || \ >>>                  SOC_DRA7XX || ARCH_S3C24XX || ARCH_S3C64XX || ARCH_S5PV210 >>>          default 416 if ARCH_SUNXI >>>          default 392 if ARCH_U8500 >>>          default 352 if ARCH_VT8500 >>>          default 288 if ARCH_ROCKCHIP >>>          default 264 if MACH_H4700 >>>          default 0 >>>          help >>>            Maximum number of GPIOs in the system. >>> >>>            If unsure, leave the default value. >>> >>> So if FASTPATH_NGPIO should be anything else than >>> ARCH_NR_GPIO this has to be established somewhere >>> as a floor or half or something, but I would just set it as >>> the same as ARCH_NR_GPIOS... >>> >>> The main reason this define exist is for this function >>> from : >>> >>> /* Convert between the old gpio_ and new gpiod_ interfaces */ >>> struct gpio_desc *gpio_to_desc(unsigned gpio); >>> >>> Nowadays that fact is a bit obscured since the variable is >>> only used when assigning the base (in the global GPIO >>> number space, which is what we want to get rid of but >>> sigh) in gpiochip_find_base() where it attempts to place >>> a newly allocated gpiochip in the higher region of this >>> numberspace since the embedded SoC GPIO base tends >>> to be 0, on old platforms. >>> >>> So I don't know about this. >>> >>> Can't we just use ARCH_NR_GPIOS? >>> >>> Very few systems have more than 512 assigned global >>> GPIO numbers and those are FPGA experimental machines. >>> >>> In the long run obviously I want to get rid of these defines >>> altogether and only allocate GPIO descriptos dynamically >>> so as you see I am reluctant to add new numberspace weirdness >>> around here. >> Isn't that for total GPIO's in the system? >> And the arrays just need to cater for max per chip? >>  From what I can understand of the code which is admittedly limited. >> >> > > Yeah the switch back to 256 was a mistake on my end (I think I > grabbed an incorrect version for my base). ARCH_NR_GPIOs > is the total number in the system which may be multiple > chips so yes we would be possibly allocating more space > than necessary. > > unsigned long fastpath[2 * BITS_TO_LONGS(FASTPATH_NGPIO)] > > unsigned long fastpath[2 * BITS_TO_LONGS(512)] > unsigned long fastpath[2 * DIV_ROUND_UP(512, 8 * sizeof(long))] > > so we end up with 128 bytes on the stack total assuming I > can do math correctly. I think this a fairly reasonable > amount though, even if we are over-estimating if there are > multiple chips. > Yeah that's not too bad. My system is a SOCFPGA so it'd be 2048 / 8 = 512. Still not unreasonable. But the system doesn't have a single gpio close to that. The largest chip is 32. -- Regards Phil Reid