* [PATCH 1/2] mtd/nand : don't free the global data fsl_lbc_ctrl_dev->nand in fsl_elbc_chip_remove() @ 2011-06-28 1:50 b35362 2011-06-28 1:50 ` [PATCH 2/2] mtd/nand : workaround for Freescale FCM to support large-page Nand chip b35362 ` (2 more replies) 0 siblings, 3 replies; 14+ messages in thread From: b35362 @ 2011-06-28 1:50 UTC (permalink / raw) To: dwmw2; +Cc: Liu Shuo, linuxppc-dev, linux-mtd From: Liu Shuo <b35362@freescale.com> The global data fsl_lbc_ctrl_dev->nand don't have to be freed in fsl_elbc_chip_remove(). The right place to do that is in fsl_elbc_nand_remove() if elbc_fcm_ctrl->counter is zero. Signed-off-by: Liu Shuo <b35362@freescale.com> --- drivers/mtd/nand/fsl_elbc_nand.c | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/drivers/mtd/nand/fsl_elbc_nand.c b/drivers/mtd/nand/fsl_elbc_nand.c index 0bb254c..a212116 100644 --- a/drivers/mtd/nand/fsl_elbc_nand.c +++ b/drivers/mtd/nand/fsl_elbc_nand.c @@ -829,7 +829,6 @@ static int fsl_elbc_chip_remove(struct fsl_elbc_mtd *priv) elbc_fcm_ctrl->chips[priv->bank] = NULL; kfree(priv); - kfree(elbc_fcm_ctrl); return 0; } -- 1.7.1 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 2/2] mtd/nand : workaround for Freescale FCM to support large-page Nand chip 2011-06-28 1:50 [PATCH 1/2] mtd/nand : don't free the global data fsl_lbc_ctrl_dev->nand in fsl_elbc_chip_remove() b35362 @ 2011-06-28 1:50 ` b35362 2011-06-28 15:35 ` [PATCH 2/2] mtd/nand : workaround for Freescale FCM to supportlarge-page " Mike Hench 2011-06-29 6:22 ` [PATCH 2/2] mtd/nand : workaround for Freescale FCM to support large-page " Artem Bityutskiy 2011-06-29 6:20 ` [PATCH 1/2] mtd/nand : don't free the global data fsl_lbc_ctrl_dev->nand in fsl_elbc_chip_remove() Artem Bityutskiy 2011-07-06 6:46 ` Artem Bityutskiy 2 siblings, 2 replies; 14+ messages in thread From: b35362 @ 2011-06-28 1:50 UTC (permalink / raw) To: dwmw2; +Cc: Liu Shuo, linuxppc-dev, linux-mtd From: Liu Shuo <b35362@freescale.com> Freescale FCM controller has a 2K size limitation of buffer RAM. In order to support the Nand flash chip whose page size is larger than 2K bytes, we divide a page into multi-2K pages for MTD layer driver. In that case, we force to set the page size to 2K bytes. We convert the page address of MTD layer driver to a real page address in flash chips and a column index in fsl_elbc driver. We can issue any column address by UA instruction of elbc controller. Signed-off-by: Liu Shuo <b35362@freescale.com> Signed-off-by: Li Yang <leoli@freescale.com> --- drivers/mtd/nand/fsl_elbc_nand.c | 61 +++++++++++++++++++++++++++++-------- 1 files changed, 48 insertions(+), 13 deletions(-) diff --git a/drivers/mtd/nand/fsl_elbc_nand.c b/drivers/mtd/nand/fsl_elbc_nand.c index a212116..eea7a22 100644 --- a/drivers/mtd/nand/fsl_elbc_nand.c +++ b/drivers/mtd/nand/fsl_elbc_nand.c @@ -76,6 +76,10 @@ struct fsl_elbc_fcm_ctrl { unsigned int oob; /* Non zero if operating on OOB data */ unsigned int counter; /* counter for the initializations */ char *oob_poi; /* Place to write ECC after read back */ + + int subpage_shift; /* If writesize > 2048, these two members*/ + int subpage_mask; /* are used to calculate the real page */ + /* address and real column address */ }; /* These map to the positions used by the FCM hardware ECC generator */ @@ -164,18 +168,27 @@ static void set_addr(struct mtd_info *mtd, int column, int page_addr, int oob) struct fsl_lbc_regs __iomem *lbc = ctrl->regs; struct fsl_elbc_fcm_ctrl *elbc_fcm_ctrl = ctrl->nand; int buf_num; + u32 real_ca = column; - elbc_fcm_ctrl->page = page_addr; + if (priv->page_size && elbc_fcm_ctrl->subpage_shift) { + real_ca = (page_addr & elbc_fcm_ctrl->subpage_mask) * 2112; + page_addr >>= elbc_fcm_ctrl->subpage_shift; + } - out_be32(&lbc->fbar, - page_addr >> (chip->phys_erase_shift - chip->page_shift)); + elbc_fcm_ctrl->page = page_addr; if (priv->page_size) { + real_ca += (oob ? 2048 : 0); + elbc_fcm_ctrl->use_mdr = 1; + elbc_fcm_ctrl->mdr = real_ca; + + out_be32(&lbc->fbar, page_addr >> 6); out_be32(&lbc->fpar, ((page_addr << FPAR_LP_PI_SHIFT) & FPAR_LP_PI) | (oob ? FPAR_LP_MS : 0) | column); buf_num = (page_addr & 1) << 2; } else { + out_be32(&lbc->fbar, page_addr >> 5); out_be32(&lbc->fpar, ((page_addr << FPAR_SP_PI_SHIFT) & FPAR_SP_PI) | (oob ? FPAR_SP_MS : 0) | column); @@ -256,10 +269,11 @@ static void fsl_elbc_do_read(struct nand_chip *chip, int oob) if (priv->page_size) { out_be32(&lbc->fir, (FIR_OP_CM0 << FIR_OP0_SHIFT) | - (FIR_OP_CA << FIR_OP1_SHIFT) | - (FIR_OP_PA << FIR_OP2_SHIFT) | - (FIR_OP_CM1 << FIR_OP3_SHIFT) | - (FIR_OP_RBW << FIR_OP4_SHIFT)); + (FIR_OP_UA << FIR_OP1_SHIFT) | + (FIR_OP_UA << FIR_OP2_SHIFT) | + (FIR_OP_PA << FIR_OP3_SHIFT) | + (FIR_OP_CM1 << FIR_OP4_SHIFT) | + (FIR_OP_RBW << FIR_OP5_SHIFT)); out_be32(&lbc->fcr, (NAND_CMD_READ0 << FCR_CMD0_SHIFT) | (NAND_CMD_READSTART << FCR_CMD1_SHIFT)); @@ -399,12 +413,13 @@ static void fsl_elbc_cmdfunc(struct mtd_info *mtd, unsigned int command, if (priv->page_size) { out_be32(&lbc->fir, (FIR_OP_CM2 << FIR_OP0_SHIFT) | - (FIR_OP_CA << FIR_OP1_SHIFT) | - (FIR_OP_PA << FIR_OP2_SHIFT) | - (FIR_OP_WB << FIR_OP3_SHIFT) | - (FIR_OP_CM3 << FIR_OP4_SHIFT) | - (FIR_OP_CW1 << FIR_OP5_SHIFT) | - (FIR_OP_RS << FIR_OP6_SHIFT)); + (FIR_OP_UA << FIR_OP1_SHIFT) | + (FIR_OP_UA << FIR_OP2_SHIFT) | + (FIR_OP_PA << FIR_OP3_SHIFT) | + (FIR_OP_WB << FIR_OP4_SHIFT) | + (FIR_OP_CM3 << FIR_OP5_SHIFT) | + (FIR_OP_CW1 << FIR_OP6_SHIFT) | + (FIR_OP_RS << FIR_OP7_SHIFT)); } else { out_be32(&lbc->fir, (FIR_OP_CM0 << FIR_OP0_SHIFT) | @@ -453,6 +468,9 @@ static void fsl_elbc_cmdfunc(struct mtd_info *mtd, unsigned int command, full_page = 1; } + if (priv->page_size) + elbc_fcm_ctrl->use_mdr = 1; + fsl_elbc_run_command(mtd); /* Read back the page in order to fill in the ECC for the @@ -654,9 +672,26 @@ static int fsl_elbc_chip_init_tail(struct mtd_info *mtd) struct nand_chip *chip = mtd->priv; struct fsl_elbc_mtd *priv = chip->priv; struct fsl_lbc_ctrl *ctrl = priv->ctrl; + struct fsl_elbc_fcm_ctrl *elbc_fcm_ctrl = ctrl->nand; struct fsl_lbc_regs __iomem *lbc = ctrl->regs; unsigned int al; + /* Hack for supporting the flash chip whose writesize is + * larger than 2K bytes. + */ + if (mtd->writesize > 2048) { + elbc_fcm_ctrl->subpage_shift = ffs(mtd->writesize >> 11) - 1; + elbc_fcm_ctrl->subpage_mask = + (1 << elbc_fcm_ctrl->subpage_shift) - 1; + /* Rewrite mtd->writesize, mtd->oobsize, chip->page_shift + * and chip->pagemask. + */ + mtd->writesize = 2048; + mtd->oobsize = 64; + chip->page_shift = ffs(mtd->writesize) - 1; + chip->pagemask = (chip->chipsize >> chip->page_shift) - 1; + } + /* calculate FMR Address Length field */ al = 0; if (chip->pagemask & 0xffff0000) -- 1.7.1 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* RE: [PATCH 2/2] mtd/nand : workaround for Freescale FCM to supportlarge-page Nand chip 2011-06-28 1:50 ` [PATCH 2/2] mtd/nand : workaround for Freescale FCM to support large-page Nand chip b35362 @ 2011-06-28 15:35 ` Mike Hench 2011-06-28 16:30 ` Scott Wood 2011-06-29 6:22 ` [PATCH 2/2] mtd/nand : workaround for Freescale FCM to support large-page " Artem Bityutskiy 1 sibling, 1 reply; 14+ messages in thread From: Mike Hench @ 2011-06-28 15:35 UTC (permalink / raw) To: b35362, dwmw2; +Cc: linuxppc-dev, linux-mtd Any boot ideas ? Will the FCM load 2k and run it? Thanks for any insight you might have. ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/2] mtd/nand : workaround for Freescale FCM to supportlarge-page Nand chip 2011-06-28 15:35 ` [PATCH 2/2] mtd/nand : workaround for Freescale FCM to supportlarge-page " Mike Hench @ 2011-06-28 16:30 ` Scott Wood 0 siblings, 0 replies; 14+ messages in thread From: Scott Wood @ 2011-06-28 16:30 UTC (permalink / raw) To: Mike Hench; +Cc: dwmw2, b35362, linux-mtd, linuxppc-dev On Tue, 28 Jun 2011 11:35:12 -0400 Mike Hench <mhench@elutions.com> wrote: > > Any boot ideas ? > Will the FCM load 2k and run it? The 4K boot region will have to be split over pages 0 and 2 (2k view) or the first half of pages 0 and 1 (4k view). -Scott ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/2] mtd/nand : workaround for Freescale FCM to support large-page Nand chip 2011-06-28 1:50 ` [PATCH 2/2] mtd/nand : workaround for Freescale FCM to support large-page Nand chip b35362 2011-06-28 15:35 ` [PATCH 2/2] mtd/nand : workaround for Freescale FCM to supportlarge-page " Mike Hench @ 2011-06-29 6:22 ` Artem Bityutskiy 2011-06-29 16:43 ` Scott Wood 1 sibling, 1 reply; 14+ messages in thread From: Artem Bityutskiy @ 2011-06-29 6:22 UTC (permalink / raw) To: b35362; +Cc: linuxppc-dev, dwmw2, linux-mtd On Tue, 2011-06-28 at 09:50 +0800, b35362@freescale.com wrote: > + /* Hack for supporting the flash chip whose writesize is > + * larger than 2K bytes. > + */ Please, use proper kernel multi-line comments. Please, make sure checkpatch.pl does not generate 13 errors with this patch. -- Best Regards, Artem Bityutskiy ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/2] mtd/nand : workaround for Freescale FCM to support large-page Nand chip 2011-06-29 6:22 ` [PATCH 2/2] mtd/nand : workaround for Freescale FCM to support large-page " Artem Bityutskiy @ 2011-06-29 16:43 ` Scott Wood 2011-06-30 11:51 ` Artem Bityutskiy 0 siblings, 1 reply; 14+ messages in thread From: Scott Wood @ 2011-06-29 16:43 UTC (permalink / raw) To: dedekind1; +Cc: linuxppc-dev, b35362, dwmw2, linux-mtd On Wed, 29 Jun 2011 09:22:04 +0300 Artem Bityutskiy <dedekind1@gmail.com> wrote: > On Tue, 2011-06-28 at 09:50 +0800, b35362@freescale.com wrote: > > + /* Hack for supporting the flash chip whose writesize is > > + * larger than 2K bytes. > > + */ > > Please, use proper kernel multi-line comments. Please, make sure > checkpatch.pl does not generate 13 errors with this patch. Most of the checkpatch complaints are about existing style in the file -- particularly, the use of tabs only for indentation, with spaces used for alignment beyond the indentation point. -Scott ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/2] mtd/nand : workaround for Freescale FCM to support large-page Nand chip 2011-06-29 16:43 ` Scott Wood @ 2011-06-30 11:51 ` Artem Bityutskiy 0 siblings, 0 replies; 14+ messages in thread From: Artem Bityutskiy @ 2011-06-30 11:51 UTC (permalink / raw) To: Scott Wood; +Cc: linuxppc-dev, b35362, dwmw2, linux-mtd On Wed, 2011-06-29 at 11:43 -0500, Scott Wood wrote: > On Wed, 29 Jun 2011 09:22:04 +0300 > Artem Bityutskiy <dedekind1@gmail.com> wrote: > > > On Tue, 2011-06-28 at 09:50 +0800, b35362@freescale.com wrote: > > > + /* Hack for supporting the flash chip whose writesize is > > > + * larger than 2K bytes. > > > + */ > > > > Please, use proper kernel multi-line comments. Please, make sure > > checkpatch.pl does not generate 13 errors with this patch. > > Most of the checkpatch complaints are about existing style in the file -- > particularly, the use of tabs only for indentation, with spaces used for > alignment beyond the indentation point. OK, fair enough, but the multi-line comment is a valid complain, although minor. And you guys could just fix the style issues as well in a separate patch-set. -- Best Regards, Artem Bityutskiy ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] mtd/nand : don't free the global data fsl_lbc_ctrl_dev->nand in fsl_elbc_chip_remove() 2011-06-28 1:50 [PATCH 1/2] mtd/nand : don't free the global data fsl_lbc_ctrl_dev->nand in fsl_elbc_chip_remove() b35362 2011-06-28 1:50 ` [PATCH 2/2] mtd/nand : workaround for Freescale FCM to support large-page Nand chip b35362 @ 2011-06-29 6:20 ` Artem Bityutskiy 2011-06-29 16:45 ` Scott Wood 2011-07-06 6:46 ` Artem Bityutskiy 2 siblings, 1 reply; 14+ messages in thread From: Artem Bityutskiy @ 2011-06-29 6:20 UTC (permalink / raw) To: b35362; +Cc: linuxppc-dev, dwmw2, linux-mtd On Tue, 2011-06-28 at 09:50 +0800, b35362@freescale.com wrote: > From: Liu Shuo <b35362@freescale.com> > > The global data fsl_lbc_ctrl_dev->nand don't have to be freed in > fsl_elbc_chip_remove(). The right place to do that is in fsl_elbc_nand_remove() > if elbc_fcm_ctrl->counter is zero. > > Signed-off-by: Liu Shuo <b35362@freescale.com> > --- > drivers/mtd/nand/fsl_elbc_nand.c | 1 - > 1 files changed, 0 insertions(+), 1 deletions(-) > > diff --git a/drivers/mtd/nand/fsl_elbc_nand.c b/drivers/mtd/nand/fsl_elbc_nand.c > index 0bb254c..a212116 100644 > --- a/drivers/mtd/nand/fsl_elbc_nand.c > +++ b/drivers/mtd/nand/fsl_elbc_nand.c > @@ -829,7 +829,6 @@ static int fsl_elbc_chip_remove(struct fsl_elbc_mtd *priv) > > elbc_fcm_ctrl->chips[priv->bank] = NULL; > kfree(priv); > - kfree(elbc_fcm_ctrl); > return 0; > } Do we have to assign fsl_lbc_ctrl_dev->nand to NULL in fsl_elbc_nand_remove() then? I think that assignment can be killed then. if (!elbc_fcm_ctrl->counter) { fsl_lbc_ctrl_dev->nand = NULL; kfree(elbc_fcm_ctrl); } -- Best Regards, Artem Bityutskiy ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] mtd/nand : don't free the global data fsl_lbc_ctrl_dev->nand in fsl_elbc_chip_remove() 2011-06-29 6:20 ` [PATCH 1/2] mtd/nand : don't free the global data fsl_lbc_ctrl_dev->nand in fsl_elbc_chip_remove() Artem Bityutskiy @ 2011-06-29 16:45 ` Scott Wood 2011-06-30 11:53 ` Artem Bityutskiy 0 siblings, 1 reply; 14+ messages in thread From: Scott Wood @ 2011-06-29 16:45 UTC (permalink / raw) To: dedekind1; +Cc: linuxppc-dev, b35362, dwmw2, linux-mtd On Wed, 29 Jun 2011 09:20:25 +0300 Artem Bityutskiy <dedekind1@gmail.com> wrote: > On Tue, 2011-06-28 at 09:50 +0800, b35362@freescale.com wrote: > > From: Liu Shuo <b35362@freescale.com> > > > > The global data fsl_lbc_ctrl_dev->nand don't have to be freed in > > fsl_elbc_chip_remove(). The right place to do that is in fsl_elbc_nand_remove() > > if elbc_fcm_ctrl->counter is zero. > > > > Signed-off-by: Liu Shuo <b35362@freescale.com> > > --- > > drivers/mtd/nand/fsl_elbc_nand.c | 1 - > > 1 files changed, 0 insertions(+), 1 deletions(-) > > > > diff --git a/drivers/mtd/nand/fsl_elbc_nand.c b/drivers/mtd/nand/fsl_elbc_nand.c > > index 0bb254c..a212116 100644 > > --- a/drivers/mtd/nand/fsl_elbc_nand.c > > +++ b/drivers/mtd/nand/fsl_elbc_nand.c > > @@ -829,7 +829,6 @@ static int fsl_elbc_chip_remove(struct fsl_elbc_mtd *priv) > > > > elbc_fcm_ctrl->chips[priv->bank] = NULL; > > kfree(priv); > > - kfree(elbc_fcm_ctrl); > > return 0; > > } > > Do we have to assign fsl_lbc_ctrl_dev->nand to NULL in > fsl_elbc_nand_remove() then? I think that assignment can be killed then. > > if (!elbc_fcm_ctrl->counter) { > fsl_lbc_ctrl_dev->nand = NULL; > kfree(elbc_fcm_ctrl); > } > If we're freeing fsl_lbc_ctrl, we'd better get rid of references to it... -Scott ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] mtd/nand : don't free the global data fsl_lbc_ctrl_dev->nand in fsl_elbc_chip_remove() 2011-06-29 16:45 ` Scott Wood @ 2011-06-30 11:53 ` Artem Bityutskiy 2011-06-30 16:26 ` Scott Wood 0 siblings, 1 reply; 14+ messages in thread From: Artem Bityutskiy @ 2011-06-30 11:53 UTC (permalink / raw) To: Scott Wood; +Cc: linuxppc-dev, b35362, dwmw2, linux-mtd On Wed, 2011-06-29 at 11:45 -0500, Scott Wood wrote: > On Wed, 29 Jun 2011 09:20:25 +0300 > Artem Bityutskiy <dedekind1@gmail.com> wrote: > > > On Tue, 2011-06-28 at 09:50 +0800, b35362@freescale.com wrote: > > > From: Liu Shuo <b35362@freescale.com> > > > > > > The global data fsl_lbc_ctrl_dev->nand don't have to be freed in > > > fsl_elbc_chip_remove(). The right place to do that is in fsl_elbc_nand_remove() > > > if elbc_fcm_ctrl->counter is zero. > > > > > > Signed-off-by: Liu Shuo <b35362@freescale.com> > > > --- > > > drivers/mtd/nand/fsl_elbc_nand.c | 1 - > > > 1 files changed, 0 insertions(+), 1 deletions(-) > > > > > > diff --git a/drivers/mtd/nand/fsl_elbc_nand.c b/drivers/mtd/nand/fsl_elbc_nand.c > > > index 0bb254c..a212116 100644 > > > --- a/drivers/mtd/nand/fsl_elbc_nand.c > > > +++ b/drivers/mtd/nand/fsl_elbc_nand.c > > > @@ -829,7 +829,6 @@ static int fsl_elbc_chip_remove(struct fsl_elbc_mtd *priv) > > > > > > elbc_fcm_ctrl->chips[priv->bank] = NULL; > > > kfree(priv); > > > - kfree(elbc_fcm_ctrl); > > > return 0; > > > } > > > > Do we have to assign fsl_lbc_ctrl_dev->nand to NULL in > > fsl_elbc_nand_remove() then? I think that assignment can be killed then. > > > > if (!elbc_fcm_ctrl->counter) { > > fsl_lbc_ctrl_dev->nand = NULL; > > kfree(elbc_fcm_ctrl); > > } > > > > If we're freeing fsl_lbc_ctrl, we'd better get rid of references to it... Yes, on the one hand this is a good defensive programming practice, on the other hand it hides double-free bugs. Like this patch fixes a double-free bug, and why it was noticed before? I thought may be because of this NULL assignment? I do not insist though, that was just a suggestion/question. -- Best Regards, Artem Bityutskiy ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] mtd/nand : don't free the global data fsl_lbc_ctrl_dev->nand in fsl_elbc_chip_remove() 2011-06-30 11:53 ` Artem Bityutskiy @ 2011-06-30 16:26 ` Scott Wood 2011-07-01 5:40 ` Artem Bityutskiy 0 siblings, 1 reply; 14+ messages in thread From: Scott Wood @ 2011-06-30 16:26 UTC (permalink / raw) To: dedekind1; +Cc: linuxppc-dev, b35362, dwmw2, linux-mtd On Thu, 30 Jun 2011 14:53:13 +0300 Artem Bityutskiy <dedekind1@gmail.com> wrote: > On Wed, 2011-06-29 at 11:45 -0500, Scott Wood wrote: > > If we're freeing fsl_lbc_ctrl, we'd better get rid of references to it... > > Yes, on the one hand this is a good defensive programming practice, on > the other hand it hides double-free bugs. Like this patch fixes a > double-free bug, and why it was noticed before? I thought may be because > of this NULL assignment? I'm not sure how the NULL assignment was hiding anything here. It was probably hidden only because nobody tested it with suitable debug options enabled since the code was last reorganized. If the NULL assignment is dropped, consider what happens if the fsl_elbc_nand module is removed then reinserted. On reinsertion, it will see a non-NULL fsl_lbc_ctrl_dev->nand, and will skip allocating a new one. Then you're referencing freed memory. Looking more closely, the MAX_BANKS loop should be removed. Since the reorganization, the platform device represents one chip, not the controller, so we should only be removing that one chip. -Scott ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] mtd/nand : don't free the global data fsl_lbc_ctrl_dev->nand in fsl_elbc_chip_remove() 2011-06-30 16:26 ` Scott Wood @ 2011-07-01 5:40 ` Artem Bityutskiy 2011-07-01 16:14 ` Scott Wood 0 siblings, 1 reply; 14+ messages in thread From: Artem Bityutskiy @ 2011-07-01 5:40 UTC (permalink / raw) To: Scott Wood; +Cc: linuxppc-dev, b35362, dwmw2, linux-mtd On Thu, 2011-06-30 at 11:26 -0500, Scott Wood wrote: > If the NULL assignment is dropped, consider what happens if the > fsl_elbc_nand module is removed then reinserted. On reinsertion, it > will > see a non-NULL fsl_lbc_ctrl_dev->nand, and will skip allocating a new > one. > Then you're referencing freed memory. Oh, then this sounds like a separate bug. Removing the module should kill everything, and re-inserging the module should have zero dependencies on the previous states... Anyway, if you think the original patch is OK, I can put it to my tree. -- Best Regards, Artem Bityutskiy ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] mtd/nand : don't free the global data fsl_lbc_ctrl_dev->nand in fsl_elbc_chip_remove() 2011-07-01 5:40 ` Artem Bityutskiy @ 2011-07-01 16:14 ` Scott Wood 0 siblings, 0 replies; 14+ messages in thread From: Scott Wood @ 2011-07-01 16:14 UTC (permalink / raw) To: dedekind1; +Cc: linuxppc-dev, b35362, dwmw2, linux-mtd On Fri, 1 Jul 2011 08:40:21 +0300 Artem Bityutskiy <dedekind1@gmail.com> wrote: > On Thu, 2011-06-30 at 11:26 -0500, Scott Wood wrote: > > If the NULL assignment is dropped, consider what happens if the > > fsl_elbc_nand module is removed then reinserted. On reinsertion, it > > will > > see a non-NULL fsl_lbc_ctrl_dev->nand, and will skip allocating a new > > one. > > Then you're referencing freed memory. > > Oh, then this sounds like a separate bug. Removing the module should > kill everything, and re-inserging the module should have zero > dependencies on the previous states... fsl_lbc_ctrl_dev (and thus the fsl_lbc_ctrl_dev->nand pointer) is not part of the module, it is part of arch/powerpc/sysdev/fsl_lbc.c. NAND isn't the only thing that elbc does. Since there can be multiple NAND chips, which are separately probed, the first chip (under a lock) creates the NAND state that is shared among the chips, and the last one removed destroys it. > Anyway, if you think the original patch is OK, I can put it to my tree. I think it's OK. The loop also needs to be removed, so the remove callback operates only on the particular chip it's called on, but that's a separate bug. -Scott ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] mtd/nand : don't free the global data fsl_lbc_ctrl_dev->nand in fsl_elbc_chip_remove() 2011-06-28 1:50 [PATCH 1/2] mtd/nand : don't free the global data fsl_lbc_ctrl_dev->nand in fsl_elbc_chip_remove() b35362 2011-06-28 1:50 ` [PATCH 2/2] mtd/nand : workaround for Freescale FCM to support large-page Nand chip b35362 2011-06-29 6:20 ` [PATCH 1/2] mtd/nand : don't free the global data fsl_lbc_ctrl_dev->nand in fsl_elbc_chip_remove() Artem Bityutskiy @ 2011-07-06 6:46 ` Artem Bityutskiy 2 siblings, 0 replies; 14+ messages in thread From: Artem Bityutskiy @ 2011-07-06 6:46 UTC (permalink / raw) To: b35362; +Cc: linuxppc-dev, dwmw2, linux-mtd On Tue, 2011-06-28 at 09:50 +0800, b35362@freescale.com wrote: > From: Liu Shuo <b35362@freescale.com> > > The global data fsl_lbc_ctrl_dev->nand don't have to be freed in > fsl_elbc_chip_remove(). The right place to do that is in fsl_elbc_nand_remove() > if elbc_fcm_ctrl->counter is zero. > > Signed-off-by: Liu Shuo <b35362@freescale.com> Changed the subject to something shorted and pushed to l2-mtd-2.6.git, thanks. -- Best Regards, Artem Bityutskiy ^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2011-07-06 6:45 UTC | newest] Thread overview: 14+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2011-06-28 1:50 [PATCH 1/2] mtd/nand : don't free the global data fsl_lbc_ctrl_dev->nand in fsl_elbc_chip_remove() b35362 2011-06-28 1:50 ` [PATCH 2/2] mtd/nand : workaround for Freescale FCM to support large-page Nand chip b35362 2011-06-28 15:35 ` [PATCH 2/2] mtd/nand : workaround for Freescale FCM to supportlarge-page " Mike Hench 2011-06-28 16:30 ` Scott Wood 2011-06-29 6:22 ` [PATCH 2/2] mtd/nand : workaround for Freescale FCM to support large-page " Artem Bityutskiy 2011-06-29 16:43 ` Scott Wood 2011-06-30 11:51 ` Artem Bityutskiy 2011-06-29 6:20 ` [PATCH 1/2] mtd/nand : don't free the global data fsl_lbc_ctrl_dev->nand in fsl_elbc_chip_remove() Artem Bityutskiy 2011-06-29 16:45 ` Scott Wood 2011-06-30 11:53 ` Artem Bityutskiy 2011-06-30 16:26 ` Scott Wood 2011-07-01 5:40 ` Artem Bityutskiy 2011-07-01 16:14 ` Scott Wood 2011-07-06 6:46 ` Artem Bityutskiy
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).