Message ID | 1430790861-30066-2-git-send-email-martin.petersen@oracle.com |
---|---|
State | Not Applicable |
Delegated to: | David Miller |
Headers | show |
On 05/05/2015 03:54 AM, Martin K. Petersen wrote: > Create a sysfs "trim" attribute for each ata_device that displays > whether DSM TRIM is "unsupported", "unqueued", "forced_unqueued" > (blacklisted) or "queued". > > Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> > --- > Documentation/ABI/testing/sysfs-ata | 11 +++++++++++ > drivers/ata/libata-transport.c | 22 ++++++++++++++++++++++ > 2 files changed, 33 insertions(+) > > diff --git a/Documentation/ABI/testing/sysfs-ata b/Documentation/ABI/testing/sysfs-ata > index 0a932155cbba..9231daef3813 100644 > --- a/Documentation/ABI/testing/sysfs-ata > +++ b/Documentation/ABI/testing/sysfs-ata > @@ -90,6 +90,17 @@ gscr > 130: SATA_PMP_GSCR_SII_GPIO > Only valid if the device is a PM. > > +trim > + > + Shows the DSM TRIM mode currently used by the device. Valid > + values are: > + unsupported: Drive does not support DSM TRIM > + unqueued: Drive supports unqueued DSM TRIM only > + queued: Drive supports queued DSM TRIM > + forced_unqueued: Drive's unqueued DSM support is known to be > + buggy and only unqueued TRIM commands > + are sent > + > spdn_cnt > > Number of time libata decided to lower the speed of link due to errors. > diff --git a/drivers/ata/libata-transport.c b/drivers/ata/libata-transport.c > index 3227b7c8a05f..d6c37bcd416d 100644 > --- a/drivers/ata/libata-transport.c > +++ b/drivers/ata/libata-transport.c > @@ -560,6 +560,27 @@ show_ata_dev_gscr(struct device *dev, > > static DEVICE_ATTR(gscr, S_IRUGO, show_ata_dev_gscr, NULL); > > +static ssize_t > +show_ata_dev_trim(struct device *dev, > + struct device_attribute *attr, char *buf) > +{ > + struct ata_device *ata_dev = transport_class_to_dev(dev); > + unsigned char *mode; > + > + if (!ata_id_has_trim(ata_dev->id)) > + mode = "unsupported"; > + else if (ata_dev->horkage & ATA_HORKAGE_NO_NCQ_TRIM) > + mode = "forced_unqueued"; > + else if (ata_fpdma_dsm_supported(ata_dev)) > + mode = "queued"; > + else > + mode = "unqueued"; > + > + return snprintf(buf, 20, "%s\n", mode); > +} > + > +static DEVICE_ATTR(trim, S_IRUGO, show_ata_dev_trim, NULL); > + > static DECLARE_TRANSPORT_CLASS(ata_dev_class, > "ata_device", NULL, NULL, NULL); > > @@ -733,6 +754,7 @@ struct scsi_transport_template *ata_attach_transport(void) > SETUP_DEV_ATTRIBUTE(ering); > SETUP_DEV_ATTRIBUTE(id); > SETUP_DEV_ATTRIBUTE(gscr); > + SETUP_DEV_ATTRIBUTE(trim); > BUG_ON(count > ATA_DEV_ATTRS); > i->dev_attrs[count] = NULL; > > Reviewed-by: Hannes Reinecke <hare@suse.de> Cheers, Hannes
> + forced_unqueued: Drive's unqueued DSM support is known to be > + buggy and only unqueued TRIM commands > + are sent Shouldn't the first "unqueued" be a "queued" -- To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
>>>>> "Christoph" == Christoph Hellwig <hch@infradead.org> writes: >> + forced_unqueued: Drive's unqueued DSM support is known to be + >> buggy and only unqueued TRIM commands + are sent Christoph> Shouldn't the first "unqueued" be a "queued" Yes, sorry about that.
diff --git a/Documentation/ABI/testing/sysfs-ata b/Documentation/ABI/testing/sysfs-ata index 0a932155cbba..9231daef3813 100644 --- a/Documentation/ABI/testing/sysfs-ata +++ b/Documentation/ABI/testing/sysfs-ata @@ -90,6 +90,17 @@ gscr 130: SATA_PMP_GSCR_SII_GPIO Only valid if the device is a PM. +trim + + Shows the DSM TRIM mode currently used by the device. Valid + values are: + unsupported: Drive does not support DSM TRIM + unqueued: Drive supports unqueued DSM TRIM only + queued: Drive supports queued DSM TRIM + forced_unqueued: Drive's unqueued DSM support is known to be + buggy and only unqueued TRIM commands + are sent + spdn_cnt Number of time libata decided to lower the speed of link due to errors. diff --git a/drivers/ata/libata-transport.c b/drivers/ata/libata-transport.c index 3227b7c8a05f..d6c37bcd416d 100644 --- a/drivers/ata/libata-transport.c +++ b/drivers/ata/libata-transport.c @@ -560,6 +560,27 @@ show_ata_dev_gscr(struct device *dev, static DEVICE_ATTR(gscr, S_IRUGO, show_ata_dev_gscr, NULL); +static ssize_t +show_ata_dev_trim(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ata_device *ata_dev = transport_class_to_dev(dev); + unsigned char *mode; + + if (!ata_id_has_trim(ata_dev->id)) + mode = "unsupported"; + else if (ata_dev->horkage & ATA_HORKAGE_NO_NCQ_TRIM) + mode = "forced_unqueued"; + else if (ata_fpdma_dsm_supported(ata_dev)) + mode = "queued"; + else + mode = "unqueued"; + + return snprintf(buf, 20, "%s\n", mode); +} + +static DEVICE_ATTR(trim, S_IRUGO, show_ata_dev_trim, NULL); + static DECLARE_TRANSPORT_CLASS(ata_dev_class, "ata_device", NULL, NULL, NULL); @@ -733,6 +754,7 @@ struct scsi_transport_template *ata_attach_transport(void) SETUP_DEV_ATTRIBUTE(ering); SETUP_DEV_ATTRIBUTE(id); SETUP_DEV_ATTRIBUTE(gscr); + SETUP_DEV_ATTRIBUTE(trim); BUG_ON(count > ATA_DEV_ATTRS); i->dev_attrs[count] = NULL;
Create a sysfs "trim" attribute for each ata_device that displays whether DSM TRIM is "unsupported", "unqueued", "forced_unqueued" (blacklisted) or "queued". Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> --- Documentation/ABI/testing/sysfs-ata | 11 +++++++++++ drivers/ata/libata-transport.c | 22 ++++++++++++++++++++++ 2 files changed, 33 insertions(+)