Re: [PATCH v4 1/1] of: unittest: overlay: ensure proper alignment of copied FDT
On 4/8/21 9:20 PM, Guenter Roeck wrote: > On 4/8/21 3:53 PM, Frank Rowand wrote: >> On 4/8/21 4:54 PM, Guenter Roeck wrote: >>> On 4/8/21 2:28 PM, Rob Herring wrote: Applying now so this gets into linux-next this week. >>> The patch doesn't apply on top of today's -next; it conflicts >>> with "of: properly check for error returned by fdt_get_name()". >>> >>> I reverted that patch and applied this one, and the DT unittests >>> run with it on openrisc. I do get a single test failure, but I that >>> is a different problem (possibly with the test case itself). >>> >>> ### dt-test ### FAIL of_unittest_dma_ranges_one():923 of_dma_get_range: >>> wrong DMA addr 0x >>> (expecting 1) on node >>> /testcase-data/address-tests/bus@8000/device@1000 >> >> That is a known regression on the target that I use for testing (and >> has been since 5.10-rc1) - the 8074 dragonboard, arm 32. No >> one else has reported it on the list, so even though I want to debug >> and fix it "promptly", other tasks have had higher priority. In my >> notes I list two suspect commits: >> >> e0d072782c73 dma-mapping: introduce DMA range map, supplanting >> dma_pfn_offset >> 0a0f0d8be76d dma-mapping: split >> >> I think that was purely based on looking at the list of commits that >> may have touched OF dma. I have not done a bisect. >> > > Here you are: > > # bad: [2c85ebc57b3e1817b6ce1a6b703928e113a90442] Linux 5.10 > # good: [bbf5c979011a099af5dc76498918ed7df445635b] Linux 5.9 > git bisect start 'v5.10' 'v5.9' > # bad: [4d0e9df5e43dba52d38b251e3b909df8fa1110be] lib, uaccess: add failure > injection to usercopy functions > git bisect bad 4d0e9df5e43dba52d38b251e3b909df8fa1110be > # good: [f888bdf9823c85fe945c4eb3ba353f749dec3856] Merge tag > 'devicetree-for-5.10' of > git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux > git bisect good f888bdf9823c85fe945c4eb3ba353f749dec3856 > # good: [640eee067d9aae0bb98d8706001976ff1affaf00] Merge tag > 'drm-misc-next-fixes-2020-10-13' of > git://anongit.freedesktop.org/drm/drm-misc into drm-next > git bisect good 640eee067d9aae0bb98d8706001976ff1affaf00 > # good: [c6dbef7307629cce855aa6b482b60cbfed88] Merge tag 'usb-5.10-rc1' > of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb > git bisect good c6dbef7307629cce855aa6b482b60cbfed88 > # good: [ce1558c285f9ad04c03b46833a028230771cc0a7] ALSA: hda/hdmi: fix > incorrect locking in hdmi_pcm_close > git bisect good ce1558c285f9ad04c03b46833a028230771cc0a7 > # good: [c48b75b7271db23c1b2d1204d6e8496d91f27711] Merge tag 'sound-5.10-rc1' > of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound > git bisect good c48b75b7271db23c1b2d1204d6e8496d91f27711 > # bad: [0cd7d9795fa82226e7516d38b474bddae8b1ff26] Merge branch 'for-linus' of > git://git.kernel.org/pub/scm/linux/kernel/git/livepatching/livepatching > git bisect bad 0cd7d9795fa82226e7516d38b474bddae8b1ff26 > # good: [b1839e7c2a42ccd9a0587c0092e880c7a213ee2a] dmaengine: xilinx: dpdma: > convert tasklets to use new tasklet_setup() API > git bisect good b1839e7c2a42ccd9a0587c0092e880c7a213ee2a > # bad: [0de327969b61a245e3a47b60009eae73fe513cef] cma: decrease CMA_ALIGNMENT > lower limit to 2 > git bisect bad 0de327969b61a245e3a47b60009eae73fe513cef > # good: [6eb0233ec2d0df288fe8515d5b0b2b15562e05bb] usb: don't inherity DMA > properties for USB devices > git bisect good 6eb0233ec2d0df288fe8515d5b0b2b15562e05bb > # bad: [48d15814dd0fc429e3205b87f1af6cc472018478] lib82596: move DMA > allocation into the callers of i82596_probe > git bisect bad 48d15814dd0fc429e3205b87f1af6cc472018478 > # bad: [eba304c6861613a649ba46cfab835b1eddeacd8e] dma-mapping: better > document dma_addr_t and DMA_MAPPING_ERROR > git bisect bad eba304c6861613a649ba46cfab835b1eddeacd8e > # bad: [b9bb694b9f62f4b31652223ed3ca38cf98bbb370] iommu/io-pgtable-arm: Clean > up faulty sanity check > git bisect bad b9bb694b9f62f4b31652223ed3ca38cf98bbb370 > # bad: [a97740f81874c8063c12c24f34d25f10c4f5e9aa] dma-debug: convert comma to > semicolon > git bisect bad a97740f81874c8063c12c24f34d25f10c4f5e9aa > # bad: [e0d072782c734d27f5af062c62266f2598f68542] dma-mapping: introduce DMA > range map, supplanting dma_pfn_offset > git bisect bad e0d072782c734d27f5af062c62266f2598f68542 > # first bad commit: [e0d072782c734d27f5af062c62266f2598f68542] dma-mapping: > introduce DMA range map, supplanting dma_pfn_offset > > Guenter > Thank you
Re: [PATCH v4 1/1] of: unittest: overlay: ensure proper alignment of copied FDT
On 4/8/21 3:53 PM, Frank Rowand wrote: > On 4/8/21 4:54 PM, Guenter Roeck wrote: >> On 4/8/21 2:28 PM, Rob Herring wrote: >>> >>> Applying now so this gets into linux-next this week. >>> >> The patch doesn't apply on top of today's -next; it conflicts >> with "of: properly check for error returned by fdt_get_name()". >> >> I reverted that patch and applied this one, and the DT unittests >> run with it on openrisc. I do get a single test failure, but I that >> is a different problem (possibly with the test case itself). >> >> ### dt-test ### FAIL of_unittest_dma_ranges_one():923 of_dma_get_range: >> wrong DMA addr 0x >> (expecting 1) on node >> /testcase-data/address-tests/bus@8000/device@1000 > > That is a known regression on the target that I use for testing (and > has been since 5.10-rc1) - the 8074 dragonboard, arm 32. No > one else has reported it on the list, so even though I want to debug > and fix it "promptly", other tasks have had higher priority. In my > notes I list two suspect commits: > > e0d072782c73 dma-mapping: introduce DMA range map, supplanting > dma_pfn_offset > 0a0f0d8be76d dma-mapping: split > > I think that was purely based on looking at the list of commits that > may have touched OF dma. I have not done a bisect. > Here you are: # bad: [2c85ebc57b3e1817b6ce1a6b703928e113a90442] Linux 5.10 # good: [bbf5c979011a099af5dc76498918ed7df445635b] Linux 5.9 git bisect start 'v5.10' 'v5.9' # bad: [4d0e9df5e43dba52d38b251e3b909df8fa1110be] lib, uaccess: add failure injection to usercopy functions git bisect bad 4d0e9df5e43dba52d38b251e3b909df8fa1110be # good: [f888bdf9823c85fe945c4eb3ba353f749dec3856] Merge tag 'devicetree-for-5.10' of git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux git bisect good f888bdf9823c85fe945c4eb3ba353f749dec3856 # good: [640eee067d9aae0bb98d8706001976ff1affaf00] Merge tag 'drm-misc-next-fixes-2020-10-13' of git://anongit.freedesktop.org/drm/drm-misc into drm-next git bisect good 640eee067d9aae0bb98d8706001976ff1affaf00 # good: [c6dbef7307629cce855aa6b482b60cbfed88] Merge tag 'usb-5.10-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb git bisect good c6dbef7307629cce855aa6b482b60cbfed88 # good: [ce1558c285f9ad04c03b46833a028230771cc0a7] ALSA: hda/hdmi: fix incorrect locking in hdmi_pcm_close git bisect good ce1558c285f9ad04c03b46833a028230771cc0a7 # good: [c48b75b7271db23c1b2d1204d6e8496d91f27711] Merge tag 'sound-5.10-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound git bisect good c48b75b7271db23c1b2d1204d6e8496d91f27711 # bad: [0cd7d9795fa82226e7516d38b474bddae8b1ff26] Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/livepatching/livepatching git bisect bad 0cd7d9795fa82226e7516d38b474bddae8b1ff26 # good: [b1839e7c2a42ccd9a0587c0092e880c7a213ee2a] dmaengine: xilinx: dpdma: convert tasklets to use new tasklet_setup() API git bisect good b1839e7c2a42ccd9a0587c0092e880c7a213ee2a # bad: [0de327969b61a245e3a47b60009eae73fe513cef] cma: decrease CMA_ALIGNMENT lower limit to 2 git bisect bad 0de327969b61a245e3a47b60009eae73fe513cef # good: [6eb0233ec2d0df288fe8515d5b0b2b15562e05bb] usb: don't inherity DMA properties for USB devices git bisect good 6eb0233ec2d0df288fe8515d5b0b2b15562e05bb # bad: [48d15814dd0fc429e3205b87f1af6cc472018478] lib82596: move DMA allocation into the callers of i82596_probe git bisect bad 48d15814dd0fc429e3205b87f1af6cc472018478 # bad: [eba304c6861613a649ba46cfab835b1eddeacd8e] dma-mapping: better document dma_addr_t and DMA_MAPPING_ERROR git bisect bad eba304c6861613a649ba46cfab835b1eddeacd8e # bad: [b9bb694b9f62f4b31652223ed3ca38cf98bbb370] iommu/io-pgtable-arm: Clean up faulty sanity check git bisect bad b9bb694b9f62f4b31652223ed3ca38cf98bbb370 # bad: [a97740f81874c8063c12c24f34d25f10c4f5e9aa] dma-debug: convert comma to semicolon git bisect bad a97740f81874c8063c12c24f34d25f10c4f5e9aa # bad: [e0d072782c734d27f5af062c62266f2598f68542] dma-mapping: introduce DMA range map, supplanting dma_pfn_offset git bisect bad e0d072782c734d27f5af062c62266f2598f68542 # first bad commit: [e0d072782c734d27f5af062c62266f2598f68542] dma-mapping: introduce DMA range map, supplanting dma_pfn_offset Guenter
Re: [PATCH v4 1/1] of: unittest: overlay: ensure proper alignment of copied FDT
On 4/8/21 4:54 PM, Guenter Roeck wrote: > On 4/8/21 2:28 PM, Rob Herring wrote: >> >> Applying now so this gets into linux-next this week. >> > The patch doesn't apply on top of today's -next; it conflicts > with "of: properly check for error returned by fdt_get_name()". > > I reverted that patch and applied this one, and the DT unittests > run with it on openrisc. I do get a single test failure, but I that > is a different problem (possibly with the test case itself). > > ### dt-test ### FAIL of_unittest_dma_ranges_one():923 of_dma_get_range: wrong > DMA addr 0x > (expecting 1) on node > /testcase-data/address-tests/bus@8000/device@1000 That is a known regression on the target that I use for testing (and has been since 5.10-rc1) - the 8074 dragonboard, arm 32. No one else has reported it on the list, so even though I want to debug and fix it "promptly", other tasks have had higher priority. In my notes I list two suspect commits: e0d072782c73 dma-mapping: introduce DMA range map, supplanting dma_pfn_offset 0a0f0d8be76d dma-mapping: split I think that was purely based on looking at the list of commits that may have touched OF dma. I have not done a bisect. One specific report of not seeing the FAIL was Vireshk on 5.11-rc6 with a Hikey board. > > Tested-by: Guenter Roeck Thanks for testing! > > Guenter >
Re: [PATCH v4 1/1] of: unittest: overlay: ensure proper alignment of copied FDT
On 4/8/21 4:28 PM, Rob Herring wrote: > On Thu, Apr 8, 2021 at 3:45 PM wrote: >> >> From: Frank Rowand >> >> The Devicetree standard specifies an 8 byte alignment of the FDT. >> Code in libfdt expects this alignment for an FDT image in memory. >> kmemdup() returns 4 byte alignment on openrisc. Replace kmemdup() >> with kmalloc(), align pointer, memcpy() to get proper alignment. >> >> The 4 byte alignment exposed a related bug which triggered a crash >> on openrisc with: >> commit 79edff12060f ("scripts/dtc: Update to upstream version >> v1.6.0-51-g183df9e9c2b9") >> as reported in: >> https://lore.kernel.org/lkml/20210327224116.69309-1-li...@roeck-us.net/ >> >> Reported-by: Guenter Roeck >> Signed-off-by: Frank Rowand >> >> --- >> >> changes since version 1: >> - use pointer from kmalloc() for kfree() instead of using pointer that >> has been modified for FDT alignment >> >> changes since version 2: >> - version 1 was a work in progress version, I failed to commit the >> following >> final changes >> - reorder first two arguments of of_overlay_apply() >> >> changes since version 3: >> - size of memory allocation and size of copy after pointer alignment >> differ, use separate variables with correct values for each case >> - edit comment to more clearly describe that ovcs->fdt is the allocated >> memory region, which may be different than where the aligned pointer >> points >> - remove unused parameter from of_overlay_apply() >> >> drivers/of/of_private.h | 2 ++ >> drivers/of/overlay.c| 27 +-- >> drivers/of/unittest.c | 13 ++--- >> 3 files changed, 29 insertions(+), 13 deletions(-) >> >> diff --git a/drivers/of/of_private.h b/drivers/of/of_private.h >> index d9e6a324de0a..d717efbd637d 100644 >> --- a/drivers/of/of_private.h >> +++ b/drivers/of/of_private.h >> @@ -8,6 +8,8 @@ >> * Copyright (C) 1996-2005 Paul Mackerras. >> */ >> >> +#define FDT_ALIGN_SIZE 8 >> + >> /** >> * struct alias_prop - Alias property in 'aliases' node >> * @link: List node to link the structure in aliases_lookup list >> diff --git a/drivers/of/overlay.c b/drivers/of/overlay.c >> index 50bbe0edf538..ecf967c57900 100644 >> --- a/drivers/of/overlay.c >> +++ b/drivers/of/overlay.c >> @@ -57,7 +57,7 @@ struct fragment { >> * struct overlay_changeset >> * @id:changeset identifier >> * @ovcs_list: list on which we are located >> - * @fdt: FDT that was unflattened to create @overlay_tree >> + * @fdt: base of memory allocated to hold aligned FDT that >> was unflattened to create @overlay_tree >> * @overlay_tree: expanded device tree that contains the fragment nodes >> * @count: count of fragment structures >> * @fragments: fragment nodes in the overlay expanded device tree >> @@ -719,8 +719,8 @@ static struct device_node *find_target(struct >> device_node *info_node) >> /** >> * init_overlay_changeset() - initialize overlay changeset from overlay tree >> * @ovcs: Overlay changeset to build >> - * @fdt: the FDT that was unflattened to create @tree >> - * @tree: Contains all the overlay fragments and overlay fixup nodes >> + * @fdt: base of memory allocated to hold aligned FDT that was >> unflattened to create @tree >> + * @tree: Contains the overlay fragments and overlay fixup nodes >> * >> * Initialize @ovcs. Populate @ovcs->fragments with node information from >> * the top level of @tree. The relevant top level nodes are the fragment >> @@ -873,7 +873,7 @@ static void free_overlay_changeset(struct >> overlay_changeset *ovcs) >> * internal documentation >> * >> * of_overlay_apply() - Create and apply an overlay changeset >> - * @fdt: the FDT that was unflattened to create @tree >> + * @fdt: base of memory allocated to hold the aligned FDT >> * @tree: Expanded overlay device tree >> * @ovcs_id: Pointer to overlay changeset id >> * >> @@ -913,7 +913,7 @@ static void free_overlay_changeset(struct >> overlay_changeset *ovcs) >> */ >> >> static int of_overlay_apply(const void *fdt, struct device_node *tree, >> - int *ovcs_id) >> + int *ovcs_id) >> { >> struct overlay_changeset *ovcs; >> int ret = 0, ret_revert, ret_tmp; >> @@ -953,7 +953,9 @@ static int of_overlay_apply(const void *fdt, struct >> device_node *tree, >> /* >> * after overlay_notify(), ovcs->overlay_tree related pointers may >> have >> * leaked to drivers, so can not kfree() tree, aka >> ovcs->overlay_tree; >> -* and can not free fdt, aka ovcs->fdt >> +* and can not free memory containing aligned fdt. The aligned fdt >> +* is contained within the memory at ovcs->fdt, possibly at an offset >> +* from ovcs->fdt. >> */ >> ret = overlay_notify(ovcs, OF_OVERLAY_PRE_APPLY); >> if
Re: [PATCH v4 1/1] of: unittest: overlay: ensure proper alignment of copied FDT
On 4/8/21 2:28 PM, Rob Herring wrote: > > Applying now so this gets into linux-next this week. > The patch doesn't apply on top of today's -next; it conflicts with "of: properly check for error returned by fdt_get_name()". I reverted that patch and applied this one, and the DT unittests run with it on openrisc. I do get a single test failure, but I that is a different problem (possibly with the test case itself). ### dt-test ### FAIL of_unittest_dma_ranges_one():923 of_dma_get_range: wrong DMA addr 0x (expecting 1) on node /testcase-data/address-tests/bus@8000/device@1000 Tested-by: Guenter Roeck Guenter
Re: [PATCH v4 1/1] of: unittest: overlay: ensure proper alignment of copied FDT
On Thu, Apr 8, 2021 at 3:45 PM wrote: > > From: Frank Rowand > > The Devicetree standard specifies an 8 byte alignment of the FDT. > Code in libfdt expects this alignment for an FDT image in memory. > kmemdup() returns 4 byte alignment on openrisc. Replace kmemdup() > with kmalloc(), align pointer, memcpy() to get proper alignment. > > The 4 byte alignment exposed a related bug which triggered a crash > on openrisc with: > commit 79edff12060f ("scripts/dtc: Update to upstream version > v1.6.0-51-g183df9e9c2b9") > as reported in: > https://lore.kernel.org/lkml/20210327224116.69309-1-li...@roeck-us.net/ > > Reported-by: Guenter Roeck > Signed-off-by: Frank Rowand > > --- > > changes since version 1: > - use pointer from kmalloc() for kfree() instead of using pointer that > has been modified for FDT alignment > > changes since version 2: > - version 1 was a work in progress version, I failed to commit the following > final changes > - reorder first two arguments of of_overlay_apply() > > changes since version 3: > - size of memory allocation and size of copy after pointer alignment > differ, use separate variables with correct values for each case > - edit comment to more clearly describe that ovcs->fdt is the allocated > memory region, which may be different than where the aligned pointer > points > - remove unused parameter from of_overlay_apply() > > drivers/of/of_private.h | 2 ++ > drivers/of/overlay.c| 27 +-- > drivers/of/unittest.c | 13 ++--- > 3 files changed, 29 insertions(+), 13 deletions(-) > > diff --git a/drivers/of/of_private.h b/drivers/of/of_private.h > index d9e6a324de0a..d717efbd637d 100644 > --- a/drivers/of/of_private.h > +++ b/drivers/of/of_private.h > @@ -8,6 +8,8 @@ > * Copyright (C) 1996-2005 Paul Mackerras. > */ > > +#define FDT_ALIGN_SIZE 8 > + > /** > * struct alias_prop - Alias property in 'aliases' node > * @link: List node to link the structure in aliases_lookup list > diff --git a/drivers/of/overlay.c b/drivers/of/overlay.c > index 50bbe0edf538..ecf967c57900 100644 > --- a/drivers/of/overlay.c > +++ b/drivers/of/overlay.c > @@ -57,7 +57,7 @@ struct fragment { > * struct overlay_changeset > * @id:changeset identifier > * @ovcs_list: list on which we are located > - * @fdt: FDT that was unflattened to create @overlay_tree > + * @fdt: base of memory allocated to hold aligned FDT that was > unflattened to create @overlay_tree > * @overlay_tree: expanded device tree that contains the fragment nodes > * @count: count of fragment structures > * @fragments: fragment nodes in the overlay expanded device tree > @@ -719,8 +719,8 @@ static struct device_node *find_target(struct device_node > *info_node) > /** > * init_overlay_changeset() - initialize overlay changeset from overlay tree > * @ovcs: Overlay changeset to build > - * @fdt: the FDT that was unflattened to create @tree > - * @tree: Contains all the overlay fragments and overlay fixup nodes > + * @fdt: base of memory allocated to hold aligned FDT that was > unflattened to create @tree > + * @tree: Contains the overlay fragments and overlay fixup nodes > * > * Initialize @ovcs. Populate @ovcs->fragments with node information from > * the top level of @tree. The relevant top level nodes are the fragment > @@ -873,7 +873,7 @@ static void free_overlay_changeset(struct > overlay_changeset *ovcs) > * internal documentation > * > * of_overlay_apply() - Create and apply an overlay changeset > - * @fdt: the FDT that was unflattened to create @tree > + * @fdt: base of memory allocated to hold the aligned FDT > * @tree: Expanded overlay device tree > * @ovcs_id: Pointer to overlay changeset id > * > @@ -913,7 +913,7 @@ static void free_overlay_changeset(struct > overlay_changeset *ovcs) > */ > > static int of_overlay_apply(const void *fdt, struct device_node *tree, > - int *ovcs_id) > + int *ovcs_id) > { > struct overlay_changeset *ovcs; > int ret = 0, ret_revert, ret_tmp; > @@ -953,7 +953,9 @@ static int of_overlay_apply(const void *fdt, struct > device_node *tree, > /* > * after overlay_notify(), ovcs->overlay_tree related pointers may > have > * leaked to drivers, so can not kfree() tree, aka ovcs->overlay_tree; > -* and can not free fdt, aka ovcs->fdt > +* and can not free memory containing aligned fdt. The aligned fdt > +* is contained within the memory at ovcs->fdt, possibly at an offset > +* from ovcs->fdt. > */ > ret = overlay_notify(ovcs, OF_OVERLAY_PRE_APPLY); > if (ret) { > @@ -1014,9 +1016,10 @@ static int of_overlay_apply(const void *fdt, struct > device_node *tree, > int of_overlay_fdt_apply(const void *overlay_fdt, u32
[PATCH v4 1/1] of: unittest: overlay: ensure proper alignment of copied FDT
From: Frank Rowand The Devicetree standard specifies an 8 byte alignment of the FDT. Code in libfdt expects this alignment for an FDT image in memory. kmemdup() returns 4 byte alignment on openrisc. Replace kmemdup() with kmalloc(), align pointer, memcpy() to get proper alignment. The 4 byte alignment exposed a related bug which triggered a crash on openrisc with: commit 79edff12060f ("scripts/dtc: Update to upstream version v1.6.0-51-g183df9e9c2b9") as reported in: https://lore.kernel.org/lkml/20210327224116.69309-1-li...@roeck-us.net/ Reported-by: Guenter Roeck Signed-off-by: Frank Rowand --- changes since version 1: - use pointer from kmalloc() for kfree() instead of using pointer that has been modified for FDT alignment changes since version 2: - version 1 was a work in progress version, I failed to commit the following final changes - reorder first two arguments of of_overlay_apply() changes since version 3: - size of memory allocation and size of copy after pointer alignment differ, use separate variables with correct values for each case - edit comment to more clearly describe that ovcs->fdt is the allocated memory region, which may be different than where the aligned pointer points - remove unused parameter from of_overlay_apply() drivers/of/of_private.h | 2 ++ drivers/of/overlay.c| 27 +-- drivers/of/unittest.c | 13 ++--- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/drivers/of/of_private.h b/drivers/of/of_private.h index d9e6a324de0a..d717efbd637d 100644 --- a/drivers/of/of_private.h +++ b/drivers/of/of_private.h @@ -8,6 +8,8 @@ * Copyright (C) 1996-2005 Paul Mackerras. */ +#define FDT_ALIGN_SIZE 8 + /** * struct alias_prop - Alias property in 'aliases' node * @link: List node to link the structure in aliases_lookup list diff --git a/drivers/of/overlay.c b/drivers/of/overlay.c index 50bbe0edf538..ecf967c57900 100644 --- a/drivers/of/overlay.c +++ b/drivers/of/overlay.c @@ -57,7 +57,7 @@ struct fragment { * struct overlay_changeset * @id:changeset identifier * @ovcs_list: list on which we are located - * @fdt: FDT that was unflattened to create @overlay_tree + * @fdt: base of memory allocated to hold aligned FDT that was unflattened to create @overlay_tree * @overlay_tree: expanded device tree that contains the fragment nodes * @count: count of fragment structures * @fragments: fragment nodes in the overlay expanded device tree @@ -719,8 +719,8 @@ static struct device_node *find_target(struct device_node *info_node) /** * init_overlay_changeset() - initialize overlay changeset from overlay tree * @ovcs: Overlay changeset to build - * @fdt: the FDT that was unflattened to create @tree - * @tree: Contains all the overlay fragments and overlay fixup nodes + * @fdt: base of memory allocated to hold aligned FDT that was unflattened to create @tree + * @tree: Contains the overlay fragments and overlay fixup nodes * * Initialize @ovcs. Populate @ovcs->fragments with node information from * the top level of @tree. The relevant top level nodes are the fragment @@ -873,7 +873,7 @@ static void free_overlay_changeset(struct overlay_changeset *ovcs) * internal documentation * * of_overlay_apply() - Create and apply an overlay changeset - * @fdt: the FDT that was unflattened to create @tree + * @fdt: base of memory allocated to hold the aligned FDT * @tree: Expanded overlay device tree * @ovcs_id: Pointer to overlay changeset id * @@ -913,7 +913,7 @@ static void free_overlay_changeset(struct overlay_changeset *ovcs) */ static int of_overlay_apply(const void *fdt, struct device_node *tree, - int *ovcs_id) + int *ovcs_id) { struct overlay_changeset *ovcs; int ret = 0, ret_revert, ret_tmp; @@ -953,7 +953,9 @@ static int of_overlay_apply(const void *fdt, struct device_node *tree, /* * after overlay_notify(), ovcs->overlay_tree related pointers may have * leaked to drivers, so can not kfree() tree, aka ovcs->overlay_tree; -* and can not free fdt, aka ovcs->fdt +* and can not free memory containing aligned fdt. The aligned fdt +* is contained within the memory at ovcs->fdt, possibly at an offset +* from ovcs->fdt. */ ret = overlay_notify(ovcs, OF_OVERLAY_PRE_APPLY); if (ret) { @@ -1014,9 +1016,10 @@ static int of_overlay_apply(const void *fdt, struct device_node *tree, int of_overlay_fdt_apply(const void *overlay_fdt, u32 overlay_fdt_size, int *ovcs_id) { - const void *new_fdt; + void *new_fdt; + void *new_fdt_align; int ret; - u32 size; + u32 size, size_alloc; struct device_node *overlay_root; *ovcs_id