Re: [RFC PATCH] device: Add kernel standard devm_k.alloc functions

From: Kevin Hilman
Date: Fri Oct 18 2013 - 12:57:48 EST


On Fri, Oct 11, 2013 at 1:11 PM, Andrew Morton
<akpm@xxxxxxxxxxxxxxxxxxxx> wrote:
> On Tue, 08 Oct 2013 22:32:27 -0700 Joe Perches <joe@xxxxxxxxxxx> wrote:
>
>> Currently, devm_ managed memory only supports kzalloc.
>>
>> Convert the devm_kzalloc implementation to devm_kmalloc
>> and remove the complete memset to 0 but still set the
>> initial struct devres header and whatever padding before
>> data to 0.
>>
>> Add the other normal alloc variants as static inlines with
>> __GFP_ZERO added to the gfp flag where appropriate:
>>
>> devm_kzalloc
>> devm_kcalloc
>> devm_kmalloc_array
>>
>> Add gfp.h to device.h for the newly added static inlines.
>>
>> ...
>>
>> --- a/drivers/base/devres.c
>> +++ b/drivers/base/devres.c
>> @@ -91,7 +91,8 @@ static __always_inline struct devres * alloc_dr(dr_release_t release,
>> if (unlikely(!dr))
>> return NULL;
>>
>> - memset(dr, 0, tot_size);
>> + memset(dr, 0, offsetof(struct devres, data));
>
> Well, this does make some assumptions about devres layout. It would
> have been cleaner to do
>
> memset(&dr.node, 0, sizeof(dr.node));
>
> but whatever.
>
> I made some changelog changes.
>
> I agree that including devm_kmalloc_array() might be going a bit far
> (it's the lack of devm_kmalloc which matters most). But
> devm_kmalloc_array() is inlined and is hence basically cost-free until
> someone actually uses it.

A handful of boot panics on ARM platforms were bisected to point at
the version of this commit that's in linux-next (commit
64c862a839a8db2c02bbaa88b923d13e1208919d). Reverting this commit
makes things happy again.

Upon further digging, it seems that users of devres_alloc() are
relying on the previous behavior of having the memory zero'd which is
no longer the case after $SUBJECT patch. The change below on top of
-next makes these ARM boards happy again.

Kevin

[1]