From: Vaibhav Jain <vaibhav@linux.ibm.com> To: linuxppc-dev@lists.ozlabs.org, linux-nvdimm@lists.01.org Cc: Vaibhav Jain <vaibhav@linux.ibm.com>, "Aneesh Kumar K . V" <aneesh.kumar@linux.ibm.com>, Michael Ellerman <mpe@ellerman.id.au> Subject: [RFC][PATCH 2/2] powerpc/papr_scm: Implement support for reporting generic nvdimm stats Date: Mon, 9 Nov 2020 02:45:49 +0530 [thread overview] Message-ID: <20201108211549.122018-2-vaibhav@linux.ibm.com> (raw) In-Reply-To: <20201108211549.122018-1-vaibhav@linux.ibm.com> Add support for reporting papr-scm supported generic nvdimm stats by implementing support for handling ND_CMD_GET_STAT in 'papr_scm_ndctl(). The mapping between libnvdimm generic nvdimm-stats and papr-scm specific performance-stats is embedded inside 'dimm_stats_map[]'. This array is queried by newly introduced 'papr_scm_get_stat()' that verifies if the requested nvdimm-stat is supported and if yes does an hcall via 'drc_pmem_query_stat()' to request the performance-stat and return it back to libnvdimm. Signed-off-by: Vaibhav Jain <vaibhav@linux.ibm.com> --- arch/powerpc/platforms/pseries/papr_scm.c | 66 ++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/arch/powerpc/platforms/pseries/papr_scm.c b/arch/powerpc/platforms/pseries/papr_scm.c index 835163f54244..51eeab3376fd 100644 --- a/arch/powerpc/platforms/pseries/papr_scm.c +++ b/arch/powerpc/platforms/pseries/papr_scm.c @@ -25,7 +25,8 @@ ((1ul << ND_CMD_GET_CONFIG_SIZE) | \ (1ul << ND_CMD_GET_CONFIG_DATA) | \ (1ul << ND_CMD_SET_CONFIG_DATA) | \ - (1ul << ND_CMD_CALL)) + (1ul << ND_CMD_CALL) | \ + (1ul << ND_CMD_GET_STAT)) /* DIMM health bitmap bitmap indicators */ /* SCM device is unable to persist memory contents */ @@ -120,6 +121,16 @@ struct papr_scm_priv { static LIST_HEAD(papr_nd_regions); static DEFINE_MUTEX(papr_ndr_lock); +/* Map generic nvdimm stats to papr-scm stats */ +static const char * const dimm_stat_map[] = { + [ND_DIMM_STAT_INVALID] = NULL, + [ND_DIMM_STAT_MEDIA_READS] = "MedRCnt ", + [ND_DIMM_STAT_MEDIA_WRITES] = "MedWCnt ", + [ND_DIMM_STAT_READ_REQUESTS] = "HostLCnt", + [ND_DIMM_STAT_WRITE_REQUESTS] = "HostSCnt", + [ND_DIMM_STAT_MAX] = NULL, +}; + static int drc_pmem_bind(struct papr_scm_priv *p) { unsigned long ret[PLPAR_HCALL_BUFSIZE]; @@ -728,6 +739,54 @@ static int papr_scm_service_pdsm(struct papr_scm_priv *p, return pdsm_pkg->cmd_status; } +/* + * For a given pdsm request call an appropriate service function. + * Returns errors if any while handling the pdsm command package. + */ +static int papr_scm_get_stat(struct papr_scm_priv *p, + struct nd_cmd_get_dimm_stat *dimm_stat) + +{ + int rc; + ssize_t size; + struct papr_scm_perf_stat *stat; + struct papr_scm_perf_stats *stats; + + /* Check if the requested stat-id is supported */ + if (dimm_stat->stat_id >= ARRAY_SIZE(dimm_stat_map) || + !dimm_stat_map[dimm_stat->stat_id]) { + dev_dbg(&p->pdev->dev, "Invalid stat-id %lld\n", dimm_stat->stat_id); + return -ENOSPC; + } + + /* Allocate request buffer enough to hold single performance stat */ + size = sizeof(struct papr_scm_perf_stats) + + sizeof(struct papr_scm_perf_stat); + + stats = kzalloc(size, GFP_KERNEL); + if (!stats) + return -ENOMEM; + + stat = &stats->scm_statistic[0]; + memcpy(&stat->stat_id, dimm_stat_map[dimm_stat->stat_id], + sizeof(stat->stat_id)); + stat->stat_val = 0; + + /* Fetch the statistic from PHYP and copy it to provided payload */ + rc = drc_pmem_query_stats(p, stats, 1); + if (rc < 0) { + dev_dbg(&p->pdev->dev, "Err(%d) fetching stat '%.8s'\n", + rc, stat->stat_id); + kfree(stats); + return rc; + } + + dimm_stat->int_val = be64_to_cpu(stat->stat_val); + + kfree(stats); + return 0; +} + static int papr_scm_ndctl(struct nvdimm_bus_descriptor *nd_desc, struct nvdimm *nvdimm, unsigned int cmd, void *buf, unsigned int buf_len, int *cmd_rc) @@ -772,6 +831,11 @@ static int papr_scm_ndctl(struct nvdimm_bus_descriptor *nd_desc, *cmd_rc = papr_scm_service_pdsm(p, call_pkg); break; + case ND_CMD_GET_STAT: + *cmd_rc = papr_scm_get_stat(p, + (struct nd_cmd_get_dimm_stat *)buf); + break; + default: dev_dbg(&p->pdev->dev, "Unknown command = %d\n", cmd); return -EINVAL; -- 2.28.0 _______________________________________________ Linux-nvdimm mailing list -- linux-nvdimm@lists.01.org To unsubscribe send an email to linux-nvdimm-leave@lists.01.org
WARNING: multiple messages have this Message-ID (diff)
From: Vaibhav Jain <vaibhav@linux.ibm.com> To: linuxppc-dev@lists.ozlabs.org, linux-nvdimm@lists.01.org Cc: Santosh Sivaraj <santosh@fossix.org>, "Aneesh Kumar K . V" <aneesh.kumar@linux.ibm.com>, Vaibhav Jain <vaibhav@linux.ibm.com>, Dan Williams <dan.j.williams@intel.com>, Ira Weiny <ira.weiny@intel.com> Subject: [RFC][PATCH 2/2] powerpc/papr_scm: Implement support for reporting generic nvdimm stats Date: Mon, 9 Nov 2020 02:45:49 +0530 [thread overview] Message-ID: <20201108211549.122018-2-vaibhav@linux.ibm.com> (raw) In-Reply-To: <20201108211549.122018-1-vaibhav@linux.ibm.com> Add support for reporting papr-scm supported generic nvdimm stats by implementing support for handling ND_CMD_GET_STAT in 'papr_scm_ndctl(). The mapping between libnvdimm generic nvdimm-stats and papr-scm specific performance-stats is embedded inside 'dimm_stats_map[]'. This array is queried by newly introduced 'papr_scm_get_stat()' that verifies if the requested nvdimm-stat is supported and if yes does an hcall via 'drc_pmem_query_stat()' to request the performance-stat and return it back to libnvdimm. Signed-off-by: Vaibhav Jain <vaibhav@linux.ibm.com> --- arch/powerpc/platforms/pseries/papr_scm.c | 66 ++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/arch/powerpc/platforms/pseries/papr_scm.c b/arch/powerpc/platforms/pseries/papr_scm.c index 835163f54244..51eeab3376fd 100644 --- a/arch/powerpc/platforms/pseries/papr_scm.c +++ b/arch/powerpc/platforms/pseries/papr_scm.c @@ -25,7 +25,8 @@ ((1ul << ND_CMD_GET_CONFIG_SIZE) | \ (1ul << ND_CMD_GET_CONFIG_DATA) | \ (1ul << ND_CMD_SET_CONFIG_DATA) | \ - (1ul << ND_CMD_CALL)) + (1ul << ND_CMD_CALL) | \ + (1ul << ND_CMD_GET_STAT)) /* DIMM health bitmap bitmap indicators */ /* SCM device is unable to persist memory contents */ @@ -120,6 +121,16 @@ struct papr_scm_priv { static LIST_HEAD(papr_nd_regions); static DEFINE_MUTEX(papr_ndr_lock); +/* Map generic nvdimm stats to papr-scm stats */ +static const char * const dimm_stat_map[] = { + [ND_DIMM_STAT_INVALID] = NULL, + [ND_DIMM_STAT_MEDIA_READS] = "MedRCnt ", + [ND_DIMM_STAT_MEDIA_WRITES] = "MedWCnt ", + [ND_DIMM_STAT_READ_REQUESTS] = "HostLCnt", + [ND_DIMM_STAT_WRITE_REQUESTS] = "HostSCnt", + [ND_DIMM_STAT_MAX] = NULL, +}; + static int drc_pmem_bind(struct papr_scm_priv *p) { unsigned long ret[PLPAR_HCALL_BUFSIZE]; @@ -728,6 +739,54 @@ static int papr_scm_service_pdsm(struct papr_scm_priv *p, return pdsm_pkg->cmd_status; } +/* + * For a given pdsm request call an appropriate service function. + * Returns errors if any while handling the pdsm command package. + */ +static int papr_scm_get_stat(struct papr_scm_priv *p, + struct nd_cmd_get_dimm_stat *dimm_stat) + +{ + int rc; + ssize_t size; + struct papr_scm_perf_stat *stat; + struct papr_scm_perf_stats *stats; + + /* Check if the requested stat-id is supported */ + if (dimm_stat->stat_id >= ARRAY_SIZE(dimm_stat_map) || + !dimm_stat_map[dimm_stat->stat_id]) { + dev_dbg(&p->pdev->dev, "Invalid stat-id %lld\n", dimm_stat->stat_id); + return -ENOSPC; + } + + /* Allocate request buffer enough to hold single performance stat */ + size = sizeof(struct papr_scm_perf_stats) + + sizeof(struct papr_scm_perf_stat); + + stats = kzalloc(size, GFP_KERNEL); + if (!stats) + return -ENOMEM; + + stat = &stats->scm_statistic[0]; + memcpy(&stat->stat_id, dimm_stat_map[dimm_stat->stat_id], + sizeof(stat->stat_id)); + stat->stat_val = 0; + + /* Fetch the statistic from PHYP and copy it to provided payload */ + rc = drc_pmem_query_stats(p, stats, 1); + if (rc < 0) { + dev_dbg(&p->pdev->dev, "Err(%d) fetching stat '%.8s'\n", + rc, stat->stat_id); + kfree(stats); + return rc; + } + + dimm_stat->int_val = be64_to_cpu(stat->stat_val); + + kfree(stats); + return 0; +} + static int papr_scm_ndctl(struct nvdimm_bus_descriptor *nd_desc, struct nvdimm *nvdimm, unsigned int cmd, void *buf, unsigned int buf_len, int *cmd_rc) @@ -772,6 +831,11 @@ static int papr_scm_ndctl(struct nvdimm_bus_descriptor *nd_desc, *cmd_rc = papr_scm_service_pdsm(p, call_pkg); break; + case ND_CMD_GET_STAT: + *cmd_rc = papr_scm_get_stat(p, + (struct nd_cmd_get_dimm_stat *)buf); + break; + default: dev_dbg(&p->pdev->dev, "Unknown command = %d\n", cmd); return -EINVAL; -- 2.28.0
next prev parent reply other threads:[~2020-11-08 21:16 UTC|newest] Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-11-08 21:15 [RFC][PATCH 1/2] libnvdimm: Introduce ND_CMD_GET_STAT to retrieve nvdimm statistics Vaibhav Jain 2020-11-08 21:15 ` Vaibhav Jain 2020-11-08 21:15 ` Vaibhav Jain [this message] 2020-11-08 21:15 ` [RFC][PATCH 2/2] powerpc/papr_scm: Implement support for reporting generic nvdimm stats Vaibhav Jain 2022-03-30 6:01 ` Christophe Leroy 2020-12-08 0:54 ` [RFC][PATCH 1/2] libnvdimm: Introduce ND_CMD_GET_STAT to retrieve nvdimm statistics Dan Williams 2020-12-08 0:54 ` Dan Williams 2020-12-08 13:00 ` Peter Zijlstra 2020-12-08 13:00 ` Peter Zijlstra
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=20201108211549.122018-2-vaibhav@linux.ibm.com \ --to=vaibhav@linux.ibm.com \ --cc=aneesh.kumar@linux.ibm.com \ --cc=linux-nvdimm@lists.01.org \ --cc=linuxppc-dev@lists.ozlabs.org \ --cc=mpe@ellerman.id.au \ /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: linkBe 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.