From: Igor Pylypiv <ipylypiv@google.com>
To: John Garry <john.g.garry@oracle.com>
Cc: Damien Le Moal <dlemoal@kernel.org>,
Niklas Cassel <cassel@kernel.org>,
Jason Yan <yanaijie@huawei.com>,
"James E.J. Bottomley" <jejb@linux.ibm.com>,
"Martin K. Petersen" <martin.petersen@oracle.com>,
Jack Wang <jinpu.wang@cloud.ionos.com>,
Hannes Reinecke <hare@suse.de>,
Xiang Chen <chenxiang66@hisilicon.com>,
Artur Paszkiewicz <artur.paszkiewicz@intel.com>,
Bart Van Assche <bvanassche@acm.org>,
TJ Adams <tadamsjr@google.com>,
linux-ide@vger.kernel.org, linux-scsi@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 1/7] ata: libata-sata: Factor out NCQ Priority configuration helpers
Date: Mon, 4 Mar 2024 14:15:26 -0800 [thread overview]
Message-ID: <ZeZH_jX4SO9YxgXk@google.com> (raw)
In-Reply-To: <5c20140a-79e8-4d0a-899a-d4ec5c9def42@oracle.com>
On Mon, Mar 04, 2024 at 08:34:52AM +0000, John Garry wrote:
> On 02/03/2024 20:16, Igor Pylypiv wrote:
> > Export libata NCQ Priority configuration helpers to be reused
> > for libsas managed SATA devices.
> >
> > Signed-off-by: Igor Pylypiv <ipylypiv@google.com>
>
> This looks ok. Some small code comments below, though.
>
> > ---
> > drivers/ata/libata-sata.c | 139 +++++++++++++++++++++++++++-----------
> > include/linux/libata.h | 4 ++
> > 2 files changed, 103 insertions(+), 40 deletions(-)
> >
> > diff --git a/drivers/ata/libata-sata.c b/drivers/ata/libata-sata.c
> > index 0fb1934875f2..a8d5e36d5211 100644
> > --- a/drivers/ata/libata-sata.c
> > +++ b/drivers/ata/libata-sata.c
> > @@ -848,29 +848,73 @@ 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);
> > +/**
> > + * ata_ncq_prio_supported - Check if device supports NCQ Priority
> > + * @ap: ATA port of the target device
> > + * @sdev: SCSI device
> > + *
> > + * Helper to check if device supports NCQ Priority feature,
> > + * usable with both libsas and libata.
> > + */
> > +int ata_ncq_prio_supported(struct ata_port *ap, struct scsi_device *sdev)
> > +{
> > + struct ata_device *dev;
> > + unsigned long flags;
> > + int rc;
> > +
> > + spin_lock_irqsave(ap->lock, flags);
> > + dev = ata_scsi_find_dev(ap, sdev);
> > + if (!dev)
> > + rc = -ENODEV;
> > + else
> > + rc = !!(dev->flags & ATA_DFLAG_NCQ_PRIO);
> > + spin_unlock_irqrestore(ap->lock, flags);
> > + return rc;
> > +}
>
> I'm not the biggest fan of functions which effectively return both a boolean
> and an error code.
>
> I like this patten more:
>
> int ata_ncq_prio_supported(struct ata_port *ap, struct scsi_device *sdev,
> bool *supported)
> {
> ...
> if (rc)
> return rc;
> *supported = true/false.
> return 0;
> }
>
> No big deal, though.
Thanks for the review, John. Separating out an error code and a boolean
makes the code a bit more readable. Sent out v4 with the changes.
>
> > +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);
> > + int rc;
> > +
> > + rc = ata_ncq_prio_supported(ap, sdev);
> > + if (rc < 0)
> > + return rc;
> > +
> > + return sysfs_emit(buf, "%d\n", rc);
> > +}
> > +
> > +DEVICE_ATTR(ncq_prio_supported, S_IRUGO, ata_ncq_prio_supported_show, NULL);
> > +EXPORT_SYMBOL_GPL(dev_attr_ncq_prio_supported);
> > +
> > +/**
> > + * ata_ncq_prio_enabled - Check if NCQ Priority is enabled
> > + * @ap: ATA port of the target device
> > + * @sdev: SCSI device
> > + *
> > + * Helper to check if NCQ Priority feature is enabled,
> > + * usable with both libsas and libata.
>
> It's usable by anything which uses libata, really. For the moment that is
> libsas and libata.
>
> > + */
> > +int ata_ncq_prio_enabled(struct ata_port *ap, struct scsi_device *sdev)
> > +{
> > struct ata_device *dev;
> > - bool ncq_prio_supported;
> > - int rc = 0;
> > + unsigned long flags;
> > + int rc;
> > - 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);
> > -
> > - return rc ? rc : sysfs_emit(buf, "%u\n", ncq_prio_supported);
> > + rc = !!(dev->flags & ATA_DFLAG_NCQ_PRIO_ENABLED);
> > + spin_unlock_irqrestore(ap->lock, flags);
> > + return rc;
> > }
> > -
> > -DEVICE_ATTR(ncq_prio_supported, S_IRUGO, ata_ncq_prio_supported_show, NULL);
> > -EXPORT_SYMBOL_GPL(dev_attr_ncq_prio_supported);
> > +EXPORT_SYMBOL_GPL(ata_ncq_prio_enabled);
> > static ssize_t ata_ncq_prio_enable_show(struct device *device,
> > struct device_attribute *attr,
> > @@ -878,50 +922,45 @@ static ssize_t ata_ncq_prio_enable_show(struct device *device,
> > {
> > 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;
> > - int rc = 0;
> > + int rc;
> > - spin_lock_irq(ap->lock);
> > - 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);
> > + rc = ata_ncq_prio_enabled(ap, sdev);
> > + if (rc < 0)
> > + return rc;
> > - return rc ? rc : sysfs_emit(buf, "%u\n", ncq_prio_enable);
> > + return sysfs_emit(buf, "%d\n", rc);
> > }
> > -static ssize_t ata_ncq_prio_enable_store(struct device *device,
> > - struct device_attribute *attr,
> > - const char *buf, size_t len)
> > +/**
> > + * 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, usable with both
> > + * libsas and libata.
> > + */
> > +int ata_ncq_prio_enable(struct ata_port *ap, struct scsi_device *sdev,
> > + bool enable)
> > {
> > - struct scsi_device *sdev = to_scsi_device(device);
> > - struct ata_port *ap;
> > struct ata_device *dev;
> > - long int input;
> > + unsigned long flags;
> > int rc = 0;
> > - rc = kstrtol(buf, 10, &input);
> > - if (rc)
> > - return rc;
> > - if ((input < 0) || (input > 1))
> > - return -EINVAL;
> > + spin_lock_irqsave(ap->lock, flags);
> > - ap = ata_shost_to_port(sdev->host);
> > dev = ata_scsi_find_dev(ap, sdev);
> > - if (unlikely(!dev))
> > - return -ENODEV;
> > -
> > - spin_lock_irq(ap->lock);
> > + if (unlikely(!dev)) {
>
> no need for unlikely() - this is not fathpath
>
> > + rc = -ENODEV;
> > + goto unlock;
> > + }
> > if (!(dev->flags & ATA_DFLAG_NCQ_PRIO)) {
> > rc = -EINVAL;
> > goto unlock;
>
next prev parent reply other threads:[~2024-03-04 22:15 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-02 20:16 [PATCH v3 0/7] NCQ Priority sysfs sttributes for libsas Igor Pylypiv
2024-03-02 20:16 ` [PATCH v3 1/7] ata: libata-sata: Factor out NCQ Priority configuration helpers Igor Pylypiv
2024-03-04 8:34 ` John Garry
2024-03-04 22:15 ` Igor Pylypiv [this message]
2024-03-02 20:16 ` [PATCH v3 2/7] scsi: libsas: Define NCQ Priority sysfs attributes for SATA devices Igor Pylypiv
2024-03-04 8:22 ` John Garry
2024-03-02 20:16 ` [PATCH v3 3/7] scsi: pm80xx: Add libsas SATA sysfs attributes group Igor Pylypiv
2024-03-04 8:16 ` John Garry
2024-03-04 8:43 ` Jinpu Wang
2024-03-02 20:16 ` [PATCH v3 4/7] scsi: mvsas: " Igor Pylypiv
2024-03-04 8:16 ` John Garry
2024-03-02 20:16 ` [PATCH v3 5/7] scsi: hisi_sas: " Igor Pylypiv
2024-03-04 8:18 ` John Garry
2024-03-02 20:16 ` [PATCH v3 6/7] scsi: aic94xx: " Igor Pylypiv
2024-03-04 8:18 ` John Garry
2024-03-02 20:16 ` [PATCH v3 7/7] scsi: isci: " Igor Pylypiv
2024-03-04 8:18 ` John Garry
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZeZH_jX4SO9YxgXk@google.com \
--to=ipylypiv@google.com \
--cc=artur.paszkiewicz@intel.com \
--cc=bvanassche@acm.org \
--cc=cassel@kernel.org \
--cc=chenxiang66@hisilicon.com \
--cc=dlemoal@kernel.org \
--cc=hare@suse.de \
--cc=jejb@linux.ibm.com \
--cc=jinpu.wang@cloud.ionos.com \
--cc=john.g.garry@oracle.com \
--cc=linux-ide@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=tadamsjr@google.com \
--cc=yanaijie@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.