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);
102109static 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,
123141static 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
182201void 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
0 commit comments