Re: [PATCH v3 13/18] of: overlay: check prevents multiple fragments touching same property

2018-10-15 Thread Frank Rowand
On 10/14/18 20:21, Frank Rowand wrote:
> On 10/14/18 18:55, Joe Perches wrote:
>> On Sun, 2018-10-14 at 18:52 -0700, Frank Rowand wrote:
>>> On 10/14/18 18:06, Joe Perches wrote:
 On Sun, 2018-10-14 at 17:24 -0700, frowand.l...@gmail.com wrote:
> From: Frank Rowand 
>
> Add test case of two fragments updating the same property.  After
> adding the test case, the system hangs at end of boot, after
> after slub stack dumps from kfree() in crypto modprobe code.
>> []
 I think this is worse performance than before.

 This now walks all entries when before it would
 return -EINVAL directly when it found a match.
>>>
>>> Yes, it is worse performance, but that is OK.
>>>
>>> This is a check that is done when a devicetree overlay is applied.
>>> If an error occurs then that means that the overlay was incorrectly
>>> specified.  The file drivers/of/unittest-data/overlay_bad_add_dup_prop.dts
>>> in this patch provides an example of how a bad overlay can be created.
>>>
>>> Once an error was detected, the check could return immediately, or it
>>> could continue to give a complete list of detected errors.  I chose to
>>> give the complete list of detected errors.
>>
>> Swell.  Please describe that in the commit message.
> 
> If a version 4 of the series is created I will update the commit
> message.  As a stand alone item I do not think it is worth a
> new version.

And there will be a version 4, so I will update the commit message.

-Frank


Re: [PATCH v3 13/18] of: overlay: check prevents multiple fragments touching same property

2018-10-14 Thread Frank Rowand
On 10/14/18 18:55, Joe Perches wrote:
> On Sun, 2018-10-14 at 18:52 -0700, Frank Rowand wrote:
>> On 10/14/18 18:06, Joe Perches wrote:
>>> On Sun, 2018-10-14 at 17:24 -0700, frowand.l...@gmail.com wrote:
 From: Frank Rowand 

 Add test case of two fragments updating the same property.  After
 adding the test case, the system hangs at end of boot, after
 after slub stack dumps from kfree() in crypto modprobe code.
> []
>>> I think this is worse performance than before.
>>>
>>> This now walks all entries when before it would
>>> return -EINVAL directly when it found a match.
>>
>> Yes, it is worse performance, but that is OK.
>>
>> This is a check that is done when a devicetree overlay is applied.
>> If an error occurs then that means that the overlay was incorrectly
>> specified.  The file drivers/of/unittest-data/overlay_bad_add_dup_prop.dts
>> in this patch provides an example of how a bad overlay can be created.
>>
>> Once an error was detected, the check could return immediately, or it
>> could continue to give a complete list of detected errors.  I chose to
>> give the complete list of detected errors.
> 
> Swell.  Please describe that in the commit message.

If a version 4 of the series is created I will update the commit
message.  As a stand alone item I do not think it is worth a
new version.

-Frank


Re: [PATCH v3 13/18] of: overlay: check prevents multiple fragments touching same property

2018-10-14 Thread Joe Perches
On Sun, 2018-10-14 at 18:52 -0700, Frank Rowand wrote:
> On 10/14/18 18:06, Joe Perches wrote:
> > On Sun, 2018-10-14 at 17:24 -0700, frowand.l...@gmail.com wrote:
> > > From: Frank Rowand 
> > > 
> > > Add test case of two fragments updating the same property.  After
> > > adding the test case, the system hangs at end of boot, after
> > > after slub stack dumps from kfree() in crypto modprobe code.
[]
> > I think this is worse performance than before.
> > 
> > This now walks all entries when before it would
> > return -EINVAL directly when it found a match.
> 
> Yes, it is worse performance, but that is OK.
> 
> This is a check that is done when a devicetree overlay is applied.
> If an error occurs then that means that the overlay was incorrectly
> specified.  The file drivers/of/unittest-data/overlay_bad_add_dup_prop.dts
> in this patch provides an example of how a bad overlay can be created.
> 
> Once an error was detected, the check could return immediately, or it
> could continue to give a complete list of detected errors.  I chose to
> give the complete list of detected errors.

Swell.  Please describe that in the commit message.




Re: [PATCH v3 13/18] of: overlay: check prevents multiple fragments touching same property

2018-10-14 Thread Frank Rowand
On 10/14/18 18:06, Joe Perches wrote:
> On Sun, 2018-10-14 at 17:24 -0700, frowand.l...@gmail.com wrote:
>> From: Frank Rowand 
>>
>> Add test case of two fragments updating the same property.  After
>> adding the test case, the system hangs at end of boot, after
>> after slub stack dumps from kfree() in crypto modprobe code.
> []
>> -static int check_changeset_dup_add_node(struct overlay_changeset *ovcs)
>> +static int changeset_dup_entry_check(struct overlay_changeset *ovcs)
>>  {
>> -struct of_changeset_entry *ce_1, *ce_2;
>> -char *fn_1, *fn_2;
>> -int name_match;
>> +struct of_changeset_entry *ce_1;
>> +int dup_entry = 0;
>>  
>>  list_for_each_entry(ce_1, >cset.entries, node) {
>> -
>> -if (ce_1->action == OF_RECONFIG_ATTACH_NODE ||
>> -ce_1->action == OF_RECONFIG_DETACH_NODE) {
>> -
>> -ce_2 = ce_1;
>> -list_for_each_entry_continue(ce_2, >cset.entries, 
>> node) {
>> -if (ce_2->action == OF_RECONFIG_ATTACH_NODE ||
>> -ce_2->action == OF_RECONFIG_DETACH_NODE) {
>> -/* inexpensive name compare */
>> -if (!of_node_cmp(ce_1->np->full_name,
>> -ce_2->np->full_name)) {
>> -/* expensive full path name 
>> compare */
>> -fn_1 = kasprintf(GFP_KERNEL, 
>> "%pOF", ce_1->np);
>> -fn_2 = kasprintf(GFP_KERNEL, 
>> "%pOF", ce_2->np);
>> -name_match = !strcmp(fn_1, 
>> fn_2);
>> -kfree(fn_1);
>> -kfree(fn_2);
>> -if (name_match) {
>> -pr_err("ERROR: multiple 
>> overlay fragments add and/or delete node %pOF\n",
>> -   ce_1->np);
>> -return -EINVAL;
>> -}
>> -}
>> -}
>> -}
>> -}
>> +dup_entry |= find_dup_cset_node_entry(ovcs, ce_1);
>> +dup_entry |= find_dup_cset_prop(ovcs, ce_1);
> 
> I think this is worse performance than before.
> 
> This now walks all entries when before it would
> return -EINVAL directly when it found a match.

Yes, it is worse performance, but that is OK.

This is a check that is done when a devicetree overlay is applied.
If an error occurs then that means that the overlay was incorrectly
specified.  The file drivers/of/unittest-data/overlay_bad_add_dup_prop.dts
in this patch provides an example of how a bad overlay can be created.

Once an error was detected, the check could return immediately, or it
could continue to give a complete list of detected errors.  I chose to
give the complete list of detected errors.

-Frank


Re: [PATCH v3 13/18] of: overlay: check prevents multiple fragments touching same property

2018-10-14 Thread Joe Perches
On Sun, 2018-10-14 at 17:24 -0700, frowand.l...@gmail.com wrote:
> From: Frank Rowand 
> 
> Add test case of two fragments updating the same property.  After
> adding the test case, the system hangs at end of boot, after
> after slub stack dumps from kfree() in crypto modprobe code.
[]
> -static int check_changeset_dup_add_node(struct overlay_changeset *ovcs)
> +static int changeset_dup_entry_check(struct overlay_changeset *ovcs)
>  {
> - struct of_changeset_entry *ce_1, *ce_2;
> - char *fn_1, *fn_2;
> - int name_match;
> + struct of_changeset_entry *ce_1;
> + int dup_entry = 0;
>  
>   list_for_each_entry(ce_1, >cset.entries, node) {
> -
> - if (ce_1->action == OF_RECONFIG_ATTACH_NODE ||
> - ce_1->action == OF_RECONFIG_DETACH_NODE) {
> -
> - ce_2 = ce_1;
> - list_for_each_entry_continue(ce_2, >cset.entries, 
> node) {
> - if (ce_2->action == OF_RECONFIG_ATTACH_NODE ||
> - ce_2->action == OF_RECONFIG_DETACH_NODE) {
> - /* inexpensive name compare */
> - if (!of_node_cmp(ce_1->np->full_name,
> - ce_2->np->full_name)) {
> - /* expensive full path name 
> compare */
> - fn_1 = kasprintf(GFP_KERNEL, 
> "%pOF", ce_1->np);
> - fn_2 = kasprintf(GFP_KERNEL, 
> "%pOF", ce_2->np);
> - name_match = !strcmp(fn_1, 
> fn_2);
> - kfree(fn_1);
> - kfree(fn_2);
> - if (name_match) {
> - pr_err("ERROR: multiple 
> overlay fragments add and/or delete node %pOF\n",
> -ce_1->np);
> - return -EINVAL;
> - }
> - }
> - }
> - }
> - }
> + dup_entry |= find_dup_cset_node_entry(ovcs, ce_1);
> + dup_entry |= find_dup_cset_prop(ovcs, ce_1);

I think this is worse performance than before.

This now walks all entries when before it would
return -EINVAL directly when it found a match.