Re: [PATCH v2 2/6] gpiolib: free the label of lines released after their chip was removed

From: Andy Shevchenko

Date: Fri Oct 16 2026 - 09:38:28 EST


On Fri, Oct 16, 2026 at 12:23:34PM +0300, Adrian Ambrozewicz wrote:
> gpiod_free_commit() only drops the consumer label while the chip is
> still there:
>
> if (guard.gc && test_bit(GPIOD_FLAG_REQUESTED, &flags)) {
> ...
> desc_set_label(desc, NULL);
>
> A line that is still requested when gpiochip_remove() runs, for instance
> by a character device line request that user space keeps open, is
> released only afterwards, when gdev->chip is already NULL. Its label is
> then never freed, as gpiodev_release() frees the descriptor array but
> not the labels, and kmemleak reports one object per such line:
>
> unreferenced object (size 32):
> comm "gpio-hold"
> backtrace:

Be consistent, in other patch it's called Call Trace:. Is it really different
wording in the Oopses you got?

> desc_set_label
> gpiod_request_commit
> gpiod_request
> linereq_create
> gpio_ioctl
>
> Commit 1f2bcb8c8ccd ("gpio: protect the descriptor label with SRCU")
> cleared the label unconditionally; it moved under the chip check with
> the removal of gpio_lock. Return early only for a line that is not
> requested on a live chip, and clear the label before the chip check, so
> that it is also freed when the chip is gone. The ->free() callback, the
> flags update and the line state notification still need the chip and
> stay under the check; with the chip gone, no character device file can
> receive the notification any more.
>
> The label is now often freed just before the last reference to the GPIO
> device goes away, which depends on gpiodev_release() waiting for pending
> label frees (previous patch).
>
> Reproduced with gpio-sim: request a line through the character device,
> set the chip's configfs "live" attribute to 0 while the request is open,
> then close it. Without this change kmemleak reports between 15 and 30
> such objects after 30 cycles; with it, none after 100.

--
With Best Regards,
Andy Shevchenko