Skip to content

Commit b47bd6e

Browse files
Daniel Jurgensdavem330
authored andcommitted
{net, ib}/mlx5: Make cache line size determination at runtime.
ARM 64B cache line systems have L1_CACHE_BYTES set to 128. cache_line_size() will return the correct size. Fixes: cf50b5e('net/mlx5_core/ib: New device capabilities handling.') Signed-off-by: Daniel Jurgens <[email protected]> Signed-off-by: Saeed Mahameed <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent bf911e9 commit b47bd6e

File tree

4 files changed

+27
-18
lines changed

4 files changed

+27
-18
lines changed

drivers/infiniband/hw/mlx5/main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1019,7 +1019,7 @@ static struct ib_ucontext *mlx5_ib_alloc_ucontext(struct ib_device *ibdev,
10191019
resp.qp_tab_size = 1 << MLX5_CAP_GEN(dev->mdev, log_max_qp);
10201020
if (mlx5_core_is_pf(dev->mdev) && MLX5_CAP_GEN(dev->mdev, bf))
10211021
resp.bf_reg_size = 1 << MLX5_CAP_GEN(dev->mdev, log_bf_reg_size);
1022-
resp.cache_line_size = L1_CACHE_BYTES;
1022+
resp.cache_line_size = cache_line_size();
10231023
resp.max_sq_desc_sz = MLX5_CAP_GEN(dev->mdev, max_wqe_sz_sq);
10241024
resp.max_rq_desc_sz = MLX5_CAP_GEN(dev->mdev, max_wqe_sz_rq);
10251025
resp.max_send_wqebb = 1 << MLX5_CAP_GEN(dev->mdev, log_max_qp_sz);

drivers/infiniband/hw/mlx5/qp.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ enum {
5252

5353
enum {
5454
MLX5_IB_SQ_STRIDE = 6,
55-
MLX5_IB_CACHE_LINE_SIZE = 64,
5655
};
5756

5857
static const u32 mlx5_ib_opcode[] = {

drivers/net/ethernet/mellanox/mlx5/core/alloc.c

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,13 @@
4141

4242
#include "mlx5_core.h"
4343

44+
struct mlx5_db_pgdir {
45+
struct list_head list;
46+
unsigned long *bitmap;
47+
__be32 *db_page;
48+
dma_addr_t db_dma;
49+
};
50+
4451
/* Handling for queue buffers -- we allocate a bunch of memory and
4552
* register it in a memory region at HCA virtual address 0.
4653
*/
@@ -102,17 +109,28 @@ EXPORT_SYMBOL_GPL(mlx5_buf_free);
102109
static struct mlx5_db_pgdir *mlx5_alloc_db_pgdir(struct mlx5_core_dev *dev,
103110
int node)
104111
{
112+
u32 db_per_page = PAGE_SIZE / cache_line_size();
105113
struct mlx5_db_pgdir *pgdir;
106114

107115
pgdir = kzalloc(sizeof(*pgdir), GFP_KERNEL);
108116
if (!pgdir)
109117
return NULL;
110118

111-
bitmap_fill(pgdir->bitmap, MLX5_DB_PER_PAGE);
119+
pgdir->bitmap = kcalloc(BITS_TO_LONGS(db_per_page),
120+
sizeof(unsigned long),
121+
GFP_KERNEL);
122+
123+
if (!pgdir->bitmap) {
124+
kfree(pgdir);
125+
return NULL;
126+
}
127+
128+
bitmap_fill(pgdir->bitmap, db_per_page);
112129

113130
pgdir->db_page = mlx5_dma_zalloc_coherent_node(dev, PAGE_SIZE,
114131
&pgdir->db_dma, node);
115132
if (!pgdir->db_page) {
133+
kfree(pgdir->bitmap);
116134
kfree(pgdir);
117135
return NULL;
118136
}
@@ -123,18 +141,19 @@ static struct mlx5_db_pgdir *mlx5_alloc_db_pgdir(struct mlx5_core_dev *dev,
123141
static int mlx5_alloc_db_from_pgdir(struct mlx5_db_pgdir *pgdir,
124142
struct mlx5_db *db)
125143
{
144+
u32 db_per_page = PAGE_SIZE / cache_line_size();
126145
int offset;
127146
int i;
128147

129-
i = find_first_bit(pgdir->bitmap, MLX5_DB_PER_PAGE);
130-
if (i >= MLX5_DB_PER_PAGE)
148+
i = find_first_bit(pgdir->bitmap, db_per_page);
149+
if (i >= db_per_page)
131150
return -ENOMEM;
132151

133152
__clear_bit(i, pgdir->bitmap);
134153

135154
db->u.pgdir = pgdir;
136155
db->index = i;
137-
offset = db->index * L1_CACHE_BYTES;
156+
offset = db->index * cache_line_size();
138157
db->db = pgdir->db_page + offset / sizeof(*pgdir->db_page);
139158
db->dma = pgdir->db_dma + offset;
140159

@@ -181,14 +200,16 @@ EXPORT_SYMBOL_GPL(mlx5_db_alloc);
181200

182201
void mlx5_db_free(struct mlx5_core_dev *dev, struct mlx5_db *db)
183202
{
203+
u32 db_per_page = PAGE_SIZE / cache_line_size();
184204
mutex_lock(&dev->priv.pgdir_mutex);
185205

186206
__set_bit(db->index, db->u.pgdir->bitmap);
187207

188-
if (bitmap_full(db->u.pgdir->bitmap, MLX5_DB_PER_PAGE)) {
208+
if (bitmap_full(db->u.pgdir->bitmap, db_per_page)) {
189209
dma_free_coherent(&(dev->pdev->dev), PAGE_SIZE,
190210
db->u.pgdir->db_page, db->u.pgdir->db_dma);
191211
list_del(&db->u.pgdir->list);
212+
kfree(db->u.pgdir->bitmap);
192213
kfree(db->u.pgdir);
193214
}
194215

include/linux/mlx5/driver.h

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -625,10 +625,6 @@ struct mlx5_db {
625625
int index;
626626
};
627627

628-
enum {
629-
MLX5_DB_PER_PAGE = PAGE_SIZE / L1_CACHE_BYTES,
630-
};
631-
632628
enum {
633629
MLX5_COMP_EQ_SIZE = 1024,
634630
};
@@ -638,13 +634,6 @@ enum {
638634
MLX5_PTYS_EN = 1 << 2,
639635
};
640636

641-
struct mlx5_db_pgdir {
642-
struct list_head list;
643-
DECLARE_BITMAP(bitmap, MLX5_DB_PER_PAGE);
644-
__be32 *db_page;
645-
dma_addr_t db_dma;
646-
};
647-
648637
typedef void (*mlx5_cmd_cbk_t)(int status, void *context);
649638

650639
struct mlx5_cmd_work_ent {

0 commit comments

Comments
 (0)