Re: [PATCH 1/3] of: dynamic: add of_property_alloc() and of_property_free()

2022-06-02 Thread Tyrel Datwyler
On 6/2/22 07:06, Rob Herring wrote:
> On Wed, Jun 1, 2022 at 5:31 PM Tyrel Datwyler  wrote:
>>
>> On 5/5/22 12:37, Rob Herring wrote:
>>> On Wed, May 04, 2022 at 05:40:31PM +0200, Clément Léger wrote:
 Add function which allows to dynamically allocate and free properties.
 Use this function internally for all code that used the same logic
 (mainly __of_prop_dup()).

 Signed-off-by: Clément Léger 
 ---
  drivers/of/dynamic.c | 101 ++-
  include/linux/of.h   |  16 +++
  2 files changed, 88 insertions(+), 29 deletions(-)

 diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c
 index cd3821a6444f..e8700e509d2e 100644
 --- a/drivers/of/dynamic.c
 +++ b/drivers/of/dynamic.c
 @@ -313,9 +313,7 @@ static void property_list_free(struct property 
 *prop_list)

  for (prop = prop_list; prop != NULL; prop = next) {
  next = prop->next;
 -kfree(prop->name);
 -kfree(prop->value);
 -kfree(prop);
 +of_property_free(prop);
  }
  }

 @@ -367,48 +365,95 @@ void of_node_release(struct kobject *kobj)
  }

  /**
 - * __of_prop_dup - Copy a property dynamically.
 - * @prop:   Property to copy
 + * of_property_free - Free a property allocated dynamically.
 + * @prop:   Property to be freed
 + */
 +void of_property_free(const struct property *prop)
 +{
 +kfree(prop->value);
 +kfree(prop->name);
 +kfree(prop);
 +}
 +EXPORT_SYMBOL(of_property_free);
 +
 +/**
 + * of_property_alloc - Allocate a property dynamically.
 + * @name:   Name of the new property
 + * @value:  Value that will be copied into the new property value
 + * @value_len:  length of @value to be copied into the new property 
 value
 + * @len:Length of new property value, must be greater than @value_len
>>>
>>> What's the usecase for the lengths being different? That doesn't seem
>>> like a common case, so perhaps handle it with a NULL value and
>>> non-zero length. Then the caller has to deal with populating
>>> prop->value.
>>>
   * @allocflags: Allocation flags (typically pass GFP_KERNEL)
   *
 - * Copy a property by dynamically allocating the memory of both the
 + * Create a property by dynamically allocating the memory of both the
   * property structure and the property name & contents. The property's
   * flags have the OF_DYNAMIC bit set so that we can differentiate between
   * dynamically allocated properties and not.
   *
   * Return: The newly allocated property or NULL on out of memory error.
   */
 -struct property *__of_prop_dup(const struct property *prop, gfp_t 
 allocflags)
 +struct property *of_property_alloc(const char *name, const void *value,
 +   int value_len, int len, gfp_t allocflags)
  {
 -struct property *new;
 +int alloc_len = len;
 +struct property *prop;
 +
 +if (len < value_len)
 +return NULL;

 -new = kzalloc(sizeof(*new), allocflags);
 -if (!new)
 +prop = kzalloc(sizeof(*prop), allocflags);
 +if (!prop)
  return NULL;

 +prop->name = kstrdup(name, allocflags);
 +if (!prop->name)
 +goto out_err;
 +
  /*
 - * NOTE: There is no check for zero length value.
 - * In case of a boolean property, this will allocate a value
 - * of zero bytes. We do this to work around the use
 - * of of_get_property() calls on boolean values.
 + * Even if the property has no value, it must be set to a
 + * non-null value since of_get_property() is used to check
 + * some values that might or not have a values (ranges for
 + * instance). Moreover, when the node is released, prop->value
 + * is kfreed so the memory must come from kmalloc.
>>>
>>> Allowing for NULL value didn't turn out well...
>>>
>>> We know that we can do the kfree because OF_DYNAMIC is set IIRC...
>>>
>>> If we do 1 allocation for prop and value, then we can test
>>> for "prop->value == prop + 1" to determine if we need to free or not.
>>
>> If its a single allocation do we even need a test? Doesn't kfree(prop) take 
>> care
>> of the property and the trailing memory allocated for the value?
> 
> Yes, it does when it's a single alloc, but it's testing for when
> prop->value is not a single allocation because we could have either.
> 

Ok, that is the part I was missing. Thanks for the clarification.

-Tyrel



Re: [PATCH 1/3] of: dynamic: add of_property_alloc() and of_property_free()

2022-06-02 Thread Rob Herring
On Wed, Jun 1, 2022 at 5:31 PM Tyrel Datwyler  wrote:
>
> On 5/5/22 12:37, Rob Herring wrote:
> > On Wed, May 04, 2022 at 05:40:31PM +0200, Clément Léger wrote:
> >> Add function which allows to dynamically allocate and free properties.
> >> Use this function internally for all code that used the same logic
> >> (mainly __of_prop_dup()).
> >>
> >> Signed-off-by: Clément Léger 
> >> ---
> >>  drivers/of/dynamic.c | 101 ++-
> >>  include/linux/of.h   |  16 +++
> >>  2 files changed, 88 insertions(+), 29 deletions(-)
> >>
> >> diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c
> >> index cd3821a6444f..e8700e509d2e 100644
> >> --- a/drivers/of/dynamic.c
> >> +++ b/drivers/of/dynamic.c
> >> @@ -313,9 +313,7 @@ static void property_list_free(struct property 
> >> *prop_list)
> >>
> >>  for (prop = prop_list; prop != NULL; prop = next) {
> >>  next = prop->next;
> >> -kfree(prop->name);
> >> -kfree(prop->value);
> >> -kfree(prop);
> >> +of_property_free(prop);
> >>  }
> >>  }
> >>
> >> @@ -367,48 +365,95 @@ void of_node_release(struct kobject *kobj)
> >>  }
> >>
> >>  /**
> >> - * __of_prop_dup - Copy a property dynamically.
> >> - * @prop:   Property to copy
> >> + * of_property_free - Free a property allocated dynamically.
> >> + * @prop:   Property to be freed
> >> + */
> >> +void of_property_free(const struct property *prop)
> >> +{
> >> +kfree(prop->value);
> >> +kfree(prop->name);
> >> +kfree(prop);
> >> +}
> >> +EXPORT_SYMBOL(of_property_free);
> >> +
> >> +/**
> >> + * of_property_alloc - Allocate a property dynamically.
> >> + * @name:   Name of the new property
> >> + * @value:  Value that will be copied into the new property value
> >> + * @value_len:  length of @value to be copied into the new property 
> >> value
> >> + * @len:Length of new property value, must be greater than @value_len
> >
> > What's the usecase for the lengths being different? That doesn't seem
> > like a common case, so perhaps handle it with a NULL value and
> > non-zero length. Then the caller has to deal with populating
> > prop->value.
> >
> >>   * @allocflags: Allocation flags (typically pass GFP_KERNEL)
> >>   *
> >> - * Copy a property by dynamically allocating the memory of both the
> >> + * Create a property by dynamically allocating the memory of both the
> >>   * property structure and the property name & contents. The property's
> >>   * flags have the OF_DYNAMIC bit set so that we can differentiate between
> >>   * dynamically allocated properties and not.
> >>   *
> >>   * Return: The newly allocated property or NULL on out of memory error.
> >>   */
> >> -struct property *__of_prop_dup(const struct property *prop, gfp_t 
> >> allocflags)
> >> +struct property *of_property_alloc(const char *name, const void *value,
> >> +   int value_len, int len, gfp_t allocflags)
> >>  {
> >> -struct property *new;
> >> +int alloc_len = len;
> >> +struct property *prop;
> >> +
> >> +if (len < value_len)
> >> +return NULL;
> >>
> >> -new = kzalloc(sizeof(*new), allocflags);
> >> -if (!new)
> >> +prop = kzalloc(sizeof(*prop), allocflags);
> >> +if (!prop)
> >>  return NULL;
> >>
> >> +prop->name = kstrdup(name, allocflags);
> >> +if (!prop->name)
> >> +goto out_err;
> >> +
> >>  /*
> >> - * NOTE: There is no check for zero length value.
> >> - * In case of a boolean property, this will allocate a value
> >> - * of zero bytes. We do this to work around the use
> >> - * of of_get_property() calls on boolean values.
> >> + * Even if the property has no value, it must be set to a
> >> + * non-null value since of_get_property() is used to check
> >> + * some values that might or not have a values (ranges for
> >> + * instance). Moreover, when the node is released, prop->value
> >> + * is kfreed so the memory must come from kmalloc.
> >
> > Allowing for NULL value didn't turn out well...
> >
> > We know that we can do the kfree because OF_DYNAMIC is set IIRC...
> >
> > If we do 1 allocation for prop and value, then we can test
> > for "prop->value == prop + 1" to determine if we need to free or not.
>
> If its a single allocation do we even need a test? Doesn't kfree(prop) take 
> care
> of the property and the trailing memory allocated for the value?

Yes, it does when it's a single alloc, but it's testing for when
prop->value is not a single allocation because we could have either.

Rob


Re: [PATCH 1/3] of: dynamic: add of_property_alloc() and of_property_free()

2022-06-01 Thread Tyrel Datwyler
On 5/5/22 12:37, Rob Herring wrote:
> On Wed, May 04, 2022 at 05:40:31PM +0200, Clément Léger wrote:
>> Add function which allows to dynamically allocate and free properties.
>> Use this function internally for all code that used the same logic
>> (mainly __of_prop_dup()).
>>
>> Signed-off-by: Clément Léger 
>> ---
>>  drivers/of/dynamic.c | 101 ++-
>>  include/linux/of.h   |  16 +++
>>  2 files changed, 88 insertions(+), 29 deletions(-)
>>
>> diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c
>> index cd3821a6444f..e8700e509d2e 100644
>> --- a/drivers/of/dynamic.c
>> +++ b/drivers/of/dynamic.c
>> @@ -313,9 +313,7 @@ static void property_list_free(struct property 
>> *prop_list)
>>  
>>  for (prop = prop_list; prop != NULL; prop = next) {
>>  next = prop->next;
>> -kfree(prop->name);
>> -kfree(prop->value);
>> -kfree(prop);
>> +of_property_free(prop);
>>  }
>>  }
>>  
>> @@ -367,48 +365,95 @@ void of_node_release(struct kobject *kobj)
>>  }
>>  
>>  /**
>> - * __of_prop_dup - Copy a property dynamically.
>> - * @prop:   Property to copy
>> + * of_property_free - Free a property allocated dynamically.
>> + * @prop:   Property to be freed
>> + */
>> +void of_property_free(const struct property *prop)
>> +{
>> +kfree(prop->value);
>> +kfree(prop->name);
>> +kfree(prop);
>> +}
>> +EXPORT_SYMBOL(of_property_free);
>> +
>> +/**
>> + * of_property_alloc - Allocate a property dynamically.
>> + * @name:   Name of the new property
>> + * @value:  Value that will be copied into the new property value
>> + * @value_len:  length of @value to be copied into the new property 
>> value
>> + * @len:Length of new property value, must be greater than @value_len
> 
> What's the usecase for the lengths being different? That doesn't seem 
> like a common case, so perhaps handle it with a NULL value and 
> non-zero length. Then the caller has to deal with populating 
> prop->value.
> 
>>   * @allocflags: Allocation flags (typically pass GFP_KERNEL)
>>   *
>> - * Copy a property by dynamically allocating the memory of both the
>> + * Create a property by dynamically allocating the memory of both the
>>   * property structure and the property name & contents. The property's
>>   * flags have the OF_DYNAMIC bit set so that we can differentiate between
>>   * dynamically allocated properties and not.
>>   *
>>   * Return: The newly allocated property or NULL on out of memory error.
>>   */
>> -struct property *__of_prop_dup(const struct property *prop, gfp_t 
>> allocflags)
>> +struct property *of_property_alloc(const char *name, const void *value,
>> +   int value_len, int len, gfp_t allocflags)
>>  {
>> -struct property *new;
>> +int alloc_len = len;
>> +struct property *prop;
>> +
>> +if (len < value_len)
>> +return NULL;
>>  
>> -new = kzalloc(sizeof(*new), allocflags);
>> -if (!new)
>> +prop = kzalloc(sizeof(*prop), allocflags);
>> +if (!prop)
>>  return NULL;
>>  
>> +prop->name = kstrdup(name, allocflags);
>> +if (!prop->name)
>> +goto out_err;
>> +
>>  /*
>> - * NOTE: There is no check for zero length value.
>> - * In case of a boolean property, this will allocate a value
>> - * of zero bytes. We do this to work around the use
>> - * of of_get_property() calls on boolean values.
>> + * Even if the property has no value, it must be set to a
>> + * non-null value since of_get_property() is used to check
>> + * some values that might or not have a values (ranges for
>> + * instance). Moreover, when the node is released, prop->value
>> + * is kfreed so the memory must come from kmalloc.
> 
> Allowing for NULL value didn't turn out well...
> 
> We know that we can do the kfree because OF_DYNAMIC is set IIRC...
> 
> If we do 1 allocation for prop and value, then we can test 
> for "prop->value == prop + 1" to determine if we need to free or not.

If its a single allocation do we even need a test? Doesn't kfree(prop) take care
of the property and the trailing memory allocated for the value?

-Tyrel

> 
>>   */
>> -new->name = kstrdup(prop->name, allocflags);
>> -new->value = kmemdup(prop->value, prop->length, allocflags);
>> -new->length = prop->length;
>> -if (!new->name || !new->value)
>> -goto err_free;
>> +if (!alloc_len)
>> +alloc_len = 1;
>>  
>> -/* mark the property as dynamic */
>> -of_property_set_flag(new, OF_DYNAMIC);
>> +prop->value = kzalloc(alloc_len, allocflags);
>> +if (!prop->value)
>> +goto out_err;
>>  
>> -return new;
>> +if (value)
>> +memcpy(prop->value, value, value_len);
>> +
>> +prop->length = len;
>> +of_property_set_flag(prop, OF_DYNAMIC);
>> +
>> +return prop;
>> +
>> +out_err:
>> +of_property_free(prop);
>>  

Re: [PATCH 1/3] of: dynamic: add of_property_alloc() and of_property_free()

2022-05-05 Thread Rob Herring
On Wed, May 04, 2022 at 05:40:31PM +0200, Clément Léger wrote:
> Add function which allows to dynamically allocate and free properties.
> Use this function internally for all code that used the same logic
> (mainly __of_prop_dup()).
> 
> Signed-off-by: Clément Léger 
> ---
>  drivers/of/dynamic.c | 101 ++-
>  include/linux/of.h   |  16 +++
>  2 files changed, 88 insertions(+), 29 deletions(-)
> 
> diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c
> index cd3821a6444f..e8700e509d2e 100644
> --- a/drivers/of/dynamic.c
> +++ b/drivers/of/dynamic.c
> @@ -313,9 +313,7 @@ static void property_list_free(struct property *prop_list)
>  
>   for (prop = prop_list; prop != NULL; prop = next) {
>   next = prop->next;
> - kfree(prop->name);
> - kfree(prop->value);
> - kfree(prop);
> + of_property_free(prop);
>   }
>  }
>  
> @@ -367,48 +365,95 @@ void of_node_release(struct kobject *kobj)
>  }
>  
>  /**
> - * __of_prop_dup - Copy a property dynamically.
> - * @prop:Property to copy
> + * of_property_free - Free a property allocated dynamically.
> + * @prop:Property to be freed
> + */
> +void of_property_free(const struct property *prop)
> +{
> + kfree(prop->value);
> + kfree(prop->name);
> + kfree(prop);
> +}
> +EXPORT_SYMBOL(of_property_free);
> +
> +/**
> + * of_property_alloc - Allocate a property dynamically.
> + * @name:Name of the new property
> + * @value:   Value that will be copied into the new property value
> + * @value_len:   length of @value to be copied into the new property 
> value
> + * @len: Length of new property value, must be greater than @value_len

What's the usecase for the lengths being different? That doesn't seem 
like a common case, so perhaps handle it with a NULL value and 
non-zero length. Then the caller has to deal with populating 
prop->value.

>   * @allocflags:  Allocation flags (typically pass GFP_KERNEL)
>   *
> - * Copy a property by dynamically allocating the memory of both the
> + * Create a property by dynamically allocating the memory of both the
>   * property structure and the property name & contents. The property's
>   * flags have the OF_DYNAMIC bit set so that we can differentiate between
>   * dynamically allocated properties and not.
>   *
>   * Return: The newly allocated property or NULL on out of memory error.
>   */
> -struct property *__of_prop_dup(const struct property *prop, gfp_t allocflags)
> +struct property *of_property_alloc(const char *name, const void *value,
> +int value_len, int len, gfp_t allocflags)
>  {
> - struct property *new;
> + int alloc_len = len;
> + struct property *prop;
> +
> + if (len < value_len)
> + return NULL;
>  
> - new = kzalloc(sizeof(*new), allocflags);
> - if (!new)
> + prop = kzalloc(sizeof(*prop), allocflags);
> + if (!prop)
>   return NULL;
>  
> + prop->name = kstrdup(name, allocflags);
> + if (!prop->name)
> + goto out_err;
> +
>   /*
> -  * NOTE: There is no check for zero length value.
> -  * In case of a boolean property, this will allocate a value
> -  * of zero bytes. We do this to work around the use
> -  * of of_get_property() calls on boolean values.
> +  * Even if the property has no value, it must be set to a
> +  * non-null value since of_get_property() is used to check
> +  * some values that might or not have a values (ranges for
> +  * instance). Moreover, when the node is released, prop->value
> +  * is kfreed so the memory must come from kmalloc.

Allowing for NULL value didn't turn out well...

We know that we can do the kfree because OF_DYNAMIC is set IIRC...

If we do 1 allocation for prop and value, then we can test 
for "prop->value == prop + 1" to determine if we need to free or not.

>*/
> - new->name = kstrdup(prop->name, allocflags);
> - new->value = kmemdup(prop->value, prop->length, allocflags);
> - new->length = prop->length;
> - if (!new->name || !new->value)
> - goto err_free;
> + if (!alloc_len)
> + alloc_len = 1;
>  
> - /* mark the property as dynamic */
> - of_property_set_flag(new, OF_DYNAMIC);
> + prop->value = kzalloc(alloc_len, allocflags);
> + if (!prop->value)
> + goto out_err;
>  
> - return new;
> + if (value)
> + memcpy(prop->value, value, value_len);
> +
> + prop->length = len;
> + of_property_set_flag(prop, OF_DYNAMIC);
> +
> + return prop;
> +
> +out_err:
> + of_property_free(prop);
>  
> - err_free:
> - kfree(new->name);
> - kfree(new->value);
> - kfree(new);
>   return NULL;
>  }
> +EXPORT_SYMBOL(of_property_alloc);
> +
> +/**
> + * __of_prop_dup - Copy a property dynamically.
> + * @prop:Property to copy
> + * @allocflags:  Allocation flags 

Re: [PATCH 1/3] of: dynamic: add of_property_alloc() and of_property_free()

2022-05-05 Thread Rob Herring
On Thu, May 05, 2022 at 07:30:47AM +, Christophe Leroy wrote:
> 
> 
> Le 04/05/2022 à 17:40, Clément Léger a écrit :
> > Add function which allows to dynamically allocate and free properties.
> > Use this function internally for all code that used the same logic
> > (mainly __of_prop_dup()).
> > 
> > Signed-off-by: Clément Léger 
> > ---
> >   drivers/of/dynamic.c | 101 ++-
> >   include/linux/of.h   |  16 +++
> >   2 files changed, 88 insertions(+), 29 deletions(-)
> > 
> > diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c
> > index cd3821a6444f..e8700e509d2e 100644
> > --- a/drivers/of/dynamic.c
> > +++ b/drivers/of/dynamic.c
> > @@ -313,9 +313,7 @@ static void property_list_free(struct property 
> > *prop_list)
> >   
> > for (prop = prop_list; prop != NULL; prop = next) {
> > next = prop->next;
> > -   kfree(prop->name);
> > -   kfree(prop->value);
> > -   kfree(prop);
> > +   of_property_free(prop);
> > }
> >   }
> >   
> > @@ -367,48 +365,95 @@ void of_node_release(struct kobject *kobj)
> >   }
> >   
> >   /**
> > - * __of_prop_dup - Copy a property dynamically.
> > - * @prop:  Property to copy
> > + * of_property_free - Free a property allocated dynamically.
> > + * @prop:  Property to be freed
> > + */
> > +void of_property_free(const struct property *prop)
> > +{
> > +   kfree(prop->value);
> > +   kfree(prop->name);
> > +   kfree(prop);
> > +}
> > +EXPORT_SYMBOL(of_property_free);
> > +
> > +/**
> > + * of_property_alloc - Allocate a property dynamically.
> > + * @name:  Name of the new property
> > + * @value: Value that will be copied into the new property value
> > + * @value_len: length of @value to be copied into the new property 
> > value
> > + * @len:   Length of new property value, must be greater than @value_len
> >* @allocflags:   Allocation flags (typically pass GFP_KERNEL)
> >*
> > - * Copy a property by dynamically allocating the memory of both the
> > + * Create a property by dynamically allocating the memory of both the
> >* property structure and the property name & contents. The property's
> >* flags have the OF_DYNAMIC bit set so that we can differentiate between
> >* dynamically allocated properties and not.
> >*
> >* Return: The newly allocated property or NULL on out of memory error.
> >*/
> > -struct property *__of_prop_dup(const struct property *prop, gfp_t 
> > allocflags)
> > +struct property *of_property_alloc(const char *name, const void *value,
> > +  int value_len, int len, gfp_t allocflags)
> >   {
> > -   struct property *new;
> > +   int alloc_len = len;
> > +   struct property *prop;
> > +
> > +   if (len < value_len)
> > +   return NULL;
> >   
> > -   new = kzalloc(sizeof(*new), allocflags);
> > -   if (!new)
> > +   prop = kzalloc(sizeof(*prop), allocflags);
> > +   if (!prop)
> > return NULL;
> >   
> > +   prop->name = kstrdup(name, allocflags);
> > +   if (!prop->name)
> > +   goto out_err;
> > +
> > /*
> > -* NOTE: There is no check for zero length value.
> > -* In case of a boolean property, this will allocate a value
> > -* of zero bytes. We do this to work around the use
> > -* of of_get_property() calls on boolean values.
> > +* Even if the property has no value, it must be set to a
> > +* non-null value since of_get_property() is used to check
> > +* some values that might or not have a values (ranges for
> > +* instance). Moreover, when the node is released, prop->value
> > +* is kfreed so the memory must come from kmalloc.
> >  */
> > -   new->name = kstrdup(prop->name, allocflags);
> > -   new->value = kmemdup(prop->value, prop->length, allocflags);
> > -   new->length = prop->length;
> > -   if (!new->name || !new->value)
> > -   goto err_free;
> > +   if (!alloc_len)
> > +   alloc_len = 1;
> >   
> > -   /* mark the property as dynamic */
> > -   of_property_set_flag(new, OF_DYNAMIC);
> > +   prop->value = kzalloc(alloc_len, allocflags);
> > +   if (!prop->value)
> > +   goto out_err;
> >   
> > -   return new;
> > +   if (value)
> > +   memcpy(prop->value, value, value_len);
> 
> Could you use kmemdup() instead of kzalloc+memcpy ?

I'd prefer there be 1 alloc for struct property and value instead of 2. 
And maybe 'name' gets rolled into it too, but that gets a bit more 
complicated to manage I think. 

With memcpy, note this series[1].

Rob

[1] https://lore.kernel.org/all/20220504014440.3697851-30-keesc...@chromium.org/


Re: [PATCH 1/3] of: dynamic: add of_property_alloc() and of_property_free()

2022-05-05 Thread Christophe Leroy


Le 04/05/2022 à 17:40, Clément Léger a écrit :
> Add function which allows to dynamically allocate and free properties.
> Use this function internally for all code that used the same logic
> (mainly __of_prop_dup()).
> 
> Signed-off-by: Clément Léger 
> ---
>   drivers/of/dynamic.c | 101 ++-
>   include/linux/of.h   |  16 +++
>   2 files changed, 88 insertions(+), 29 deletions(-)
> 
> diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c
> index cd3821a6444f..e8700e509d2e 100644
> --- a/drivers/of/dynamic.c
> +++ b/drivers/of/dynamic.c
> @@ -313,9 +313,7 @@ static void property_list_free(struct property *prop_list)
>   
>   for (prop = prop_list; prop != NULL; prop = next) {
>   next = prop->next;
> - kfree(prop->name);
> - kfree(prop->value);
> - kfree(prop);
> + of_property_free(prop);
>   }
>   }
>   
> @@ -367,48 +365,95 @@ void of_node_release(struct kobject *kobj)
>   }
>   
>   /**
> - * __of_prop_dup - Copy a property dynamically.
> - * @prop:Property to copy
> + * of_property_free - Free a property allocated dynamically.
> + * @prop:Property to be freed
> + */
> +void of_property_free(const struct property *prop)
> +{
> + kfree(prop->value);
> + kfree(prop->name);
> + kfree(prop);
> +}
> +EXPORT_SYMBOL(of_property_free);
> +
> +/**
> + * of_property_alloc - Allocate a property dynamically.
> + * @name:Name of the new property
> + * @value:   Value that will be copied into the new property value
> + * @value_len:   length of @value to be copied into the new property 
> value
> + * @len: Length of new property value, must be greater than @value_len
>* @allocflags: Allocation flags (typically pass GFP_KERNEL)
>*
> - * Copy a property by dynamically allocating the memory of both the
> + * Create a property by dynamically allocating the memory of both the
>* property structure and the property name & contents. The property's
>* flags have the OF_DYNAMIC bit set so that we can differentiate between
>* dynamically allocated properties and not.
>*
>* Return: The newly allocated property or NULL on out of memory error.
>*/
> -struct property *__of_prop_dup(const struct property *prop, gfp_t allocflags)
> +struct property *of_property_alloc(const char *name, const void *value,
> +int value_len, int len, gfp_t allocflags)
>   {
> - struct property *new;
> + int alloc_len = len;
> + struct property *prop;
> +
> + if (len < value_len)
> + return NULL;
>   
> - new = kzalloc(sizeof(*new), allocflags);
> - if (!new)
> + prop = kzalloc(sizeof(*prop), allocflags);
> + if (!prop)
>   return NULL;
>   
> + prop->name = kstrdup(name, allocflags);
> + if (!prop->name)
> + goto out_err;
> +
>   /*
> -  * NOTE: There is no check for zero length value.
> -  * In case of a boolean property, this will allocate a value
> -  * of zero bytes. We do this to work around the use
> -  * of of_get_property() calls on boolean values.
> +  * Even if the property has no value, it must be set to a
> +  * non-null value since of_get_property() is used to check
> +  * some values that might or not have a values (ranges for
> +  * instance). Moreover, when the node is released, prop->value
> +  * is kfreed so the memory must come from kmalloc.
>*/
> - new->name = kstrdup(prop->name, allocflags);
> - new->value = kmemdup(prop->value, prop->length, allocflags);
> - new->length = prop->length;
> - if (!new->name || !new->value)
> - goto err_free;
> + if (!alloc_len)
> + alloc_len = 1;
>   
> - /* mark the property as dynamic */
> - of_property_set_flag(new, OF_DYNAMIC);
> + prop->value = kzalloc(alloc_len, allocflags);
> + if (!prop->value)
> + goto out_err;
>   
> - return new;
> + if (value)
> + memcpy(prop->value, value, value_len);

Could you use kmemdup() instead of kzalloc+memcpy ?

> +
> + prop->length = len;
> + of_property_set_flag(prop, OF_DYNAMIC);
> +
> + return prop;
> +
> +out_err:
> + of_property_free(prop);
>   
> - err_free:
> - kfree(new->name);
> - kfree(new->value);
> - kfree(new);
>   return NULL;
>   }
> +EXPORT_SYMBOL(of_property_alloc);
> +
> +/**
> + * __of_prop_dup - Copy a property dynamically.
> + * @prop:Property to copy
> + * @allocflags:  Allocation flags (typically pass GFP_KERNEL)
> + *
> + * Copy a property by dynamically allocating the memory of both the
> + * property structure and the property name & contents. The property's
> + * flags have the OF_DYNAMIC bit set so that we can differentiate between
> + * dynamically allocated properties and not.
> + *
> + * Return: The newly allocated property or NULL on out of memory error.
> + */
>