From: Christophe Kerello <christophe.kerello@foss.st.com>
To: Miquel Raynal <miquel.raynal@bootlin.com>,
Richard Weinberger <richard@nod.at>,
Vignesh Raghavendra <vigneshr@ti.com>,
Tudor Ambarus <tudor.ambarus@linaro.org>,
Pratyush Yadav <pratyush@kernel.org>,
Michael Walle <michael@walle.cc>, <linux-mtd@lists.infradead.org>
Cc: "Thomas Petazzoni" <thomas.petazzoni@bootlin.com>,
"Julien Su" <juliensu@mxic.com.tw>,
"Jaime Liao" <jaimeliao@mxic.com.tw>,
"Jaime Liao" <jaimeliao.tw@gmail.com>,
"Alvin Zhou" <alvinzhou@mxic.com.tw>,
eagle.alexander923@gmail.com, mans@mansr.com, martin@geanix.com,
"Sean Nyekjær" <sean@geanix.com>,
stable@vger.kernel.org
Subject: Re: [PATCH 1/3] mtd: rawnand: Fix and simplify again the continuous read derivations
Date: Fri, 1 Mar 2024 18:48:31 +0100 [thread overview]
Message-ID: <ffdb0f72-5e49-4e41-9801-399035c0bdce@foss.st.com> (raw)
In-Reply-To: <20240223115545.354541-2-miquel.raynal@bootlin.com>
Hi Miquel,
On 2/23/24 12:55, Miquel Raynal wrote:
> We need to avoid the first page if we don't read it entirely.
> We need to avoid the last page if we don't read it entirely.
> While rather simple, this logic has been failed in the previous
> fix. This time I wrote about 30 unit tests locally to check each
> possible condition, hopefully I covered them all.
>
> Reported-by: Christophe Kerello <christophe.kerello@foss.st.com>
> Closes: https://lore.kernel.org/linux-mtd/20240221175327.42f7076d@xps-13/T/#m399bacb10db8f58f6b1f0149a1df867ec086bb0a
> Suggested-by: Christophe Kerello <christophe.kerello@foss.st.com>
> Fixes: 828f6df1bcba ("mtd: rawnand: Clarify conditions to enable continuous reads")
> Cc: stable@vger.kernel.org
> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Tested-by: Christophe Kerello <christophe.kerello@foss.st.com>
Regards,
Christophe Kerello.
> ---
> drivers/mtd/nand/raw/nand_base.c | 38 ++++++++++++++++++--------------
> 1 file changed, 22 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c
> index 3b3ce2926f5d..bcfd99a1699f 100644
> --- a/drivers/mtd/nand/raw/nand_base.c
> +++ b/drivers/mtd/nand/raw/nand_base.c
> @@ -3466,30 +3466,36 @@ static void rawnand_enable_cont_reads(struct nand_chip *chip, unsigned int page,
> u32 readlen, int col)
> {
> struct mtd_info *mtd = nand_to_mtd(chip);
> - unsigned int end_page, end_col;
> + unsigned int first_page, last_page;
>
> chip->cont_read.ongoing = false;
>
> if (!chip->controller->supported_op.cont_read)
> return;
>
> - end_page = DIV_ROUND_UP(col + readlen, mtd->writesize);
> - end_col = (col + readlen) % mtd->writesize;
> + /*
> + * Don't bother making any calculations if the length is too small.
> + * Side effect: avoids possible integer underflows below.
> + */
> + if (readlen < (2 * mtd->writesize))
> + return;
>
> + /* Derive the page where continuous read should start (the first full page read) */
> + first_page = page;
> if (col)
> - page++;
> -
> - if (end_col && end_page)
> - end_page--;
> -
> - if (page + 1 > end_page)
> - return;
> -
> - chip->cont_read.first_page = page;
> - chip->cont_read.last_page = end_page;
> - chip->cont_read.ongoing = true;
> -
> - rawnand_cap_cont_reads(chip);
> + first_page++;
> +
> + /* Derive the page where continuous read should stop (the last full page read) */
> + last_page = page + ((col + readlen) / mtd->writesize) - 1;
> +
> + /* Configure and enable continuous read when suitable */
> + if (first_page < last_page) {
> + chip->cont_read.first_page = first_page;
> + chip->cont_read.last_page = last_page;
> + chip->cont_read.ongoing = true;
> + /* May reset the ongoing flag */
> + rawnand_cap_cont_reads(chip);
> + }
> }
>
> static void rawnand_cont_read_skip_first_page(struct nand_chip *chip, unsigned int page)
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
WARNING: multiple messages have this Message-ID (diff)
From: Christophe Kerello <christophe.kerello@foss.st.com>
To: Miquel Raynal <miquel.raynal@bootlin.com>,
Richard Weinberger <richard@nod.at>,
Vignesh Raghavendra <vigneshr@ti.com>,
Tudor Ambarus <tudor.ambarus@linaro.org>,
Pratyush Yadav <pratyush@kernel.org>,
Michael Walle <michael@walle.cc>, <linux-mtd@lists.infradead.org>
Cc: "Thomas Petazzoni" <thomas.petazzoni@bootlin.com>,
"Julien Su" <juliensu@mxic.com.tw>,
"Jaime Liao" <jaimeliao@mxic.com.tw>,
"Jaime Liao" <jaimeliao.tw@gmail.com>,
"Alvin Zhou" <alvinzhou@mxic.com.tw>,
eagle.alexander923@gmail.com, mans@mansr.com, martin@geanix.com,
"Sean Nyekjær" <sean@geanix.com>,
stable@vger.kernel.org
Subject: Re: [PATCH 1/3] mtd: rawnand: Fix and simplify again the continuous read derivations
Date: Fri, 1 Mar 2024 18:48:31 +0100 [thread overview]
Message-ID: <ffdb0f72-5e49-4e41-9801-399035c0bdce@foss.st.com> (raw)
In-Reply-To: <20240223115545.354541-2-miquel.raynal@bootlin.com>
Hi Miquel,
On 2/23/24 12:55, Miquel Raynal wrote:
> We need to avoid the first page if we don't read it entirely.
> We need to avoid the last page if we don't read it entirely.
> While rather simple, this logic has been failed in the previous
> fix. This time I wrote about 30 unit tests locally to check each
> possible condition, hopefully I covered them all.
>
> Reported-by: Christophe Kerello <christophe.kerello@foss.st.com>
> Closes: https://lore.kernel.org/linux-mtd/20240221175327.42f7076d@xps-13/T/#m399bacb10db8f58f6b1f0149a1df867ec086bb0a
> Suggested-by: Christophe Kerello <christophe.kerello@foss.st.com>
> Fixes: 828f6df1bcba ("mtd: rawnand: Clarify conditions to enable continuous reads")
> Cc: stable@vger.kernel.org
> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Tested-by: Christophe Kerello <christophe.kerello@foss.st.com>
Regards,
Christophe Kerello.
> ---
> drivers/mtd/nand/raw/nand_base.c | 38 ++++++++++++++++++--------------
> 1 file changed, 22 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c
> index 3b3ce2926f5d..bcfd99a1699f 100644
> --- a/drivers/mtd/nand/raw/nand_base.c
> +++ b/drivers/mtd/nand/raw/nand_base.c
> @@ -3466,30 +3466,36 @@ static void rawnand_enable_cont_reads(struct nand_chip *chip, unsigned int page,
> u32 readlen, int col)
> {
> struct mtd_info *mtd = nand_to_mtd(chip);
> - unsigned int end_page, end_col;
> + unsigned int first_page, last_page;
>
> chip->cont_read.ongoing = false;
>
> if (!chip->controller->supported_op.cont_read)
> return;
>
> - end_page = DIV_ROUND_UP(col + readlen, mtd->writesize);
> - end_col = (col + readlen) % mtd->writesize;
> + /*
> + * Don't bother making any calculations if the length is too small.
> + * Side effect: avoids possible integer underflows below.
> + */
> + if (readlen < (2 * mtd->writesize))
> + return;
>
> + /* Derive the page where continuous read should start (the first full page read) */
> + first_page = page;
> if (col)
> - page++;
> -
> - if (end_col && end_page)
> - end_page--;
> -
> - if (page + 1 > end_page)
> - return;
> -
> - chip->cont_read.first_page = page;
> - chip->cont_read.last_page = end_page;
> - chip->cont_read.ongoing = true;
> -
> - rawnand_cap_cont_reads(chip);
> + first_page++;
> +
> + /* Derive the page where continuous read should stop (the last full page read) */
> + last_page = page + ((col + readlen) / mtd->writesize) - 1;
> +
> + /* Configure and enable continuous read when suitable */
> + if (first_page < last_page) {
> + chip->cont_read.first_page = first_page;
> + chip->cont_read.last_page = last_page;
> + chip->cont_read.ongoing = true;
> + /* May reset the ongoing flag */
> + rawnand_cap_cont_reads(chip);
> + }
> }
>
> static void rawnand_cont_read_skip_first_page(struct nand_chip *chip, unsigned int page)
next prev parent reply other threads:[~2024-03-01 17:50 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-23 11:55 [PATCH 0/3] mtd: rawnand: More continuous read fixes Miquel Raynal
2024-02-23 11:55 ` [PATCH 1/3] mtd: rawnand: Fix and simplify again the continuous read derivations Miquel Raynal
2024-02-23 11:55 ` Miquel Raynal
2024-03-01 17:48 ` Christophe Kerello [this message]
2024-03-01 17:48 ` Christophe Kerello
2024-03-07 17:28 ` Miquel Raynal
2024-03-07 17:28 ` Miquel Raynal
2024-02-23 11:55 ` [PATCH 2/3] mtd: rawnand: Add a helper for calculating a page index Miquel Raynal
2024-02-23 11:55 ` Miquel Raynal
2024-02-23 11:55 ` [PATCH 3/3] mtd: rawnand: Ensure all continuous terms are always in sync Miquel Raynal
2024-02-23 11:55 ` Miquel Raynal
2024-03-07 17:28 ` Miquel Raynal
2024-03-07 17:28 ` Miquel Raynal
2024-02-26 14:28 ` [PATCH 0/3] mtd: rawnand: More continuous read fixes Christophe Kerello
2024-02-29 10:46 ` Miquel Raynal
2024-03-04 10:44 ` Christophe Kerello
2024-03-07 11:52 ` Miquel Raynal
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=ffdb0f72-5e49-4e41-9801-399035c0bdce@foss.st.com \
--to=christophe.kerello@foss.st.com \
--cc=alvinzhou@mxic.com.tw \
--cc=eagle.alexander923@gmail.com \
--cc=jaimeliao.tw@gmail.com \
--cc=jaimeliao@mxic.com.tw \
--cc=juliensu@mxic.com.tw \
--cc=linux-mtd@lists.infradead.org \
--cc=mans@mansr.com \
--cc=martin@geanix.com \
--cc=michael@walle.cc \
--cc=miquel.raynal@bootlin.com \
--cc=pratyush@kernel.org \
--cc=richard@nod.at \
--cc=sean@geanix.com \
--cc=stable@vger.kernel.org \
--cc=thomas.petazzoni@bootlin.com \
--cc=tudor.ambarus@linaro.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.