Re: [PATCH] libata: add horkage for M88V29

From: Böszörményi Zoltán
Date: Thu Jun 23 2022 - 06:12:11 EST


2022. 06. 23. 11:32 keltezéssel, Böszörményi Zoltán írta:
2022. 06. 23. 10:46 keltezéssel, Damien Le Moal írta:
On 6/23/22 17:38, Böszörményi Zoltán wrote:
2022. 06. 23. 10:22 keltezéssel, Damien Le Moal írta:
On 6/23/22 16:47, Böszörményi Zoltán wrote:
2022. 02. 08. 9:07 keltezéssel, Damien Le Moal írta:
On 2/4/22 21:57, zboszor@xxxxx wrote:
From: Zoltán Böszörményi <zboszor@xxxxxxxxx>

This device is a CF card, or possibly an SSD in CF form factor.
It supports NCQ and high speed DMA.

While it also advertises TRIM support, I/O errors are reported
when the discard mount option fstrim is used. TRIM also fails
when disabling NCQ and not just as an NCQ command.

TRIM must be disabled for this device.

Signed-off-by: Zoltán Böszörményi <zboszor@xxxxxxxxx>
---
    drivers/ata/libata-core.c | 1 +
    1 file changed, 1 insertion(+)

diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index 67f88027680a..4a7f58fcc411 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -4028,6 +4028,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
            /* devices that don't properly handle TRIM commands */
        { "SuperSSpeed S238*",        NULL, ATA_HORKAGE_NOTRIM, },
+    { "M88V29*",            NULL, ATA_HORKAGE_NOTRIM, },
            /*
         * As defined, the DRAT (Deterministic Read After Trim) and RZAT
Applied to for-5.17-fixes. Thanks !
Thank you. However, I have second thoughts about this patch.
The device advertises this:

# hdparm -iI /dev/sda
...
    Enabled Supported
       *    Data Set Management TRIM supported (limit 1 block)
...

but the I/O failures always reported higher number of blocks,
IIRC the attempted number of block was 8 or so.

Can the kernel limit or split TRIM commands according to the
advertised limit? If not (or not yet) then the quirk is good for now.
Yes, the kernel does that. See the sysfs queue attributes
discard_max_bytes and discard_max_hw_bytes. What are the values for your
device ? I think that the "limit 1 block" indicated by hdparm is simply to
say that the DSM command (to trim the device) accept only at most a 1
block (512 B) list of sectors to trim. That is not the actual trim limit
for each sector range in that list.
With the quirk in effect (TRIM disabled) I have these:

[root@chef queue]# pwd
/sys/block/sda/queue
[root@chef queue]# cat discard_granularity
0
[root@chef queue]# cat discard_max_bytes
0
[root@chef queue]# cat discard_max_hw_bytes
0
Yes, expected. What are the values without the quirk applied ?

I built 5.18.6 with removing the quirk.

[root@chef queue]# pwd
/sys/block/sda/queue/
[root@chef queue]# cat discard_granularity
512
[root@chef queue]# cat discard_max_bytes
2147450880
[root@chef queue]# cat discard_max_hw_bytes
2147450880
[root@chef queue]# cat max_discard_segments
1

"echo 512 >discard_max_hw_bytes" says permission denied.
"echo 512 >discard_max_bytes" can be set

But with or without libata.force=noncqtrim, running
"fstrim /boot" (which is ext4) goes into an infinite loop
dumping a lot of I/O errors into dmesg.

Interestingly, after setting discard_max_bytes=512,
in both cases (with or without libata.force=noncqrtim)
running "fstrim /" (which is f2fs) there is no error in
dmesg and fstrim returns after a small delay.

So I guess TRIM does work but ext4 seems to be misbehaving.

FWIW "mount" shows "discard" for the big f2fs partition but
it doesn't for ext4 but it's in the default mount option AFAIK.
"mount /boot -o remount.discard" doesn't make a difference.
the machine dumps a lot of errors into dmesg with "fstrim /boot".


With 5.19, you can use libata.force to disable/enable it. See
Documentation/admin-guide/kernel-parameters.txt for details.
You could try disabling DSM TRIM (queued trim) and see if the non-ncq trim
work.