All of lore.kernel.org
 help / color / mirror / Atom feed
From: "han.xu" <han.xu@nxp.com>
To: Ansuel Smith <ansuelsmth@gmail.com>
Cc: "Miquel Raynal" <miquel.raynal@bootlin.com>,
	"Richard Weinberger" <richard@nod.at>,
	"Vignesh Raghavendra" <vigneshr@ti.com>,
	"Rob Herring" <robh+dt@kernel.org>,
	"Krzysztof Kozlowski" <krzysztof.kozlowski+dt@linaro.org>,
	"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
	"Jens Axboe" <axboe@kernel.dk>, �ecki <rafal@milecki.pl>,
	"Manivannan Sadhasivam" <mani@kernel.org>,
	linux-mtd@lists.infradead.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH v5 3/3] mtd: core: introduce of support for dynamic partitions
Date: Mon, 17 Oct 2022 14:59:52 -0500	[thread overview]
Message-ID: <20221017195820.ve6c3zj2civkswm6@umbrella> (raw)
In-Reply-To: <20220606151417.19227-4-ansuelsmth@gmail.com>

On 22/06/06 05:14PM, Ansuel Smith wrote:
> We have many parser that register mtd partitions at runtime. One example
> is the cmdlinepart or the smem-part parser where the compatible is defined
> in the dts and the partitions gets detected and registered by the
> parser. This is problematic for the NVMEM subsystem that requires an OF node
> to detect NVMEM cells.
> 
> To fix this problem, introduce an additional logic that will try to
> assign an OF node to the MTD if declared.
> 
> On MTD addition, it will be checked if the MTD has an OF node and if
> not declared will check if a partition with the same label is
> declared in DTS. If an exact match is found, the partition dynamically
> allocated by the parser will have a connected OF node.
> 
> The NVMEM subsystem will detect the OF node and register any NVMEM cells
> declared statically in the DTS.
> 
> Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
> ---
>  drivers/mtd/mtdcore.c | 49 +++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 49 insertions(+)
> 
> diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
> index 7731796024e0..807194efb580 100644
> --- a/drivers/mtd/mtdcore.c
> +++ b/drivers/mtd/mtdcore.c
> @@ -546,6 +546,54 @@ static int mtd_nvmem_add(struct mtd_info *mtd)
>  	return 0;
>  }
>  
> +static void mtd_check_of_node(struct mtd_info *mtd)
> +{
> +	struct device_node *partitions, *parent_dn, *mtd_dn = NULL;
> +	struct mtd_info *parent;
> +	const char *mtd_name;
> +	bool found = false;
> +	int plen;
> +
> +	/* Check if MTD already has a device node */
> +	if (dev_of_node(&mtd->dev))
> +		return;
> +
> +	/* Check if a partitions node exist */
> +	parent = mtd->parent;
> +	parent_dn = dev_of_node(&parent->dev);
> +	if (!parent_dn)
> +		return;
> +
> +	partitions = of_get_child_by_name(parent_dn, "partitions");
> +	if (!partitions)
> +		goto exit_parent;
> +
> +	/* Search if a partition is defined with the same name */
> +	for_each_child_of_node(partitions, mtd_dn) {
> +		/* Skip partition with no label */
> +		mtd_name = of_get_property(mtd_dn, "label", &plen);
> +		if (!mtd_name)
> +			continue;
> +
> +		if (!strncmp(mtd->name, mtd_name, plen)) {
> +			found = true;
> +			break;
> +		}
> +	}
> +
> +	if (!found)
> +		goto exit_partitions;
> +
> +	/* Set of_node only for nvmem */
> +	if (of_device_is_compatible(mtd_dn, "nvmem-cells"))
> +		mtd_set_of_node(mtd, mtd_dn);
> +
> +exit_partitions:
> +	of_node_put(partitions);
> +exit_parent:
> +	of_node_put(parent_dn);
> +}
> +
>  /**
>   *	add_mtd_device - register an MTD device
>   *	@mtd: pointer to new MTD device info structure
> @@ -651,6 +699,7 @@ int add_mtd_device(struct mtd_info *mtd)
>  	mtd->dev.devt = MTD_DEVT(i);
>  	dev_set_name(&mtd->dev, "mtd%d", i);
>  	dev_set_drvdata(&mtd->dev, mtd);
> +	mtd_check_of_node(mtd);
>  	of_node_get(mtd_get_of_node(mtd));
>  	error = device_register(&mtd->dev);
>  	if (error)

NXP GPMI NAND controller with 6 cmdline partitions meets refcount underflow
with this patch. The of_node_put(parent_dn) doesn't work with cmdline parser and
causes the issue.

[    1.078910] 6 cmdlinepart partitions found on MTD device gpmi-nand
[    1.085116] Creating 6 MTD partitions on "gpmi-nand":
[    1.090181] 0x000000000000-0x000008000000 : "nandboot"
[    1.096952] 0x000008000000-0x000009000000 : "nandfit"
[    1.103547] 0x000009000000-0x00000b000000 : "nandkernel"
[    1.110317] 0x00000b000000-0x00000c000000 : "nanddtb"
[    1.115525] ------------[ cut here ]------------
[    1.120141] refcount_t: addition on 0; use-after-free.
[    1.125328] WARNING: CPU: 0 PID: 1 at lib/refcount.c:25 refcount_warn_saturate+0xdc/0x148
[    1.133528] Modules linked in:
[    1.136589] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 6.0.0-rc7-next-20220930-04543-g8cf3f7
[    1.146342] Hardware name: Freescale i.MX8DXL DDR3L EVK (DT)
[    1.151999] pstate: 600000c5 (nZCv daIF -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[    1.158965] pc : refcount_warn_saturate+0xdc/0x148
[    1.163760] lr : refcount_warn_saturate+0xdc/0x148
[    1.168556] sp : ffff800009ddb080
[    1.171866] x29: ffff800009ddb080 x28: ffff800009ddb35a x27: 0000000000000002
[    1.179015] x26: ffff8000098b06ad x25: ffffffffffffffff x24: ffff0a00ffffff05
[    1.186165] x23: ffff00001fdf6470 x22: ffff800009ddb367 x21: 0000000000000000
[    1.193314] x20: ffff00001fdfebe8 x19: ffff00001fdfec50 x18: ffffffffffffffff
[    1.200464] x17: 0000000000000000 x16: 0000000000000118 x15: 0000000000000004
[    1.207614] x14: 0000000000000fff x13: ffff800009bca248 x12: 0000000000000003
[    1.214764] x11: 00000000ffffefff x10: c0000000ffffefff x9 : 4762cb2ccb52de00
[    1.221914] x8 : 4762cb2ccb52de00 x7 : 205d313431303231 x6 : 312e31202020205b
[    1.229063] x5 : ffff800009d55c1f x4 : 0000000000000001 x3 : 0000000000000000
[    1.236213] x2 : 0000000000000000 x1 : ffff800009954be6 x0 : 000000000000002a
[    1.243365] Call trace:
[    1.245806]  refcount_warn_saturate+0xdc/0x148
[    1.250253]  kobject_get+0x98/0x9c
[    1.253658]  of_node_get+0x20/0x34
[    1.257072]  of_fwnode_get+0x3c/0x54
[    1.260652]  fwnode_get_nth_parent+0xd8/0xf4
[    1.264926]  fwnode_full_name_string+0x3c/0xb4
[    1.269373]  device_node_string+0x498/0x5b4
[    1.273561]  pointer+0x41c/0x5d0
[    1.276793]  vsnprintf+0x4d8/0x694
[    1.280198]  vprintk_store+0x164/0x528
[    1.283951]  vprintk_emit+0x98/0x164
[    1.287530]  vprintk_default+0x44/0x6c
[    1.291284]  vprintk+0xf0/0x134
[    1.294428]  _printk+0x54/0x7c
[    1.297486]  of_node_release+0xe8/0x128
[    1.301326]  kobject_put+0x98/0xfc
[    1.304732]  of_node_put+0x1c/0x28
[    1.308137]  add_mtd_device+0x484/0x6d4
[    1.311977]  add_mtd_partitions+0xf0/0x1d0
[    1.316078]  parse_mtd_partitions+0x45c/0x518
[    1.320439]  mtd_device_parse_register+0xb0/0x274
[    1.325147]  gpmi_nand_probe+0x51c/0x650
[    1.329074]  platform_probe+0xa8/0xd0
[    1.332740]  really_probe+0x130/0x334
[    1.336406]  __driver_probe_device+0xb4/0xe0
[    1.340681]  driver_probe_device+0x3c/0x1f8
[    1.344869]  __driver_attach+0xdc/0x1a4
[    1.348708]  bus_for_each_dev+0x80/0xcc
[    1.352548]  driver_attach+0x24/0x30
[    1.356127]  bus_add_driver+0x108/0x1f4
[    1.359967]  driver_register+0x78/0x114
[    1.363807]  __platform_driver_register+0x24/0x30
[    1.368515]  gpmi_nand_driver_init+0x1c/0x28
[    1.372798]  do_one_initcall+0xbc/0x238
[    1.376638]  do_initcall_level+0x94/0xb4
[    1.380565]  do_initcalls+0x54/0x94
[    1.384058]  do_basic_setup+0x1c/0x28
[    1.387724]  kernel_init_freeable+0x110/0x188
[    1.392084]  kernel_init+0x20/0x1a0
[    1.395578]  ret_from_fork+0x10/0x20
[    1.399157] ---[ end trace 0000000000000000 ]---
[    1.403782] ------------[ cut here ]------------


> -- 
> 2.36.1
> 
> 
> ______________________________________________________
> Linux MTD discussion mailing list
> http://lists.infradead.org/mailman/listinfo/linux-mtd/

WARNING: multiple messages have this Message-ID (diff)
From: "han.xu" <han.xu@nxp.com>
To: Ansuel Smith <ansuelsmth@gmail.com>
Cc: "Miquel Raynal" <miquel.raynal@bootlin.com>,
	"Richard Weinberger" <richard@nod.at>,
	"Vignesh Raghavendra" <vigneshr@ti.com>,
	"Rob Herring" <robh+dt@kernel.org>,
	"Krzysztof Kozlowski" <krzysztof.kozlowski+dt@linaro.org>,
	"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
	"Jens Axboe" <axboe@kernel.dk>, �ecki <rafal@milecki.pl>,
	"Manivannan Sadhasivam" <mani@kernel.org>,
	linux-mtd@lists.infradead.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH v5 3/3] mtd: core: introduce of support for dynamic partitions
Date: Mon, 17 Oct 2022 14:59:52 -0500	[thread overview]
Message-ID: <20221017195820.ve6c3zj2civkswm6@umbrella> (raw)
In-Reply-To: <20220606151417.19227-4-ansuelsmth@gmail.com>

On 22/06/06 05:14PM, Ansuel Smith wrote:
> We have many parser that register mtd partitions at runtime. One example
> is the cmdlinepart or the smem-part parser where the compatible is defined
> in the dts and the partitions gets detected and registered by the
> parser. This is problematic for the NVMEM subsystem that requires an OF node
> to detect NVMEM cells.
> 
> To fix this problem, introduce an additional logic that will try to
> assign an OF node to the MTD if declared.
> 
> On MTD addition, it will be checked if the MTD has an OF node and if
> not declared will check if a partition with the same label is
> declared in DTS. If an exact match is found, the partition dynamically
> allocated by the parser will have a connected OF node.
> 
> The NVMEM subsystem will detect the OF node and register any NVMEM cells
> declared statically in the DTS.
> 
> Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
> ---
>  drivers/mtd/mtdcore.c | 49 +++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 49 insertions(+)
> 
> diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
> index 7731796024e0..807194efb580 100644
> --- a/drivers/mtd/mtdcore.c
> +++ b/drivers/mtd/mtdcore.c
> @@ -546,6 +546,54 @@ static int mtd_nvmem_add(struct mtd_info *mtd)
>  	return 0;
>  }
>  
> +static void mtd_check_of_node(struct mtd_info *mtd)
> +{
> +	struct device_node *partitions, *parent_dn, *mtd_dn = NULL;
> +	struct mtd_info *parent;
> +	const char *mtd_name;
> +	bool found = false;
> +	int plen;
> +
> +	/* Check if MTD already has a device node */
> +	if (dev_of_node(&mtd->dev))
> +		return;
> +
> +	/* Check if a partitions node exist */
> +	parent = mtd->parent;
> +	parent_dn = dev_of_node(&parent->dev);
> +	if (!parent_dn)
> +		return;
> +
> +	partitions = of_get_child_by_name(parent_dn, "partitions");
> +	if (!partitions)
> +		goto exit_parent;
> +
> +	/* Search if a partition is defined with the same name */
> +	for_each_child_of_node(partitions, mtd_dn) {
> +		/* Skip partition with no label */
> +		mtd_name = of_get_property(mtd_dn, "label", &plen);
> +		if (!mtd_name)
> +			continue;
> +
> +		if (!strncmp(mtd->name, mtd_name, plen)) {
> +			found = true;
> +			break;
> +		}
> +	}
> +
> +	if (!found)
> +		goto exit_partitions;
> +
> +	/* Set of_node only for nvmem */
> +	if (of_device_is_compatible(mtd_dn, "nvmem-cells"))
> +		mtd_set_of_node(mtd, mtd_dn);
> +
> +exit_partitions:
> +	of_node_put(partitions);
> +exit_parent:
> +	of_node_put(parent_dn);
> +}
> +
>  /**
>   *	add_mtd_device - register an MTD device
>   *	@mtd: pointer to new MTD device info structure
> @@ -651,6 +699,7 @@ int add_mtd_device(struct mtd_info *mtd)
>  	mtd->dev.devt = MTD_DEVT(i);
>  	dev_set_name(&mtd->dev, "mtd%d", i);
>  	dev_set_drvdata(&mtd->dev, mtd);
> +	mtd_check_of_node(mtd);
>  	of_node_get(mtd_get_of_node(mtd));
>  	error = device_register(&mtd->dev);
>  	if (error)

NXP GPMI NAND controller with 6 cmdline partitions meets refcount underflow
with this patch. The of_node_put(parent_dn) doesn't work with cmdline parser and
causes the issue.

[    1.078910] 6 cmdlinepart partitions found on MTD device gpmi-nand
[    1.085116] Creating 6 MTD partitions on "gpmi-nand":
[    1.090181] 0x000000000000-0x000008000000 : "nandboot"
[    1.096952] 0x000008000000-0x000009000000 : "nandfit"
[    1.103547] 0x000009000000-0x00000b000000 : "nandkernel"
[    1.110317] 0x00000b000000-0x00000c000000 : "nanddtb"
[    1.115525] ------------[ cut here ]------------
[    1.120141] refcount_t: addition on 0; use-after-free.
[    1.125328] WARNING: CPU: 0 PID: 1 at lib/refcount.c:25 refcount_warn_saturate+0xdc/0x148
[    1.133528] Modules linked in:
[    1.136589] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 6.0.0-rc7-next-20220930-04543-g8cf3f7
[    1.146342] Hardware name: Freescale i.MX8DXL DDR3L EVK (DT)
[    1.151999] pstate: 600000c5 (nZCv daIF -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[    1.158965] pc : refcount_warn_saturate+0xdc/0x148
[    1.163760] lr : refcount_warn_saturate+0xdc/0x148
[    1.168556] sp : ffff800009ddb080
[    1.171866] x29: ffff800009ddb080 x28: ffff800009ddb35a x27: 0000000000000002
[    1.179015] x26: ffff8000098b06ad x25: ffffffffffffffff x24: ffff0a00ffffff05
[    1.186165] x23: ffff00001fdf6470 x22: ffff800009ddb367 x21: 0000000000000000
[    1.193314] x20: ffff00001fdfebe8 x19: ffff00001fdfec50 x18: ffffffffffffffff
[    1.200464] x17: 0000000000000000 x16: 0000000000000118 x15: 0000000000000004
[    1.207614] x14: 0000000000000fff x13: ffff800009bca248 x12: 0000000000000003
[    1.214764] x11: 00000000ffffefff x10: c0000000ffffefff x9 : 4762cb2ccb52de00
[    1.221914] x8 : 4762cb2ccb52de00 x7 : 205d313431303231 x6 : 312e31202020205b
[    1.229063] x5 : ffff800009d55c1f x4 : 0000000000000001 x3 : 0000000000000000
[    1.236213] x2 : 0000000000000000 x1 : ffff800009954be6 x0 : 000000000000002a
[    1.243365] Call trace:
[    1.245806]  refcount_warn_saturate+0xdc/0x148
[    1.250253]  kobject_get+0x98/0x9c
[    1.253658]  of_node_get+0x20/0x34
[    1.257072]  of_fwnode_get+0x3c/0x54
[    1.260652]  fwnode_get_nth_parent+0xd8/0xf4
[    1.264926]  fwnode_full_name_string+0x3c/0xb4
[    1.269373]  device_node_string+0x498/0x5b4
[    1.273561]  pointer+0x41c/0x5d0
[    1.276793]  vsnprintf+0x4d8/0x694
[    1.280198]  vprintk_store+0x164/0x528
[    1.283951]  vprintk_emit+0x98/0x164
[    1.287530]  vprintk_default+0x44/0x6c
[    1.291284]  vprintk+0xf0/0x134
[    1.294428]  _printk+0x54/0x7c
[    1.297486]  of_node_release+0xe8/0x128
[    1.301326]  kobject_put+0x98/0xfc
[    1.304732]  of_node_put+0x1c/0x28
[    1.308137]  add_mtd_device+0x484/0x6d4
[    1.311977]  add_mtd_partitions+0xf0/0x1d0
[    1.316078]  parse_mtd_partitions+0x45c/0x518
[    1.320439]  mtd_device_parse_register+0xb0/0x274
[    1.325147]  gpmi_nand_probe+0x51c/0x650
[    1.329074]  platform_probe+0xa8/0xd0
[    1.332740]  really_probe+0x130/0x334
[    1.336406]  __driver_probe_device+0xb4/0xe0
[    1.340681]  driver_probe_device+0x3c/0x1f8
[    1.344869]  __driver_attach+0xdc/0x1a4
[    1.348708]  bus_for_each_dev+0x80/0xcc
[    1.352548]  driver_attach+0x24/0x30
[    1.356127]  bus_add_driver+0x108/0x1f4
[    1.359967]  driver_register+0x78/0x114
[    1.363807]  __platform_driver_register+0x24/0x30
[    1.368515]  gpmi_nand_driver_init+0x1c/0x28
[    1.372798]  do_one_initcall+0xbc/0x238
[    1.376638]  do_initcall_level+0x94/0xb4
[    1.380565]  do_initcalls+0x54/0x94
[    1.384058]  do_basic_setup+0x1c/0x28
[    1.387724]  kernel_init_freeable+0x110/0x188
[    1.392084]  kernel_init+0x20/0x1a0
[    1.395578]  ret_from_fork+0x10/0x20
[    1.399157] ---[ end trace 0000000000000000 ]---
[    1.403782] ------------[ cut here ]------------


> -- 
> 2.36.1
> 
> 
> ______________________________________________________
> Linux MTD discussion mailing list
> http://lists.infradead.org/mailman/listinfo/linux-mtd/

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

  parent reply	other threads:[~2022-10-17 20:00 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-06-06 15:14 [PATCH v5 0/3] Add nvmem support for dynamic partitions Ansuel Smith
2022-06-06 15:14 ` Ansuel Smith
2022-06-06 15:14 ` [PATCH v5 1/3] dt-bindings: mtd: partitions: Support label only partition Ansuel Smith
2022-06-06 15:14   ` Ansuel Smith
2022-06-09 18:32   ` Rob Herring
2022-06-09 18:32     ` Rob Herring
2022-06-09 19:57     ` Ansuel Smith
2022-06-09 19:57       ` Ansuel Smith
2022-06-10 17:02       ` Rob Herring
2022-06-10 17:02         ` Rob Herring
2022-06-11 12:36         ` Ansuel Smith
2022-06-11 12:36           ` Ansuel Smith
2022-06-13 19:25         ` Ansuel Smith
2022-06-13 19:25           ` Ansuel Smith
2022-06-06 15:14 ` [PATCH v5 2/3] dt-bindings: mtd: partitions: add additional example for qcom,smem-part Ansuel Smith
2022-06-06 15:14   ` Ansuel Smith
2022-06-09 18:33   ` Rob Herring
2022-06-09 18:33     ` Rob Herring
2022-06-06 15:14 ` [PATCH v5 3/3] mtd: core: introduce of support for dynamic partitions Ansuel Smith
2022-06-06 15:14   ` Ansuel Smith
2022-06-08 15:44   ` [mtd] a2af0cae87: BUG:kernel_NULL_pointer_dereference,address kernel test robot
2022-06-08 15:44     ` kernel test robot
2022-06-08 15:44     ` kernel test robot
2022-06-09 12:35     ` Miquel Raynal
2022-06-09 12:35       ` [mtd] a2af0cae87: BUG:kernel_NULL_pointer_dereference, address Miquel Raynal
2022-06-09 12:35       ` [mtd] a2af0cae87: BUG:kernel_NULL_pointer_dereference,address Miquel Raynal
2022-10-17 19:59   ` han.xu [this message]
2022-10-17 19:59     ` [PATCH v5 3/3] mtd: core: introduce of support for dynamic partitions han.xu
2022-10-17 21:52     ` Rafał Miłecki
2022-10-17 21:52       ` Rafał Miłecki
2022-10-18  2:48       ` han.xu
2022-10-18  2:48         ` han.xu

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=20221017195820.ve6c3zj2civkswm6@umbrella \
    --to=han.xu@nxp.com \
    --cc=ansuelsmth@gmail.com \
    --cc=axboe@kernel.dk \
    --cc=devicetree@vger.kernel.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mtd@lists.infradead.org \
    --cc=mani@kernel.org \
    --cc=miquel.raynal@bootlin.com \
    --cc=rafal@milecki.pl \
    --cc=richard@nod.at \
    --cc=robh+dt@kernel.org \
    --cc=vigneshr@ti.com \
    /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.