lkml.org 
[lkml]   [2021]   [Jul]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.13 755/800] powerpc/papr_scm: Make perf_stats invisible if perf-stats unavailable
    Date
    From: Vaibhav Jain <vaibhav@linux.ibm.com>

    [ Upstream commit ed78f56e1271f108e8af61baeba383dcd77adbec ]

    In case performance stats for an nvdimm are not available, reading the
    'perf_stats' sysfs file returns an -ENOENT error. A better approach is
    to make the 'perf_stats' file entirely invisible to indicate that
    performance stats for an nvdimm are unavailable.

    So this patch updates 'papr_nd_attribute_group' to add a 'is_visible'
    callback implemented as newly introduced 'papr_nd_attribute_visible()'
    that returns an appropriate mode in case performance stats aren't
    supported in a given nvdimm.

    Also the initialization of 'papr_scm_priv.stat_buffer_len' is moved
    from papr_scm_nvdimm_init() to papr_scm_probe() so that it value is
    available when 'papr_nd_attribute_visible()' is called during nvdimm
    initialization.

    Even though 'perf_stats' attribute is available since v5.9, there are
    no known user-space tools/scripts that are dependent on presence of its
    sysfs file. Hence I dont expect any user-space breakage with this
    patch.

    Fixes: 2d02bf835e57 ("powerpc/papr_scm: Fetch nvdimm performance stats from PHYP")
    Signed-off-by: Vaibhav Jain <vaibhav@linux.ibm.com>
    Reviewed-by: Dan Williams <dan.j.williams@intel.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20210513092349.285021-1-vaibhav@linux.ibm.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    Documentation/ABI/testing/sysfs-bus-papr-pmem | 8 +++--
    arch/powerpc/platforms/pseries/papr_scm.c | 35 +++++++++++++------
    2 files changed, 29 insertions(+), 14 deletions(-)

    diff --git a/Documentation/ABI/testing/sysfs-bus-papr-pmem b/Documentation/ABI/testing/sysfs-bus-papr-pmem
    index 92e2db0e2d3d..95254cec92bf 100644
    --- a/Documentation/ABI/testing/sysfs-bus-papr-pmem
    +++ b/Documentation/ABI/testing/sysfs-bus-papr-pmem
    @@ -39,9 +39,11 @@ KernelVersion: v5.9
    Contact: linuxppc-dev <linuxppc-dev@lists.ozlabs.org>, nvdimm@lists.linux.dev,
    Description:
    (RO) Report various performance stats related to papr-scm NVDIMM
    - device. Each stat is reported on a new line with each line
    - composed of a stat-identifier followed by it value. Below are
    - currently known dimm performance stats which are reported:
    + device. This attribute is only available for NVDIMM devices
    + that support reporting NVDIMM performance stats. Each stat is
    + reported on a new line with each line composed of a
    + stat-identifier followed by it value. Below are currently known
    + dimm performance stats which are reported:

    * "CtlResCt" : Controller Reset Count
    * "CtlResTm" : Controller Reset Elapsed Time
    diff --git a/arch/powerpc/platforms/pseries/papr_scm.c b/arch/powerpc/platforms/pseries/papr_scm.c
    index 8335e13836db..d34e6eb4be0d 100644
    --- a/arch/powerpc/platforms/pseries/papr_scm.c
    +++ b/arch/powerpc/platforms/pseries/papr_scm.c
    @@ -901,6 +901,20 @@ static ssize_t flags_show(struct device *dev,
    }
    DEVICE_ATTR_RO(flags);

    +static umode_t papr_nd_attribute_visible(struct kobject *kobj,
    + struct attribute *attr, int n)
    +{
    + struct device *dev = kobj_to_dev(kobj);
    + struct nvdimm *nvdimm = to_nvdimm(dev);
    + struct papr_scm_priv *p = nvdimm_provider_data(nvdimm);
    +
    + /* For if perf-stats not available remove perf_stats sysfs */
    + if (attr == &dev_attr_perf_stats.attr && p->stat_buffer_len == 0)
    + return 0;
    +
    + return attr->mode;
    +}
    +
    /* papr_scm specific dimm attributes */
    static struct attribute *papr_nd_attributes[] = {
    &dev_attr_flags.attr,
    @@ -910,6 +924,7 @@ static struct attribute *papr_nd_attributes[] = {

    static struct attribute_group papr_nd_attribute_group = {
    .name = "papr",
    + .is_visible = papr_nd_attribute_visible,
    .attrs = papr_nd_attributes,
    };

    @@ -925,7 +940,6 @@ static int papr_scm_nvdimm_init(struct papr_scm_priv *p)
    struct nd_region_desc ndr_desc;
    unsigned long dimm_flags;
    int target_nid, online_nid;
    - ssize_t stat_size;

    p->bus_desc.ndctl = papr_scm_ndctl;
    p->bus_desc.module = THIS_MODULE;
    @@ -1010,16 +1024,6 @@ static int papr_scm_nvdimm_init(struct papr_scm_priv *p)
    list_add_tail(&p->region_list, &papr_nd_regions);
    mutex_unlock(&papr_ndr_lock);

    - /* Try retriving the stat buffer and see if its supported */
    - stat_size = drc_pmem_query_stats(p, NULL, 0);
    - if (stat_size > 0) {
    - p->stat_buffer_len = stat_size;
    - dev_dbg(&p->pdev->dev, "Max perf-stat size %lu-bytes\n",
    - p->stat_buffer_len);
    - } else {
    - dev_info(&p->pdev->dev, "Dimm performance stats unavailable\n");
    - }
    -
    return 0;

    err: nvdimm_bus_unregister(p->bus);
    @@ -1097,6 +1101,7 @@ static int papr_scm_probe(struct platform_device *pdev)
    struct papr_scm_priv *p;
    u8 uuid_raw[UUID_SIZE];
    const char *uuid_str;
    + ssize_t stat_size;
    uuid_t uuid;
    int rc;

    @@ -1181,6 +1186,14 @@ static int papr_scm_probe(struct platform_device *pdev)
    p->res.name = pdev->name;
    p->res.flags = IORESOURCE_MEM;

    + /* Try retrieving the stat buffer and see if its supported */
    + stat_size = drc_pmem_query_stats(p, NULL, 0);
    + if (stat_size > 0) {
    + p->stat_buffer_len = stat_size;
    + dev_dbg(&p->pdev->dev, "Max perf-stat size %lu-bytes\n",
    + p->stat_buffer_len);
    + }
    +
    rc = papr_scm_nvdimm_init(p);
    if (rc)
    goto err2;
    --
    2.30.2


    \
     
     \ /
      Last update: 2021-07-12 11:10    [W:4.021 / U:0.372 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site