From: xufuhai <xufuhai1992@gmail.com>
To: linux@dominikbrodowski.net, sherry.hurwitz@amd.com,
trenn@suse.com, linux-pm@vger.kernel.org, rrichter@amd.com,
nathan.fontenot@amd.com, bp@suse.de, latha@linux.vnet.ibm.com,
linux-kernel@vger.kernel.org
Cc: lishujin@kuaishou.com
Subject: Re: [PATCH 1/2] cpupower: fix amd cpu (family < 0x17) active state issue
Date: Mon, 29 Mar 2021 11:51:18 +0800 [thread overview]
Message-ID: <61bffd2d-dd37-d1e7-2b19-96d066e10397@gmail.com> (raw)
In-Reply-To: <35ab0d0a-f9ce-b4d7-cd85-3cd8a8638ab6@gmail.com>
yeah Shuah~ thanks for your reply
For this issue, not meaning "current CPU frequency" but "boost state support--->Active" during
"cpupower frequency-info" command as below:
boost state support:
Supported: yes
Active: yes/no
I think the state returned from the command for amd cpu (family < 0x17) should be like as below:
as non-root Active state:
Active: Error while evaluating Boost Capabilities on CPU xx -- are you root?
as root Active state:
Active: yes (if supported)
no (if not supprted)
I don't wanna see the state returned like below:
as non-root Active state:
Active: yes
as root Active state:
Active: yes (if supported)
no (if not supprted)
I will paste the related code by detailed for showing the issue:
if amd cpu family < 0x17 , will run amd_pci_get_num_boost_states function:
-----------------------------------------------------
/linux/tools/power/cpupower/utils/helper/misc.c
if (cpupower_cpu_info.caps & CPUPOWER_CAP_AMD_CPB) {
*support = 1;
/* AMD Family 0x17 does not utilize PCI D18F4 like prior
* families and has no fixed discrete boost states but
* has Hardware determined variable increments instead.
*/
if (cpupower_cpu_info.caps & CPUPOWER_CAP_AMD_CPB_MSR) {
if (!read_msr(cpu, MSR_AMD_HWCR, &val)) {
if (!(val & CPUPOWER_AMD_CPBDIS))
*active = 1;
}
} else {
ret = amd_pci_get_num_boost_states(active, states);
if (ret)
return ret;
}
---------------------------------------------------
/linux/tools/power/cpupower/utils/helper/amd.c
amd_pci_get_num_boost_states:
val = pci_read_byte(device, 0x15c);
if (val & 3)
*active = 1;
else
----------------------------------------------------
pci_read_byte will memset val to 0xff if caller has no permission to access to read from pci_dev
but for amd_pci_get_num_boost_states, active state will set 1 meaning "yes". I believe that active
state should return negative value to caller function meaning "have no permission" will showing "
Error while evaluating Boost Capabilities on CPU xx -- are you root?"
----------------------------------------------------
static inline void
pci_read_data(struct pci_dev *d, void *buf, int pos, int len)
{
if (pos & (len-1))
d->access->error("Unaligned read: pos=%02x, len=%d", pos, len);
if (pos + len <= d->cache_len)
memcpy(buf, d->cache + pos, len);
else if (!d->methods->read(d, pos, buf, len))
memset(buf, 0xff, len);
}
byte
pci_read_byte(struct pci_dev *d, int pos)
{
byte buf;
pci_read_data(d, &buf, pos, 1);
return buf;
}
----------------------------------------------------
在 2021/3/24 下午6:27, xufuhai 写道:
> From: xufuhai <xufuhai@kuaishou.com>
>
> For the old AMD processor (family < 0x17), cpupower will call the
> amd_pci_get_num_boost_states function, but for the non-root user
> pci_read_byte function (implementation comes from the psutil library),
> val will be set to 0xff, indicating that there is no read function
> callback. At this time, the original logic will set the cpupower turbo
> active state to yes. This is an obvious issue~
>
> Reproduce procedure:
> cpupower frequency-info
>
> Signed-off-by: xufuhai <xufuhai@kuaishou.com>
> Signed-off-by: chenguanqiao <chenguanqiao@kuaishou.com>
> Signed-off-by: lishujin <lishujin@kuaishou.com>
> ---
> tools/power/cpupower/utils/helpers/amd.c | 7 +++++++
> 1 file changed, 7 insertions(+)
>
> diff --git a/tools/power/cpupower/utils/helpers/amd.c b/tools/power/cpupower/utils/helpers/amd.c
> index 97f2c857048e..6f9504906afa 100644
> --- a/tools/power/cpupower/utils/helpers/amd.c
> +++ b/tools/power/cpupower/utils/helpers/amd.c
> @@ -137,6 +137,13 @@ int amd_pci_get_num_boost_states(int *active, int *states)
> return -ENODEV;
>
> val = pci_read_byte(device, 0x15c);
> +
> + /* If val is 0xff, meaning has no permisson to
> + * get the boost states, return -1
> + */
> + if (val == 0xff)
> + return -1;
> +
> if (val & 3)
> *active = 1;
> else
>
next prev parent reply other threads:[~2021-03-29 3:52 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-24 10:27 [PATCH 1/2] cpupower: fix amd cpu (family < 0x17) active state issue xufuhai
2021-03-26 20:13 ` Shuah Khan
2021-03-29 3:51 ` xufuhai [this message]
[not found] <20210324082838.41462-1-xufuhai1992@gmail.com>
2021-03-29 11:10 ` Thomas Renninger
2021-03-30 3:47 ` xufuhai
2021-04-08 2:22 ` xufuhai
[not found] <bf312780-dda7-d08f-6098-1d8a7d4044e4@gmail.com>
[not found] ` <378e58d3-5300-1179-44bb-bc2b42a3beb0@gmail.com>
2021-04-23 22:26 ` [PATCH 1/2] cpupower: Fix " Shuah Khan
2021-04-25 2:41 ` 徐福海
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=61bffd2d-dd37-d1e7-2b19-96d066e10397@gmail.com \
--to=xufuhai1992@gmail.com \
--cc=bp@suse.de \
--cc=latha@linux.vnet.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux@dominikbrodowski.net \
--cc=lishujin@kuaishou.com \
--cc=nathan.fontenot@amd.com \
--cc=rrichter@amd.com \
--cc=sherry.hurwitz@amd.com \
--cc=trenn@suse.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).