linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] powercap/drivers/dtpm: Fix __udivdi3 and __aeabi_uldivmod unresolved symbols
       [not found] <CAJZ5v0gN3NfWyAHA7At=1ZG90vCJbDoUzF5ts2_t3GmunSbrMQ@mail.gmail.com>
@ 2020-12-30 15:37 ` Daniel Lezcano
  2020-12-30 18:09   ` Rafael J. Wysocki
  2021-01-04  8:18   ` Geert Uytterhoeven
  0 siblings, 2 replies; 4+ messages in thread
From: Daniel Lezcano @ 2020-12-30 15:37 UTC (permalink / raw)
  To: rafael
  Cc: linux-pm, linux-acpi, kernel test robot, Rafael J. Wysocki, open list

32 bits architectures do not support u64 division, so the macro
DIV_ROUND_CLOSEST is not adequate as the compiler will replace the
call to an unexisting function for the platform, leading to an
unresolved symbols.

Fix this by using the compatible macros:

DIV64_U64_ROUND_CLOSEST and DIV_ROUND_CLOSEST_ULL.

Reported-by: kernel test robot <lkp@intel.com>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
 drivers/powercap/dtpm.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/powercap/dtpm.c b/drivers/powercap/dtpm.c
index 5b6857e9b064..0abcc439d728 100644
--- a/drivers/powercap/dtpm.c
+++ b/drivers/powercap/dtpm.c
@@ -99,8 +99,8 @@ static void __dtpm_rebalance_weight(struct dtpm *dtpm)
 		pr_debug("Setting weight '%d' for '%s'\n",
 			 child->weight, child->zone.name);
 
-		child->weight = DIV_ROUND_CLOSEST(child->power_max * 1024,
-						  dtpm->power_max);
+		child->weight = DIV64_U64_ROUND_CLOSEST(
+			child->power_max * 1024, dtpm->power_max);
 
 		__dtpm_rebalance_weight(child);
 	}
@@ -272,7 +272,7 @@ static int __set_power_limit_uw(struct dtpm *dtpm, int cid, u64 power_limit)
 			} else if (power_limit == dtpm->power_min) {
 				power = child->power_min;
 			} else {
-				power = DIV_ROUND_CLOSEST(
+				power = DIV_ROUND_CLOSEST_ULL(
 					power_limit * child->weight, 1024);
 			}
 
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] powercap/drivers/dtpm: Fix __udivdi3 and __aeabi_uldivmod unresolved symbols
  2020-12-30 15:37 ` [PATCH] powercap/drivers/dtpm: Fix __udivdi3 and __aeabi_uldivmod unresolved symbols Daniel Lezcano
@ 2020-12-30 18:09   ` Rafael J. Wysocki
  2021-01-04  8:18   ` Geert Uytterhoeven
  1 sibling, 0 replies; 4+ messages in thread
From: Rafael J. Wysocki @ 2020-12-30 18:09 UTC (permalink / raw)
  To: Daniel Lezcano
  Cc: Rafael J. Wysocki, Linux PM, ACPI Devel Maling List,
	kernel test robot, Rafael J. Wysocki, open list

On Wed, Dec 30, 2020 at 4:38 PM Daniel Lezcano
<daniel.lezcano@linaro.org> wrote:
>
> 32 bits architectures do not support u64 division, so the macro
> DIV_ROUND_CLOSEST is not adequate as the compiler will replace the
> call to an unexisting function for the platform, leading to an
> unresolved symbols.
>
> Fix this by using the compatible macros:
>
> DIV64_U64_ROUND_CLOSEST and DIV_ROUND_CLOSEST_ULL.
>
> Reported-by: kernel test robot <lkp@intel.com>
> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>

Applied and pushed into the linux-next branch, thanks!

> ---
>  drivers/powercap/dtpm.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/powercap/dtpm.c b/drivers/powercap/dtpm.c
> index 5b6857e9b064..0abcc439d728 100644
> --- a/drivers/powercap/dtpm.c
> +++ b/drivers/powercap/dtpm.c
> @@ -99,8 +99,8 @@ static void __dtpm_rebalance_weight(struct dtpm *dtpm)
>                 pr_debug("Setting weight '%d' for '%s'\n",
>                          child->weight, child->zone.name);
>
> -               child->weight = DIV_ROUND_CLOSEST(child->power_max * 1024,
> -                                                 dtpm->power_max);
> +               child->weight = DIV64_U64_ROUND_CLOSEST(
> +                       child->power_max * 1024, dtpm->power_max);
>
>                 __dtpm_rebalance_weight(child);
>         }
> @@ -272,7 +272,7 @@ static int __set_power_limit_uw(struct dtpm *dtpm, int cid, u64 power_limit)
>                         } else if (power_limit == dtpm->power_min) {
>                                 power = child->power_min;
>                         } else {
> -                               power = DIV_ROUND_CLOSEST(
> +                               power = DIV_ROUND_CLOSEST_ULL(
>                                         power_limit * child->weight, 1024);
>                         }
>
> --
> 2.17.1
>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] powercap/drivers/dtpm: Fix __udivdi3 and __aeabi_uldivmod unresolved symbols
  2020-12-30 15:37 ` [PATCH] powercap/drivers/dtpm: Fix __udivdi3 and __aeabi_uldivmod unresolved symbols Daniel Lezcano
  2020-12-30 18:09   ` Rafael J. Wysocki
@ 2021-01-04  8:18   ` Geert Uytterhoeven
  2021-01-04 11:20     ` Daniel Lezcano
  1 sibling, 1 reply; 4+ messages in thread
From: Geert Uytterhoeven @ 2021-01-04  8:18 UTC (permalink / raw)
  To: Daniel Lezcano
  Cc: Rafael J. Wysocki, Linux PM list, ACPI Devel Maling List,
	kernel test robot, Rafael J. Wysocki, open list

Hi Daniel,

On Wed, Dec 30, 2020 at 4:39 PM Daniel Lezcano
<daniel.lezcano@linaro.org> wrote:
> 32 bits architectures do not support u64 division, so the macro
> DIV_ROUND_CLOSEST is not adequate as the compiler will replace the
> call to an unexisting function for the platform, leading to an
> unresolved symbols.
>
> Fix this by using the compatible macros:
>
> DIV64_U64_ROUND_CLOSEST and DIV_ROUND_CLOSEST_ULL.
>
> Reported-by: kernel test robot <lkp@intel.com>
> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>

Thanks for your patch!

> --- a/drivers/powercap/dtpm.c
> +++ b/drivers/powercap/dtpm.c
> @@ -99,8 +99,8 @@ static void __dtpm_rebalance_weight(struct dtpm *dtpm)
>                 pr_debug("Setting weight '%d' for '%s'\n",
>                          child->weight, child->zone.name);
>
> -               child->weight = DIV_ROUND_CLOSEST(child->power_max * 1024,
> -                                                 dtpm->power_max);
> +               child->weight = DIV64_U64_ROUND_CLOSEST(
> +                       child->power_max * 1024, dtpm->power_max);

Note that 64-by-64 divisions are expensive on 32-bit platforms.

Does dtpm.power_max need to be u64?
The (lack of) documentation for the dtpm structure does not say what is
being stored there.

Gr{oetje,eeting}s,

                        Geert

-- 
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] powercap/drivers/dtpm: Fix __udivdi3 and __aeabi_uldivmod unresolved symbols
  2021-01-04  8:18   ` Geert Uytterhoeven
@ 2021-01-04 11:20     ` Daniel Lezcano
  0 siblings, 0 replies; 4+ messages in thread
From: Daniel Lezcano @ 2021-01-04 11:20 UTC (permalink / raw)
  To: Geert Uytterhoeven
  Cc: Rafael J. Wysocki, Linux PM list, ACPI Devel Maling List,
	kernel test robot, Rafael J. Wysocki, open list


Hi Geert,


On 04/01/2021 09:18, Geert Uytterhoeven wrote:
> Hi Daniel,
> 
> On Wed, Dec 30, 2020 at 4:39 PM Daniel Lezcano
> <daniel.lezcano@linaro.org> wrote:
>> 32 bits architectures do not support u64 division, so the macro
>> DIV_ROUND_CLOSEST is not adequate as the compiler will replace the
>> call to an unexisting function for the platform, leading to an
>> unresolved symbols.
>>
>> Fix this by using the compatible macros:
>>
>> DIV64_U64_ROUND_CLOSEST and DIV_ROUND_CLOSEST_ULL.
>>
>> Reported-by: kernel test robot <lkp@intel.com>
>> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
> 
> Thanks for your patch!
> 
>> --- a/drivers/powercap/dtpm.c
>> +++ b/drivers/powercap/dtpm.c
>> @@ -99,8 +99,8 @@ static void __dtpm_rebalance_weight(struct dtpm *dtpm)
>>                 pr_debug("Setting weight '%d' for '%s'\n",
>>                          child->weight, child->zone.name);
>>
>> -               child->weight = DIV_ROUND_CLOSEST(child->power_max * 1024,
>> -                                                 dtpm->power_max);
>> +               child->weight = DIV64_U64_ROUND_CLOSEST(
>> +                       child->power_max * 1024, dtpm->power_max);
> 
> Note that 64-by-64 divisions are expensive on 32-bit platforms.
> 
> Does dtpm.power_max need to be u64?

The dtpm is based on the powercap framework which deals with microwatts
and the functions are expecting u64 values.

The division here happens when there is an update of the dtpm tree which
occurs rarely (at boot time or hotplug).

As the power model is in the vast majority on 64b platforms, the effort
to optimize to u32 sounds not worth, especially that the 32b platforms
supporting the energy model are now obsolete.

> The (lack of) documentation for the dtpm structure does not say what is
> being stored there.
> 
> Gr{oetje,eeting}s,
> 
>                         Geert
> 


-- 
<http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs

Follow Linaro:  <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2021-01-04 11:21 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <CAJZ5v0gN3NfWyAHA7At=1ZG90vCJbDoUzF5ts2_t3GmunSbrMQ@mail.gmail.com>
2020-12-30 15:37 ` [PATCH] powercap/drivers/dtpm: Fix __udivdi3 and __aeabi_uldivmod unresolved symbols Daniel Lezcano
2020-12-30 18:09   ` Rafael J. Wysocki
2021-01-04  8:18   ` Geert Uytterhoeven
2021-01-04 11:20     ` Daniel Lezcano

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).