2019-09-30 14:17:12

by Borislav Petkov

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

Hi!

JFYI,

I'm seeing this on i386 allyesconfig builds of current Linus master:

ERROR: "__umoddi3" [drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.ko] undefined!
make[1]: *** [__modpost] Error 1
make: *** [modules] Error 2

--
Regards/Gruss,
Boris.

https://people.kernel.org/tglx/notes-about-netiquette


2019-09-30 15:47:32

by Michal Kubecek

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

On Mon, Sep 30, 2019 at 04:13:17PM +0200, Borislav Petkov wrote:
> I'm seeing this on i386 allyesconfig builds of current Linus master:
>
> ERROR: "__umoddi3" [drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.ko] undefined!
> make[1]: *** [__modpost] Error 1
> make: *** [modules] Error 2

This is usually result of dividing (or modulo) by a 64-bit integer. Can
you identify where (file and line number) is the __umoddi3() call
generated?

Michal

2019-09-30 16:30:07

by Borislav Petkov

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

On Mon, Sep 30, 2019 at 05:45:35PM +0200, Michal Kubecek wrote:
> On Mon, Sep 30, 2019 at 04:13:17PM +0200, Borislav Petkov wrote:
> > I'm seeing this on i386 allyesconfig builds of current Linus master:
> >
> > ERROR: "__umoddi3" [drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.ko] undefined!
> > make[1]: *** [__modpost] Error 1
> > make: *** [modules] Error 2
>
> This is usually result of dividing (or modulo) by a 64-bit integer. Can
> you identify where (file and line number) is the __umoddi3() call
> generated?

Did another 32-bit allyesconfig build. It said:

ld: drivers/net/ethernet/mellanox/mlx5/core/steering/dr_icm_pool.o: in function `mlx5dr_icm_alloc_chunk':
dr_icm_pool.c:(.text+0x733): undefined reference to `__umoddi3'
make: *** [vmlinux] Error 1

The .s file then points to the exact location:

# drivers/net/ethernet/mellanox/mlx5/core/steering/dr_icm_pool.c:140: align_diff = icm_mr->icm_start_addr % align_base;
pushl %ebx # align_base
pushl %ecx # align_base
call __umoddi3 #
popl %edx #
popl %ecx #

HTH.

--
Regards/Gruss,
Boris.

https://people.kernel.org/tglx/notes-about-netiquette

2019-09-30 20:41:45

by Stephen Hemminger

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

On Mon, 30 Sep 2019 18:29:10 +0200
Borislav Petkov <[email protected]> wrote:

> On Mon, Sep 30, 2019 at 05:45:35PM +0200, Michal Kubecek wrote:
> > On Mon, Sep 30, 2019 at 04:13:17PM +0200, Borislav Petkov wrote:
> > > I'm seeing this on i386 allyesconfig builds of current Linus master:
> > >
> > > ERROR: "__umoddi3" [drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.ko] undefined!
> > > make[1]: *** [__modpost] Error 1
> > > make: *** [modules] Error 2
> >
> > This is usually result of dividing (or modulo) by a 64-bit integer. Can
> > you identify where (file and line number) is the __umoddi3() call
> > generated?
>
> Did another 32-bit allyesconfig build. It said:
>
> ld: drivers/net/ethernet/mellanox/mlx5/core/steering/dr_icm_pool.o: in function `mlx5dr_icm_alloc_chunk':
> dr_icm_pool.c:(.text+0x733): undefined reference to `__umoddi3'
> make: *** [vmlinux] Error 1
>
> The .s file then points to the exact location:
>
> # drivers/net/ethernet/mellanox/mlx5/core/steering/dr_icm_pool.c:140: align_diff = icm_mr->icm_start_addr % align_base;
> pushl %ebx # align_base
> pushl %ecx # align_base
> call __umoddi3 #
> popl %edx #
> popl %ecx #
>
> HTH.
>

Could also us div_u64_rem here?

2019-09-30 20:43:41

by Stephen Hemminger

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

On Mon, 30 Sep 2019 18:29:10 +0200
Borislav Petkov <[email protected]> wrote:

> On Mon, Sep 30, 2019 at 05:45:35PM +0200, Michal Kubecek wrote:
> > On Mon, Sep 30, 2019 at 04:13:17PM +0200, Borislav Petkov wrote:
> > > I'm seeing this on i386 allyesconfig builds of current Linus master:
> > >
> > > ERROR: "__umoddi3" [drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.ko] undefined!
> > > make[1]: *** [__modpost] Error 1
> > > make: *** [modules] Error 2
> >
> > This is usually result of dividing (or modulo) by a 64-bit integer. Can
> > you identify where (file and line number) is the __umoddi3() call
> > generated?
>
> Did another 32-bit allyesconfig build. It said:
>
> ld: drivers/net/ethernet/mellanox/mlx5/core/steering/dr_icm_pool.o: in function `mlx5dr_icm_alloc_chunk':
> dr_icm_pool.c:(.text+0x733): undefined reference to `__umoddi3'
> make: *** [vmlinux] Error 1
>
> The .s file then points to the exact location:
>
> # drivers/net/ethernet/mellanox/mlx5/core/steering/dr_icm_pool.c:140: align_diff = icm_mr->icm_start_addr % align_base;
> pushl %ebx # align_base
> pushl %ecx # align_base
> call __umoddi3 #
> popl %edx #
> popl %ecx #

Since align_base is a power of 2 masking should work as well.

2019-09-30 21:12:54

by Borislav Petkov

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

On Mon, Sep 30, 2019 at 09:55:16AM -0700, Stephen Hemminger wrote:
> Could also us div_u64_rem here?

Yah, the below seems to work and the resulting asm looks sensible to me
but someone should definitely double-check me as I don't know this code
at all.

Thx.

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..b4302658e5f8 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,7 @@ 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;
+ div_u64_rem(icm_mr->icm_start_addr, align_base, &align_diff);
if (align_diff)
icm_mr->used_length = align_base - align_diff;


--
Regards/Gruss,
Boris.

https://people.kernel.org/tglx/notes-about-netiquette

2019-10-01 15:18:21

by Michal Kubecek

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

On Mon, Sep 30, 2019 at 08:40:31PM +0200, Borislav Petkov wrote:
> On Mon, Sep 30, 2019 at 09:55:16AM -0700, Stephen Hemminger wrote:
> > Could also us div_u64_rem here?
>
> Yah, the below seems to work and the resulting asm looks sensible to me
> but someone should definitely double-check me as I don't know this code
> at all.
>
> Thx.
>
> 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..b4302658e5f8 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,7 @@ 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;
> + div_u64_rem(icm_mr->icm_start_addr, align_base, &align_diff);
> if (align_diff)
> icm_mr->used_length = align_base - align_diff;
>
>

While this fixes 32-bit builds, it breaks 64-bit ones as align_diff is
64-bit and div_u64_rem expects pointer to u32. :-(

I checked that align_base is always a power of two so that we could get
away with

align_diff = icm_mr->icm_start_addr & (align_base - 1)

I'm not sure, however, if it's safe to assume align_base will always
have to be a power of two or if we should add a check for safety.

(Cc-ing also author of commit 29cf8febd185 ("net/mlx5: DR, ICM pool
memory allocator").)

Michal

2019-10-16 03:43:51

by Saeed Mahameed

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

On Tue, 2019-10-01 at 17:14 +0200, Michal Kubecek wrote:
> On Mon, Sep 30, 2019 at 08:40:31PM +0200, Borislav Petkov wrote:
> > On Mon, Sep 30, 2019 at 09:55:16AM -0700, Stephen Hemminger wrote:
> > > Could also us div_u64_rem here?
> >
> > Yah, the below seems to work and the resulting asm looks sensible
> > to me
> > but someone should definitely double-check me as I don't know this
> > code
> > at all.
> >
> > Thx.
> >
> > 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..b4302658e5f8 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,7 @@ 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;
> > + div_u64_rem(icm_mr->icm_start_addr, align_base, &align_diff);
> > if (align_diff)
> > icm_mr->used_length = align_base - align_diff;
> >
> >
>
> While this fixes 32-bit builds, it breaks 64-bit ones as align_diff
> is
> 64-bit and div_u64_rem expects pointer to u32. :-(
>
> I checked that align_base is always a power of two so that we could
> get
> away with
>
> align_diff = icm_mr->icm_start_addr & (align_base - 1)
>
> I'm not sure, however, if it's safe to assume align_base will always
> have to be a power of two or if we should add a check for safety.
>
> (Cc-ing also author of commit 29cf8febd185 ("net/mlx5: DR, ICM pool
> memory allocator").)
>

Thanks everyone for your input on this, Alex will take care of this and
we will submit a patch ..


> Michal

2019-10-16 03:53:06

by Saeed Mahameed

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

On Tue, 2019-10-15 at 20:29 +0000, Saeed Mahameed wrote:
> On Tue, 2019-10-01 at 17:14 +0200, Michal Kubecek wrote:
> > On Mon, Sep 30, 2019 at 08:40:31PM +0200, Borislav Petkov wrote:
> > > On Mon, Sep 30, 2019 at 09:55:16AM -0700, Stephen Hemminger
> > > wrote:
> > > > Could also us div_u64_rem here?
> > >
> > > Yah, the below seems to work and the resulting asm looks sensible
> > > to me
> > > but someone should definitely double-check me as I don't know
> > > this
> > > code
> > > at all.
> > >
> > > Thx.
> > >
> > > 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..b4302658e5f8 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,7 @@ 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;
> > > + div_u64_rem(icm_mr->icm_start_addr, align_base, &align_diff);
> > > if (align_diff)
> > > icm_mr->used_length = align_base - align_diff;
> > >
> > >
> >
> > While this fixes 32-bit builds, it breaks 64-bit ones as align_diff
> > is
> > 64-bit and div_u64_rem expects pointer to u32. :-(
> >
> > I checked that align_base is always a power of two so that we could
> > get
> > away with
> >
> > align_diff = icm_mr->icm_start_addr & (align_base - 1)
> >
> > I'm not sure, however, if it's safe to assume align_base will
> > always
> > have to be a power of two or if we should add a check for safety.
> >
> > (Cc-ing also author of commit 29cf8febd185 ("net/mlx5: DR, ICM pool
> > memory allocator").)
> >
>
> Thanks everyone for your input on this, Alex will take care of this
> and
> we will submit a patch ..
>

Please disregard, i see this was fixed in
"[net] mlx5: avoid 64-bit division in dr_icm_pool_mr_create()"

Just came back from a long vacation, got a lot of catching up to do
:)..