diff options
| author | Tom Herbert <tom@herbertland.com> | 2016-10-11 21:57:10 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2016-10-13 10:13:24 -0400 |
| commit | b8a4ddb2e8f44f872fb93bbda2d541b27079fd2b (patch) | |
| tree | 005a5bc1845c1d1be6c34096db67640a1128d15f /include/linux/mlx5 | |
| parent | 9a765881bf3dcd32847d7108cf48cb04a4ed993f (diff) | |
net/mlx5: Add MLX5_ARRAY_SET64 to fix BUILD_BUG_ON
I am hitting this in mlx5:
drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c: In function
reclaim_pages_cmd.clone.0:
drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c:346: error: call
to __compiletime_assert_346 declared with attribute error:
BUILD_BUG_ON failed: __mlx5_bit_off(manage_pages_out, pas[i]) % 64
drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c: In function give_pages:
drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c:291: error: call
to __compiletime_assert_291 declared with attribute error:
BUILD_BUG_ON failed: __mlx5_bit_off(manage_pages_in, pas[i]) % 64
Problem is that this is doing a BUILD_BUG_ON on a non-constant
expression because of trying to take offset of pas[i] in the
structure.
Fix is to create MLX5_ARRAY_SET64 that takes an additional argument
that is the field index to separate between BUILD_BUG_ON on the array
constant field and the indexed field to assign the value to.
There are two callers of MLX5_SET64 that are trying to get a variable
offset, change those to call MLX5_ARRAY_SET64 passing 'pas' and 'i'
as the arguments to use in the offset check and the indexed value
assignment.
Fixes: a533ed5e179cd ("net/mlx5: Pages management commands via mlx5 ifc")
Signed-off-by: Tom Herbert <tom@herbertland.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/linux/mlx5')
| -rw-r--r-- | include/linux/mlx5/device.h | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/include/linux/mlx5/device.h b/include/linux/mlx5/device.h index 77c141797152..58276144ba81 100644 --- a/include/linux/mlx5/device.h +++ b/include/linux/mlx5/device.h | |||
| @@ -92,12 +92,21 @@ __mlx5_mask(typ, fld)) | |||
| 92 | ___t; \ | 92 | ___t; \ |
| 93 | }) | 93 | }) |
| 94 | 94 | ||
| 95 | #define MLX5_SET64(typ, p, fld, v) do { \ | 95 | #define __MLX5_SET64(typ, p, fld, v) do { \ |
| 96 | BUILD_BUG_ON(__mlx5_bit_sz(typ, fld) != 64); \ | 96 | BUILD_BUG_ON(__mlx5_bit_sz(typ, fld) != 64); \ |
| 97 | BUILD_BUG_ON(__mlx5_bit_off(typ, fld) % 64); \ | ||
| 98 | *((__be64 *)(p) + __mlx5_64_off(typ, fld)) = cpu_to_be64(v); \ | 97 | *((__be64 *)(p) + __mlx5_64_off(typ, fld)) = cpu_to_be64(v); \ |
| 99 | } while (0) | 98 | } while (0) |
| 100 | 99 | ||
| 100 | #define MLX5_SET64(typ, p, fld, v) do { \ | ||
| 101 | BUILD_BUG_ON(__mlx5_bit_off(typ, fld) % 64); \ | ||
| 102 | __MLX5_SET64(typ, p, fld, v); \ | ||
| 103 | } while (0) | ||
| 104 | |||
| 105 | #define MLX5_ARRAY_SET64(typ, p, fld, idx, v) do { \ | ||
| 106 | BUILD_BUG_ON(__mlx5_bit_off(typ, fld) % 64); \ | ||
| 107 | __MLX5_SET64(typ, p, fld[idx], v); \ | ||
| 108 | } while (0) | ||
| 109 | |||
| 101 | #define MLX5_GET64(typ, p, fld) be64_to_cpu(*((__be64 *)(p) + __mlx5_64_off(typ, fld))) | 110 | #define MLX5_GET64(typ, p, fld) be64_to_cpu(*((__be64 *)(p) + __mlx5_64_off(typ, fld))) |
| 102 | 111 | ||
| 103 | #define MLX5_GET64_PR(typ, p, fld) ({ \ | 112 | #define MLX5_GET64_PR(typ, p, fld) ({ \ |
