diff mbox series

[1/2] cpupower: fix amd cpu (family < 0x17) active state issue

Message ID 35ab0d0a-f9ce-b4d7-cd85-3cd8a8638ab6@gmail.com
State New
Headers show
Series [1/2] cpupower: fix amd cpu (family < 0x17) active state issue | expand

Commit Message

徐福海 March 24, 2021, 10:27 a.m. UTC
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(+)

Comments

Shuah Khan March 26, 2021, 8:13 p.m. UTC | #1
On 3/24/21 4:27 AM, xufuhai wrote:
> 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~

> 


Please run get_maintainer.pl and send patch maintainers
and others suggested by the tool. I don't see this in my
Inbox for me to review/accept and send it to pm maintainer.

Hmm. I am seeing on my AMD

as non-root
current CPU frequency: Unable to call hardware

as root
current CPU frequency: 3.60 GHz (asserted by call to hardware)

Are you sure this change is necessary?

Please give me more information on this fix.


> 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


Typo: permisson. Reads better as "0xff indicates user
doesn't have permission to read boot states"

> +	 * get the boost states, return -1

> +	 */

> +	if (val == 0xff)

> +		return -1;

> +

>   	if (val & 3)

>   		*active = 1;

>   	else

> 


thanks,
-- Shuah
徐福海 March 29, 2021, 3:51 a.m. UTC | #2
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

>
diff mbox series

Patch

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