diff mbox series

[net] mlx5: avoid 64-bit division in dr_icm_pool_mr_create()

Message ID 20191002121241.D74DAE04C7@unicorn.suse.cz
State Accepted
Delegated to: David Miller
Headers show
Series [net] mlx5: avoid 64-bit division in dr_icm_pool_mr_create() | expand

Commit Message

Michal Kubecek Oct. 2, 2019, 12:12 p.m. UTC
Recently added code introduces 64-bit division in dr_icm_pool_mr_create()
so that build on 32-bit architectures fails with

  ERROR: "__umoddi3" [drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.ko] undefined!

As the divisor is always a power of 2, we can use bitwise operation
instead.

Fixes: 29cf8febd185 ("net/mlx5: DR, ICM pool memory allocator")
Reported-by: Borislav Petkov <bp@alien8.de>
Signed-off-by: Michal Kubecek <mkubecek@suse.cz>
---
 drivers/net/ethernet/mellanox/mlx5/core/steering/dr_icm_pool.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

Alex Vesker Oct. 2, 2019, 2:58 p.m. UTC | #1
On 10/2/2019 3:12 PM, Michal Kubecek wrote:
> Recently added code introduces 64-bit division in dr_icm_pool_mr_create()
> so that build on 32-bit architectures fails with
>
>    ERROR: "__umoddi3" [drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.ko] undefined!
>
> As the divisor is always a power of 2, we can use bitwise operation
> instead.
>
> Fixes: 29cf8febd185 ("net/mlx5: DR, ICM pool memory allocator")
> Reported-by: Borislav Petkov <bp@alien8.de>
> Signed-off-by: Michal Kubecek <mkubecek@suse.cz>
> ---
>   drivers/net/ethernet/mellanox/mlx5/core/steering/dr_icm_pool.c | 3 ++-
>   1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_icm_pool.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_icm_pool.c
> index 913f1e5aaaf2..d7c7467e2d53 100644
> --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_icm_pool.c
> +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_icm_pool.c
> @@ -137,7 +137,8 @@ dr_icm_pool_mr_create(struct mlx5dr_icm_pool *pool,
>   
>   	icm_mr->icm_start_addr = icm_mr->dm.addr;
>   
> -	align_diff = icm_mr->icm_start_addr % align_base;
> +	/* align_base is always a power of 2 */
> +	align_diff = icm_mr->icm_start_addr & (align_base - 1);
>   	if (align_diff)
>   		icm_mr->used_length = align_base - align_diff;
>   

Align diff is power of 2,  looks good to me.
Thanks for fixing it Michal.
David Miller Oct. 2, 2019, 3:08 p.m. UTC | #2
From: Alex Vesker <valex@mellanox.com>
Date: Wed, 2 Oct 2019 14:58:44 +0000

> On 10/2/2019 3:12 PM, Michal Kubecek wrote:
>> Recently added code introduces 64-bit division in dr_icm_pool_mr_create()
>> so that build on 32-bit architectures fails with
>>
>>    ERROR: "__umoddi3" [drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.ko] undefined!
>>
>> As the divisor is always a power of 2, we can use bitwise operation
>> instead.
>>
>> Fixes: 29cf8febd185 ("net/mlx5: DR, ICM pool memory allocator")
>> Reported-by: Borislav Petkov <bp@alien8.de>
>> Signed-off-by: Michal Kubecek <mkubecek@suse.cz>
 ...
> Align diff is power of 2,  looks good to me.
> Thanks for fixing it Michal.

I'll just apply this directly, thanks everyone.
diff mbox series

Patch

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_icm_pool.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_icm_pool.c
index 913f1e5aaaf2..d7c7467e2d53 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_icm_pool.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_icm_pool.c
@@ -137,7 +137,8 @@  dr_icm_pool_mr_create(struct mlx5dr_icm_pool *pool,
 
 	icm_mr->icm_start_addr = icm_mr->dm.addr;
 
-	align_diff = icm_mr->icm_start_addr % align_base;
+	/* align_base is always a power of 2 */
+	align_diff = icm_mr->icm_start_addr & (align_base - 1);
 	if (align_diff)
 		icm_mr->used_length = align_base - align_diff;