From: Scott Cheloha <hidden> Date: 2020-07-27 18:50:35
The H_GetPerformanceCounterInfo (GPCI) hypercall input/output structs are
useful to modules outside of perf/, so move them into asm/hvcall.h to live
alongside the other powerpc hypercall structs.
Leave the perf-specific GPCI stuff in perf/hv-gpci.h.
Signed-off-by: Scott Cheloha <redacted>
---
arch/powerpc/include/asm/hvcall.h | 36 +++++++++++++++++++++++++++++++
arch/powerpc/perf/hv-gpci.c | 9 --------
arch/powerpc/perf/hv-gpci.h | 27 -----------------------
3 files changed, 36 insertions(+), 36 deletions(-)
@@ -527,6 +527,42 @@ struct hv_guest_state {/* Latest version of hv_guest_state structure */#define HV_GUEST_STATE_VERSION 1+/*+*Fromthedocument"H_GetPerformanceCounterInfo Interface"v1.07+*+*H_GET_PERF_COUNTER_INFOargument+*/+structhv_get_perf_counter_info_params{+__be32counter_request;/* I */+__be32starting_index;/* IO */+__be16secondary_index;/* IO */+__be16returned_values;/* O */+__be32detail_rc;/* O, only needed when called via *_norets() */++/*+*O,sizeeachofcounter_valueelementinbytes,onlysetforversion+*>=0x3+*/+__be16cv_element_size;++/* I, 0 (zero) for versions < 0x3 */+__u8counter_info_version_in;++/* O, 0 (zero) if version < 0x3. Must be set to 0 when making hcall */+__u8counter_info_version_out;+__u8reserved[0xC];+__u8counter_value[];+}__packed;++#define HGPCI_REQ_BUFFER_SIZE 4096+#define HGPCI_MAX_DATA_BYTES \+(HGPCI_REQ_BUFFER_SIZE-sizeof(structhv_get_perf_counter_info_params))++structhv_gpci_request_buffer{+structhv_get_perf_counter_info_paramsparams;+uint8_tbytes[HGPCI_MAX_DATA_BYTES];+}__packed;+#endif /* __ASSEMBLY__ */#endif /* __KERNEL__ */#endif /* _ASM_POWERPC_HVCALL_H */
@@ -2,33 +2,6 @@#ifndef LINUX_POWERPC_PERF_HV_GPCI_H_#define LINUX_POWERPC_PERF_HV_GPCI_H_-#include<linux/types.h>--/* From the document "H_GetPerformanceCounterInfo Interface" v1.07 */--/* H_GET_PERF_COUNTER_INFO argument */-structhv_get_perf_counter_info_params{-__be32counter_request;/* I */-__be32starting_index;/* IO */-__be16secondary_index;/* IO */-__be16returned_values;/* O */-__be32detail_rc;/* O, only needed when called via *_norets() */--/*-*O,sizeeachofcounter_valueelementinbytes,onlysetforversion-*>=0x3-*/-__be16cv_element_size;--/* I, 0 (zero) for versions < 0x3 */-__u8counter_info_version_in;--/* O, 0 (zero) if version < 0x3. Must be set to 0 when making hcall */-__u8counter_info_version_out;-__u8reserved[0xC];-__u8counter_value[];-}__packed;-/**counterinfoversion=>fwversion/reference(specversion)*
From: Scott Cheloha <hidden> Date: 2020-07-27 18:52:41
The H_GetPerformanceCounterInfo (GPCI) PHYP hypercall has a subcall,
Affinity_Domain_Info_By_Partition, which returns, among other things,
a "partition affinity score" for a given LPAR. This score, a value on
[0-100], represents the processor-memory affinity for the LPAR in
question. A score of 0 indicates the worst possible affinity while a
score of 100 indicates perfect affinity. The score can be used to
reason about performance.
This patch adds the score for the local LPAR to the lparcfg procfile
under a new 'partition_affinity_score' key.
Signed-off-by: Scott Cheloha <redacted>
---
arch/powerpc/platforms/pseries/lparcfg.c | 35 ++++++++++++++++++++++++
1 file changed, 35 insertions(+)
The H_GetPerformanceCounterInfo (GPCI) hypercall input/output structs are
useful to modules outside of perf/, so move them into asm/hvcall.h to live
alongside the other powerpc hypercall structs.
Leave the perf-specific GPCI stuff in perf/hv-gpci.h.
Signed-off-by: Scott Cheloha <redacted>
---
arch/powerpc/include/asm/hvcall.h | 36 +++++++++++++++++++++++++++++++
arch/powerpc/perf/hv-gpci.c | 9 --------
arch/powerpc/perf/hv-gpci.h | 27 -----------------------
3 files changed, 36 insertions(+), 36 deletions(-)
@@ -527,6 +527,42 @@ struct hv_guest_state {/* Latest version of hv_guest_state structure */#define HV_GUEST_STATE_VERSION 1+/*+*Fromthedocument"H_GetPerformanceCounterInfo Interface"v1.07+*+*H_GET_PERF_COUNTER_INFOargument+*/+structhv_get_perf_counter_info_params{+__be32counter_request;/* I */+__be32starting_index;/* IO */+__be16secondary_index;/* IO */+__be16returned_values;/* O */+__be32detail_rc;/* O, only needed when called via *_norets() */++/*+*O,sizeeachofcounter_valueelementinbytes,onlysetforversion+*>=0x3+*/+__be16cv_element_size;++/* I, 0 (zero) for versions < 0x3 */+__u8counter_info_version_in;++/* O, 0 (zero) if version < 0x3. Must be set to 0 when making hcall */+__u8counter_info_version_out;+__u8reserved[0xC];+__u8counter_value[];+}__packed;++#define HGPCI_REQ_BUFFER_SIZE 4096+#define HGPCI_MAX_DATA_BYTES \+(HGPCI_REQ_BUFFER_SIZE-sizeof(structhv_get_perf_counter_info_params))++structhv_gpci_request_buffer{+structhv_get_perf_counter_info_paramsparams;+uint8_tbytes[HGPCI_MAX_DATA_BYTES];+}__packed;+#endif /* __ASSEMBLY__ */#endif /* __KERNEL__ */#endif /* _ASM_POWERPC_HVCALL_H */
@@ -2,33 +2,6 @@#ifndef LINUX_POWERPC_PERF_HV_GPCI_H_#define LINUX_POWERPC_PERF_HV_GPCI_H_-#include<linux/types.h>--/* From the document "H_GetPerformanceCounterInfo Interface" v1.07 */--/* H_GET_PERF_COUNTER_INFO argument */-structhv_get_perf_counter_info_params{-__be32counter_request;/* I */-__be32starting_index;/* IO */-__be16secondary_index;/* IO */-__be16returned_values;/* O */-__be32detail_rc;/* O, only needed when called via *_norets() */--/*-*O,sizeeachofcounter_valueelementinbytes,onlysetforversion-*>=0x3-*/-__be16cv_element_size;--/* I, 0 (zero) for versions < 0x3 */-__u8counter_info_version_in;--/* O, 0 (zero) if version < 0x3. Must be set to 0 when making hcall */-__u8counter_info_version_out;-__u8reserved[0xC];-__u8counter_value[];-}__packed;-
Hmm, this pretty much guts this header which normally I'd be inclined to suggest
moving the whole thing. The remainder of that header for context:
/*
* counter info version => fw version/reference (spec version)
*
* 8 => power8 (1.07)
* [7 is skipped by spec 1.07]
* 6 => TLBIE (1.07)
* 5 => v7r7m0.phyp (1.05)
* [4 skipped]
* 3 => v7r6m0.phyp (?)
* [1,2 skipped]
* 0 => v7r{2,3,4}m0.phyp (?)
*/
#define COUNTER_INFO_VERSION_CURRENT 0x8
/* capability mask masks. */
enum {
HV_GPCI_CM_GA = (1 << 7),
HV_GPCI_CM_EXPANDED = (1 << 6),
HV_GPCI_CM_LAB = (1 << 5)
};
#define REQUEST_FILE "../hv-gpci-requests.h"
#define NAME_LOWER hv_gpci
#define NAME_UPPER HV_GPCI
#include "req-gen/perf.h"
#undef REQUEST_FILE
#undef NAME_LOWER
#undef NAME_UPPER
The side effect of moving seems that we would have to drag "hv-gpci-requests.h"
along as well. So, maybe its best just moving the struct as you've done so it
can be used by code outside of perf.
-Tyrel
The H_GetPerformanceCounterInfo (GPCI) PHYP hypercall has a subcall,
Affinity_Domain_Info_By_Partition, which returns, among other things,
a "partition affinity score" for a given LPAR. This score, a value on
[0-100], represents the processor-memory affinity for the LPAR in
question. A score of 0 indicates the worst possible affinity while a
score of 100 indicates perfect affinity. The score can be used to
reason about performance.
This patch adds the score for the local LPAR to the lparcfg procfile
under a new 'partition_affinity_score' key.
Signed-off-by: Scott Cheloha <redacted>
I was hoping Michael would chime in the first time around on this patch series
about adding another key/value pair to lparcfg. So, barring a NACK from mpe:
Reviewed-by: Tyrel Datwyler <tyreld@linux.ibm.com>
From: Michael Ellerman <mpe@ellerman.id.au> Date: 2020-08-06 12:58:39
Tyrel Datwyler [off-list ref] writes:
On 7/27/20 11:46 AM, Scott Cheloha wrote:
quoted
The H_GetPerformanceCounterInfo (GPCI) PHYP hypercall has a subcall,
Affinity_Domain_Info_By_Partition, which returns, among other things,
a "partition affinity score" for a given LPAR. This score, a value on
[0-100], represents the processor-memory affinity for the LPAR in
question. A score of 0 indicates the worst possible affinity while a
score of 100 indicates perfect affinity. The score can be used to
reason about performance.
This patch adds the score for the local LPAR to the lparcfg procfile
under a new 'partition_affinity_score' key.
Signed-off-by: Scott Cheloha <redacted>
I was hoping Michael would chime in the first time around on this patch series
about adding another key/value pair to lparcfg.
That guy is so unreliable.
I don't love adding new stuff in lparcfg, but given the file already
exists and there's no prospect of removing it, it's probably not worth
the effort to put the new field anywhere else.
My other query with this was how on earth anyone is meant to interpret
the metric. ie. if my metric is 50, what does that mean? If it's 90
should I worry?
Which makes me realise we have no documentation for lparcfg in the
kernel at all.
So it would be nice to have it mentioned somewhere in Documentation,
even if it just points to the manpage in powerpc-ibm-utils.
cheers
So, barring a NACK from mpe:
Reviewed-by: Tyrel Datwyler <tyreld@linux.ibm.com>
The H_GetPerformanceCounterInfo (GPCI) PHYP hypercall has a subcall,
Affinity_Domain_Info_By_Partition, which returns, among other things,
a "partition affinity score" for a given LPAR. This score, a value on
[0-100], represents the processor-memory affinity for the LPAR in
question. A score of 0 indicates the worst possible affinity while a
score of 100 indicates perfect affinity. The score can be used to
reason about performance.
This patch adds the score for the local LPAR to the lparcfg procfile
under a new 'partition_affinity_score' key.
Signed-off-by: Scott Cheloha <redacted>
I was hoping Michael would chime in the first time around on this patch series
about adding another key/value pair to lparcfg.
That guy is so unreliable.
I don't love adding new stuff in lparcfg, but given the file already
exists and there's no prospect of removing it, it's probably not worth
the effort to put the new field anywhere else.
My other query with this was how on earth anyone is meant to interpret
the metric. ie. if my metric is 50, what does that mean? If it's 90
should I worry?
Here's some more background.
This interface is just passing up what the platform provides, and it's
identical to the partition affinity score described in the documentation
for the management console's lsmemopt command:
https://www.ibm.com/support/knowledgecenter/POWER9/p9edm/lsmemopt.html
The score is 0-100, higher values are better. To illustrate: I believe a
partition's score will be 100 (or very close to it) if all of its CPUs
and memory reside within one node. It will be lower than that when a
partition has some memory without local CPUs, and lower still when there
is no CPU-memory affinity within the partition. Beyond that I don't have
more specific information and the algorithm and scale are set by the
platform.
The intent is for this to be a metric to gather during problem
determination e.g. via sosreport or similar, but as far as Linux is
concerned this should be treated as an opaque value.
The H_GetPerformanceCounterInfo (GPCI) PHYP hypercall has a subcall,
Affinity_Domain_Info_By_Partition, which returns, among other things,
a "partition affinity score" for a given LPAR. This score, a value on
[0-100], represents the processor-memory affinity for the LPAR in
question. A score of 0 indicates the worst possible affinity while a
score of 100 indicates perfect affinity. The score can be used to
reason about performance.
This patch adds the score for the local LPAR to the lparcfg procfile
under a new 'partition_affinity_score' key.
Signed-off-by: Scott Cheloha <redacted>
---
arch/powerpc/platforms/pseries/lparcfg.c | 35 ++++++++++++++++++++++++
1 file changed, 35 insertions(+)
The H_GetPerformanceCounterInfo (GPCI) hypercall input/output structs are
useful to modules outside of perf/, so move them into asm/hvcall.h to live
alongside the other powerpc hypercall structs.
Leave the perf-specific GPCI stuff in perf/hv-gpci.h.
Signed-off-by: Scott Cheloha <redacted>
From: Michael Ellerman <hidden> Date: 2020-09-09 13:33:11
On Mon, 27 Jul 2020 13:46:04 -0500, Scott Cheloha wrote:
The H_GetPerformanceCounterInfo (GPCI) hypercall input/output structs are
useful to modules outside of perf/, so move them into asm/hvcall.h to live
alongside the other powerpc hypercall structs.
Leave the perf-specific GPCI stuff in perf/hv-gpci.h.