All of lore.kernel.org
 help / color / mirror / Atom feed
From: Frank Rowand <frowand.list@gmail.com>
To: Joe Perches <joe@perches.com>, Rob Herring <robh+dt@kernel.org>,
	Pantelis Antoniou <pantelis.antoniou@konsulko.com>,
	Michael Ellerman <mpe@ellerman.id.au>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Paul Mackerras <paulus@samba.org>, Alan Tull <atull@kernel.org>,
	Moritz Fischer <mdf@kernel.org>
Cc: linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,
	devicetree@vger.kernel.org, linux-fpga@vger.kernel.org
Subject: Re: [PATCH v3 13/18] of: overlay: check prevents multiple fragments touching same property
Date: Sun, 14 Oct 2018 18:52:21 -0700	[thread overview]
Message-ID: <850f0866-1189-5a49-01c5-79caf270abbd@gmail.com> (raw)
In-Reply-To: <b6ee53f7e02cc3ea52713ae82402e97d7050cb3e.camel@perches.com>

On 10/14/18 18:06, Joe Perches wrote:
> On Sun, 2018-10-14 at 17:24 -0700, frowand.list@gmail.com wrote:
>> From: Frank Rowand <frank.rowand@sony.com>
>>
>> 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, &ovcs->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, &ovcs->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

WARNING: multiple messages have this Message-ID (diff)
From: Frank Rowand <frowand.list@gmail.com>
To: Joe Perches <joe@perches.com>, Rob Herring <robh+dt@kernel.org>,
	Pantelis Antoniou <pantelis.antoniou@konsulko.com>,
	Michael Ellerman <mpe@ellerman.id.au>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Paul Mackerras <paulus@samba.org>, Alan Tull <atull@kernel.org>,
	Moritz Fischer <mdf@kernel.org>
Cc: devicetree@vger.kernel.org, linux-fpga@vger.kernel.org,
	linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 13/18] of: overlay: check prevents multiple fragments touching same property
Date: Sun, 14 Oct 2018 18:52:21 -0700	[thread overview]
Message-ID: <850f0866-1189-5a49-01c5-79caf270abbd@gmail.com> (raw)
In-Reply-To: <b6ee53f7e02cc3ea52713ae82402e97d7050cb3e.camel@perches.com>

On 10/14/18 18:06, Joe Perches wrote:
> On Sun, 2018-10-14 at 17:24 -0700, frowand.list@gmail.com wrote:
>> From: Frank Rowand <frank.rowand@sony.com>
>>
>> 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, &ovcs->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, &ovcs->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

  reply	other threads:[~2018-10-15  1:52 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-15  0:24 [PATCH v3 00/18] of: overlay: validation checks, subsequent fixes frowand.list
2018-10-15  0:24 ` frowand.list
2018-10-15  0:24 ` [PATCH v3 01/18] of: overlay: add tests to validate kfrees from overlay removal frowand.list
2018-10-15  0:24   ` frowand.list
2018-10-15  0:24 ` [PATCH v3 02/18] of: overlay: add missing of_node_put() after add new node to changeset frowand.list
2018-10-15  0:24   ` frowand.list
2018-10-15  0:24 ` [PATCH v3 03/18] of: overlay: add missing of_node_get() in __of_attach_node_sysfs frowand.list
2018-10-15  0:24   ` frowand.list
2018-10-15  0:24 ` [PATCH v3 04/18] powerpc/pseries: add of_node_put() in dlpar_detach_node() frowand.list
2018-10-15  0:24   ` frowand.list
2018-10-15  0:24 ` [PATCH v3 05/18] of: overlay: use prop add changeset entry for property in new nodes frowand.list
2018-10-15  0:24   ` frowand.list
2018-10-15  0:24 ` [PATCH v3 06/18] of: overlay: do not duplicate properties from overlay for " frowand.list
2018-10-15  0:24   ` frowand.list
2018-10-15  0:24 ` [PATCH v3 07/18] of: dynamic: change type of of_{at,de}tach_node() to void frowand.list
2018-10-15  0:24   ` [PATCH v3 07/18] of: dynamic: change type of of_{at, de}tach_node() " frowand.list
2018-10-15  0:24 ` [PATCH v3 08/18] of: overlay: reorder fields in struct fragment frowand.list
2018-10-15  0:24   ` frowand.list
2018-10-15  0:24 ` [PATCH v3 09/18] of: overlay: validate overlay properties #address-cells and #size-cells frowand.list
2018-10-15  0:24   ` frowand.list
2018-10-15 19:01   ` Alan Tull
2018-10-15 19:01     ` Alan Tull
2018-10-15 19:01     ` Alan Tull
2018-10-15 20:16     ` Frank Rowand
2018-10-15 20:16       ` Frank Rowand
2018-10-15 20:16       ` Frank Rowand
2018-10-15  0:24 ` [PATCH v3 10/18] of: overlay: make all pr_debug() and pr_err() messages unique frowand.list
2018-10-15  0:24   ` frowand.list
2018-10-15  0:24 ` [PATCH v3 11/18] of: overlay: test case of two fragments adding same node frowand.list
2018-10-15  0:24   ` frowand.list
2018-10-15  0:24 ` [PATCH v3 12/18] of: overlay: check prevents multiple fragments add or delete " frowand.list
2018-10-15  0:24   ` frowand.list
2018-10-15  0:24 ` [PATCH v3 13/18] of: overlay: check prevents multiple fragments touching same property frowand.list
2018-10-15  0:24   ` frowand.list
2018-10-15  1:06   ` Joe Perches
2018-10-15  1:06     ` Joe Perches
2018-10-15  1:52     ` Frank Rowand [this message]
2018-10-15  1:52       ` Frank Rowand
2018-10-15  1:55       ` Joe Perches
2018-10-15  1:55         ` Joe Perches
2018-10-15  3:21         ` Frank Rowand
2018-10-15  3:21           ` Frank Rowand
2018-10-15 19:30           ` Frank Rowand
2018-10-15 19:30             ` Frank Rowand
2018-10-15  0:24 ` [PATCH v3 14/18] of: unittest: remove unused of_unittest_apply_overlay() argument frowand.list
2018-10-15  0:24   ` frowand.list
2018-10-15  0:24 ` [PATCH v3 15/18] of: overlay: set node fields from properties when add new overlay node frowand.list
2018-10-15  0:24   ` frowand.list
2018-10-15  0:24 ` [PATCH v3 16/18] of: unittest: allow base devicetree to have symbol metadata frowand.list
2018-10-15  0:24   ` frowand.list
2018-10-15  0:24 ` [PATCH v3 17/18] of: unittest: find overlays[] entry by name instead of index frowand.list
2018-10-15  0:24   ` frowand.list
2018-10-15  0:24 ` [PATCH v3 18/18] of: unittest: initialize args before calling of_*parse_*() frowand.list
2018-10-15  0:24   ` frowand.list
2018-10-15 19:21 ` [PATCH v3 00/18] of: overlay: validation checks, subsequent fixes Alan Tull
2018-10-15 19:21   ` Alan Tull
2018-10-15 19:21   ` Alan Tull
2018-10-15 20:23   ` Frank Rowand
2018-10-15 20:23     ` Frank Rowand
2018-10-15 20:23     ` Frank Rowand
2018-10-15 20:47     ` Alan Tull
2018-10-15 20:47       ` Alan Tull
2018-10-15 20:47       ` Alan Tull

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=850f0866-1189-5a49-01c5-79caf270abbd@gmail.com \
    --to=frowand.list@gmail.com \
    --cc=atull@kernel.org \
    --cc=benh@kernel.crashing.org \
    --cc=devicetree@vger.kernel.org \
    --cc=joe@perches.com \
    --cc=linux-fpga@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=mdf@kernel.org \
    --cc=mpe@ellerman.id.au \
    --cc=pantelis.antoniou@konsulko.com \
    --cc=paulus@samba.org \
    --cc=robh+dt@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.