This patch series adds sas_ncq_prio_supported and sas_ncq_prio_enable
sysfs sttributes for libsas managed SATA devices. Existing libata sysfs
attributes cannot be used directly because the ata_port location is
different for libsas.
Changes since v6:
- Replaced sas_ata_sdev_attr_group definition with a macro for
the "CONFIG_SCSI_SAS_ATA is not set" case. The macro defines
an empty rvalue struct eliminating the variable definition.
Changes since v5:
- Added __maybe_unused attribute to sas_ata_sdev_attr_group to prevent
an unused-const-variable warning when CONFIG_SCSI_SAS_ATA is not set.
Changes since v4:
- Updated sas_ncq_prio_* sysfs functions to use WARN_ON_ONCE() instead
of WARN_ON().
Changes since v3:
- Changed ata_ncq_prio_supported() and ata_ncq_prio_enabled() to store
the result into a boolean variable passed by address.
- Removed the "usable with both libsas and libata" wording from
ata_ncq_prio_* helper's function comments.
- Removed the unlikely() in ata_ncq_prio_enable() because the function
is not in a fastpath.
- Dropped hisi_sas v1 HW driver changes because it doesn't support SATA.
Changes since v2:
- Added libsas SATA sysfs attributes to aic94xx and isci.
Changes since v1:
- Dropped the "sas_" prefix to align sysfs sttributes naming with AHCI.
- Dropped ternary operators to make the code more readable.
- Corrected the formatting %u -> %d in sysfs_emit().
- Changed kstrtol() to kstrtobool() in [ata|sas]_ncq_prio_enable_store().
- Changed comments to use the "/* */" style instead of "//".
- Added libsas SATA sysfs attributes to mvsas and hisi_sas.
- Dropped the 'Reviewed-by' tags because they were not sent in-reply
to the patch emails.
Igor Pylypiv (7):
ata: libata-sata: Factor out NCQ Priority configuration helpers
scsi: libsas: Define NCQ Priority sysfs attributes for SATA devices
scsi: pm80xx: Add libsas SATA sysfs attributes group
scsi: mvsas: Add libsas SATA sysfs attributes group
scsi: hisi_sas: Add libsas SATA sysfs attributes group
scsi: aic94xx: Add libsas SATA sysfs attributes group
scsi: isci: Add libsas SATA sysfs attributes group
drivers/ata/libata-sata.c | 140 ++++++++++++++++++-------
drivers/scsi/aic94xx/aic94xx_init.c | 8 ++
drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 6 ++
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 6 ++
drivers/scsi/isci/init.c | 6 ++
drivers/scsi/libsas/sas_ata.c | 94 +++++++++++++++++
drivers/scsi/mvsas/mv_init.c | 7 ++
drivers/scsi/pm8001/pm8001_ctl.c | 5 +
drivers/scsi/pm8001/pm8001_init.c | 1 +
drivers/scsi/pm8001/pm8001_sas.h | 1 +
include/linux/libata.h | 6 ++
include/scsi/sas_ata.h | 6 ++
12 files changed, 247 insertions(+), 39 deletions(-)
--
2.44.0.278.ge034bb2e1d-goog
Export libata NCQ Priority configuration helpers to be reused
for libsas managed SATA devices.
Acked-by: Damien Le Moal <[email protected]>
Reviewed-by: Jason Yan <[email protected]>
Signed-off-by: Igor Pylypiv <[email protected]>
---
drivers/ata/libata-sata.c | 140 +++++++++++++++++++++++++++-----------
include/linux/libata.h | 6 ++
2 files changed, 107 insertions(+), 39 deletions(-)
diff --git a/drivers/ata/libata-sata.c b/drivers/ata/libata-sata.c
index 0fb1934875f2..f00dd02dc6f8 100644
--- a/drivers/ata/libata-sata.c
+++ b/drivers/ata/libata-sata.c
@@ -848,80 +848,122 @@ DEVICE_ATTR(link_power_management_policy, S_IRUGO | S_IWUSR,
ata_scsi_lpm_show, ata_scsi_lpm_store);
EXPORT_SYMBOL_GPL(dev_attr_link_power_management_policy);
-static ssize_t ata_ncq_prio_supported_show(struct device *device,
- struct device_attribute *attr,
- char *buf)
+/**
+ * ata_ncq_prio_supported - Check if device supports NCQ Priority
+ * @ap: ATA port of the target device
+ * @sdev: SCSI device
+ * @supported: Address of a boolean to store the result
+ *
+ * Helper to check if device supports NCQ Priority feature.
+ */
+int ata_ncq_prio_supported(struct ata_port *ap, struct scsi_device *sdev,
+ bool *supported)
{
- struct scsi_device *sdev = to_scsi_device(device);
- struct ata_port *ap = ata_shost_to_port(sdev->host);
struct ata_device *dev;
- bool ncq_prio_supported;
+ unsigned long flags;
int rc = 0;
- spin_lock_irq(ap->lock);
+ spin_lock_irqsave(ap->lock, flags);
dev = ata_scsi_find_dev(ap, sdev);
if (!dev)
rc = -ENODEV;
else
- ncq_prio_supported = dev->flags & ATA_DFLAG_NCQ_PRIO;
- spin_unlock_irq(ap->lock);
+ *supported = dev->flags & ATA_DFLAG_NCQ_PRIO;
+ spin_unlock_irqrestore(ap->lock, flags);
+ return rc;
+}
+EXPORT_SYMBOL_GPL(ata_ncq_prio_supported);
+
+static ssize_t ata_ncq_prio_supported_show(struct device *device,
+ struct device_attribute *attr,
+ char *buf)
+{
+ struct scsi_device *sdev = to_scsi_device(device);
+ struct ata_port *ap = ata_shost_to_port(sdev->host);
+ bool supported;
+ int rc;
- return rc ? rc : sysfs_emit(buf, "%u\n", ncq_prio_supported);
+ rc = ata_ncq_prio_supported(ap, sdev, &supported);
+ if (rc)
+ return rc;
+
+ return sysfs_emit(buf, "%d\n", supported);
}
DEVICE_ATTR(ncq_prio_supported, S_IRUGO, ata_ncq_prio_supported_show, NULL);
EXPORT_SYMBOL_GPL(dev_attr_ncq_prio_supported);
-static ssize_t ata_ncq_prio_enable_show(struct device *device,
- struct device_attribute *attr,
- char *buf)
+/**
+ * ata_ncq_prio_enabled - Check if NCQ Priority is enabled
+ * @ap: ATA port of the target device
+ * @sdev: SCSI device
+ * @enabled: Address of a boolean to store the result
+ *
+ * Helper to check if NCQ Priority feature is enabled.
+ */
+int ata_ncq_prio_enabled(struct ata_port *ap, struct scsi_device *sdev,
+ bool *enabled)
{
- struct scsi_device *sdev = to_scsi_device(device);
- struct ata_port *ap = ata_shost_to_port(sdev->host);
struct ata_device *dev;
- bool ncq_prio_enable;
+ unsigned long flags;
int rc = 0;
- spin_lock_irq(ap->lock);
+ spin_lock_irqsave(ap->lock, flags);
dev = ata_scsi_find_dev(ap, sdev);
if (!dev)
rc = -ENODEV;
else
- ncq_prio_enable = dev->flags & ATA_DFLAG_NCQ_PRIO_ENABLED;
- spin_unlock_irq(ap->lock);
-
- return rc ? rc : sysfs_emit(buf, "%u\n", ncq_prio_enable);
+ *enabled = dev->flags & ATA_DFLAG_NCQ_PRIO_ENABLED;
+ spin_unlock_irqrestore(ap->lock, flags);
+ return rc;
}
+EXPORT_SYMBOL_GPL(ata_ncq_prio_enabled);
-static ssize_t ata_ncq_prio_enable_store(struct device *device,
- struct device_attribute *attr,
- const char *buf, size_t len)
+static ssize_t ata_ncq_prio_enable_show(struct device *device,
+ struct device_attribute *attr,
+ char *buf)
{
struct scsi_device *sdev = to_scsi_device(device);
- struct ata_port *ap;
- struct ata_device *dev;
- long int input;
- int rc = 0;
+ struct ata_port *ap = ata_shost_to_port(sdev->host);
+ bool enabled;
+ int rc;
- rc = kstrtol(buf, 10, &input);
+ rc = ata_ncq_prio_enabled(ap, sdev, &enabled);
if (rc)
return rc;
- if ((input < 0) || (input > 1))
- return -EINVAL;
- ap = ata_shost_to_port(sdev->host);
- dev = ata_scsi_find_dev(ap, sdev);
- if (unlikely(!dev))
- return -ENODEV;
+ return sysfs_emit(buf, "%d\n", enabled);
+}
+
+/**
+ * ata_ncq_prio_enable - Enable/disable NCQ Priority
+ * @ap: ATA port of the target device
+ * @sdev: SCSI device
+ * @enable: true - enable NCQ Priority, false - disable NCQ Priority
+ *
+ * Helper to enable/disable NCQ Priority feature.
+ */
+int ata_ncq_prio_enable(struct ata_port *ap, struct scsi_device *sdev,
+ bool enable)
+{
+ struct ata_device *dev;
+ unsigned long flags;
+ int rc = 0;
+
+ spin_lock_irqsave(ap->lock, flags);
- spin_lock_irq(ap->lock);
+ dev = ata_scsi_find_dev(ap, sdev);
+ if (!dev) {
+ rc = -ENODEV;
+ goto unlock;
+ }
if (!(dev->flags & ATA_DFLAG_NCQ_PRIO)) {
rc = -EINVAL;
goto unlock;
}
- if (input) {
+ if (enable) {
if (dev->flags & ATA_DFLAG_CDL_ENABLED) {
ata_dev_err(dev,
"CDL must be disabled to enable NCQ priority\n");
@@ -934,9 +976,29 @@ static ssize_t ata_ncq_prio_enable_store(struct device *device,
}
unlock:
- spin_unlock_irq(ap->lock);
+ spin_unlock_irqrestore(ap->lock, flags);
+ return rc;
+}
+EXPORT_SYMBOL_GPL(ata_ncq_prio_enable);
+
+static ssize_t ata_ncq_prio_enable_store(struct device *device,
+ struct device_attribute *attr,
+ const char *buf, size_t len)
+{
+ struct scsi_device *sdev = to_scsi_device(device);
+ struct ata_port *ap = ata_shost_to_port(sdev->host);
+ bool enable;
+ int rc;
+
+ rc = kstrtobool(buf, &enable);
+ if (rc)
+ return rc;
+
+ rc = ata_ncq_prio_enable(ap, sdev, enable);
+ if (rc)
+ return rc;
- return rc ? rc : len;
+ return len;
}
DEVICE_ATTR(ncq_prio_enable, S_IRUGO | S_IWUSR,
diff --git a/include/linux/libata.h b/include/linux/libata.h
index 26d68115afb8..6dd9a4f9ca7c 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -1157,6 +1157,12 @@ extern int ata_scsi_change_queue_depth(struct scsi_device *sdev,
int queue_depth);
extern int ata_change_queue_depth(struct ata_port *ap, struct scsi_device *sdev,
int queue_depth);
+extern int ata_ncq_prio_supported(struct ata_port *ap, struct scsi_device *sdev,
+ bool *supported);
+extern int ata_ncq_prio_enabled(struct ata_port *ap, struct scsi_device *sdev,
+ bool *enabled);
+extern int ata_ncq_prio_enable(struct ata_port *ap, struct scsi_device *sdev,
+ bool enable);
extern struct ata_device *ata_dev_pair(struct ata_device *adev);
extern int ata_do_set_mode(struct ata_link *link, struct ata_device **r_failed_dev);
extern void ata_scsi_port_error_handler(struct Scsi_Host *host, struct ata_port *ap);
--
2.44.0.278.ge034bb2e1d-goog
Libata sysfs attributes cannot be used for libsas managed SATA devices
because the ata_port location is different for libsas.
Defined sysfs attributes (visible for SATA devices only):
- /sys/block/sda/device/ncq_prio_enable
- /sys/block/sda/device/ncq_prio_supported
The newly defined attributes will pass the correct ata_port to libata
helper functions.
Reviewed-by: John Garry <[email protected]>
Reviewed-by: Damien Le Moal <[email protected]>
Reviewed-by: Jason Yan <[email protected]>
Signed-off-by: Igor Pylypiv <[email protected]>
---
drivers/scsi/libsas/sas_ata.c | 94 +++++++++++++++++++++++++++++++++++
include/scsi/sas_ata.h | 6 +++
2 files changed, 100 insertions(+)
diff --git a/drivers/scsi/libsas/sas_ata.c b/drivers/scsi/libsas/sas_ata.c
index 12e2653846e3..04b0bd9a4e01 100644
--- a/drivers/scsi/libsas/sas_ata.c
+++ b/drivers/scsi/libsas/sas_ata.c
@@ -964,3 +964,97 @@ int sas_execute_ata_cmd(struct domain_device *device, u8 *fis, int force_phy_id)
force_phy_id, &tmf_task);
}
EXPORT_SYMBOL_GPL(sas_execute_ata_cmd);
+
+static ssize_t sas_ncq_prio_supported_show(struct device *device,
+ struct device_attribute *attr,
+ char *buf)
+{
+ struct scsi_device *sdev = to_scsi_device(device);
+ struct domain_device *ddev = sdev_to_domain_dev(sdev);
+ bool supported;
+ int rc;
+
+ /* This attribute shall be visible for SATA devices only */
+ if (WARN_ON_ONCE(!dev_is_sata(ddev)))
+ return -EINVAL;
+
+ rc = ata_ncq_prio_supported(ddev->sata_dev.ap, sdev, &supported);
+ if (rc)
+ return rc;
+
+ return sysfs_emit(buf, "%d\n", supported);
+}
+
+DEVICE_ATTR(ncq_prio_supported, S_IRUGO, sas_ncq_prio_supported_show, NULL);
+
+static ssize_t sas_ncq_prio_enable_show(struct device *device,
+ struct device_attribute *attr,
+ char *buf)
+{
+ struct scsi_device *sdev = to_scsi_device(device);
+ struct domain_device *ddev = sdev_to_domain_dev(sdev);
+ bool enabled;
+ int rc;
+
+ /* This attribute shall be visible for SATA devices only */
+ if (WARN_ON_ONCE(!dev_is_sata(ddev)))
+ return -EINVAL;
+
+ rc = ata_ncq_prio_enabled(ddev->sata_dev.ap, sdev, &enabled);
+ if (rc)
+ return rc;
+
+ return sysfs_emit(buf, "%d\n", enabled);
+}
+
+static ssize_t sas_ncq_prio_enable_store(struct device *device,
+ struct device_attribute *attr,
+ const char *buf, size_t len)
+{
+ struct scsi_device *sdev = to_scsi_device(device);
+ struct domain_device *ddev = sdev_to_domain_dev(sdev);
+ bool enable;
+ int rc;
+
+ /* This attribute shall be visible for SATA devices only */
+ if (WARN_ON_ONCE(!dev_is_sata(ddev)))
+ return -EINVAL;
+
+ rc = kstrtobool(buf, &enable);
+ if (rc)
+ return rc;
+
+ rc = ata_ncq_prio_enable(ddev->sata_dev.ap, sdev, enable);
+ if (rc)
+ return rc;
+
+ return len;
+}
+
+DEVICE_ATTR(ncq_prio_enable, S_IRUGO | S_IWUSR,
+ sas_ncq_prio_enable_show, sas_ncq_prio_enable_store);
+
+static struct attribute *sas_ata_sdev_attrs[] = {
+ &dev_attr_ncq_prio_supported.attr,
+ &dev_attr_ncq_prio_enable.attr,
+ NULL
+};
+
+static umode_t sas_ata_attr_is_visible(struct kobject *kobj,
+ struct attribute *attr, int i)
+{
+ struct device *dev = kobj_to_dev(kobj);
+ struct scsi_device *sdev = to_scsi_device(dev);
+ struct domain_device *ddev = sdev_to_domain_dev(sdev);
+
+ if (!dev_is_sata(ddev))
+ return 0;
+
+ return attr->mode;
+}
+
+const struct attribute_group sas_ata_sdev_attr_group = {
+ .attrs = sas_ata_sdev_attrs,
+ .is_visible = sas_ata_attr_is_visible,
+};
+EXPORT_SYMBOL_GPL(sas_ata_sdev_attr_group);
diff --git a/include/scsi/sas_ata.h b/include/scsi/sas_ata.h
index 2f8c719840a6..92e27e7bf088 100644
--- a/include/scsi/sas_ata.h
+++ b/include/scsi/sas_ata.h
@@ -39,6 +39,9 @@ int smp_ata_check_ready_type(struct ata_link *link);
int sas_discover_sata(struct domain_device *dev);
int sas_ata_add_dev(struct domain_device *parent, struct ex_phy *phy,
struct domain_device *child, int phy_id);
+
+extern const struct attribute_group sas_ata_sdev_attr_group;
+
#else
static inline void sas_ata_disabled_notice(void)
@@ -123,6 +126,9 @@ static inline int sas_ata_add_dev(struct domain_device *parent, struct ex_phy *p
sas_ata_disabled_notice();
return -ENODEV;
}
+
+#define sas_ata_sdev_attr_group ((struct attribute_group) {})
+
#endif
#endif /* _SAS_ATA_H_ */
--
2.44.0.278.ge034bb2e1d-goog
The added sysfs attributes group enables the configuration of NCQ Priority
feature for HBAs that rely on libsas to manage SATA devices.
Acked-by: Jack Wang <[email protected]>
Reviewed-by: John Garry <[email protected]>
Reviewed-by: Damien Le Moal <[email protected]>
Reviewed-by: Jason Yan <[email protected]>
Signed-off-by: Igor Pylypiv <[email protected]>
---
drivers/scsi/pm8001/pm8001_ctl.c | 5 +++++
drivers/scsi/pm8001/pm8001_init.c | 1 +
drivers/scsi/pm8001/pm8001_sas.h | 1 +
3 files changed, 7 insertions(+)
diff --git a/drivers/scsi/pm8001/pm8001_ctl.c b/drivers/scsi/pm8001/pm8001_ctl.c
index 5c26a13ffbd2..9ffe1a868d0f 100644
--- a/drivers/scsi/pm8001/pm8001_ctl.c
+++ b/drivers/scsi/pm8001/pm8001_ctl.c
@@ -1039,3 +1039,8 @@ const struct attribute_group *pm8001_host_groups[] = {
&pm8001_host_attr_group,
NULL
};
+
+const struct attribute_group *pm8001_sdev_groups[] = {
+ &sas_ata_sdev_attr_group,
+ NULL
+};
diff --git a/drivers/scsi/pm8001/pm8001_init.c b/drivers/scsi/pm8001/pm8001_init.c
index ed6b7d954dda..e6b1108f6117 100644
--- a/drivers/scsi/pm8001/pm8001_init.c
+++ b/drivers/scsi/pm8001/pm8001_init.c
@@ -134,6 +134,7 @@ static const struct scsi_host_template pm8001_sht = {
.compat_ioctl = sas_ioctl,
#endif
.shost_groups = pm8001_host_groups,
+ .sdev_groups = pm8001_sdev_groups,
.track_queue_depth = 1,
.cmd_per_lun = 32,
.map_queues = pm8001_map_queues,
diff --git a/drivers/scsi/pm8001/pm8001_sas.h b/drivers/scsi/pm8001/pm8001_sas.h
index 3ccb7371902f..ced6721380a8 100644
--- a/drivers/scsi/pm8001/pm8001_sas.h
+++ b/drivers/scsi/pm8001/pm8001_sas.h
@@ -717,6 +717,7 @@ int pm80xx_fatal_errors(struct pm8001_hba_info *pm8001_ha);
void pm8001_free_dev(struct pm8001_device *pm8001_dev);
/* ctl shared API */
extern const struct attribute_group *pm8001_host_groups[];
+extern const struct attribute_group *pm8001_sdev_groups[];
#define PM8001_INVALID_TAG ((u32)-1)
--
2.44.0.278.ge034bb2e1d-goog
The added sysfs attributes group enables the configuration of NCQ Priority
feature for HBAs that rely on libsas to manage SATA devices.
Reviewed-by: John Garry <[email protected]>
Reviewed-by: Damien Le Moal <[email protected]>
Reviewed-by: Jason Yan <[email protected]>
Signed-off-by: Igor Pylypiv <[email protected]>
---
drivers/scsi/mvsas/mv_init.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/drivers/scsi/mvsas/mv_init.c b/drivers/scsi/mvsas/mv_init.c
index 43ebb331e216..f1090bb5f2c9 100644
--- a/drivers/scsi/mvsas/mv_init.c
+++ b/drivers/scsi/mvsas/mv_init.c
@@ -26,6 +26,7 @@ static const struct mvs_chip_info mvs_chips[] = {
};
static const struct attribute_group *mvst_host_groups[];
+static const struct attribute_group *mvst_sdev_groups[];
#define SOC_SAS_NUM 2
@@ -53,6 +54,7 @@ static const struct scsi_host_template mvs_sht = {
.compat_ioctl = sas_ioctl,
#endif
.shost_groups = mvst_host_groups,
+ .sdev_groups = mvst_sdev_groups,
.track_queue_depth = 1,
};
@@ -779,6 +781,11 @@ static struct attribute *mvst_host_attrs[] = {
ATTRIBUTE_GROUPS(mvst_host);
+static const struct attribute_group *mvst_sdev_groups[] = {
+ &sas_ata_sdev_attr_group,
+ NULL
+};
+
module_init(mvs_init);
module_exit(mvs_exit);
--
2.44.0.278.ge034bb2e1d-goog
The added sysfs attributes group enables the configuration of NCQ Priority
feature for HBAs that rely on libsas to manage SATA devices.
Reviewed-by: John Garry <[email protected]>
Reviewed-by: Damien Le Moal <[email protected]>
Reviewed-by: Jason Yan <[email protected]>
Signed-off-by: Igor Pylypiv <[email protected]>
---
drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 6 ++++++
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 6 ++++++
2 files changed, 12 insertions(+)
diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
index 73b378837da7..b5d379ebe05d 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
@@ -3544,6 +3544,11 @@ static struct attribute *host_v2_hw_attrs[] = {
ATTRIBUTE_GROUPS(host_v2_hw);
+static const struct attribute_group *sdev_groups_v2_hw[] = {
+ &sas_ata_sdev_attr_group,
+ NULL
+};
+
static void map_queues_v2_hw(struct Scsi_Host *shost)
{
struct hisi_hba *hisi_hba = shost_priv(shost);
@@ -3585,6 +3590,7 @@ static const struct scsi_host_template sht_v2_hw = {
.compat_ioctl = sas_ioctl,
#endif
.shost_groups = host_v2_hw_groups,
+ .sdev_groups = sdev_groups_v2_hw,
.host_reset = hisi_sas_host_reset,
.map_queues = map_queues_v2_hw,
.host_tagset = 1,
diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
index b56fbc61a15a..9b69ea16a1e6 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
@@ -2929,6 +2929,11 @@ static struct attribute *host_v3_hw_attrs[] = {
ATTRIBUTE_GROUPS(host_v3_hw);
+static const struct attribute_group *sdev_groups_v3_hw[] = {
+ &sas_ata_sdev_attr_group,
+ NULL
+};
+
#define HISI_SAS_DEBUGFS_REG(x) {#x, x}
struct hisi_sas_debugfs_reg_lu {
@@ -3340,6 +3345,7 @@ static const struct scsi_host_template sht_v3_hw = {
.compat_ioctl = sas_ioctl,
#endif
.shost_groups = host_v3_hw_groups,
+ .sdev_groups = sdev_groups_v3_hw,
.tag_alloc_policy = BLK_TAG_ALLOC_RR,
.host_reset = hisi_sas_host_reset,
.host_tagset = 1,
--
2.44.0.278.ge034bb2e1d-goog
The added sysfs attributes group enables the configuration of NCQ Priority
feature for HBAs that rely on libsas to manage SATA devices.
Reviewed-by: John Garry <[email protected]>
Reviewed-by: Damien Le Moal <[email protected]>
Reviewed-by: Jason Yan <[email protected]>
Signed-off-by: Igor Pylypiv <[email protected]>
---
drivers/scsi/aic94xx/aic94xx_init.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/drivers/scsi/aic94xx/aic94xx_init.c b/drivers/scsi/aic94xx/aic94xx_init.c
index 8a3340d8d7ad..ccccd0eb6275 100644
--- a/drivers/scsi/aic94xx/aic94xx_init.c
+++ b/drivers/scsi/aic94xx/aic94xx_init.c
@@ -14,6 +14,7 @@
#include <linux/firmware.h>
#include <linux/slab.h>
+#include <scsi/sas_ata.h>
#include <scsi/scsi_host.h>
#include "aic94xx.h"
@@ -34,6 +35,7 @@ MODULE_PARM_DESC(use_msi, "\n"
static struct scsi_transport_template *aic94xx_transport_template;
static int asd_scan_finished(struct Scsi_Host *, unsigned long);
static void asd_scan_start(struct Scsi_Host *);
+static const struct attribute_group *asd_sdev_groups[];
static const struct scsi_host_template aic94xx_sht = {
.module = THIS_MODULE,
@@ -60,6 +62,7 @@ static const struct scsi_host_template aic94xx_sht = {
.compat_ioctl = sas_ioctl,
#endif
.track_queue_depth = 1,
+ .sdev_groups = asd_sdev_groups,
};
static int asd_map_memio(struct asd_ha_struct *asd_ha)
@@ -951,6 +954,11 @@ static void asd_remove_driver_attrs(struct device_driver *driver)
driver_remove_file(driver, &driver_attr_version);
}
+static const struct attribute_group *asd_sdev_groups[] = {
+ &sas_ata_sdev_attr_group,
+ NULL
+};
+
static struct sas_domain_function_template aic94xx_transport_functions = {
.lldd_dev_found = asd_dev_found,
.lldd_dev_gone = asd_dev_gone,
--
2.44.0.278.ge034bb2e1d-goog
The added sysfs attributes group enables the configuration of NCQ Priority
feature for HBAs that rely on libsas to manage SATA devices.
Reviewed-by: John Garry <[email protected]>
Reviewed-by: Damien Le Moal <[email protected]>
Reviewed-by: Jason Yan <[email protected]>
Signed-off-by: Igor Pylypiv <[email protected]>
---
drivers/scsi/isci/init.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/drivers/scsi/isci/init.c b/drivers/scsi/isci/init.c
index 6277162a028b..8658dcd61b87 100644
--- a/drivers/scsi/isci/init.c
+++ b/drivers/scsi/isci/init.c
@@ -149,6 +149,11 @@ static struct attribute *isci_host_attrs[] = {
ATTRIBUTE_GROUPS(isci_host);
+static const struct attribute_group *isci_sdev_groups[] = {
+ &sas_ata_sdev_attr_group,
+ NULL
+};
+
static const struct scsi_host_template isci_sht = {
.module = THIS_MODULE,
@@ -176,6 +181,7 @@ static const struct scsi_host_template isci_sht = {
.compat_ioctl = sas_ioctl,
#endif
.shost_groups = isci_host_groups,
+ .sdev_groups = isci_sdev_groups,
.track_queue_depth = 1,
};
--
2.44.0.278.ge034bb2e1d-goog
Hello Igor,
On Tue, Mar 05, 2024 at 05:22:20PM -0800, Igor Pylypiv wrote:
> Export libata NCQ Priority configuration helpers to be reused
> for libsas managed SATA devices.
>
> Acked-by: Damien Le Moal <[email protected]>
> Reviewed-by: Jason Yan <[email protected]>
> Signed-off-by: Igor Pylypiv <[email protected]>
> ---
> drivers/ata/libata-sata.c | 140 +++++++++++++++++++++++++++-----------
> include/linux/libata.h | 6 ++
> 2 files changed, 107 insertions(+), 39 deletions(-)
>
> diff --git a/drivers/ata/libata-sata.c b/drivers/ata/libata-sata.c
> index 0fb1934875f2..f00dd02dc6f8 100644
> --- a/drivers/ata/libata-sata.c
> +++ b/drivers/ata/libata-sata.c
> @@ -848,80 +848,122 @@ DEVICE_ATTR(link_power_management_policy, S_IRUGO | S_IWUSR,
> ata_scsi_lpm_show, ata_scsi_lpm_store);
> EXPORT_SYMBOL_GPL(dev_attr_link_power_management_policy);
>
> -static ssize_t ata_ncq_prio_supported_show(struct device *device,
> - struct device_attribute *attr,
> - char *buf)
> +/**
> + * ata_ncq_prio_supported - Check if device supports NCQ Priority
> + * @ap: ATA port of the target device
> + * @sdev: SCSI device
> + * @supported: Address of a boolean to store the result
> + *
> + * Helper to check if device supports NCQ Priority feature.
This kdoc is missing a "Return:", see:
https://www.kernel.org/doc/html/latest/doc-guide/kernel-doc.html
(Same comment for other functions.)
> + */
> +int ata_ncq_prio_supported(struct ata_port *ap, struct scsi_device *sdev,
> + bool *supported)
> {
> - struct scsi_device *sdev = to_scsi_device(device);
> - struct ata_port *ap = ata_shost_to_port(sdev->host);
> struct ata_device *dev;
> - bool ncq_prio_supported;
> + unsigned long flags;
> int rc = 0;
>
> - spin_lock_irq(ap->lock);
> + spin_lock_irqsave(ap->lock, flags);
You should mention why you are changing this from a spin_lock_irq() to a
spin_lock_irqsave() in the commit message.
> dev = ata_scsi_find_dev(ap, sdev);
> if (!dev)
> rc = -ENODEV;
> else
> - ncq_prio_supported = dev->flags & ATA_DFLAG_NCQ_PRIO;
> - spin_unlock_irq(ap->lock);
> + *supported = dev->flags & ATA_DFLAG_NCQ_PRIO;
> + spin_unlock_irqrestore(ap->lock, flags);
> + return rc;
You removed the blank link between spin_unlock and return,
please keep this empty line.
(Same comment for other functions.)
> +}
> +EXPORT_SYMBOL_GPL(ata_ncq_prio_supported);
> +
> +static ssize_t ata_ncq_prio_supported_show(struct device *device,
> + struct device_attribute *attr,
> + char *buf)
> +{
> + struct scsi_device *sdev = to_scsi_device(device);
> + struct ata_port *ap = ata_shost_to_port(sdev->host);
> + bool supported;
> + int rc;
>
> - return rc ? rc : sysfs_emit(buf, "%u\n", ncq_prio_supported);
> + rc = ata_ncq_prio_supported(ap, sdev, &supported);
> + if (rc)
> + return rc;
> +
> + return sysfs_emit(buf, "%d\n", supported);
> }
>
> DEVICE_ATTR(ncq_prio_supported, S_IRUGO, ata_ncq_prio_supported_show, NULL);
> EXPORT_SYMBOL_GPL(dev_attr_ncq_prio_supported);
>
> -static ssize_t ata_ncq_prio_enable_show(struct device *device,
> - struct device_attribute *attr,
> - char *buf)
> +/**
> + * ata_ncq_prio_enabled - Check if NCQ Priority is enabled
> + * @ap: ATA port of the target device
> + * @sdev: SCSI device
> + * @enabled: Address of a boolean to store the result
> + *
> + * Helper to check if NCQ Priority feature is enabled.
> + */
> +int ata_ncq_prio_enabled(struct ata_port *ap, struct scsi_device *sdev,
> + bool *enabled)
> {
> - struct scsi_device *sdev = to_scsi_device(device);
> - struct ata_port *ap = ata_shost_to_port(sdev->host);
> struct ata_device *dev;
> - bool ncq_prio_enable;
> + unsigned long flags;
> int rc = 0;
>
> - spin_lock_irq(ap->lock);
> + spin_lock_irqsave(ap->lock, flags);
> dev = ata_scsi_find_dev(ap, sdev);
> if (!dev)
> rc = -ENODEV;
> else
> - ncq_prio_enable = dev->flags & ATA_DFLAG_NCQ_PRIO_ENABLED;
> - spin_unlock_irq(ap->lock);
> -
> - return rc ? rc : sysfs_emit(buf, "%u\n", ncq_prio_enable);
> + *enabled = dev->flags & ATA_DFLAG_NCQ_PRIO_ENABLED;
> + spin_unlock_irqrestore(ap->lock, flags);
> + return rc;
> }
> +EXPORT_SYMBOL_GPL(ata_ncq_prio_enabled);
>
> -static ssize_t ata_ncq_prio_enable_store(struct device *device,
> - struct device_attribute *attr,
> - const char *buf, size_t len)
> +static ssize_t ata_ncq_prio_enable_show(struct device *device,
> + struct device_attribute *attr,
> + char *buf)
> {
> struct scsi_device *sdev = to_scsi_device(device);
> - struct ata_port *ap;
> - struct ata_device *dev;
> - long int input;
> - int rc = 0;
> + struct ata_port *ap = ata_shost_to_port(sdev->host);
> + bool enabled;
> + int rc;
>
> - rc = kstrtol(buf, 10, &input);
> + rc = ata_ncq_prio_enabled(ap, sdev, &enabled);
> if (rc)
> return rc;
> - if ((input < 0) || (input > 1))
> - return -EINVAL;
>
> - ap = ata_shost_to_port(sdev->host);
> - dev = ata_scsi_find_dev(ap, sdev);
> - if (unlikely(!dev))
> - return -ENODEV;
> + return sysfs_emit(buf, "%d\n", enabled);
> +}
> +
> +/**
> + * ata_ncq_prio_enable - Enable/disable NCQ Priority
> + * @ap: ATA port of the target device
> + * @sdev: SCSI device
> + * @enable: true - enable NCQ Priority, false - disable NCQ Priority
> + *
> + * Helper to enable/disable NCQ Priority feature.
> + */
> +int ata_ncq_prio_enable(struct ata_port *ap, struct scsi_device *sdev,
> + bool enable)
> +{
> + struct ata_device *dev;
> + unsigned long flags;
> + int rc = 0;
> +
> + spin_lock_irqsave(ap->lock, flags);
>
> - spin_lock_irq(ap->lock);
> + dev = ata_scsi_find_dev(ap, sdev);
> + if (!dev) {
> + rc = -ENODEV;
> + goto unlock;
> + }
>
> if (!(dev->flags & ATA_DFLAG_NCQ_PRIO)) {
> rc = -EINVAL;
> goto unlock;
> }
>
> - if (input) {
> + if (enable) {
> if (dev->flags & ATA_DFLAG_CDL_ENABLED) {
> ata_dev_err(dev,
> "CDL must be disabled to enable NCQ priority\n");
> @@ -934,9 +976,29 @@ static ssize_t ata_ncq_prio_enable_store(struct device *device,
> }
>
> unlock:
> - spin_unlock_irq(ap->lock);
> + spin_unlock_irqrestore(ap->lock, flags);
> + return rc;
> +}
> +EXPORT_SYMBOL_GPL(ata_ncq_prio_enable);
> +
> +static ssize_t ata_ncq_prio_enable_store(struct device *device,
> + struct device_attribute *attr,
> + const char *buf, size_t len)
> +{
> + struct scsi_device *sdev = to_scsi_device(device);
> + struct ata_port *ap = ata_shost_to_port(sdev->host);
> + bool enable;
> + int rc;
> +
> + rc = kstrtobool(buf, &enable);
> + if (rc)
> + return rc;
> +
> + rc = ata_ncq_prio_enable(ap, sdev, enable);
> + if (rc)
> + return rc;
>
> - return rc ? rc : len;
> + return len;
> }
>
> DEVICE_ATTR(ncq_prio_enable, S_IRUGO | S_IWUSR,
> diff --git a/include/linux/libata.h b/include/linux/libata.h
> index 26d68115afb8..6dd9a4f9ca7c 100644
> --- a/include/linux/libata.h
> +++ b/include/linux/libata.h
> @@ -1157,6 +1157,12 @@ extern int ata_scsi_change_queue_depth(struct scsi_device *sdev,
> int queue_depth);
> extern int ata_change_queue_depth(struct ata_port *ap, struct scsi_device *sdev,
> int queue_depth);
> +extern int ata_ncq_prio_supported(struct ata_port *ap, struct scsi_device *sdev,
> + bool *supported);
> +extern int ata_ncq_prio_enabled(struct ata_port *ap, struct scsi_device *sdev,
> + bool *enabled);
> +extern int ata_ncq_prio_enable(struct ata_port *ap, struct scsi_device *sdev,
> + bool enable);
> extern struct ata_device *ata_dev_pair(struct ata_device *adev);
> extern int ata_do_set_mode(struct ata_link *link, struct ata_device **r_failed_dev);
> extern void ata_scsi_port_error_handler(struct Scsi_Host *host, struct ata_port *ap);
> --
> 2.44.0.278.ge034bb2e1d-goog
>
On Tue, Mar 05, 2024 at 05:22:22PM -0800, Igor Pylypiv wrote:
> The added sysfs attributes group enables the configuration of NCQ Priority
> feature for HBAs that rely on libsas to manage SATA devices.
>
> Acked-by: Jack Wang <[email protected]>
> Reviewed-by: John Garry <[email protected]>
> Reviewed-by: Damien Le Moal <[email protected]>
> Reviewed-by: Jason Yan <[email protected]>
> Signed-off-by: Igor Pylypiv <[email protected]>
> ---
> drivers/scsi/pm8001/pm8001_ctl.c | 5 +++++
> drivers/scsi/pm8001/pm8001_init.c | 1 +
> drivers/scsi/pm8001/pm8001_sas.h | 1 +
> 3 files changed, 7 insertions(+)
>
> diff --git a/drivers/scsi/pm8001/pm8001_ctl.c b/drivers/scsi/pm8001/pm8001_ctl.c
> index 5c26a13ffbd2..9ffe1a868d0f 100644
> --- a/drivers/scsi/pm8001/pm8001_ctl.c
> +++ b/drivers/scsi/pm8001/pm8001_ctl.c
> @@ -1039,3 +1039,8 @@ const struct attribute_group *pm8001_host_groups[] = {
> &pm8001_host_attr_group,
> NULL
> };
> +
> +const struct attribute_group *pm8001_sdev_groups[] = {
> + &sas_ata_sdev_attr_group,
> + NULL
> +};
> diff --git a/drivers/scsi/pm8001/pm8001_init.c b/drivers/scsi/pm8001/pm8001_init.c
> index ed6b7d954dda..e6b1108f6117 100644
> --- a/drivers/scsi/pm8001/pm8001_init.c
> +++ b/drivers/scsi/pm8001/pm8001_init.c
> @@ -134,6 +134,7 @@ static const struct scsi_host_template pm8001_sht = {
> .compat_ioctl = sas_ioctl,
> #endif
> .shost_groups = pm8001_host_groups,
> + .sdev_groups = pm8001_sdev_groups,
> .track_queue_depth = 1,
> .cmd_per_lun = 32,
> .map_queues = pm8001_map_queues,
> diff --git a/drivers/scsi/pm8001/pm8001_sas.h b/drivers/scsi/pm8001/pm8001_sas.h
> index 3ccb7371902f..ced6721380a8 100644
> --- a/drivers/scsi/pm8001/pm8001_sas.h
> +++ b/drivers/scsi/pm8001/pm8001_sas.h
> @@ -717,6 +717,7 @@ int pm80xx_fatal_errors(struct pm8001_hba_info *pm8001_ha);
> void pm8001_free_dev(struct pm8001_device *pm8001_dev);
> /* ctl shared API */
> extern const struct attribute_group *pm8001_host_groups[];
> +extern const struct attribute_group *pm8001_sdev_groups[];
>
> #define PM8001_INVALID_TAG ((u32)-1)
>
> --
> 2.44.0.278.ge034bb2e1d-goog
>
Reviewed-by: Niklas Cassel <[email protected]>
On Tue, Mar 05, 2024 at 05:22:23PM -0800, Igor Pylypiv wrote:
> The added sysfs attributes group enables the configuration of NCQ Priority
> feature for HBAs that rely on libsas to manage SATA devices.
>
> Reviewed-by: John Garry <[email protected]>
> Reviewed-by: Damien Le Moal <[email protected]>
> Reviewed-by: Jason Yan <[email protected]>
> Signed-off-by: Igor Pylypiv <[email protected]>
> ---
> drivers/scsi/mvsas/mv_init.c | 7 +++++++
> 1 file changed, 7 insertions(+)
>
> diff --git a/drivers/scsi/mvsas/mv_init.c b/drivers/scsi/mvsas/mv_init.c
> index 43ebb331e216..f1090bb5f2c9 100644
> --- a/drivers/scsi/mvsas/mv_init.c
> +++ b/drivers/scsi/mvsas/mv_init.c
> @@ -26,6 +26,7 @@ static const struct mvs_chip_info mvs_chips[] = {
> };
>
> static const struct attribute_group *mvst_host_groups[];
> +static const struct attribute_group *mvst_sdev_groups[];
I think you can remove this line.
>
> #define SOC_SAS_NUM 2
>
> @@ -53,6 +54,7 @@ static const struct scsi_host_template mvs_sht = {
> .compat_ioctl = sas_ioctl,
> #endif
> .shost_groups = mvst_host_groups,
> + .sdev_groups = mvst_sdev_groups,
> .track_queue_depth = 1,
> };
>
> @@ -779,6 +781,11 @@ static struct attribute *mvst_host_attrs[] = {
>
> ATTRIBUTE_GROUPS(mvst_host);
>
> +static const struct attribute_group *mvst_sdev_groups[] = {
> + &sas_ata_sdev_attr_group,
> + NULL
> +};
.and move these lines up to be after:
static const struct attribute_group *mvst_host_groups[];
> +
> module_init(mvs_init);
> module_exit(mvs_exit);
>
> --
> 2.44.0.278.ge034bb2e1d-goog
>
On Tue, Mar 05, 2024 at 05:22:25PM -0800, Igor Pylypiv wrote:
> The added sysfs attributes group enables the configuration of NCQ Priority
> feature for HBAs that rely on libsas to manage SATA devices.
>
> Reviewed-by: John Garry <[email protected]>
> Reviewed-by: Damien Le Moal <[email protected]>
> Reviewed-by: Jason Yan <[email protected]>
> Signed-off-by: Igor Pylypiv <[email protected]>
> ---
> drivers/scsi/aic94xx/aic94xx_init.c | 8 ++++++++
> 1 file changed, 8 insertions(+)
>
> diff --git a/drivers/scsi/aic94xx/aic94xx_init.c b/drivers/scsi/aic94xx/aic94xx_init.c
> index 8a3340d8d7ad..ccccd0eb6275 100644
> --- a/drivers/scsi/aic94xx/aic94xx_init.c
> +++ b/drivers/scsi/aic94xx/aic94xx_init.c
> @@ -14,6 +14,7 @@
> #include <linux/firmware.h>
> #include <linux/slab.h>
>
> +#include <scsi/sas_ata.h>
> #include <scsi/scsi_host.h>
>
> #include "aic94xx.h"
> @@ -34,6 +35,7 @@ MODULE_PARM_DESC(use_msi, "\n"
> static struct scsi_transport_template *aic94xx_transport_template;
> static int asd_scan_finished(struct Scsi_Host *, unsigned long);
> static void asd_scan_start(struct Scsi_Host *);
> +static const struct attribute_group *asd_sdev_groups[];
>
> static const struct scsi_host_template aic94xx_sht = {
> .module = THIS_MODULE,
> @@ -60,6 +62,7 @@ static const struct scsi_host_template aic94xx_sht = {
> .compat_ioctl = sas_ioctl,
> #endif
> .track_queue_depth = 1,
> + .sdev_groups = asd_sdev_groups,
> };
>
> static int asd_map_memio(struct asd_ha_struct *asd_ha)
> @@ -951,6 +954,11 @@ static void asd_remove_driver_attrs(struct device_driver *driver)
> driver_remove_file(driver, &driver_attr_version);
> }
>
> +static const struct attribute_group *asd_sdev_groups[] = {
> + &sas_ata_sdev_attr_group,
> + NULL
> +};
If you move this in front of:
static const struct scsi_host_template aic94xx_sht = { };
I think that you can remove the forward declaration.
> +
> static struct sas_domain_function_template aic94xx_transport_functions = {
> .lldd_dev_found = asd_dev_found,
> .lldd_dev_gone = asd_dev_gone,
> --
> 2.44.0.278.ge034bb2e1d-goog
>
On Tue, Mar 05, 2024 at 05:22:26PM -0800, Igor Pylypiv wrote:
> The added sysfs attributes group enables the configuration of NCQ Priority
> feature for HBAs that rely on libsas to manage SATA devices.
>
> Reviewed-by: John Garry <[email protected]>
> Reviewed-by: Damien Le Moal <[email protected]>
> Reviewed-by: Jason Yan <[email protected]>
> Signed-off-by: Igor Pylypiv <[email protected]>
> ---
> drivers/scsi/isci/init.c | 6 ++++++
> 1 file changed, 6 insertions(+)
>
> diff --git a/drivers/scsi/isci/init.c b/drivers/scsi/isci/init.c
> index 6277162a028b..8658dcd61b87 100644
> --- a/drivers/scsi/isci/init.c
> +++ b/drivers/scsi/isci/init.c
> @@ -149,6 +149,11 @@ static struct attribute *isci_host_attrs[] = {
>
> ATTRIBUTE_GROUPS(isci_host);
>
> +static const struct attribute_group *isci_sdev_groups[] = {
> + &sas_ata_sdev_attr_group,
> + NULL
> +};
> +
> static const struct scsi_host_template isci_sht = {
>
> .module = THIS_MODULE,
> @@ -176,6 +181,7 @@ static const struct scsi_host_template isci_sht = {
> .compat_ioctl = sas_ioctl,
> #endif
> .shost_groups = isci_host_groups,
> + .sdev_groups = isci_sdev_groups,
> .track_queue_depth = 1,
> };
>
> --
> 2.44.0.278.ge034bb2e1d-goog
>
Reviewed-by: Niklas Cassel <[email protected]>
On Tue, Mar 05, 2024 at 05:22:21PM -0800, Igor Pylypiv wrote:
> Libata sysfs attributes cannot be used for libsas managed SATA devices
> because the ata_port location is different for libsas.
>
> Defined sysfs attributes (visible for SATA devices only):
> - /sys/block/sda/device/ncq_prio_enable
> - /sys/block/sda/device/ncq_prio_supported
>
> The newly defined attributes will pass the correct ata_port to libata
> helper functions.
>
> Reviewed-by: John Garry <[email protected]>
> Reviewed-by: Damien Le Moal <[email protected]>
> Reviewed-by: Jason Yan <[email protected]>
> Signed-off-by: Igor Pylypiv <[email protected]>
> ---
> drivers/scsi/libsas/sas_ata.c | 94 +++++++++++++++++++++++++++++++++++
> include/scsi/sas_ata.h | 6 +++
> 2 files changed, 100 insertions(+)
>
> diff --git a/drivers/scsi/libsas/sas_ata.c b/drivers/scsi/libsas/sas_ata.c
> index 12e2653846e3..04b0bd9a4e01 100644
> --- a/drivers/scsi/libsas/sas_ata.c
> +++ b/drivers/scsi/libsas/sas_ata.c
> @@ -964,3 +964,97 @@ int sas_execute_ata_cmd(struct domain_device *device, u8 *fis, int force_phy_id)
> force_phy_id, &tmf_task);
> }
> EXPORT_SYMBOL_GPL(sas_execute_ata_cmd);
> +
> +static ssize_t sas_ncq_prio_supported_show(struct device *device,
> + struct device_attribute *attr,
> + char *buf)
> +{
> + struct scsi_device *sdev = to_scsi_device(device);
> + struct domain_device *ddev = sdev_to_domain_dev(sdev);
> + bool supported;
> + int rc;
> +
> + /* This attribute shall be visible for SATA devices only */
> + if (WARN_ON_ONCE(!dev_is_sata(ddev)))
> + return -EINVAL;
Like Hannes commented, I don't believe this is needed.
> +
> + rc = ata_ncq_prio_supported(ddev->sata_dev.ap, sdev, &supported);
> + if (rc)
> + return rc;
> +
> + return sysfs_emit(buf, "%d\n", supported);
> +}
> +
While this is a bit different depending on file, the most common way is to
have no blank link before the DEVICE_ATTR().
> +DEVICE_ATTR(ncq_prio_supported, S_IRUGO, sas_ncq_prio_supported_show, NULL);
> +
> +static ssize_t sas_ncq_prio_enable_show(struct device *device,
> + struct device_attribute *attr,
> + char *buf)
> +{
> + struct scsi_device *sdev = to_scsi_device(device);
> + struct domain_device *ddev = sdev_to_domain_dev(sdev);
> + bool enabled;
> + int rc;
> +
> + /* This attribute shall be visible for SATA devices only */
> + if (WARN_ON_ONCE(!dev_is_sata(ddev)))
> + return -EINVAL;
> +
> + rc = ata_ncq_prio_enabled(ddev->sata_dev.ap, sdev, &enabled);
> + if (rc)
> + return rc;
> +
> + return sysfs_emit(buf, "%d\n", enabled);
> +}
> +
> +static ssize_t sas_ncq_prio_enable_store(struct device *device,
> + struct device_attribute *attr,
> + const char *buf, size_t len)
> +{
> + struct scsi_device *sdev = to_scsi_device(device);
> + struct domain_device *ddev = sdev_to_domain_dev(sdev);
> + bool enable;
> + int rc;
> +
> + /* This attribute shall be visible for SATA devices only */
> + if (WARN_ON_ONCE(!dev_is_sata(ddev)))
> + return -EINVAL;
> +
> + rc = kstrtobool(buf, &enable);
> + if (rc)
> + return rc;
> +
> + rc = ata_ncq_prio_enable(ddev->sata_dev.ap, sdev, enable);
> + if (rc)
> + return rc;
> +
> + return len;
> +}
> +
> +DEVICE_ATTR(ncq_prio_enable, S_IRUGO | S_IWUSR,
> + sas_ncq_prio_enable_show, sas_ncq_prio_enable_store);
> +
> +static struct attribute *sas_ata_sdev_attrs[] = {
> + &dev_attr_ncq_prio_supported.attr,
> + &dev_attr_ncq_prio_enable.attr,
> + NULL
> +};
> +
> +static umode_t sas_ata_attr_is_visible(struct kobject *kobj,
> + struct attribute *attr, int i)
> +{
> + struct device *dev = kobj_to_dev(kobj);
> + struct scsi_device *sdev = to_scsi_device(dev);
> + struct domain_device *ddev = sdev_to_domain_dev(sdev);
> +
> + if (!dev_is_sata(ddev))
> + return 0;
> +
> + return attr->mode;
> +}
> +
> +const struct attribute_group sas_ata_sdev_attr_group = {
> + .attrs = sas_ata_sdev_attrs,
> + .is_visible = sas_ata_attr_is_visible,
> +};
> +EXPORT_SYMBOL_GPL(sas_ata_sdev_attr_group);
> diff --git a/include/scsi/sas_ata.h b/include/scsi/sas_ata.h
> index 2f8c719840a6..92e27e7bf088 100644
> --- a/include/scsi/sas_ata.h
> +++ b/include/scsi/sas_ata.h
> @@ -39,6 +39,9 @@ int smp_ata_check_ready_type(struct ata_link *link);
> int sas_discover_sata(struct domain_device *dev);
> int sas_ata_add_dev(struct domain_device *parent, struct ex_phy *phy,
> struct domain_device *child, int phy_id);
> +
> +extern const struct attribute_group sas_ata_sdev_attr_group;
> +
> #else
>
> static inline void sas_ata_disabled_notice(void)
> @@ -123,6 +126,9 @@ static inline int sas_ata_add_dev(struct domain_device *parent, struct ex_phy *p
> sas_ata_disabled_notice();
> return -ENODEV;
> }
> +
> +#define sas_ata_sdev_attr_group ((struct attribute_group) {})
> +
> #endif
>
> #endif /* _SAS_ATA_H_ */
> --
> 2.44.0.278.ge034bb2e1d-goog
>
Hello Igor,
On Tue, Mar 05, 2024 at 05:22:19PM -0800, Igor Pylypiv wrote:
> This patch series adds sas_ncq_prio_supported and sas_ncq_prio_enable
> sysfs sttributes for libsas managed SATA devices. Existing libata sysfs
> attributes cannot be used directly because the ata_port location is
> different for libsas.
As far as I can tell, you don't add sas_ncq_prio_supported and
sas_ncq_prio_enable, but instead add ncq_prio_supported and
ncq_prio_enable, so perhaps update this sentence.
Kind regards,
Niklas
>
> Changes since v6:
> - Replaced sas_ata_sdev_attr_group definition with a macro for
> the "CONFIG_SCSI_SAS_ATA is not set" case. The macro defines
> an empty rvalue struct eliminating the variable definition.
>
> Changes since v5:
> - Added __maybe_unused attribute to sas_ata_sdev_attr_group to prevent
> an unused-const-variable warning when CONFIG_SCSI_SAS_ATA is not set.
>
> Changes since v4:
> - Updated sas_ncq_prio_* sysfs functions to use WARN_ON_ONCE() instead
> of WARN_ON().
>
> Changes since v3:
> - Changed ata_ncq_prio_supported() and ata_ncq_prio_enabled() to store
> the result into a boolean variable passed by address.
> - Removed the "usable with both libsas and libata" wording from
> ata_ncq_prio_* helper's function comments.
> - Removed the unlikely() in ata_ncq_prio_enable() because the function
> is not in a fastpath.
> - Dropped hisi_sas v1 HW driver changes because it doesn't support SATA.
>
> Changes since v2:
> - Added libsas SATA sysfs attributes to aic94xx and isci.
>
> Changes since v1:
> - Dropped the "sas_" prefix to align sysfs sttributes naming with AHCI.
> - Dropped ternary operators to make the code more readable.
> - Corrected the formatting %u -> %d in sysfs_emit().
> - Changed kstrtol() to kstrtobool() in [ata|sas]_ncq_prio_enable_store().
> - Changed comments to use the "/* */" style instead of "//".
> - Added libsas SATA sysfs attributes to mvsas and hisi_sas.
> - Dropped the 'Reviewed-by' tags because they were not sent in-reply
> to the patch emails.
>
> Igor Pylypiv (7):
> ata: libata-sata: Factor out NCQ Priority configuration helpers
> scsi: libsas: Define NCQ Priority sysfs attributes for SATA devices
> scsi: pm80xx: Add libsas SATA sysfs attributes group
> scsi: mvsas: Add libsas SATA sysfs attributes group
> scsi: hisi_sas: Add libsas SATA sysfs attributes group
> scsi: aic94xx: Add libsas SATA sysfs attributes group
> scsi: isci: Add libsas SATA sysfs attributes group
>
> drivers/ata/libata-sata.c | 140 ++++++++++++++++++-------
> drivers/scsi/aic94xx/aic94xx_init.c | 8 ++
> drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 6 ++
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 6 ++
> drivers/scsi/isci/init.c | 6 ++
> drivers/scsi/libsas/sas_ata.c | 94 +++++++++++++++++
> drivers/scsi/mvsas/mv_init.c | 7 ++
> drivers/scsi/pm8001/pm8001_ctl.c | 5 +
> drivers/scsi/pm8001/pm8001_init.c | 1 +
> drivers/scsi/pm8001/pm8001_sas.h | 1 +
> include/linux/libata.h | 6 ++
> include/scsi/sas_ata.h | 6 ++
> 12 files changed, 247 insertions(+), 39 deletions(-)
>
> --
> 2.44.0.278.ge034bb2e1d-goog
>
On Tue, Mar 05, 2024 at 05:22:24PM -0800, Igor Pylypiv wrote:
> The added sysfs attributes group enables the configuration of NCQ Priority
> feature for HBAs that rely on libsas to manage SATA devices.
>
> Reviewed-by: John Garry <[email protected]>
> Reviewed-by: Damien Le Moal <[email protected]>
> Reviewed-by: Jason Yan <[email protected]>
> Signed-off-by: Igor Pylypiv <[email protected]>
> ---
> drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 6 ++++++
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 6 ++++++
Is there a reason why you didn't patch:
drivers/scsi/hisi_sas/hisi_sas_v1_hw.c ?
> 2 files changed, 12 insertions(+)
>
> diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
> index 73b378837da7..b5d379ebe05d 100644
> --- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
> +++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
> @@ -3544,6 +3544,11 @@ static struct attribute *host_v2_hw_attrs[] = {
>
> ATTRIBUTE_GROUPS(host_v2_hw);
>
> +static const struct attribute_group *sdev_groups_v2_hw[] = {
> + &sas_ata_sdev_attr_group,
> + NULL
> +};
> +
> static void map_queues_v2_hw(struct Scsi_Host *shost)
> {
> struct hisi_hba *hisi_hba = shost_priv(shost);
> @@ -3585,6 +3590,7 @@ static const struct scsi_host_template sht_v2_hw = {
> .compat_ioctl = sas_ioctl,
> #endif
> .shost_groups = host_v2_hw_groups,
> + .sdev_groups = sdev_groups_v2_hw,
> .host_reset = hisi_sas_host_reset,
> .map_queues = map_queues_v2_hw,
> .host_tagset = 1,
> diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
> index b56fbc61a15a..9b69ea16a1e6 100644
> --- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
> +++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
> @@ -2929,6 +2929,11 @@ static struct attribute *host_v3_hw_attrs[] = {
>
> ATTRIBUTE_GROUPS(host_v3_hw);
>
> +static const struct attribute_group *sdev_groups_v3_hw[] = {
> + &sas_ata_sdev_attr_group,
> + NULL
> +};
> +
> #define HISI_SAS_DEBUGFS_REG(x) {#x, x}
>
> struct hisi_sas_debugfs_reg_lu {
> @@ -3340,6 +3345,7 @@ static const struct scsi_host_template sht_v3_hw = {
> .compat_ioctl = sas_ioctl,
> #endif
> .shost_groups = host_v3_hw_groups,
> + .sdev_groups = sdev_groups_v3_hw,
> .tag_alloc_policy = BLK_TAG_ALLOC_RR,
> .host_reset = hisi_sas_host_reset,
> .host_tagset = 1,
> --
> 2.44.0.278.ge034bb2e1d-goog
>
On Wed, Mar 06, 2024 at 11:54:52AM +0100, Niklas Cassel wrote:
> On Tue, Mar 05, 2024 at 05:22:21PM -0800, Igor Pylypiv wrote:
> > Libata sysfs attributes cannot be used for libsas managed SATA devices
> > because the ata_port location is different for libsas.
> >
> > Defined sysfs attributes (visible for SATA devices only):
> > - /sys/block/sda/device/ncq_prio_enable
> > - /sys/block/sda/device/ncq_prio_supported
> >
> > The newly defined attributes will pass the correct ata_port to libata
> > helper functions.
> >
> > Reviewed-by: John Garry <[email protected]>
> > Reviewed-by: Damien Le Moal <[email protected]>
> > Reviewed-by: Jason Yan <[email protected]>
> > Signed-off-by: Igor Pylypiv <[email protected]>
> > ---
> > drivers/scsi/libsas/sas_ata.c | 94 +++++++++++++++++++++++++++++++++++
> > include/scsi/sas_ata.h | 6 +++
> > 2 files changed, 100 insertions(+)
> >
> > diff --git a/drivers/scsi/libsas/sas_ata.c b/drivers/scsi/libsas/sas_ata.c
> > index 12e2653846e3..04b0bd9a4e01 100644
> > --- a/drivers/scsi/libsas/sas_ata.c
> > +++ b/drivers/scsi/libsas/sas_ata.c
> > @@ -964,3 +964,97 @@ int sas_execute_ata_cmd(struct domain_device *device, u8 *fis, int force_phy_id)
> > force_phy_id, &tmf_task);
> > }
> > EXPORT_SYMBOL_GPL(sas_execute_ata_cmd);
> > +
> > +static ssize_t sas_ncq_prio_supported_show(struct device *device,
> > + struct device_attribute *attr,
> > + char *buf)
> > +{
> > + struct scsi_device *sdev = to_scsi_device(device);
> > + struct domain_device *ddev = sdev_to_domain_dev(sdev);
> > + bool supported;
> > + int rc;
> > +
> > + /* This attribute shall be visible for SATA devices only */
> > + if (WARN_ON_ONCE(!dev_is_sata(ddev)))
> > + return -EINVAL;
>
> Like Hannes commented, I don't believe this is needed.
>
The intention for the check is to serve as a fail-safe in case 'is_visible()'
callback gets incorrectly modified and stops hiding the sysfs attributes
for non-SATA devices.
Just want to clarify should I remove the WARN_ON_ONCE and keep the fail-safe
check or should I get rid of the check completely and trust 'is_visible()'
to always hide the sysfs attributes for non-SATA devices?
>
> > +
> > + rc = ata_ncq_prio_supported(ddev->sata_dev.ap, sdev, &supported);
> > + if (rc)
> > + return rc;
> > +
> > + return sysfs_emit(buf, "%d\n", supported);
> > +}
> > +
>
> While this is a bit different depending on file, the most common way is to
> have no blank link before the DEVICE_ATTR().
>
In "[PATCH 1/3] ata: libata-sata: Factor out NCQ Priority configuration helpers"
Damien asked to keep the blank link before the DEVICE_ATTR() in libata-sata.c.
Non-prio sysfs attributes in libata-sata.c don't have blank lines
before DEVICE_ATTR() so I'm more inclined to remove the lines.
I'm fine with either of ways, just want to get a consensus and make it
consistent for both libata-sata.c and sas_ata.c.
>
> > +DEVICE_ATTR(ncq_prio_supported, S_IRUGO, sas_ncq_prio_supported_show, NULL);
> > +
> > +static ssize_t sas_ncq_prio_enable_show(struct device *device,
> > + struct device_attribute *attr,
> > + char *buf)
> > +{
> > + struct scsi_device *sdev = to_scsi_device(device);
> > + struct domain_device *ddev = sdev_to_domain_dev(sdev);
> > + bool enabled;
> > + int rc;
> > +
> > + /* This attribute shall be visible for SATA devices only */
> > + if (WARN_ON_ONCE(!dev_is_sata(ddev)))
> > + return -EINVAL;
> > +
> > + rc = ata_ncq_prio_enabled(ddev->sata_dev.ap, sdev, &enabled);
> > + if (rc)
> > + return rc;
> > +
> > + return sysfs_emit(buf, "%d\n", enabled);
> > +}
> > +
> > +static ssize_t sas_ncq_prio_enable_store(struct device *device,
> > + struct device_attribute *attr,
> > + const char *buf, size_t len)
> > +{
> > + struct scsi_device *sdev = to_scsi_device(device);
> > + struct domain_device *ddev = sdev_to_domain_dev(sdev);
> > + bool enable;
> > + int rc;
> > +
> > + /* This attribute shall be visible for SATA devices only */
> > + if (WARN_ON_ONCE(!dev_is_sata(ddev)))
> > + return -EINVAL;
> > +
> > + rc = kstrtobool(buf, &enable);
> > + if (rc)
> > + return rc;
> > +
> > + rc = ata_ncq_prio_enable(ddev->sata_dev.ap, sdev, enable);
> > + if (rc)
> > + return rc;
> > +
> > + return len;
> > +}
> > +
> > +DEVICE_ATTR(ncq_prio_enable, S_IRUGO | S_IWUSR,
> > + sas_ncq_prio_enable_show, sas_ncq_prio_enable_store);
> > +
> > +static struct attribute *sas_ata_sdev_attrs[] = {
> > + &dev_attr_ncq_prio_supported.attr,
> > + &dev_attr_ncq_prio_enable.attr,
> > + NULL
> > +};
> > +
> > +static umode_t sas_ata_attr_is_visible(struct kobject *kobj,
> > + struct attribute *attr, int i)
> > +{
> > + struct device *dev = kobj_to_dev(kobj);
> > + struct scsi_device *sdev = to_scsi_device(dev);
> > + struct domain_device *ddev = sdev_to_domain_dev(sdev);
> > +
> > + if (!dev_is_sata(ddev))
> > + return 0;
> > +
> > + return attr->mode;
> > +}
> > +
> > +const struct attribute_group sas_ata_sdev_attr_group = {
> > + .attrs = sas_ata_sdev_attrs,
> > + .is_visible = sas_ata_attr_is_visible,
> > +};
> > +EXPORT_SYMBOL_GPL(sas_ata_sdev_attr_group);
> > diff --git a/include/scsi/sas_ata.h b/include/scsi/sas_ata.h
> > index 2f8c719840a6..92e27e7bf088 100644
> > --- a/include/scsi/sas_ata.h
> > +++ b/include/scsi/sas_ata.h
> > @@ -39,6 +39,9 @@ int smp_ata_check_ready_type(struct ata_link *link);
> > int sas_discover_sata(struct domain_device *dev);
> > int sas_ata_add_dev(struct domain_device *parent, struct ex_phy *phy,
> > struct domain_device *child, int phy_id);
> > +
> > +extern const struct attribute_group sas_ata_sdev_attr_group;
> > +
> > #else
> >
> > static inline void sas_ata_disabled_notice(void)
> > @@ -123,6 +126,9 @@ static inline int sas_ata_add_dev(struct domain_device *parent, struct ex_phy *p
> > sas_ata_disabled_notice();
> > return -ENODEV;
> > }
> > +
> > +#define sas_ata_sdev_attr_group ((struct attribute_group) {})
> > +
> > #endif
> >
> > #endif /* _SAS_ATA_H_ */
> > --
> > 2.44.0.278.ge034bb2e1d-goog
> >
On Wed, Mar 06, 2024 at 11:55:33AM +0100, Niklas Cassel wrote:
> On Tue, Mar 05, 2024 at 05:22:24PM -0800, Igor Pylypiv wrote:
> > The added sysfs attributes group enables the configuration of NCQ Priority
> > feature for HBAs that rely on libsas to manage SATA devices.
> >
> > Reviewed-by: John Garry <[email protected]>
> > Reviewed-by: Damien Le Moal <[email protected]>
> > Reviewed-by: Jason Yan <[email protected]>
> > Signed-off-by: Igor Pylypiv <[email protected]>
> > ---
> > drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 6 ++++++
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 6 ++++++
>
> Is there a reason why you didn't patch:
> drivers/scsi/hisi_sas/hisi_sas_v1_hw.c ?
>
I originally patched hisi_sas_v1_hw.c as well. John Garry pointed out
that v1 HW doesn't support SATA so I dropped the change.
>
> > 2 files changed, 12 insertions(+)
> >
> > diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
> > index 73b378837da7..b5d379ebe05d 100644
> > --- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
> > +++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
> > @@ -3544,6 +3544,11 @@ static struct attribute *host_v2_hw_attrs[] = {
> >
> > ATTRIBUTE_GROUPS(host_v2_hw);
> >
> > +static const struct attribute_group *sdev_groups_v2_hw[] = {
> > + &sas_ata_sdev_attr_group,
> > + NULL
> > +};
> > +
> > static void map_queues_v2_hw(struct Scsi_Host *shost)
> > {
> > struct hisi_hba *hisi_hba = shost_priv(shost);
> > @@ -3585,6 +3590,7 @@ static const struct scsi_host_template sht_v2_hw = {
> > .compat_ioctl = sas_ioctl,
> > #endif
> > .shost_groups = host_v2_hw_groups,
> > + .sdev_groups = sdev_groups_v2_hw,
> > .host_reset = hisi_sas_host_reset,
> > .map_queues = map_queues_v2_hw,
> > .host_tagset = 1,
> > diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
> > index b56fbc61a15a..9b69ea16a1e6 100644
> > --- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
> > +++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
> > @@ -2929,6 +2929,11 @@ static struct attribute *host_v3_hw_attrs[] = {
> >
> > ATTRIBUTE_GROUPS(host_v3_hw);
> >
> > +static const struct attribute_group *sdev_groups_v3_hw[] = {
> > + &sas_ata_sdev_attr_group,
> > + NULL
> > +};
> > +
> > #define HISI_SAS_DEBUGFS_REG(x) {#x, x}
> >
> > struct hisi_sas_debugfs_reg_lu {
> > @@ -3340,6 +3345,7 @@ static const struct scsi_host_template sht_v3_hw = {
> > .compat_ioctl = sas_ioctl,
> > #endif
> > .shost_groups = host_v3_hw_groups,
> > + .sdev_groups = sdev_groups_v3_hw,
> > .tag_alloc_policy = BLK_TAG_ALLOC_RR,
> > .host_reset = hisi_sas_host_reset,
> > .host_tagset = 1,
> > --
> > 2.44.0.278.ge034bb2e1d-goog
> >
On Wed, Mar 06, 2024 at 11:55:19AM +0100, Niklas Cassel wrote:
> On Tue, Mar 05, 2024 at 05:22:23PM -0800, Igor Pylypiv wrote:
> > The added sysfs attributes group enables the configuration of NCQ Priority
> > feature for HBAs that rely on libsas to manage SATA devices.
> >
> > Reviewed-by: John Garry <[email protected]>
> > Reviewed-by: Damien Le Moal <[email protected]>
> > Reviewed-by: Jason Yan <[email protected]>
> > Signed-off-by: Igor Pylypiv <[email protected]>
> > ---
> > drivers/scsi/mvsas/mv_init.c | 7 +++++++
> > 1 file changed, 7 insertions(+)
> >
> > diff --git a/drivers/scsi/mvsas/mv_init.c b/drivers/scsi/mvsas/mv_init.c
> > index 43ebb331e216..f1090bb5f2c9 100644
> > --- a/drivers/scsi/mvsas/mv_init.c
> > +++ b/drivers/scsi/mvsas/mv_init.c
> > @@ -26,6 +26,7 @@ static const struct mvs_chip_info mvs_chips[] = {
> > };
> >
> > static const struct attribute_group *mvst_host_groups[];
> > +static const struct attribute_group *mvst_sdev_groups[];
>
> I think you can remove this line.
>
I kept the forward declaration to match the mvst_host_groups style.
Perhaps mvs_sht can be moved to the bottom of the file so that all forward
declarations can be removed? This can be done in a separate cleanup patch
series.
I'll keep this and aic94xx patches as-is, unless there are objections.
>
> >
> > #define SOC_SAS_NUM 2
> >
> > @@ -53,6 +54,7 @@ static const struct scsi_host_template mvs_sht = {
> > .compat_ioctl = sas_ioctl,
> > #endif
> > .shost_groups = mvst_host_groups,
> > + .sdev_groups = mvst_sdev_groups,
> > .track_queue_depth = 1,
> > };
> >
> > @@ -779,6 +781,11 @@ static struct attribute *mvst_host_attrs[] = {
> >
> > ATTRIBUTE_GROUPS(mvst_host);
> >
> > +static const struct attribute_group *mvst_sdev_groups[] = {
> > + &sas_ata_sdev_attr_group,
> > + NULL
> > +};
>
> ..and move these lines up to be after:
> static const struct attribute_group *mvst_host_groups[];
>
>
> > +
> > module_init(mvs_init);
> > module_exit(mvs_exit);
> >
> > --
> > 2.44.0.278.ge034bb2e1d-goog
> >
On Wed, Mar 06, 2024 at 11:55:48AM +0100, Niklas Cassel wrote:
> On Tue, Mar 05, 2024 at 05:22:25PM -0800, Igor Pylypiv wrote:
> > The added sysfs attributes group enables the configuration of NCQ Priority
> > feature for HBAs that rely on libsas to manage SATA devices.
> >
> > Reviewed-by: John Garry <[email protected]>
> > Reviewed-by: Damien Le Moal <[email protected]>
> > Reviewed-by: Jason Yan <[email protected]>
> > Signed-off-by: Igor Pylypiv <[email protected]>
> > ---
> > drivers/scsi/aic94xx/aic94xx_init.c | 8 ++++++++
> > 1 file changed, 8 insertions(+)
> >
> > diff --git a/drivers/scsi/aic94xx/aic94xx_init.c b/drivers/scsi/aic94xx/aic94xx_init.c
> > index 8a3340d8d7ad..ccccd0eb6275 100644
> > --- a/drivers/scsi/aic94xx/aic94xx_init.c
> > +++ b/drivers/scsi/aic94xx/aic94xx_init.c
> > @@ -14,6 +14,7 @@
> > #include <linux/firmware.h>
> > #include <linux/slab.h>
> >
> > +#include <scsi/sas_ata.h>
> > #include <scsi/scsi_host.h>
> >
> > #include "aic94xx.h"
> > @@ -34,6 +35,7 @@ MODULE_PARM_DESC(use_msi, "\n"
> > static struct scsi_transport_template *aic94xx_transport_template;
> > static int asd_scan_finished(struct Scsi_Host *, unsigned long);
> > static void asd_scan_start(struct Scsi_Host *);
> > +static const struct attribute_group *asd_sdev_groups[];
> >
> > static const struct scsi_host_template aic94xx_sht = {
> > .module = THIS_MODULE,
> > @@ -60,6 +62,7 @@ static const struct scsi_host_template aic94xx_sht = {
> > .compat_ioctl = sas_ioctl,
> > #endif
> > .track_queue_depth = 1,
> > + .sdev_groups = asd_sdev_groups,
> > };
> >
> > static int asd_map_memio(struct asd_ha_struct *asd_ha)
> > @@ -951,6 +954,11 @@ static void asd_remove_driver_attrs(struct device_driver *driver)
> > driver_remove_file(driver, &driver_attr_version);
> > }
> >
> > +static const struct attribute_group *asd_sdev_groups[] = {
> > + &sas_ata_sdev_attr_group,
> > + NULL
> > +};
>
> If you move this in front of:
> static const struct scsi_host_template aic94xx_sht = { };
>
> I think that you can remove the forward declaration.
>
Same comment as for mvs_sht. Perhaps mvs_sht can be moved to the bottom
of the file (in a separate patch series) so that all forward declarations
can be removed?
>
> > +
> > static struct sas_domain_function_template aic94xx_transport_functions = {
> > .lldd_dev_found = asd_dev_found,
> > .lldd_dev_gone = asd_dev_gone,
> > --
> > 2.44.0.278.ge034bb2e1d-goog
> >
On Wed, Mar 06, 2024 at 11:54:20AM +0100, Niklas Cassel wrote:
> Hello Igor,
>
> On Tue, Mar 05, 2024 at 05:22:19PM -0800, Igor Pylypiv wrote:
> > This patch series adds sas_ncq_prio_supported and sas_ncq_prio_enable
> > sysfs sttributes for libsas managed SATA devices. Existing libata sysfs
> > attributes cannot be used directly because the ata_port location is
> > different for libsas.
>
> As far as I can tell, you don't add sas_ncq_prio_supported and
> sas_ncq_prio_enable, but instead add ncq_prio_supported and
> ncq_prio_enable, so perhaps update this sentence.
>
Thank you for catching this, Niklas! I've updated the sysfs naming in
the actual patch but forgot to update the cover letter.
Thanks,
Igor
>
> Kind regards,
> Niklas
>
> >
> > Changes since v6:
> > - Replaced sas_ata_sdev_attr_group definition with a macro for
> > the "CONFIG_SCSI_SAS_ATA is not set" case. The macro defines
> > an empty rvalue struct eliminating the variable definition.
> >
> > Changes since v5:
> > - Added __maybe_unused attribute to sas_ata_sdev_attr_group to prevent
> > an unused-const-variable warning when CONFIG_SCSI_SAS_ATA is not set.
> >
> > Changes since v4:
> > - Updated sas_ncq_prio_* sysfs functions to use WARN_ON_ONCE() instead
> > of WARN_ON().
> >
> > Changes since v3:
> > - Changed ata_ncq_prio_supported() and ata_ncq_prio_enabled() to store
> > the result into a boolean variable passed by address.
> > - Removed the "usable with both libsas and libata" wording from
> > ata_ncq_prio_* helper's function comments.
> > - Removed the unlikely() in ata_ncq_prio_enable() because the function
> > is not in a fastpath.
> > - Dropped hisi_sas v1 HW driver changes because it doesn't support SATA.
> >
> > Changes since v2:
> > - Added libsas SATA sysfs attributes to aic94xx and isci.
> >
> > Changes since v1:
> > - Dropped the "sas_" prefix to align sysfs sttributes naming with AHCI.
> > - Dropped ternary operators to make the code more readable.
> > - Corrected the formatting %u -> %d in sysfs_emit().
> > - Changed kstrtol() to kstrtobool() in [ata|sas]_ncq_prio_enable_store().
> > - Changed comments to use the "/* */" style instead of "//".
> > - Added libsas SATA sysfs attributes to mvsas and hisi_sas.
> > - Dropped the 'Reviewed-by' tags because they were not sent in-reply
> > to the patch emails.
> >
> > Igor Pylypiv (7):
> > ata: libata-sata: Factor out NCQ Priority configuration helpers
> > scsi: libsas: Define NCQ Priority sysfs attributes for SATA devices
> > scsi: pm80xx: Add libsas SATA sysfs attributes group
> > scsi: mvsas: Add libsas SATA sysfs attributes group
> > scsi: hisi_sas: Add libsas SATA sysfs attributes group
> > scsi: aic94xx: Add libsas SATA sysfs attributes group
> > scsi: isci: Add libsas SATA sysfs attributes group
> >
> > drivers/ata/libata-sata.c | 140 ++++++++++++++++++-------
> > drivers/scsi/aic94xx/aic94xx_init.c | 8 ++
> > drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 6 ++
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 6 ++
> > drivers/scsi/isci/init.c | 6 ++
> > drivers/scsi/libsas/sas_ata.c | 94 +++++++++++++++++
> > drivers/scsi/mvsas/mv_init.c | 7 ++
> > drivers/scsi/pm8001/pm8001_ctl.c | 5 +
> > drivers/scsi/pm8001/pm8001_init.c | 1 +
> > drivers/scsi/pm8001/pm8001_sas.h | 1 +
> > include/linux/libata.h | 6 ++
> > include/scsi/sas_ata.h | 6 ++
> > 12 files changed, 247 insertions(+), 39 deletions(-)
> >
> > --
> > 2.44.0.278.ge034bb2e1d-goog
> >
On 06/03/2024 20:56, Igor Pylypiv wrote:
>>> ---
>>> drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 6 ++++++
>>> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 6 ++++++
>> Is there a reason why you didn't patch:
>> drivers/scsi/hisi_sas/hisi_sas_v1_hw.c ?
>>
> I originally patched hisi_sas_v1_hw.c as well. John Garry pointed out
> that v1 HW doesn't support SATA so I dropped the change.
If you are going to do another spin, then maybe update the commit
message with this.
Thanks,
John
On Wed, Mar 06, 2024 at 01:13:22PM -0800, Igor Pylypiv wrote:
> On Wed, Mar 06, 2024 at 11:55:19AM +0100, Niklas Cassel wrote:
> > On Tue, Mar 05, 2024 at 05:22:23PM -0800, Igor Pylypiv wrote:
> > > The added sysfs attributes group enables the configuration of NCQ Priority
> > > feature for HBAs that rely on libsas to manage SATA devices.
> > >
> > > Reviewed-by: John Garry <[email protected]>
> > > Reviewed-by: Damien Le Moal <[email protected]>
> > > Reviewed-by: Jason Yan <[email protected]>
> > > Signed-off-by: Igor Pylypiv <[email protected]>
> > > ---
> > > drivers/scsi/mvsas/mv_init.c | 7 +++++++
> > > 1 file changed, 7 insertions(+)
> > >
> > > diff --git a/drivers/scsi/mvsas/mv_init.c b/drivers/scsi/mvsas/mv_init.c
> > > index 43ebb331e216..f1090bb5f2c9 100644
> > > --- a/drivers/scsi/mvsas/mv_init.c
> > > +++ b/drivers/scsi/mvsas/mv_init.c
> > > @@ -26,6 +26,7 @@ static const struct mvs_chip_info mvs_chips[] = {
> > > };
> > >
> > > static const struct attribute_group *mvst_host_groups[];
> > > +static const struct attribute_group *mvst_sdev_groups[];
> >
> > I think you can remove this line.
> >
> I kept the forward declaration to match the mvst_host_groups style.
>
> Perhaps mvs_sht can be moved to the bottom of the file so that all forward
> declarations can be removed? This can be done in a separate cleanup patch
> series.
>
> I'll keep this and aic94xx patches as-is, unless there are objections.
Usually, you first do the cleanup, then you do your changes.
(That way, there are fewer lines changed, since each patch is smaller.)
But no objection from me.
Kind regards,
Niklas
>
> >
> > >
> > > #define SOC_SAS_NUM 2
> > >
> > > @@ -53,6 +54,7 @@ static const struct scsi_host_template mvs_sht = {
> > > .compat_ioctl = sas_ioctl,
> > > #endif
> > > .shost_groups = mvst_host_groups,
> > > + .sdev_groups = mvst_sdev_groups,
> > > .track_queue_depth = 1,
> > > };
> > >
> > > @@ -779,6 +781,11 @@ static struct attribute *mvst_host_attrs[] = {
> > >
> > > ATTRIBUTE_GROUPS(mvst_host);
> > >
> > > +static const struct attribute_group *mvst_sdev_groups[] = {
> > > + &sas_ata_sdev_attr_group,
> > > + NULL
> > > +};
> >
> > ..and move these lines up to be after:
> > static const struct attribute_group *mvst_host_groups[];
> >
> >
> > > +
> > > module_init(mvs_init);
> > > module_exit(mvs_exit);
> > >
> > > --
> > > 2.44.0.278.ge034bb2e1d-goog
> > >
On Wed, Mar 06, 2024 at 11:28:42AM -0800, Igor Pylypiv wrote:
> On Wed, Mar 06, 2024 at 11:54:52AM +0100, Niklas Cassel wrote:
> > On Tue, Mar 05, 2024 at 05:22:21PM -0800, Igor Pylypiv wrote:
> > > Libata sysfs attributes cannot be used for libsas managed SATA devices
> > > because the ata_port location is different for libsas.
> > >
> > > Defined sysfs attributes (visible for SATA devices only):
> > > - /sys/block/sda/device/ncq_prio_enable
> > > - /sys/block/sda/device/ncq_prio_supported
> > >
> > > The newly defined attributes will pass the correct ata_port to libata
> > > helper functions.
> > >
> > > Reviewed-by: John Garry <[email protected]>
> > > Reviewed-by: Damien Le Moal <[email protected]>
> > > Reviewed-by: Jason Yan <[email protected]>
> > > Signed-off-by: Igor Pylypiv <[email protected]>
> > > ---
> > > drivers/scsi/libsas/sas_ata.c | 94 +++++++++++++++++++++++++++++++++++
> > > include/scsi/sas_ata.h | 6 +++
> > > 2 files changed, 100 insertions(+)
> > >
> > > diff --git a/drivers/scsi/libsas/sas_ata.c b/drivers/scsi/libsas/sas_ata.c
> > > index 12e2653846e3..04b0bd9a4e01 100644
> > > --- a/drivers/scsi/libsas/sas_ata.c
> > > +++ b/drivers/scsi/libsas/sas_ata.c
> > > @@ -964,3 +964,97 @@ int sas_execute_ata_cmd(struct domain_device *device, u8 *fis, int force_phy_id)
> > > force_phy_id, &tmf_task);
> > > }
> > > EXPORT_SYMBOL_GPL(sas_execute_ata_cmd);
> > > +
> > > +static ssize_t sas_ncq_prio_supported_show(struct device *device,
> > > + struct device_attribute *attr,
> > > + char *buf)
> > > +{
> > > + struct scsi_device *sdev = to_scsi_device(device);
> > > + struct domain_device *ddev = sdev_to_domain_dev(sdev);
> > > + bool supported;
> > > + int rc;
> > > +
> > > + /* This attribute shall be visible for SATA devices only */
> > > + if (WARN_ON_ONCE(!dev_is_sata(ddev)))
> > > + return -EINVAL;
> >
> > Like Hannes commented, I don't believe this is needed.
> >
>
> The intention for the check is to serve as a fail-safe in case 'is_visible()'
> callback gets incorrectly modified and stops hiding the sysfs attributes
> for non-SATA devices.
>
> Just want to clarify should I remove the WARN_ON_ONCE and keep the fail-safe
> check or should I get rid of the check completely and trust 'is_visible()'
> to always hide the sysfs attributes for non-SATA devices?
I think that you can remove both the WARN_ON_ONCE and the
if (!dev_is_sata()).
We usually don't keep code around "just in case someone modifies some
other function sometime in the future".
If someone changes is_visible() to remove the dev_is_sata() check,
then they would introuce a bug. I don't see why anyone would change that,
but if someone tried to remove that check from is_visible() anyway,
I'm assuming that someone would catch it during code review.
>
> >
> > > +
> > > + rc = ata_ncq_prio_supported(ddev->sata_dev.ap, sdev, &supported);
> > > + if (rc)
> > > + return rc;
> > > +
> > > + return sysfs_emit(buf, "%d\n", supported);
> > > +}
> > > +
> >
> > While this is a bit different depending on file, the most common way is to
> > have no blank link before the DEVICE_ATTR().
> >
>
> In "[PATCH 1/3] ata: libata-sata: Factor out NCQ Priority configuration helpers"
> Damien asked to keep the blank link before the DEVICE_ATTR() in libata-sata.c.
>
> Non-prio sysfs attributes in libata-sata.c don't have blank lines
> before DEVICE_ATTR() so I'm more inclined to remove the lines.
>
> I'm fine with either of ways, just want to get a consensus and make it
> consistent for both libata-sata.c and sas_ata.c.
While it is a bit different depending on file, it is slightly more common
to no have a extra blank line before DEVICE_ATTR():
$ git grep -B 1 DEVICE_ATTR | grep "}" | wc -l
2167
$ git grep -B 1 DEVICE_ATTR | grep -- "c-$" | wc -l
1725
But I'm fine to keep it like it is, especially if Damien already had expresed
a preference.
Kind regards,
Niklas
>
> >
> > > +DEVICE_ATTR(ncq_prio_supported, S_IRUGO, sas_ncq_prio_supported_show, NULL);
> > > +
> > > +static ssize_t sas_ncq_prio_enable_show(struct device *device,
> > > + struct device_attribute *attr,
> > > + char *buf)
> > > +{
> > > + struct scsi_device *sdev = to_scsi_device(device);
> > > + struct domain_device *ddev = sdev_to_domain_dev(sdev);
> > > + bool enabled;
> > > + int rc;
> > > +
> > > + /* This attribute shall be visible for SATA devices only */
> > > + if (WARN_ON_ONCE(!dev_is_sata(ddev)))
> > > + return -EINVAL;
> > > +
> > > + rc = ata_ncq_prio_enabled(ddev->sata_dev.ap, sdev, &enabled);
> > > + if (rc)
> > > + return rc;
> > > +
> > > + return sysfs_emit(buf, "%d\n", enabled);
> > > +}
> > > +
> > > +static ssize_t sas_ncq_prio_enable_store(struct device *device,
> > > + struct device_attribute *attr,
> > > + const char *buf, size_t len)
> > > +{
> > > + struct scsi_device *sdev = to_scsi_device(device);
> > > + struct domain_device *ddev = sdev_to_domain_dev(sdev);
> > > + bool enable;
> > > + int rc;
> > > +
> > > + /* This attribute shall be visible for SATA devices only */
> > > + if (WARN_ON_ONCE(!dev_is_sata(ddev)))
> > > + return -EINVAL;
> > > +
> > > + rc = kstrtobool(buf, &enable);
> > > + if (rc)
> > > + return rc;
> > > +
> > > + rc = ata_ncq_prio_enable(ddev->sata_dev.ap, sdev, enable);
> > > + if (rc)
> > > + return rc;
> > > +
> > > + return len;
> > > +}
> > > +
> > > +DEVICE_ATTR(ncq_prio_enable, S_IRUGO | S_IWUSR,
> > > + sas_ncq_prio_enable_show, sas_ncq_prio_enable_store);
> > > +
> > > +static struct attribute *sas_ata_sdev_attrs[] = {
> > > + &dev_attr_ncq_prio_supported.attr,
> > > + &dev_attr_ncq_prio_enable.attr,
> > > + NULL
> > > +};
> > > +
> > > +static umode_t sas_ata_attr_is_visible(struct kobject *kobj,
> > > + struct attribute *attr, int i)
> > > +{
> > > + struct device *dev = kobj_to_dev(kobj);
> > > + struct scsi_device *sdev = to_scsi_device(dev);
> > > + struct domain_device *ddev = sdev_to_domain_dev(sdev);
> > > +
> > > + if (!dev_is_sata(ddev))
> > > + return 0;
> > > +
> > > + return attr->mode;
> > > +}
> > > +
> > > +const struct attribute_group sas_ata_sdev_attr_group = {
> > > + .attrs = sas_ata_sdev_attrs,
> > > + .is_visible = sas_ata_attr_is_visible,
> > > +};
> > > +EXPORT_SYMBOL_GPL(sas_ata_sdev_attr_group);
> > > diff --git a/include/scsi/sas_ata.h b/include/scsi/sas_ata.h
> > > index 2f8c719840a6..92e27e7bf088 100644
> > > --- a/include/scsi/sas_ata.h
> > > +++ b/include/scsi/sas_ata.h
> > > @@ -39,6 +39,9 @@ int smp_ata_check_ready_type(struct ata_link *link);
> > > int sas_discover_sata(struct domain_device *dev);
> > > int sas_ata_add_dev(struct domain_device *parent, struct ex_phy *phy,
> > > struct domain_device *child, int phy_id);
> > > +
> > > +extern const struct attribute_group sas_ata_sdev_attr_group;
> > > +
> > > #else
> > >
> > > static inline void sas_ata_disabled_notice(void)
> > > @@ -123,6 +126,9 @@ static inline int sas_ata_add_dev(struct domain_device *parent, struct ex_phy *p
> > > sas_ata_disabled_notice();
> > > return -ENODEV;
> > > }
> > > +
> > > +#define sas_ata_sdev_attr_group ((struct attribute_group) {})
> > > +
> > > #endif
> > >
> > > #endif /* _SAS_ATA_H_ */
> > > --
> > > 2.44.0.278.ge034bb2e1d-goog
> > >
On Thu, Mar 07, 2024 at 08:55:51AM +0000, John Garry wrote:
> On 06/03/2024 20:56, Igor Pylypiv wrote:
> > > > ---
> > > > drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 6 ++++++
> > > > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 6 ++++++
> > > Is there a reason why you didn't patch:
> > > drivers/scsi/hisi_sas/hisi_sas_v1_hw.c ?
> > >
> > I originally patched hisi_sas_v1_hw.c as well. John Garry pointed out
> > that v1 HW doesn't support SATA so I dropped the change.
>
> If you are going to do another spin, then maybe update the commit message
> with this.
+1
John, now I'm curious, do you know why hisi_sas_v1_hw.c is implemented
as a libsas driver (instead of a regular SCSI driver), if it doesn't
support SATA?
Was perhaps v2_hw and v3_hw implemented as a libsas driver first
(since they support SATA), and v1_hw support was added later,
so that it could reuse much of the parts of the existing driver?
Kind regards,
Niklas
> John, now I'm curious, do you know why hisi_sas_v1_hw.c is implemented
> as a libsas driver (instead of a regular SCSI driver), if it doesn't
> support SATA?
Using libsas is not really dependent on whether the HW supports SATA/STP
or not. It's a protocol layer thing. Considering the SAS protocol stack,
HW for drivers using libsas have implemented only the lower protocol
layers, and SW, i.e. libsas, is required to manage upper layers, like
Port layer and above.
BTW, IIRC, v1 hw did support SATA, but not STP, i.e. directly attached
SATA only, but the SATA support was even more broken than v2 hw (which
is quite broken), so never bothered supporting in SW.
>
> Was perhaps v2_hw and v3_hw implemented as a libsas driver first
> (since they support SATA), and v1_hw support was added later,
> so that it could reuse much of the parts of the existing driver?
v1 driver support came first.
Thanks,
John
On Thu, Mar 07, 2024 at 10:52:08AM +0100, Niklas Cassel wrote:
> On Wed, Mar 06, 2024 at 01:13:22PM -0800, Igor Pylypiv wrote:
> > On Wed, Mar 06, 2024 at 11:55:19AM +0100, Niklas Cassel wrote:
> > > On Tue, Mar 05, 2024 at 05:22:23PM -0800, Igor Pylypiv wrote:
> > > > The added sysfs attributes group enables the configuration of NCQ Priority
> > > > feature for HBAs that rely on libsas to manage SATA devices.
> > > >
> > > > Reviewed-by: John Garry <[email protected]>
> > > > Reviewed-by: Damien Le Moal <[email protected]>
> > > > Reviewed-by: Jason Yan <[email protected]>
> > > > Signed-off-by: Igor Pylypiv <[email protected]>
> > > > ---
> > > > drivers/scsi/mvsas/mv_init.c | 7 +++++++
> > > > 1 file changed, 7 insertions(+)
> > > >
> > > > diff --git a/drivers/scsi/mvsas/mv_init.c b/drivers/scsi/mvsas/mv_init.c
> > > > index 43ebb331e216..f1090bb5f2c9 100644
> > > > --- a/drivers/scsi/mvsas/mv_init.c
> > > > +++ b/drivers/scsi/mvsas/mv_init.c
> > > > @@ -26,6 +26,7 @@ static const struct mvs_chip_info mvs_chips[] = {
> > > > };
> > > >
> > > > static const struct attribute_group *mvst_host_groups[];
> > > > +static const struct attribute_group *mvst_sdev_groups[];
> > >
> > > I think you can remove this line.
> > >
> > I kept the forward declaration to match the mvst_host_groups style.
> >
> > Perhaps mvs_sht can be moved to the bottom of the file so that all forward
> > declarations can be removed? This can be done in a separate cleanup patch
> > series.
> >
> > I'll keep this and aic94xx patches as-is, unless there are objections.
>
> Usually, you first do the cleanup, then you do your changes.
> (That way, there are fewer lines changed, since each patch is smaller.)
>
Ack. I think it makes sense to wait for the John's patch series
"Add LIBSAS_SHT_BASE for libsas" to get merged first:
https://lore.kernel.org/linux-scsi/[email protected]/T/#t
This way John woudn't need to re-do the patches on top of the moved sht.
Since the LIBSAS_SHT_BASE reduces the line count the following cleanup
patches will have fewer lines changed.
> But no objection from me.
>
>
> Kind regards,
> Niklas
>
>
> >
> > >
> > > >
> > > > #define SOC_SAS_NUM 2
> > > >
> > > > @@ -53,6 +54,7 @@ static const struct scsi_host_template mvs_sht = {
> > > > .compat_ioctl = sas_ioctl,
> > > > #endif
> > > > .shost_groups = mvst_host_groups,
> > > > + .sdev_groups = mvst_sdev_groups,
> > > > .track_queue_depth = 1,
> > > > };
> > > >
> > > > @@ -779,6 +781,11 @@ static struct attribute *mvst_host_attrs[] = {
> > > >
> > > > ATTRIBUTE_GROUPS(mvst_host);
> > > >
> > > > +static const struct attribute_group *mvst_sdev_groups[] = {
> > > > + &sas_ata_sdev_attr_group,
> > > > + NULL
> > > > +};
> > >
> > > ..and move these lines up to be after:
> > > static const struct attribute_group *mvst_host_groups[];
> > >
> > >
> > > > +
> > > > module_init(mvs_init);
> > > > module_exit(mvs_exit);
> > > >
> > > > --
> > > > 2.44.0.278.ge034bb2e1d-goog
> > > >
On Thu, Mar 07, 2024 at 10:51:37AM +0100, Niklas Cassel wrote:
> On Wed, Mar 06, 2024 at 11:28:42AM -0800, Igor Pylypiv wrote:
> > On Wed, Mar 06, 2024 at 11:54:52AM +0100, Niklas Cassel wrote:
> > > On Tue, Mar 05, 2024 at 05:22:21PM -0800, Igor Pylypiv wrote:
> > > > Libata sysfs attributes cannot be used for libsas managed SATA devices
> > > > because the ata_port location is different for libsas.
> > > >
> > > > Defined sysfs attributes (visible for SATA devices only):
> > > > - /sys/block/sda/device/ncq_prio_enable
> > > > - /sys/block/sda/device/ncq_prio_supported
> > > >
> > > > The newly defined attributes will pass the correct ata_port to libata
> > > > helper functions.
> > > >
> > > > Reviewed-by: John Garry <[email protected]>
> > > > Reviewed-by: Damien Le Moal <[email protected]>
> > > > Reviewed-by: Jason Yan <[email protected]>
> > > > Signed-off-by: Igor Pylypiv <[email protected]>
> > > > ---
> > > > drivers/scsi/libsas/sas_ata.c | 94 +++++++++++++++++++++++++++++++++++
> > > > include/scsi/sas_ata.h | 6 +++
> > > > 2 files changed, 100 insertions(+)
> > > >
> > > > diff --git a/drivers/scsi/libsas/sas_ata.c b/drivers/scsi/libsas/sas_ata.c
> > > > index 12e2653846e3..04b0bd9a4e01 100644
> > > > --- a/drivers/scsi/libsas/sas_ata.c
> > > > +++ b/drivers/scsi/libsas/sas_ata.c
> > > > @@ -964,3 +964,97 @@ int sas_execute_ata_cmd(struct domain_device *device, u8 *fis, int force_phy_id)
> > > > force_phy_id, &tmf_task);
> > > > }
> > > > EXPORT_SYMBOL_GPL(sas_execute_ata_cmd);
> > > > +
> > > > +static ssize_t sas_ncq_prio_supported_show(struct device *device,
> > > > + struct device_attribute *attr,
> > > > + char *buf)
> > > > +{
> > > > + struct scsi_device *sdev = to_scsi_device(device);
> > > > + struct domain_device *ddev = sdev_to_domain_dev(sdev);
> > > > + bool supported;
> > > > + int rc;
> > > > +
> > > > + /* This attribute shall be visible for SATA devices only */
> > > > + if (WARN_ON_ONCE(!dev_is_sata(ddev)))
> > > > + return -EINVAL;
> > >
> > > Like Hannes commented, I don't believe this is needed.
> > >
> >
> > The intention for the check is to serve as a fail-safe in case 'is_visible()'
> > callback gets incorrectly modified and stops hiding the sysfs attributes
> > for non-SATA devices.
> >
> > Just want to clarify should I remove the WARN_ON_ONCE and keep the fail-safe
> > check or should I get rid of the check completely and trust 'is_visible()'
> > to always hide the sysfs attributes for non-SATA devices?
>
> I think that you can remove both the WARN_ON_ONCE and the
> if (!dev_is_sata()).
>
> We usually don't keep code around "just in case someone modifies some
> other function sometime in the future".
>
>
> If someone changes is_visible() to remove the dev_is_sata() check,
> then they would introuce a bug. I don't see why anyone would change that,
> but if someone tried to remove that check from is_visible() anyway,
> I'm assuming that someone would catch it during code review.
>
Ack, makes sense. I'll remove the checks in v8. Thanks!
>
> >
> > >
> > > > +
> > > > + rc = ata_ncq_prio_supported(ddev->sata_dev.ap, sdev, &supported);
> > > > + if (rc)
> > > > + return rc;
> > > > +
> > > > + return sysfs_emit(buf, "%d\n", supported);
> > > > +}
> > > > +
> > >
> > > While this is a bit different depending on file, the most common way is to
> > > have no blank link before the DEVICE_ATTR().
> > >
> >
> > In "[PATCH 1/3] ata: libata-sata: Factor out NCQ Priority configuration helpers"
> > Damien asked to keep the blank link before the DEVICE_ATTR() in libata-sata.c.
> >
> > Non-prio sysfs attributes in libata-sata.c don't have blank lines
> > before DEVICE_ATTR() so I'm more inclined to remove the lines.
> >
> > I'm fine with either of ways, just want to get a consensus and make it
> > consistent for both libata-sata.c and sas_ata.c.
>
> While it is a bit different depending on file, it is slightly more common
> to no have a extra blank line before DEVICE_ATTR():
>
> $ git grep -B 1 DEVICE_ATTR | grep "}" | wc -l
> 2167
>
> $ git grep -B 1 DEVICE_ATTR | grep -- "c-$" | wc -l
> 1725
>
> But I'm fine to keep it like it is, especially if Damien already had expresed
> a preference.
>
Thank you Niklas. Let's keep the extra blank line as Damien suggested.
Thanks,
Igor
>
> Kind regards,
> Niklas
>
> >
> > >
> > > > +DEVICE_ATTR(ncq_prio_supported, S_IRUGO, sas_ncq_prio_supported_show, NULL);
> > > > +
> > > > +static ssize_t sas_ncq_prio_enable_show(struct device *device,
> > > > + struct device_attribute *attr,
> > > > + char *buf)
> > > > +{
> > > > + struct scsi_device *sdev = to_scsi_device(device);
> > > > + struct domain_device *ddev = sdev_to_domain_dev(sdev);
> > > > + bool enabled;
> > > > + int rc;
> > > > +
> > > > + /* This attribute shall be visible for SATA devices only */
> > > > + if (WARN_ON_ONCE(!dev_is_sata(ddev)))
> > > > + return -EINVAL;
> > > > +
> > > > + rc = ata_ncq_prio_enabled(ddev->sata_dev.ap, sdev, &enabled);
> > > > + if (rc)
> > > > + return rc;
> > > > +
> > > > + return sysfs_emit(buf, "%d\n", enabled);
> > > > +}
> > > > +
> > > > +static ssize_t sas_ncq_prio_enable_store(struct device *device,
> > > > + struct device_attribute *attr,
> > > > + const char *buf, size_t len)
> > > > +{
> > > > + struct scsi_device *sdev = to_scsi_device(device);
> > > > + struct domain_device *ddev = sdev_to_domain_dev(sdev);
> > > > + bool enable;
> > > > + int rc;
> > > > +
> > > > + /* This attribute shall be visible for SATA devices only */
> > > > + if (WARN_ON_ONCE(!dev_is_sata(ddev)))
> > > > + return -EINVAL;
> > > > +
> > > > + rc = kstrtobool(buf, &enable);
> > > > + if (rc)
> > > > + return rc;
> > > > +
> > > > + rc = ata_ncq_prio_enable(ddev->sata_dev.ap, sdev, enable);
> > > > + if (rc)
> > > > + return rc;
> > > > +
> > > > + return len;
> > > > +}
> > > > +
> > > > +DEVICE_ATTR(ncq_prio_enable, S_IRUGO | S_IWUSR,
> > > > + sas_ncq_prio_enable_show, sas_ncq_prio_enable_store);
> > > > +
> > > > +static struct attribute *sas_ata_sdev_attrs[] = {
> > > > + &dev_attr_ncq_prio_supported.attr,
> > > > + &dev_attr_ncq_prio_enable.attr,
> > > > + NULL
> > > > +};
> > > > +
> > > > +static umode_t sas_ata_attr_is_visible(struct kobject *kobj,
> > > > + struct attribute *attr, int i)
> > > > +{
> > > > + struct device *dev = kobj_to_dev(kobj);
> > > > + struct scsi_device *sdev = to_scsi_device(dev);
> > > > + struct domain_device *ddev = sdev_to_domain_dev(sdev);
> > > > +
> > > > + if (!dev_is_sata(ddev))
> > > > + return 0;
> > > > +
> > > > + return attr->mode;
> > > > +}
> > > > +
> > > > +const struct attribute_group sas_ata_sdev_attr_group = {
> > > > + .attrs = sas_ata_sdev_attrs,
> > > > + .is_visible = sas_ata_attr_is_visible,
> > > > +};
> > > > +EXPORT_SYMBOL_GPL(sas_ata_sdev_attr_group);
> > > > diff --git a/include/scsi/sas_ata.h b/include/scsi/sas_ata.h
> > > > index 2f8c719840a6..92e27e7bf088 100644
> > > > --- a/include/scsi/sas_ata.h
> > > > +++ b/include/scsi/sas_ata.h
> > > > @@ -39,6 +39,9 @@ int smp_ata_check_ready_type(struct ata_link *link);
> > > > int sas_discover_sata(struct domain_device *dev);
> > > > int sas_ata_add_dev(struct domain_device *parent, struct ex_phy *phy,
> > > > struct domain_device *child, int phy_id);
> > > > +
> > > > +extern const struct attribute_group sas_ata_sdev_attr_group;
> > > > +
> > > > #else
> > > >
> > > > static inline void sas_ata_disabled_notice(void)
> > > > @@ -123,6 +126,9 @@ static inline int sas_ata_add_dev(struct domain_device *parent, struct ex_phy *p
> > > > sas_ata_disabled_notice();
> > > > return -ENODEV;
> > > > }
> > > > +
> > > > +#define sas_ata_sdev_attr_group ((struct attribute_group) {})
> > > > +
> > > > #endif
> > > >
> > > > #endif /* _SAS_ATA_H_ */
> > > > --
> > > > 2.44.0.278.ge034bb2e1d-goog
> > > >