Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id DBF41C61DA3 for ; Tue, 21 Feb 2023 13:52:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233910AbjBUNwt (ORCPT ); Tue, 21 Feb 2023 08:52:49 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42456 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233400AbjBUNwr (ORCPT ); Tue, 21 Feb 2023 08:52:47 -0500 Received: from domac.alu.hr (domac.alu.unizg.hr [IPv6:2001:b68:2:2800::3]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BFA8025E3D; Tue, 21 Feb 2023 05:52:44 -0800 (PST) Received: from localhost (localhost [127.0.0.1]) by domac.alu.hr (Postfix) with ESMTP id DB15A604ED; Tue, 21 Feb 2023 14:52:41 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=alu.unizg.hr; s=mail; t=1676987561; bh=DU0Q/m3FTCWzaxKV8pFjKM5tQt37HfAjM4pJvKiUo2k=; h=Date:From:Subject:To:Cc:References:In-Reply-To:From; b=EC3RxDM+mEmohfJ3Etxcjpjlx4ADud/v5jGISZn7iTsfsFpnFGFv3ifpvC5A7YUay Mj6zZgx9f2KaDEpOP3Tdw0xrJO3airlZ1JKtVOPAs+l8ZdoRppcm1wWWWLSspkOYQu WqeZ+uPWh1k2nyTMjCKBRcskjscUqRBvAuWafunigJcg9AYliez0IUy1pBywSQ7zUV p/A2ixwix3qj+EYzHq6rmWOXRYEU9yBR1PyhfShYdRKBQb85Y5NhAKkmwRm+au9H/P blNEAMB8ytVM9G4khUt3OXkvZZkJP9nxPE/yJsO7hirm0lJB8hSxVfnMuRqnG1W7yp Xh4BzPfoJW/KQ== X-Virus-Scanned: Debian amavisd-new at domac.alu.hr Received: from domac.alu.hr ([127.0.0.1]) by localhost (domac.alu.hr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id iWpdHBbm2MPb; Tue, 21 Feb 2023 14:52:39 +0100 (CET) Received: from [10.0.1.16] (grf-nat.grf.hr [161.53.83.23]) by domac.alu.hr (Postfix) with ESMTPSA id 0A4C2604EA; Tue, 21 Feb 2023 14:52:38 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=alu.unizg.hr; s=mail; t=1676987559; bh=DU0Q/m3FTCWzaxKV8pFjKM5tQt37HfAjM4pJvKiUo2k=; h=Date:From:Subject:To:Cc:References:In-Reply-To:From; b=qrPLaMlPV3GpgOgA783VpPDQ2yNPIBYzmLk83rabjzF5DKa/lS6cn9L0h24JxXqXf N0Tta/l5l90QTBd41BDmRVRW9ubQjewhYHEYOEYKBqyYOcYtts50dgcupbPX6y/uug 10i0FsYFj18SjEaz94qBEK3LIjQSAfdm3u0p7Llsb6KmJVGYl+VQO8ItS7A/VjjpUY pTyy6p+1ALCjayeZ3evq5BhxrAJWixUmsu90Wc+sq1A0GxtbBBO8vNUHdNOFkED060 osrixGnRd891FdDaGpad++P4qm/1RAk23LJffGqWf7Q9B77MMfJuyFVsYMU/Tdd4nG gWa82RiJEFshg== Message-ID: Date: Tue, 21 Feb 2023 14:52:38 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.7.2 From: Mirsad Goran Todorovac Subject: Re: INFO: REPRODUCED: memory leak in gpio device in 6.2-rc6 To: Andy Shevchenko Cc: Bartosz Golaszewski , linux-gpio@vger.kernel.org, Linus Walleij , linux-kernel@vger.kernel.org, Thorsten Leemhuis References: <36d8e761-58e2-2515-fd1a-65a11731d1b1@alu.unizg.hr> <3d96e50b-ed17-9bf5-149b-8a50c7b4cca2@alu.unizg.hr> <4b001ce6-b35d-3ad1-b757-f5f6baca7b51@alu.unizg.hr> Content-Language: en-US, hr In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 20. 02. 2023. 14:43, Andy Shevchenko wrote: > On Mon, Feb 20, 2023 at 02:10:00PM +0100, Mirsad Todorovac wrote: >> On 2/16/23 15:16, Bartosz Golaszewski wrote: > > ... > >> As Mr. McKenney once said, a bunch of monkeys with keyboard could >> have done it in a considerable number of trials and errors ;-) >> >> But here I have something that could potentially leak as well. I could not devise a >> reproducer due to the leak being lightly triggered only in extreme memory contention. >> >> See it for yourself: >> >> drivers/gpio/gpio-sim.c: >> 301 static int gpio_sim_setup_sysfs(struct gpio_sim_chip *chip) >> 302 { >> 303 struct device_attribute *val_dev_attr, *pull_dev_attr; >> 304 struct gpio_sim_attribute *val_attr, *pull_attr; >> 305 unsigned int num_lines = chip->gc.ngpio; >> 306 struct device *dev = chip->gc.parent; >> 307 struct attribute_group *attr_group; >> 308 struct attribute **attrs; >> 309 int i, ret; >> 310 >> 311 chip->attr_groups = devm_kcalloc(dev, sizeof(*chip->attr_groups), >> 312 num_lines + 1, GFP_KERNEL); >> 313 if (!chip->attr_groups) >> 314 return -ENOMEM; >> 315 >> 316 for (i = 0; i < num_lines; i++) { >> 317 attr_group = devm_kzalloc(dev, sizeof(*attr_group), GFP_KERNEL); >> 318 attrs = devm_kcalloc(dev, GPIO_SIM_NUM_ATTRS, sizeof(*attrs), >> 319 GFP_KERNEL); >> 320 val_attr = devm_kzalloc(dev, sizeof(*val_attr), GFP_KERNEL); >> 321 pull_attr = devm_kzalloc(dev, sizeof(*pull_attr), GFP_KERNEL); >> 322 if (!attr_group || !attrs || !val_attr || !pull_attr) >> 323 return -ENOMEM; >> 324 >> 325 attr_group->name = devm_kasprintf(dev, GFP_KERNEL, >> 326 "sim_gpio%u", i); >> 327 if (!attr_group->name) >> 328 return -ENOMEM; >> >> Apparently, if the memory allocation only partially succeeds, in the theoretical case >> that the system is close to its kernel memory exhaustion, `return -ENOMEM` would not >> free the partially succeeded allocs, would it? >> >> To explain it better, I tried a version that is not yet full doing "all or nothing" >> memory allocation for the gpio-sim driver, because I am not that familiar with the >> driver internals. > > devm_*() mean that the resource allocation is made in a managed manner, so when > it's done, it will be freed automatically. Didn't see that one coming ... :-/ "buzzing though the bush ..." > The question is: is the lifetime of the attr_groups should be lesser or the > same as chip->gc.parent? Maybe it's incorrect to call devm_*() in the first place? Bona fide said, I hope that automatic deallocation does things in the right order. I've realised that devm_kzalloc() calls devm_kmalloc() that registers allocations on a per driver list. But I am not sure how chip->gc was allocated? Here is said it is allocated in drivers/gpio/gpio-sim.c:386 in gpio_sim_add_bank(), as a part of struct gpio_sim_chip *chip; struct gpio_chip *gc; gc = &chip->gc; and gc->parent is set to gc->parent = dev; in line 420, which appears called before gpio_sim_setup_sysfs() and the lines above. If I understood well, automatic deallocation on unloading the driver goes in the reverse order, so lifetime of chip appears to be longer than attr_groups, but I am really not that good at this ... > Or maybe the chip->gc.parent should be changed to something else (actual GPIO > device, but then it's unclear how to provide the attributes in non-racy way Really, dunno. I have to repeat that my learning curve cannot adapt so quickly. I merely gave the report of KMEMLEAK, otherwise I am not a Linux kernel device expert nor would be appropriate to try the craft not earned ;-) Regards, Mirsad -- Mirsad Goran Todorovac Sistem inženjer Grafički fakultet | Akademija likovnih umjetnosti Sveučilište u Zagrebu System engineer Faculty of Graphic Arts | Academy of Fine Arts University of Zagreb, Republic of Croatia The European Union