On Fri, Jul 10, 2020 at 6:11 PM Jon Hunter <jonathanh@xxxxxxxxxx> wrote: > > > On 10/07/2020 17:03, Bartosz Golaszewski wrote: > > On Fri, Jul 10, 2020 at 3:46 PM Jon Hunter <jonathanh@xxxxxxxxxx> wrote: > >> > >> Hi Bartosz, > >> > >> On 29/06/2020 07:50, Bartosz Golaszewski wrote: > >>> From: Bartosz Golaszewski <bgolaszewski@xxxxxxxxxxxx> > >>> > >>> Make devm_kmalloc() behave similarly to non-managed kmalloc(): return > >>> ZERO_SIZE_PTR when requested size is 0. Update devm_kfree() to handle > >>> this case. > >>> > >>> Signed-off-by: Bartosz Golaszewski <bgolaszewski@xxxxxxxxxxxx> > >>> --- > >>> drivers/base/devres.c | 9 ++++++--- > >>> 1 file changed, 6 insertions(+), 3 deletions(-) > >>> > >>> diff --git a/drivers/base/devres.c b/drivers/base/devres.c > >>> index 1df1fb10b2d9..ed615d3b9cf1 100644 > >>> --- a/drivers/base/devres.c > >>> +++ b/drivers/base/devres.c > >>> @@ -819,6 +819,9 @@ void *devm_kmalloc(struct device *dev, size_t size, gfp_t gfp) > >>> { > >>> struct devres *dr; > >>> > >>> + if (unlikely(!size)) > >>> + return ZERO_SIZE_PTR; > >>> + > >>> /* use raw alloc_dr for kmalloc caller tracing */ > >>> dr = alloc_dr(devm_kmalloc_release, size, gfp, dev_to_node(dev)); > >>> if (unlikely(!dr)) > >>> @@ -950,10 +953,10 @@ void devm_kfree(struct device *dev, const void *p) > >>> int rc; > >>> > >>> /* > >>> - * Special case: pointer to a string in .rodata returned by > >>> - * devm_kstrdup_const(). > >>> + * Special cases: pointer to a string in .rodata returned by > >>> + * devm_kstrdup_const() or NULL/ZERO ptr. > >>> */ > >>> - if (unlikely(is_kernel_rodata((unsigned long)p))) > >>> + if (unlikely(is_kernel_rodata((unsigned long)p) || ZERO_OR_NULL_PTR(p))) > >>> return; > >>> > >>> rc = devres_destroy(dev, devm_kmalloc_release, > >> > >> > >> This change caught a bug in one of our Tegra drivers, which I am in the > >> process of fixing. Once I bisected to this commit it was easy to track > >> down, but I am wondering if there is any reason why we don't add a > >> WARN_ON() if size is 0 in devm_kmalloc? It was essentially what I ended > >> up doing to find the bug. > >> > >> Jon > >> > >> -- > >> nvpublic > > > > Hi Jon, > > > > this is in line with what the regular kmalloc() does. If size is zero, > > it returns ZERO_SIZE_PTR. It's not an error condition. Actually in > > user-space malloc() does a similar thing: for size == 0 it allocates > > one-byte and returns a pointer to it (at least in glibc). > > > Yes that's fine, I was just wondering if there is any reason not to WARN > as well? > > Cheers > Jon > Why? Nothing bad happens. Regular kmalloc() doesn't warn, why should devm_kmalloc() do? Bartosz