linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/2] Optimize secure erase performance for certain Kingston eMMC devices
@ 2025-12-15 10:20 ziniu.wang_1
  2025-12-15 10:20 ` [PATCH v2 1/2] block: decouple secure erase size limit from discard size limit ziniu.wang_1
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: ziniu.wang_1 @ 2025-12-15 10:20 UTC (permalink / raw)
  To: axboe, ulf.hansson; +Cc: linux-block, linux-mmc, linux-kernel, imx

From: Luke Wang <ziniu.wang_1@nxp.com>

This patch series optimize secure erase performance for certain Kingston
eMMC devices (IY2964 and IB2932) that take a fixed ~2 seconds per secure
erase operation regardless of size.

Currently, a 1GB secure erase requires ~300 operations (limited by max
discard size), taking ~10 minutes. With these changes, the same secure
erase completes in a single operation, reducing time to just 2 seconds.

---
Changes in v2:
- Rebased on v6.19-rc1 as requested
- Cover letter: terminology fix (command -> operation)
---

Luke Wang (2):
  block: decouple secure erase size limit from discard size limit
  mmc: add quirk to optimize certain Kingston eMMC secure erase/trim
    performance

 block/blk-merge.c         | 9 +++++++--
 block/blk.h               | 6 +++++-
 drivers/mmc/core/card.h   | 5 +++++
 drivers/mmc/core/queue.c  | 9 +++++++--
 drivers/mmc/core/quirks.h | 9 +++++++++
 include/linux/mmc/card.h  | 1 +
 6 files changed, 34 insertions(+), 5 deletions(-)

-- 
2.34.1


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v2 1/2] block: decouple secure erase size limit from discard size limit
  2025-12-15 10:20 [PATCH v2 0/2] Optimize secure erase performance for certain Kingston eMMC devices ziniu.wang_1
@ 2025-12-15 10:20 ` ziniu.wang_1
  2025-12-15 15:43   ` Christoph Hellwig
  2025-12-15 10:20 ` [PATCH v2 2/2] mmc: add quirk to optimize certain Kingston eMMC secure erase/trim performance ziniu.wang_1
  2025-12-15 15:37 ` [PATCH v2 0/2] Optimize secure erase performance for certain Kingston eMMC devices Ulf Hansson
  2 siblings, 1 reply; 8+ messages in thread
From: ziniu.wang_1 @ 2025-12-15 10:20 UTC (permalink / raw)
  To: axboe, ulf.hansson; +Cc: linux-block, linux-mmc, linux-kernel, imx

From: Luke Wang <ziniu.wang_1@nxp.com>

Secure erase should use max_secure_erase_sectors instead of being limited
by max_discard_sectors. Separate the handling of REQ_OP_SECURE_ERASE from
REQ_OP_DISCARD to allow each operation to use its own size limit.

Signed-off-by: Luke Wang <ziniu.wang_1@nxp.com>
---
 block/blk-merge.c | 9 +++++++--
 block/blk.h       | 6 +++++-
 2 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/block/blk-merge.c b/block/blk-merge.c
index d3115d7469df..0885e4b982ed 100644
--- a/block/blk-merge.c
+++ b/block/blk-merge.c
@@ -169,8 +169,13 @@ struct bio *bio_split_discard(struct bio *bio, const struct queue_limits *lim,
 
 	granularity = max(lim->discard_granularity >> 9, 1U);
 
-	max_discard_sectors =
-		min(lim->max_discard_sectors, bio_allowed_max_sectors(lim));
+	if (bio_op(bio) == REQ_OP_SECURE_ERASE)
+		max_discard_sectors = min(lim->max_secure_erase_sectors,
+					  bio_allowed_max_sectors(lim));
+	else
+		max_discard_sectors = min(lim->max_discard_sectors,
+					  bio_allowed_max_sectors(lim));
+
 	max_discard_sectors -= max_discard_sectors % granularity;
 	if (unlikely(!max_discard_sectors))
 		return bio;
diff --git a/block/blk.h b/block/blk.h
index e4c433f62dfc..4cd5a91346d8 100644
--- a/block/blk.h
+++ b/block/blk.h
@@ -208,10 +208,14 @@ static inline unsigned int blk_queue_get_max_sectors(struct request *rq)
 	struct request_queue *q = rq->q;
 	enum req_op op = req_op(rq);
 
-	if (unlikely(op == REQ_OP_DISCARD || op == REQ_OP_SECURE_ERASE))
+	if (unlikely(op == REQ_OP_DISCARD))
 		return min(q->limits.max_discard_sectors,
 			   UINT_MAX >> SECTOR_SHIFT);
 
+	if (unlikely(op == REQ_OP_SECURE_ERASE))
+		return min(q->limits.max_secure_erase_sectors,
+			   UINT_MAX >> SECTOR_SHIFT);
+
 	if (unlikely(op == REQ_OP_WRITE_ZEROES))
 		return q->limits.max_write_zeroes_sectors;
 
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v2 2/2] mmc: add quirk to optimize certain Kingston eMMC secure erase/trim performance
  2025-12-15 10:20 [PATCH v2 0/2] Optimize secure erase performance for certain Kingston eMMC devices ziniu.wang_1
  2025-12-15 10:20 ` [PATCH v2 1/2] block: decouple secure erase size limit from discard size limit ziniu.wang_1
@ 2025-12-15 10:20 ` ziniu.wang_1
  2025-12-15 15:37 ` [PATCH v2 0/2] Optimize secure erase performance for certain Kingston eMMC devices Ulf Hansson
  2 siblings, 0 replies; 8+ messages in thread
From: ziniu.wang_1 @ 2025-12-15 10:20 UTC (permalink / raw)
  To: axboe, ulf.hansson; +Cc: linux-block, linux-mmc, linux-kernel, imx

From: Luke Wang <ziniu.wang_1@nxp.com>

Kingston eMMC IY2964 and IB2932 takes a fixed ~2 seconds for each secure
erase/trim operation regardless of size - that is, a single secure
erase/trim operation of 1MB takes the same time as 1GB. With default
calculated 3.5MB max discard size, secure erase 1GB requires ~300 separate
operations taking ~10 minutes total.

Add MMC_QUIRK_FIXED_SECURE_ERASE_TRIM_TIME quirk to set maximum secure
erase size for those devices. This allows 1GB secure erase to complete
in a single operation, reducing time from 10 minutes to just 2 seconds.

Signed-off-by: Luke Wang <ziniu.wang_1@nxp.com>
---
 drivers/mmc/core/card.h   | 5 +++++
 drivers/mmc/core/queue.c  | 9 +++++++--
 drivers/mmc/core/quirks.h | 9 +++++++++
 include/linux/mmc/card.h  | 1 +
 4 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/drivers/mmc/core/card.h b/drivers/mmc/core/card.h
index 1200951bab08..0a198a2c2616 100644
--- a/drivers/mmc/core/card.h
+++ b/drivers/mmc/core/card.h
@@ -305,4 +305,9 @@ static inline int mmc_card_no_uhs_ddr50_tuning(const struct mmc_card *c)
 	return c->quirks & MMC_QUIRK_NO_UHS_DDR50_TUNING;
 }
 
+static inline int mmc_card_fixed_secure_erase_trim_time(const struct mmc_card *c)
+{
+	return c->quirks & MMC_QUIRK_FIXED_SECURE_ERASE_TRIM_TIME;
+}
+
 #endif
diff --git a/drivers/mmc/core/queue.c b/drivers/mmc/core/queue.c
index 284856c8f655..eb1053d8cae7 100644
--- a/drivers/mmc/core/queue.c
+++ b/drivers/mmc/core/queue.c
@@ -184,8 +184,13 @@ static void mmc_queue_setup_discard(struct mmc_card *card,
 		return;
 
 	lim->max_hw_discard_sectors = max_discard;
-	if (mmc_card_can_secure_erase_trim(card))
-		lim->max_secure_erase_sectors = max_discard;
+	if (mmc_card_can_secure_erase_trim(card)) {
+		if (mmc_card_fixed_secure_erase_trim_time(card))
+			lim->max_secure_erase_sectors = UINT_MAX >> card->erase_shift;
+		else
+			lim->max_secure_erase_sectors = max_discard;
+	}
+
 	if (mmc_card_can_trim(card) && card->erased_byte == 0)
 		lim->max_write_zeroes_sectors = max_discard;
 
diff --git a/drivers/mmc/core/quirks.h b/drivers/mmc/core/quirks.h
index c417ed34c057..1f7406c0ab03 100644
--- a/drivers/mmc/core/quirks.h
+++ b/drivers/mmc/core/quirks.h
@@ -153,6 +153,15 @@ static const struct mmc_fixup __maybe_unused mmc_blk_fixups[] = {
 	MMC_FIXUP("M62704", CID_MANFID_KINGSTON, 0x0100, add_quirk_mmc,
 		  MMC_QUIRK_TRIM_BROKEN),
 
+	/*
+	 * On Some Kingston eMMCs, secure erase/trim time is independent
+	 * of erase size, fixed at approximately 2 seconds.
+	 */
+	MMC_FIXUP("IY2964", CID_MANFID_KINGSTON, 0x0100, add_quirk_mmc,
+		  MMC_QUIRK_FIXED_SECURE_ERASE_TRIM_TIME),
+	MMC_FIXUP("IB2932", CID_MANFID_KINGSTON, 0x0100, add_quirk_mmc,
+		  MMC_QUIRK_FIXED_SECURE_ERASE_TRIM_TIME),
+
 	END_FIXUP
 };
 
diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h
index e9e964c20e53..1882267ef201 100644
--- a/include/linux/mmc/card.h
+++ b/include/linux/mmc/card.h
@@ -329,6 +329,7 @@ struct mmc_card {
 #define MMC_QUIRK_BROKEN_CACHE_FLUSH	(1<<16)	/* Don't flush cache until the write has occurred */
 #define MMC_QUIRK_BROKEN_SD_POWEROFF_NOTIFY	(1<<17) /* Disable broken SD poweroff notify support */
 #define MMC_QUIRK_NO_UHS_DDR50_TUNING	(1<<18) /* Disable DDR50 tuning */
+#define MMC_QUIRK_FIXED_SECURE_ERASE_TRIM_TIME	(1<<19) /* Secure erase/trim time is fixed regardless of size */
 
 	bool			written_flag;	/* Indicates eMMC has been written since power on */
 	bool			reenable_cmdq;	/* Re-enable Command Queue */
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 0/2] Optimize secure erase performance for certain Kingston eMMC devices
  2025-12-15 10:20 [PATCH v2 0/2] Optimize secure erase performance for certain Kingston eMMC devices ziniu.wang_1
  2025-12-15 10:20 ` [PATCH v2 1/2] block: decouple secure erase size limit from discard size limit ziniu.wang_1
  2025-12-15 10:20 ` [PATCH v2 2/2] mmc: add quirk to optimize certain Kingston eMMC secure erase/trim performance ziniu.wang_1
@ 2025-12-15 15:37 ` Ulf Hansson
  2025-12-16 10:02   ` [EXT] " Luke Wang
  2 siblings, 1 reply; 8+ messages in thread
From: Ulf Hansson @ 2025-12-15 15:37 UTC (permalink / raw)
  To: ziniu.wang_1; +Cc: axboe, linux-block, linux-mmc, linux-kernel, imx

On Mon, 15 Dec 2025 at 11:18, <ziniu.wang_1@nxp.com> wrote:
>
> From: Luke Wang <ziniu.wang_1@nxp.com>
>
> This patch series optimize secure erase performance for certain Kingston
> eMMC devices (IY2964 and IB2932) that take a fixed ~2 seconds per secure
> erase operation regardless of size.

Well, that sounds to me like the eMMC isn't really erasing the blocks.
I wonder how "secure" this is in practice.

>
> Currently, a 1GB secure erase requires ~300 operations (limited by max
> discard size), taking ~10 minutes. With these changes, the same secure
> erase completes in a single operation, reducing time to just 2 seconds.

Hmm, is the problem really the size or is it the timeout? Why does 300
operations to erase 1GB take ~10 minutes?

Can you please elaborate what happens on the mmc host driver level for
each operation. What mmc host driver/controller is being used? Does it
support MMC_CAP_WAIT_WHILE_BUSY or do we end up polling for
busy-completion in-between each command?

Kind regards
Uffe

>
> ---
> Changes in v2:
> - Rebased on v6.19-rc1 as requested
> - Cover letter: terminology fix (command -> operation)
> ---
>
> Luke Wang (2):
>   block: decouple secure erase size limit from discard size limit
>   mmc: add quirk to optimize certain Kingston eMMC secure erase/trim
>     performance
>
>  block/blk-merge.c         | 9 +++++++--
>  block/blk.h               | 6 +++++-
>  drivers/mmc/core/card.h   | 5 +++++
>  drivers/mmc/core/queue.c  | 9 +++++++--
>  drivers/mmc/core/quirks.h | 9 +++++++++
>  include/linux/mmc/card.h  | 1 +
>  6 files changed, 34 insertions(+), 5 deletions(-)
>
> --
> 2.34.1
>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 1/2] block: decouple secure erase size limit from discard size limit
  2025-12-15 10:20 ` [PATCH v2 1/2] block: decouple secure erase size limit from discard size limit ziniu.wang_1
@ 2025-12-15 15:43   ` Christoph Hellwig
  0 siblings, 0 replies; 8+ messages in thread
From: Christoph Hellwig @ 2025-12-15 15:43 UTC (permalink / raw)
  To: ziniu.wang_1
  Cc: axboe, ulf.hansson, linux-block, linux-mmc, linux-kernel, imx

> --- a/block/blk-merge.c
> +++ b/block/blk-merge.c
> @@ -169,8 +169,13 @@ struct bio *bio_split_discard(struct bio *bio, const struct queue_limits *lim,
>  
>  	granularity = max(lim->discard_granularity >> 9, 1U);
>  
> -	max_discard_sectors =
> -		min(lim->max_discard_sectors, bio_allowed_max_sectors(lim));
> +	if (bio_op(bio) == REQ_OP_SECURE_ERASE)
> +		max_discard_sectors = min(lim->max_secure_erase_sectors,
> +					  bio_allowed_max_sectors(lim));
> +	else
> +		max_discard_sectors = min(lim->max_discard_sectors,
> +					  bio_allowed_max_sectors(lim));

Please factor our a low-level helper and pass the max_sectors
as argument.


^ permalink raw reply	[flat|nested] 8+ messages in thread

* RE: [EXT] Re: [PATCH v2 0/2] Optimize secure erase performance for certain Kingston eMMC devices
  2025-12-15 15:37 ` [PATCH v2 0/2] Optimize secure erase performance for certain Kingston eMMC devices Ulf Hansson
@ 2025-12-16 10:02   ` Luke Wang
  2025-12-16 10:47     ` Christoph Hellwig
  2025-12-16 12:15     ` Ulf Hansson
  0 siblings, 2 replies; 8+ messages in thread
From: Luke Wang @ 2025-12-16 10:02 UTC (permalink / raw)
  To: Ulf Hansson
  Cc: axboe@kernel.dk, linux-block@vger.kernel.org,
	linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org,
	imx@lists.linux.dev



> -----Original Message-----
> From: Ulf Hansson <ulf.hansson@linaro.org>
> Sent: Monday, December 15, 2025 11:38 PM
> To: Luke Wang <ziniu.wang_1@nxp.com>
> Cc: axboe@kernel.dk; linux-block@vger.kernel.org; linux-
> mmc@vger.kernel.org; linux-kernel@vger.kernel.org; imx@lists.linux.dev
> Subject: [EXT] Re: [PATCH v2 0/2] Optimize secure erase performance for
> certain Kingston eMMC devices
> 
> Caution: This is an external email. Please take care when clicking links or
> opening attachments. When in doubt, report the message using the 'Report
> this email' button
> 
> 
> On Mon, 15 Dec 2025 at 11:18, <ziniu.wang_1@nxp.com> wrote:
> >
> > From: Luke Wang <ziniu.wang_1@nxp.com>
> >
> > This patch series optimize secure erase performance for certain Kingston
> > eMMC devices (IY2964 and IB2932) that take a fixed ~2 seconds per secure
> > erase operation regardless of size.
> 
> Well, that sounds to me like the eMMC isn't really erasing the blocks.
> I wonder how "secure" this is in practice.

Compared to other eMMC, 2 second secure erase time for 1GB is reasonable.

Using the default 3.5MB secure erase chunk, the total time spent secure erasing 1GB:
Sandisk SDINBDG4-32G-I 0.8s
Micron MTFC32GAKAEEF-AIT 4.7s
Longsys FEMDNN032G-C9A55 0.6s

In fact, secure erase does not guarantee that data is physically erased. We previously encountered
an issue with long secure trim times on the MTFC32GAKAEEF-AIT eMMC, and got confirmation
from Micron:
"Secure Erase (0x80000000) is treated as a simple Erase (0x00000000), while Secure
Trim (0x80000001 + 0x80008000) and Trim (0x00000001) are treated differently. So, it is
possible that Secure Trim really is the heaviest possible erase operation for the FW to execute. "

And the eMMC 5.1 Spec:
"NOTE Secure Erase is included for backwards compatibility. New system level implementations
(based on v4.51 devices and beyond) should use Erase combined with Sanitize instead of secure erase."

> 
> >
> > Currently, a 1GB secure erase requires ~300 operations (limited by max
> > discard size), taking ~10 minutes. With these changes, the same secure
> > erase completes in a single operation, reducing time to just 2 seconds.
> 
> Hmm, is the problem really the size or is it the timeout? Why does 300
> operations to erase 1GB take ~10 minutes?

I think the problem is caused by the fact that this Kingston eMMC secure erase
small chunk need ~2 second. In contrast, other eMMC secure erase small chunk
only take tens of milliseconds.

Also, the calculated max discard is too small. For the I.MX8MN USBHC controller, 
host->max_busy_timeout is 2684ms, and the calculated max discard is always
card->pref_erase - 1, which is 3.5MB.

> 
> Can you please elaborate what happens on the mmc host driver level for
> each operation. What mmc host driver/controller is being used? Does it
> support MMC_CAP_WAIT_WHILE_BUSY or do we end up polling for
> busy-completion in-between each command?

This issue is found on IMX8MN-EVK, uSDHC controller. We end up polling for 
busy-completion in-between each command.

I print some log during secure erasing:
Without this patch
[  126.760429] mmc2: starting CMD35 arg 01294000 flags 00000095
[  126.766530] mmc2: starting CMD36 arg 01295bff flags 00000095
[  126.772246] mmc2: starting CMD38 arg 80000000 flags 00000095
[  126.777988] mmc2: mmc_poll_for_busy
[  128.616245] mmc2: erase operation completes
[  128.628511] mmc2: starting CMD35 arg 01295c00 flags 00000095
[  128.634293] mmc2: starting CMD36 arg 012977ff flags 00000095
[  128.640089] mmc2: starting CMD38 arg 80000000 flags 00000095
[  128.645811] mmc2: mmc_poll_for_busy
[  130.456184] mmc2: erase operation completes
[  130.468390] mmc2: starting CMD35 arg 01297800 flags 00000095
[  130.474160] mmc2: starting CMD36 arg 012993ff flags 00000095
[  130.479928] mmc2: starting CMD38 arg 80000000 flags 00000095
[  130.485798] mmc2: mmc_poll_for_busy
[  132.192309] mmc2: erase operation completes
...

Apply this patch
[  296.480818] mmc2: starting CMD35 arg 01294000 flags 00000095
[  296.487219] mmc2: starting CMD36 arg 01493fff flags 00000095
[  296.492995] mmc2: starting CMD38 arg 80000000 flags 00000095
[  296.498999] mmc2: mmc_poll_for_busy
[  298.712865] mmc2: erase operation completes

Regards,
Luke
> 
> Kind regards
> Uffe
> 
> >
> > ---
> > Changes in v2:
> > - Rebased on v6.19-rc1 as requested
> > - Cover letter: terminology fix (command -> operation)
> > ---
> >
> > Luke Wang (2):
> >   block: decouple secure erase size limit from discard size limit
> >   mmc: add quirk to optimize certain Kingston eMMC secure erase/trim
> >     performance
> >
> >  block/blk-merge.c         | 9 +++++++--
> >  block/blk.h               | 6 +++++-
> >  drivers/mmc/core/card.h   | 5 +++++
> >  drivers/mmc/core/queue.c  | 9 +++++++--
> >  drivers/mmc/core/quirks.h | 9 +++++++++
> >  include/linux/mmc/card.h  | 1 +
> >  6 files changed, 34 insertions(+), 5 deletions(-)
> >
> > --
> > 2.34.1
> >

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [EXT] Re: [PATCH v2 0/2] Optimize secure erase performance for certain Kingston eMMC devices
  2025-12-16 10:02   ` [EXT] " Luke Wang
@ 2025-12-16 10:47     ` Christoph Hellwig
  2025-12-16 12:15     ` Ulf Hansson
  1 sibling, 0 replies; 8+ messages in thread
From: Christoph Hellwig @ 2025-12-16 10:47 UTC (permalink / raw)
  To: Luke Wang
  Cc: Ulf Hansson, axboe@kernel.dk, linux-block@vger.kernel.org,
	linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org,
	imx@lists.linux.dev

On Tue, Dec 16, 2025 at 10:02:49AM +0000, Luke Wang wrote:
> In fact, secure erase does not guarantee that data is physically
> erased.

It can't.  Given how Flash storage works there is no way to actually
securely erase data on a per-LBA range basis. 

> And the eMMC 5.1 Spec:
> "NOTE Secure Erase is included for backwards compatibility. New system level implementations
> (based on v4.51 devices and beyond) should use Erase combined with Sanitize instead of secure erase."

And this is 100% correct.  Only a device-level Sanitize operation
can do meaningful erasure of data on Flash based media (or modern
HDDs with all the remapping they do for that matter).


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [EXT] Re: [PATCH v2 0/2] Optimize secure erase performance for certain Kingston eMMC devices
  2025-12-16 10:02   ` [EXT] " Luke Wang
  2025-12-16 10:47     ` Christoph Hellwig
@ 2025-12-16 12:15     ` Ulf Hansson
  1 sibling, 0 replies; 8+ messages in thread
From: Ulf Hansson @ 2025-12-16 12:15 UTC (permalink / raw)
  To: Luke Wang
  Cc: axboe@kernel.dk, linux-block@vger.kernel.org,
	linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org,
	imx@lists.linux.dev

On Tue, 16 Dec 2025 at 11:02, Luke Wang <ziniu.wang_1@nxp.com> wrote:
>
>
>
> > -----Original Message-----
> > From: Ulf Hansson <ulf.hansson@linaro.org>
> > Sent: Monday, December 15, 2025 11:38 PM
> > To: Luke Wang <ziniu.wang_1@nxp.com>
> > Cc: axboe@kernel.dk; linux-block@vger.kernel.org; linux-
> > mmc@vger.kernel.org; linux-kernel@vger.kernel.org; imx@lists.linux.dev
> > Subject: [EXT] Re: [PATCH v2 0/2] Optimize secure erase performance for
> > certain Kingston eMMC devices
> >
> > Caution: This is an external email. Please take care when clicking links or
> > opening attachments. When in doubt, report the message using the 'Report
> > this email' button
> >
> >
> > On Mon, 15 Dec 2025 at 11:18, <ziniu.wang_1@nxp.com> wrote:
> > >
> > > From: Luke Wang <ziniu.wang_1@nxp.com>
> > >
> > > This patch series optimize secure erase performance for certain Kingston
> > > eMMC devices (IY2964 and IB2932) that take a fixed ~2 seconds per secure
> > > erase operation regardless of size.
> >
> > Well, that sounds to me like the eMMC isn't really erasing the blocks.
> > I wonder how "secure" this is in practice.
>
> Compared to other eMMC, 2 second secure erase time for 1GB is reasonable.
>
> Using the default 3.5MB secure erase chunk, the total time spent secure erasing 1GB:
> Sandisk SDINBDG4-32G-I 0.8s
> Micron MTFC32GAKAEEF-AIT 4.7s
> Longsys FEMDNN032G-C9A55 0.6s
>
> In fact, secure erase does not guarantee that data is physically erased. We previously encountered
> an issue with long secure trim times on the MTFC32GAKAEEF-AIT eMMC, and got confirmation
> from Micron:
> "Secure Erase (0x80000000) is treated as a simple Erase (0x00000000), while Secure
> Trim (0x80000001 + 0x80008000) and Trim (0x00000001) are treated differently. So, it is
> possible that Secure Trim really is the heaviest possible erase operation for the FW to execute. "
>
> And the eMMC 5.1 Spec:
> "NOTE Secure Erase is included for backwards compatibility. New system level implementations
> (based on v4.51 devices and beyond) should use Erase combined with Sanitize instead of secure erase."

Right, thanks for clarifying this! I do recall the complexity around this now.

>
> >
> > >
> > > Currently, a 1GB secure erase requires ~300 operations (limited by max
> > > discard size), taking ~10 minutes. With these changes, the same secure
> > > erase completes in a single operation, reducing time to just 2 seconds.
> >
> > Hmm, is the problem really the size or is it the timeout? Why does 300
> > operations to erase 1GB take ~10 minutes?
>
> I think the problem is caused by the fact that this Kingston eMMC secure erase
> small chunk need ~2 second. In contrast, other eMMC secure erase small chunk
> only take tens of milliseconds.

Okay! So it looks like using a card quirk, something along what you
propose in patch2 could make sense. I will have a closer look.

>
> Also, the calculated max discard is too small. For the I.MX8MN USBHC controller,
> host->max_busy_timeout is 2684ms, and the calculated max discard is always
> card->pref_erase - 1, which is 3.5MB.

I see, so regular REQ_OP_DISCARDs are suffering from similar problems
that are taking a very long time to complete?

Are you planning to make a similar card quirk for discards or what do
you have in mind?

>
> >
> > Can you please elaborate what happens on the mmc host driver level for
> > each operation. What mmc host driver/controller is being used? Does it
> > support MMC_CAP_WAIT_WHILE_BUSY or do we end up polling for
> > busy-completion in-between each command?
>
> This issue is found on IMX8MN-EVK, uSDHC controller. We end up polling for
> busy-completion in-between each command.
>
> I print some log during secure erasing:
> Without this patch
> [  126.760429] mmc2: starting CMD35 arg 01294000 flags 00000095
> [  126.766530] mmc2: starting CMD36 arg 01295bff flags 00000095
> [  126.772246] mmc2: starting CMD38 arg 80000000 flags 00000095
> [  126.777988] mmc2: mmc_poll_for_busy
> [  128.616245] mmc2: erase operation completes
> [  128.628511] mmc2: starting CMD35 arg 01295c00 flags 00000095
> [  128.634293] mmc2: starting CMD36 arg 012977ff flags 00000095
> [  128.640089] mmc2: starting CMD38 arg 80000000 flags 00000095
> [  128.645811] mmc2: mmc_poll_for_busy
> [  130.456184] mmc2: erase operation completes
> [  130.468390] mmc2: starting CMD35 arg 01297800 flags 00000095
> [  130.474160] mmc2: starting CMD36 arg 012993ff flags 00000095
> [  130.479928] mmc2: starting CMD38 arg 80000000 flags 00000095
> [  130.485798] mmc2: mmc_poll_for_busy
> [  132.192309] mmc2: erase operation completes
> ...
>
> Apply this patch
> [  296.480818] mmc2: starting CMD35 arg 01294000 flags 00000095
> [  296.487219] mmc2: starting CMD36 arg 01493fff flags 00000095
> [  296.492995] mmc2: starting CMD38 arg 80000000 flags 00000095
> [  296.498999] mmc2: mmc_poll_for_busy
> [  298.712865] mmc2: erase operation completes

Thanks for sharing the log, much appreciated!

Just to double check, I assume that you have verified that the
busy-polling works as expected on your HW? The reason for asking is
that we have seen problems with this several times in the past, on
other HWs.

Kind regards
Uffe

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2025-12-16 12:16 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-15 10:20 [PATCH v2 0/2] Optimize secure erase performance for certain Kingston eMMC devices ziniu.wang_1
2025-12-15 10:20 ` [PATCH v2 1/2] block: decouple secure erase size limit from discard size limit ziniu.wang_1
2025-12-15 15:43   ` Christoph Hellwig
2025-12-15 10:20 ` [PATCH v2 2/2] mmc: add quirk to optimize certain Kingston eMMC secure erase/trim performance ziniu.wang_1
2025-12-15 15:37 ` [PATCH v2 0/2] Optimize secure erase performance for certain Kingston eMMC devices Ulf Hansson
2025-12-16 10:02   ` [EXT] " Luke Wang
2025-12-16 10:47     ` Christoph Hellwig
2025-12-16 12:15     ` Ulf Hansson

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).