Re: [6.2 regression][bisected]discard storm on idle since v6.1-rc8-59-g63a7cb130718 discard=async

Christoph Hellwig
2023-04-04T16:28:20Z

On Tue, Apr 04, 2023 at 09:20:27PM +0500, Roman Mamedov wrote:
> SSDs do not physically erase blocks on discard, that would be very slow.
>
> Instead they nuke corresponding records in the Flash translation layer (FTL)
> tables, so that the discarded areas point "nowhere" instead of the actual
> stored blocks. And when facing such pointers on trying to resolve read
> requests, the controller knows to just return zeroes.

Of course they don't erase blocks on every discard (although if you look
long enough you'll probably find a worst case implementation that does
this anyway). But you still need to persist your FTL changes, and the
zeroing if any was done by the time your get a FLUSH command, because
without that you'd return different data when reading a block after a
powerfail (i.e. the old data) than before (zeros or a pattern), which is
a no-go.

> Of course there can be varying behaviors per SSD, e.g. I know of some that
> return random garbage instead of zeroes, and some which for a puzzling reason
> prefer to return the byte FF instead.

All of that is valid behavior per the relevant standards.

> But I think the 1st point above should
> be universal, pretty certain there are none where a discard/TRIM would take
> comparable time to "dd if=/dev/zero of=/dev/ssd" (making it unusable in
> practice).

This is wishful thinking :) SSDs generall optimize the fast path very
heavily, so slow path command even when they should in theory be faster
due to the underlying optimizations might not be, as they are processed
in software instead of hardware offloads, moved to slower cores, etc.

For discard things have gotten a lot better in the last years, but for
many older devices performance can be outright horrible.

For SATA SSDs the fact that classic TRIM isn't a queued command adds
insult to injury as it always means draining the queue first and not
issuing any I/O until the TRIM command is done. There is a FPDMA
version not, but I don't think it ws all that widely implemented before
SATA SSDs fell out of favour.