xref: /linux/drivers/infiniband/hw/mlx5/mr.c (revision 3a39d672e7f48b8d6b91a09afa4b55352773b4b5)
1 /*
2  * Copyright (c) 2013-2015, Mellanox Technologies. All rights reserved.
3  * Copyright (c) 2020, Intel Corporation. All rights reserved.
4  *
5  * This software is available to you under a choice of one of two
6  * licenses.  You may choose to be licensed under the terms of the GNU
7  * General Public License (GPL) Version 2, available from the file
8  * COPYING in the main directory of this source tree, or the
9  * OpenIB.org BSD license below:
10  *
11  *     Redistribution and use in source and binary forms, with or
12  *     without modification, are permitted provided that the following
13  *     conditions are met:
14  *
15  *      - Redistributions of source code must retain the above
16  *        copyright notice, this list of conditions and the following
17  *        disclaimer.
18  *
19  *      - Redistributions in binary form must reproduce the above
20  *        copyright notice, this list of conditions and the following
21  *        disclaimer in the documentation and/or other materials
22  *        provided with the distribution.
23  *
24  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
28  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
29  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
30  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
31  * SOFTWARE.
32  */
33 
34 
35 #include <linux/kref.h>
36 #include <linux/random.h>
37 #include <linux/debugfs.h>
38 #include <linux/export.h>
39 #include <linux/delay.h>
40 #include <linux/dma-buf.h>
41 #include <linux/dma-resv.h>
42 #include <rdma/ib_umem_odp.h>
43 #include "dm.h"
44 #include "mlx5_ib.h"
45 #include "umr.h"
46 #include "data_direct.h"
47 
48 enum {
49 	MAX_PENDING_REG_MR = 8,
50 };
51 
52 #define MLX5_MR_CACHE_PERSISTENT_ENTRY_MIN_DESCS 4
53 #define MLX5_UMR_ALIGN 2048
54 
55 static void
56 create_mkey_callback(int status, struct mlx5_async_work *context);
57 static struct mlx5_ib_mr *reg_create(struct ib_pd *pd, struct ib_umem *umem,
58 				     u64 iova, int access_flags,
59 				     unsigned int page_size, bool populate,
60 				     int access_mode);
61 static int __mlx5_ib_dereg_mr(struct ib_mr *ibmr);
62 
set_mkc_access_pd_addr_fields(void * mkc,int acc,u64 start_addr,struct ib_pd * pd)63 static void set_mkc_access_pd_addr_fields(void *mkc, int acc, u64 start_addr,
64 					  struct ib_pd *pd)
65 {
66 	struct mlx5_ib_dev *dev = to_mdev(pd->device);
67 
68 	MLX5_SET(mkc, mkc, a, !!(acc & IB_ACCESS_REMOTE_ATOMIC));
69 	MLX5_SET(mkc, mkc, rw, !!(acc & IB_ACCESS_REMOTE_WRITE));
70 	MLX5_SET(mkc, mkc, rr, !!(acc & IB_ACCESS_REMOTE_READ));
71 	MLX5_SET(mkc, mkc, lw, !!(acc & IB_ACCESS_LOCAL_WRITE));
72 	MLX5_SET(mkc, mkc, lr, 1);
73 
74 	if (acc & IB_ACCESS_RELAXED_ORDERING) {
75 		if (MLX5_CAP_GEN(dev->mdev, relaxed_ordering_write))
76 			MLX5_SET(mkc, mkc, relaxed_ordering_write, 1);
77 
78 		if (MLX5_CAP_GEN(dev->mdev, relaxed_ordering_read) ||
79 		    (MLX5_CAP_GEN(dev->mdev,
80 				  relaxed_ordering_read_pci_enabled) &&
81 		     pcie_relaxed_ordering_enabled(dev->mdev->pdev)))
82 			MLX5_SET(mkc, mkc, relaxed_ordering_read, 1);
83 	}
84 
85 	MLX5_SET(mkc, mkc, pd, to_mpd(pd)->pdn);
86 	MLX5_SET(mkc, mkc, qpn, 0xffffff);
87 	MLX5_SET64(mkc, mkc, start_addr, start_addr);
88 }
89 
assign_mkey_variant(struct mlx5_ib_dev * dev,u32 * mkey,u32 * in)90 static void assign_mkey_variant(struct mlx5_ib_dev *dev, u32 *mkey, u32 *in)
91 {
92 	u8 key = atomic_inc_return(&dev->mkey_var);
93 	void *mkc;
94 
95 	mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry);
96 	MLX5_SET(mkc, mkc, mkey_7_0, key);
97 	*mkey = key;
98 }
99 
mlx5_ib_create_mkey(struct mlx5_ib_dev * dev,struct mlx5_ib_mkey * mkey,u32 * in,int inlen)100 static int mlx5_ib_create_mkey(struct mlx5_ib_dev *dev,
101 			       struct mlx5_ib_mkey *mkey, u32 *in, int inlen)
102 {
103 	int ret;
104 
105 	assign_mkey_variant(dev, &mkey->key, in);
106 	ret = mlx5_core_create_mkey(dev->mdev, &mkey->key, in, inlen);
107 	if (!ret)
108 		init_waitqueue_head(&mkey->wait);
109 
110 	return ret;
111 }
112 
mlx5_ib_create_mkey_cb(struct mlx5r_async_create_mkey * async_create)113 static int mlx5_ib_create_mkey_cb(struct mlx5r_async_create_mkey *async_create)
114 {
115 	struct mlx5_ib_dev *dev = async_create->ent->dev;
116 	size_t inlen = MLX5_ST_SZ_BYTES(create_mkey_in);
117 	size_t outlen = MLX5_ST_SZ_BYTES(create_mkey_out);
118 
119 	MLX5_SET(create_mkey_in, async_create->in, opcode,
120 		 MLX5_CMD_OP_CREATE_MKEY);
121 	assign_mkey_variant(dev, &async_create->mkey, async_create->in);
122 	return mlx5_cmd_exec_cb(&dev->async_ctx, async_create->in, inlen,
123 				async_create->out, outlen, create_mkey_callback,
124 				&async_create->cb_work);
125 }
126 
127 static int mkey_cache_max_order(struct mlx5_ib_dev *dev);
128 static void queue_adjust_cache_locked(struct mlx5_cache_ent *ent);
129 
destroy_mkey(struct mlx5_ib_dev * dev,struct mlx5_ib_mr * mr)130 static int destroy_mkey(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr)
131 {
132 	WARN_ON(xa_load(&dev->odp_mkeys, mlx5_base_mkey(mr->mmkey.key)));
133 
134 	return mlx5_core_destroy_mkey(dev->mdev, mr->mmkey.key);
135 }
136 
create_mkey_warn(struct mlx5_ib_dev * dev,int status,void * out)137 static void create_mkey_warn(struct mlx5_ib_dev *dev, int status, void *out)
138 {
139 	if (status == -ENXIO) /* core driver is not available */
140 		return;
141 
142 	mlx5_ib_warn(dev, "async reg mr failed. status %d\n", status);
143 	if (status != -EREMOTEIO) /* driver specific failure */
144 		return;
145 
146 	/* Failed in FW, print cmd out failure details */
147 	mlx5_cmd_out_err(dev->mdev, MLX5_CMD_OP_CREATE_MKEY, 0, out);
148 }
149 
push_mkey_locked(struct mlx5_cache_ent * ent,u32 mkey)150 static int push_mkey_locked(struct mlx5_cache_ent *ent, u32 mkey)
151 {
152 	unsigned long tmp = ent->mkeys_queue.ci % NUM_MKEYS_PER_PAGE;
153 	struct mlx5_mkeys_page *page;
154 
155 	lockdep_assert_held(&ent->mkeys_queue.lock);
156 	if (ent->mkeys_queue.ci >=
157 	    ent->mkeys_queue.num_pages * NUM_MKEYS_PER_PAGE) {
158 		page = kzalloc(sizeof(*page), GFP_ATOMIC);
159 		if (!page)
160 			return -ENOMEM;
161 		ent->mkeys_queue.num_pages++;
162 		list_add_tail(&page->list, &ent->mkeys_queue.pages_list);
163 	} else {
164 		page = list_last_entry(&ent->mkeys_queue.pages_list,
165 				       struct mlx5_mkeys_page, list);
166 	}
167 
168 	page->mkeys[tmp] = mkey;
169 	ent->mkeys_queue.ci++;
170 	return 0;
171 }
172 
pop_mkey_locked(struct mlx5_cache_ent * ent)173 static int pop_mkey_locked(struct mlx5_cache_ent *ent)
174 {
175 	unsigned long tmp = (ent->mkeys_queue.ci - 1) % NUM_MKEYS_PER_PAGE;
176 	struct mlx5_mkeys_page *last_page;
177 	u32 mkey;
178 
179 	lockdep_assert_held(&ent->mkeys_queue.lock);
180 	last_page = list_last_entry(&ent->mkeys_queue.pages_list,
181 				    struct mlx5_mkeys_page, list);
182 	mkey = last_page->mkeys[tmp];
183 	last_page->mkeys[tmp] = 0;
184 	ent->mkeys_queue.ci--;
185 	if (ent->mkeys_queue.num_pages > 1 && !tmp) {
186 		list_del(&last_page->list);
187 		ent->mkeys_queue.num_pages--;
188 		kfree(last_page);
189 	}
190 	return mkey;
191 }
192 
create_mkey_callback(int status,struct mlx5_async_work * context)193 static void create_mkey_callback(int status, struct mlx5_async_work *context)
194 {
195 	struct mlx5r_async_create_mkey *mkey_out =
196 		container_of(context, struct mlx5r_async_create_mkey, cb_work);
197 	struct mlx5_cache_ent *ent = mkey_out->ent;
198 	struct mlx5_ib_dev *dev = ent->dev;
199 	unsigned long flags;
200 
201 	if (status) {
202 		create_mkey_warn(dev, status, mkey_out->out);
203 		kfree(mkey_out);
204 		spin_lock_irqsave(&ent->mkeys_queue.lock, flags);
205 		ent->pending--;
206 		WRITE_ONCE(dev->fill_delay, 1);
207 		spin_unlock_irqrestore(&ent->mkeys_queue.lock, flags);
208 		mod_timer(&dev->delay_timer, jiffies + HZ);
209 		return;
210 	}
211 
212 	mkey_out->mkey |= mlx5_idx_to_mkey(
213 		MLX5_GET(create_mkey_out, mkey_out->out, mkey_index));
214 	WRITE_ONCE(dev->cache.last_add, jiffies);
215 
216 	spin_lock_irqsave(&ent->mkeys_queue.lock, flags);
217 	push_mkey_locked(ent, mkey_out->mkey);
218 	ent->pending--;
219 	/* If we are doing fill_to_high_water then keep going. */
220 	queue_adjust_cache_locked(ent);
221 	spin_unlock_irqrestore(&ent->mkeys_queue.lock, flags);
222 	kfree(mkey_out);
223 }
224 
get_mkc_octo_size(unsigned int access_mode,unsigned int ndescs)225 static int get_mkc_octo_size(unsigned int access_mode, unsigned int ndescs)
226 {
227 	int ret = 0;
228 
229 	switch (access_mode) {
230 	case MLX5_MKC_ACCESS_MODE_MTT:
231 		ret = DIV_ROUND_UP(ndescs, MLX5_IB_UMR_OCTOWORD /
232 						   sizeof(struct mlx5_mtt));
233 		break;
234 	case MLX5_MKC_ACCESS_MODE_KSM:
235 		ret = DIV_ROUND_UP(ndescs, MLX5_IB_UMR_OCTOWORD /
236 						   sizeof(struct mlx5_klm));
237 		break;
238 	default:
239 		WARN_ON(1);
240 	}
241 	return ret;
242 }
243 
set_cache_mkc(struct mlx5_cache_ent * ent,void * mkc)244 static void set_cache_mkc(struct mlx5_cache_ent *ent, void *mkc)
245 {
246 	set_mkc_access_pd_addr_fields(mkc, ent->rb_key.access_flags, 0,
247 				      ent->dev->umrc.pd);
248 	MLX5_SET(mkc, mkc, free, 1);
249 	MLX5_SET(mkc, mkc, umr_en, 1);
250 	MLX5_SET(mkc, mkc, access_mode_1_0, ent->rb_key.access_mode & 0x3);
251 	MLX5_SET(mkc, mkc, access_mode_4_2,
252 		(ent->rb_key.access_mode >> 2) & 0x7);
253 	MLX5_SET(mkc, mkc, ma_translation_mode, !!ent->rb_key.ats);
254 
255 	MLX5_SET(mkc, mkc, translations_octword_size,
256 		 get_mkc_octo_size(ent->rb_key.access_mode,
257 				   ent->rb_key.ndescs));
258 	MLX5_SET(mkc, mkc, log_page_size, PAGE_SHIFT);
259 }
260 
261 /* Asynchronously schedule new MRs to be populated in the cache. */
add_keys(struct mlx5_cache_ent * ent,unsigned int num)262 static int add_keys(struct mlx5_cache_ent *ent, unsigned int num)
263 {
264 	struct mlx5r_async_create_mkey *async_create;
265 	void *mkc;
266 	int err = 0;
267 	int i;
268 
269 	for (i = 0; i < num; i++) {
270 		async_create = kzalloc(sizeof(struct mlx5r_async_create_mkey),
271 				       GFP_KERNEL);
272 		if (!async_create)
273 			return -ENOMEM;
274 		mkc = MLX5_ADDR_OF(create_mkey_in, async_create->in,
275 				   memory_key_mkey_entry);
276 		set_cache_mkc(ent, mkc);
277 		async_create->ent = ent;
278 
279 		spin_lock_irq(&ent->mkeys_queue.lock);
280 		if (ent->pending >= MAX_PENDING_REG_MR) {
281 			err = -EAGAIN;
282 			goto free_async_create;
283 		}
284 		ent->pending++;
285 		spin_unlock_irq(&ent->mkeys_queue.lock);
286 
287 		err = mlx5_ib_create_mkey_cb(async_create);
288 		if (err) {
289 			mlx5_ib_warn(ent->dev, "create mkey failed %d\n", err);
290 			goto err_create_mkey;
291 		}
292 	}
293 
294 	return 0;
295 
296 err_create_mkey:
297 	spin_lock_irq(&ent->mkeys_queue.lock);
298 	ent->pending--;
299 free_async_create:
300 	spin_unlock_irq(&ent->mkeys_queue.lock);
301 	kfree(async_create);
302 	return err;
303 }
304 
305 /* Synchronously create a MR in the cache */
create_cache_mkey(struct mlx5_cache_ent * ent,u32 * mkey)306 static int create_cache_mkey(struct mlx5_cache_ent *ent, u32 *mkey)
307 {
308 	size_t inlen = MLX5_ST_SZ_BYTES(create_mkey_in);
309 	void *mkc;
310 	u32 *in;
311 	int err;
312 
313 	in = kzalloc(inlen, GFP_KERNEL);
314 	if (!in)
315 		return -ENOMEM;
316 	mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry);
317 	set_cache_mkc(ent, mkc);
318 
319 	err = mlx5_core_create_mkey(ent->dev->mdev, mkey, in, inlen);
320 	if (err)
321 		goto free_in;
322 
323 	WRITE_ONCE(ent->dev->cache.last_add, jiffies);
324 free_in:
325 	kfree(in);
326 	return err;
327 }
328 
remove_cache_mr_locked(struct mlx5_cache_ent * ent)329 static void remove_cache_mr_locked(struct mlx5_cache_ent *ent)
330 {
331 	u32 mkey;
332 
333 	lockdep_assert_held(&ent->mkeys_queue.lock);
334 	if (!ent->mkeys_queue.ci)
335 		return;
336 	mkey = pop_mkey_locked(ent);
337 	spin_unlock_irq(&ent->mkeys_queue.lock);
338 	mlx5_core_destroy_mkey(ent->dev->mdev, mkey);
339 	spin_lock_irq(&ent->mkeys_queue.lock);
340 }
341 
resize_available_mrs(struct mlx5_cache_ent * ent,unsigned int target,bool limit_fill)342 static int resize_available_mrs(struct mlx5_cache_ent *ent, unsigned int target,
343 				bool limit_fill)
344 	__acquires(&ent->mkeys_queue.lock) __releases(&ent->mkeys_queue.lock)
345 {
346 	int err;
347 
348 	lockdep_assert_held(&ent->mkeys_queue.lock);
349 
350 	while (true) {
351 		if (limit_fill)
352 			target = ent->limit * 2;
353 		if (target == ent->pending + ent->mkeys_queue.ci)
354 			return 0;
355 		if (target > ent->pending + ent->mkeys_queue.ci) {
356 			u32 todo = target - (ent->pending + ent->mkeys_queue.ci);
357 
358 			spin_unlock_irq(&ent->mkeys_queue.lock);
359 			err = add_keys(ent, todo);
360 			if (err == -EAGAIN)
361 				usleep_range(3000, 5000);
362 			spin_lock_irq(&ent->mkeys_queue.lock);
363 			if (err) {
364 				if (err != -EAGAIN)
365 					return err;
366 			} else
367 				return 0;
368 		} else {
369 			remove_cache_mr_locked(ent);
370 		}
371 	}
372 }
373 
size_write(struct file * filp,const char __user * buf,size_t count,loff_t * pos)374 static ssize_t size_write(struct file *filp, const char __user *buf,
375 			  size_t count, loff_t *pos)
376 {
377 	struct mlx5_cache_ent *ent = filp->private_data;
378 	u32 target;
379 	int err;
380 
381 	err = kstrtou32_from_user(buf, count, 0, &target);
382 	if (err)
383 		return err;
384 
385 	/*
386 	 * Target is the new value of total_mrs the user requests, however we
387 	 * cannot free MRs that are in use. Compute the target value for stored
388 	 * mkeys.
389 	 */
390 	spin_lock_irq(&ent->mkeys_queue.lock);
391 	if (target < ent->in_use) {
392 		err = -EINVAL;
393 		goto err_unlock;
394 	}
395 	target = target - ent->in_use;
396 	if (target < ent->limit || target > ent->limit*2) {
397 		err = -EINVAL;
398 		goto err_unlock;
399 	}
400 	err = resize_available_mrs(ent, target, false);
401 	if (err)
402 		goto err_unlock;
403 	spin_unlock_irq(&ent->mkeys_queue.lock);
404 
405 	return count;
406 
407 err_unlock:
408 	spin_unlock_irq(&ent->mkeys_queue.lock);
409 	return err;
410 }
411 
size_read(struct file * filp,char __user * buf,size_t count,loff_t * pos)412 static ssize_t size_read(struct file *filp, char __user *buf, size_t count,
413 			 loff_t *pos)
414 {
415 	struct mlx5_cache_ent *ent = filp->private_data;
416 	char lbuf[20];
417 	int err;
418 
419 	err = snprintf(lbuf, sizeof(lbuf), "%ld\n",
420 		       ent->mkeys_queue.ci + ent->in_use);
421 	if (err < 0)
422 		return err;
423 
424 	return simple_read_from_buffer(buf, count, pos, lbuf, err);
425 }
426 
427 static const struct file_operations size_fops = {
428 	.owner	= THIS_MODULE,
429 	.open	= simple_open,
430 	.write	= size_write,
431 	.read	= size_read,
432 };
433 
limit_write(struct file * filp,const char __user * buf,size_t count,loff_t * pos)434 static ssize_t limit_write(struct file *filp, const char __user *buf,
435 			   size_t count, loff_t *pos)
436 {
437 	struct mlx5_cache_ent *ent = filp->private_data;
438 	u32 var;
439 	int err;
440 
441 	err = kstrtou32_from_user(buf, count, 0, &var);
442 	if (err)
443 		return err;
444 
445 	/*
446 	 * Upon set we immediately fill the cache to high water mark implied by
447 	 * the limit.
448 	 */
449 	spin_lock_irq(&ent->mkeys_queue.lock);
450 	ent->limit = var;
451 	err = resize_available_mrs(ent, 0, true);
452 	spin_unlock_irq(&ent->mkeys_queue.lock);
453 	if (err)
454 		return err;
455 	return count;
456 }
457 
limit_read(struct file * filp,char __user * buf,size_t count,loff_t * pos)458 static ssize_t limit_read(struct file *filp, char __user *buf, size_t count,
459 			  loff_t *pos)
460 {
461 	struct mlx5_cache_ent *ent = filp->private_data;
462 	char lbuf[20];
463 	int err;
464 
465 	err = snprintf(lbuf, sizeof(lbuf), "%d\n", ent->limit);
466 	if (err < 0)
467 		return err;
468 
469 	return simple_read_from_buffer(buf, count, pos, lbuf, err);
470 }
471 
472 static const struct file_operations limit_fops = {
473 	.owner	= THIS_MODULE,
474 	.open	= simple_open,
475 	.write	= limit_write,
476 	.read	= limit_read,
477 };
478 
someone_adding(struct mlx5_mkey_cache * cache)479 static bool someone_adding(struct mlx5_mkey_cache *cache)
480 {
481 	struct mlx5_cache_ent *ent;
482 	struct rb_node *node;
483 	bool ret;
484 
485 	mutex_lock(&cache->rb_lock);
486 	for (node = rb_first(&cache->rb_root); node; node = rb_next(node)) {
487 		ent = rb_entry(node, struct mlx5_cache_ent, node);
488 		spin_lock_irq(&ent->mkeys_queue.lock);
489 		ret = ent->mkeys_queue.ci < ent->limit;
490 		spin_unlock_irq(&ent->mkeys_queue.lock);
491 		if (ret) {
492 			mutex_unlock(&cache->rb_lock);
493 			return true;
494 		}
495 	}
496 	mutex_unlock(&cache->rb_lock);
497 	return false;
498 }
499 
500 /*
501  * Check if the bucket is outside the high/low water mark and schedule an async
502  * update. The cache refill has hysteresis, once the low water mark is hit it is
503  * refilled up to the high mark.
504  */
queue_adjust_cache_locked(struct mlx5_cache_ent * ent)505 static void queue_adjust_cache_locked(struct mlx5_cache_ent *ent)
506 {
507 	lockdep_assert_held(&ent->mkeys_queue.lock);
508 
509 	if (ent->disabled || READ_ONCE(ent->dev->fill_delay) || ent->is_tmp)
510 		return;
511 	if (ent->mkeys_queue.ci < ent->limit) {
512 		ent->fill_to_high_water = true;
513 		mod_delayed_work(ent->dev->cache.wq, &ent->dwork, 0);
514 	} else if (ent->fill_to_high_water &&
515 		   ent->mkeys_queue.ci + ent->pending < 2 * ent->limit) {
516 		/*
517 		 * Once we start populating due to hitting a low water mark
518 		 * continue until we pass the high water mark.
519 		 */
520 		mod_delayed_work(ent->dev->cache.wq, &ent->dwork, 0);
521 	} else if (ent->mkeys_queue.ci == 2 * ent->limit) {
522 		ent->fill_to_high_water = false;
523 	} else if (ent->mkeys_queue.ci > 2 * ent->limit) {
524 		/* Queue deletion of excess entries */
525 		ent->fill_to_high_water = false;
526 		if (ent->pending)
527 			queue_delayed_work(ent->dev->cache.wq, &ent->dwork,
528 					   msecs_to_jiffies(1000));
529 		else
530 			mod_delayed_work(ent->dev->cache.wq, &ent->dwork, 0);
531 	}
532 }
533 
clean_keys(struct mlx5_ib_dev * dev,struct mlx5_cache_ent * ent)534 static void clean_keys(struct mlx5_ib_dev *dev, struct mlx5_cache_ent *ent)
535 {
536 	u32 mkey;
537 
538 	spin_lock_irq(&ent->mkeys_queue.lock);
539 	while (ent->mkeys_queue.ci) {
540 		mkey = pop_mkey_locked(ent);
541 		spin_unlock_irq(&ent->mkeys_queue.lock);
542 		mlx5_core_destroy_mkey(dev->mdev, mkey);
543 		spin_lock_irq(&ent->mkeys_queue.lock);
544 	}
545 	ent->tmp_cleanup_scheduled = false;
546 	spin_unlock_irq(&ent->mkeys_queue.lock);
547 }
548 
__cache_work_func(struct mlx5_cache_ent * ent)549 static void __cache_work_func(struct mlx5_cache_ent *ent)
550 {
551 	struct mlx5_ib_dev *dev = ent->dev;
552 	struct mlx5_mkey_cache *cache = &dev->cache;
553 	int err;
554 
555 	spin_lock_irq(&ent->mkeys_queue.lock);
556 	if (ent->disabled)
557 		goto out;
558 
559 	if (ent->fill_to_high_water &&
560 	    ent->mkeys_queue.ci + ent->pending < 2 * ent->limit &&
561 	    !READ_ONCE(dev->fill_delay)) {
562 		spin_unlock_irq(&ent->mkeys_queue.lock);
563 		err = add_keys(ent, 1);
564 		spin_lock_irq(&ent->mkeys_queue.lock);
565 		if (ent->disabled)
566 			goto out;
567 		if (err) {
568 			/*
569 			 * EAGAIN only happens if there are pending MRs, so we
570 			 * will be rescheduled when storing them. The only
571 			 * failure path here is ENOMEM.
572 			 */
573 			if (err != -EAGAIN) {
574 				mlx5_ib_warn(
575 					dev,
576 					"add keys command failed, err %d\n",
577 					err);
578 				queue_delayed_work(cache->wq, &ent->dwork,
579 						   msecs_to_jiffies(1000));
580 			}
581 		}
582 	} else if (ent->mkeys_queue.ci > 2 * ent->limit) {
583 		bool need_delay;
584 
585 		/*
586 		 * The remove_cache_mr() logic is performed as garbage
587 		 * collection task. Such task is intended to be run when no
588 		 * other active processes are running.
589 		 *
590 		 * The need_resched() will return TRUE if there are user tasks
591 		 * to be activated in near future.
592 		 *
593 		 * In such case, we don't execute remove_cache_mr() and postpone
594 		 * the garbage collection work to try to run in next cycle, in
595 		 * order to free CPU resources to other tasks.
596 		 */
597 		spin_unlock_irq(&ent->mkeys_queue.lock);
598 		need_delay = need_resched() || someone_adding(cache) ||
599 			     !time_after(jiffies,
600 					 READ_ONCE(cache->last_add) + 300 * HZ);
601 		spin_lock_irq(&ent->mkeys_queue.lock);
602 		if (ent->disabled)
603 			goto out;
604 		if (need_delay) {
605 			queue_delayed_work(cache->wq, &ent->dwork, 300 * HZ);
606 			goto out;
607 		}
608 		remove_cache_mr_locked(ent);
609 		queue_adjust_cache_locked(ent);
610 	}
611 out:
612 	spin_unlock_irq(&ent->mkeys_queue.lock);
613 }
614 
delayed_cache_work_func(struct work_struct * work)615 static void delayed_cache_work_func(struct work_struct *work)
616 {
617 	struct mlx5_cache_ent *ent;
618 
619 	ent = container_of(work, struct mlx5_cache_ent, dwork.work);
620 	/* temp entries are never filled, only cleaned */
621 	if (ent->is_tmp)
622 		clean_keys(ent->dev, ent);
623 	else
624 		__cache_work_func(ent);
625 }
626 
cache_ent_key_cmp(struct mlx5r_cache_rb_key key1,struct mlx5r_cache_rb_key key2)627 static int cache_ent_key_cmp(struct mlx5r_cache_rb_key key1,
628 			     struct mlx5r_cache_rb_key key2)
629 {
630 	int res;
631 
632 	res = key1.ats - key2.ats;
633 	if (res)
634 		return res;
635 
636 	res = key1.access_mode - key2.access_mode;
637 	if (res)
638 		return res;
639 
640 	res = key1.access_flags - key2.access_flags;
641 	if (res)
642 		return res;
643 
644 	/*
645 	 * keep ndescs the last in the compare table since the find function
646 	 * searches for an exact match on all properties and only closest
647 	 * match in size.
648 	 */
649 	return key1.ndescs - key2.ndescs;
650 }
651 
mlx5_cache_ent_insert(struct mlx5_mkey_cache * cache,struct mlx5_cache_ent * ent)652 static int mlx5_cache_ent_insert(struct mlx5_mkey_cache *cache,
653 				 struct mlx5_cache_ent *ent)
654 {
655 	struct rb_node **new = &cache->rb_root.rb_node, *parent = NULL;
656 	struct mlx5_cache_ent *cur;
657 	int cmp;
658 
659 	/* Figure out where to put new node */
660 	while (*new) {
661 		cur = rb_entry(*new, struct mlx5_cache_ent, node);
662 		parent = *new;
663 		cmp = cache_ent_key_cmp(cur->rb_key, ent->rb_key);
664 		if (cmp > 0)
665 			new = &((*new)->rb_left);
666 		if (cmp < 0)
667 			new = &((*new)->rb_right);
668 		if (cmp == 0)
669 			return -EEXIST;
670 	}
671 
672 	/* Add new node and rebalance tree. */
673 	rb_link_node(&ent->node, parent, new);
674 	rb_insert_color(&ent->node, &cache->rb_root);
675 
676 	return 0;
677 }
678 
679 static struct mlx5_cache_ent *
mkey_cache_ent_from_rb_key(struct mlx5_ib_dev * dev,struct mlx5r_cache_rb_key rb_key)680 mkey_cache_ent_from_rb_key(struct mlx5_ib_dev *dev,
681 			   struct mlx5r_cache_rb_key rb_key)
682 {
683 	struct rb_node *node = dev->cache.rb_root.rb_node;
684 	struct mlx5_cache_ent *cur, *smallest = NULL;
685 	u64 ndescs_limit;
686 	int cmp;
687 
688 	/*
689 	 * Find the smallest ent with order >= requested_order.
690 	 */
691 	while (node) {
692 		cur = rb_entry(node, struct mlx5_cache_ent, node);
693 		cmp = cache_ent_key_cmp(cur->rb_key, rb_key);
694 		if (cmp > 0) {
695 			smallest = cur;
696 			node = node->rb_left;
697 		}
698 		if (cmp < 0)
699 			node = node->rb_right;
700 		if (cmp == 0)
701 			return cur;
702 	}
703 
704 	/*
705 	 * Limit the usage of mkeys larger than twice the required size while
706 	 * also allowing the usage of smallest cache entry for small MRs.
707 	 */
708 	ndescs_limit = max_t(u64, rb_key.ndescs * 2,
709 			     MLX5_MR_CACHE_PERSISTENT_ENTRY_MIN_DESCS);
710 
711 	return (smallest &&
712 		smallest->rb_key.access_mode == rb_key.access_mode &&
713 		smallest->rb_key.access_flags == rb_key.access_flags &&
714 		smallest->rb_key.ats == rb_key.ats &&
715 		smallest->rb_key.ndescs <= ndescs_limit) ?
716 		       smallest :
717 		       NULL;
718 }
719 
_mlx5_mr_cache_alloc(struct mlx5_ib_dev * dev,struct mlx5_cache_ent * ent,int access_flags)720 static struct mlx5_ib_mr *_mlx5_mr_cache_alloc(struct mlx5_ib_dev *dev,
721 					struct mlx5_cache_ent *ent,
722 					int access_flags)
723 {
724 	struct mlx5_ib_mr *mr;
725 	int err;
726 
727 	mr = kzalloc(sizeof(*mr), GFP_KERNEL);
728 	if (!mr)
729 		return ERR_PTR(-ENOMEM);
730 
731 	spin_lock_irq(&ent->mkeys_queue.lock);
732 	ent->in_use++;
733 
734 	if (!ent->mkeys_queue.ci) {
735 		queue_adjust_cache_locked(ent);
736 		ent->miss++;
737 		spin_unlock_irq(&ent->mkeys_queue.lock);
738 		err = create_cache_mkey(ent, &mr->mmkey.key);
739 		if (err) {
740 			spin_lock_irq(&ent->mkeys_queue.lock);
741 			ent->in_use--;
742 			spin_unlock_irq(&ent->mkeys_queue.lock);
743 			kfree(mr);
744 			return ERR_PTR(err);
745 		}
746 	} else {
747 		mr->mmkey.key = pop_mkey_locked(ent);
748 		queue_adjust_cache_locked(ent);
749 		spin_unlock_irq(&ent->mkeys_queue.lock);
750 	}
751 	mr->mmkey.cache_ent = ent;
752 	mr->mmkey.type = MLX5_MKEY_MR;
753 	mr->mmkey.rb_key = ent->rb_key;
754 	mr->mmkey.cacheable = true;
755 	init_waitqueue_head(&mr->mmkey.wait);
756 	return mr;
757 }
758 
get_unchangeable_access_flags(struct mlx5_ib_dev * dev,int access_flags)759 static int get_unchangeable_access_flags(struct mlx5_ib_dev *dev,
760 					 int access_flags)
761 {
762 	int ret = 0;
763 
764 	if ((access_flags & IB_ACCESS_REMOTE_ATOMIC) &&
765 	    MLX5_CAP_GEN(dev->mdev, atomic) &&
766 	    MLX5_CAP_GEN(dev->mdev, umr_modify_atomic_disabled))
767 		ret |= IB_ACCESS_REMOTE_ATOMIC;
768 
769 	if ((access_flags & IB_ACCESS_RELAXED_ORDERING) &&
770 	    MLX5_CAP_GEN(dev->mdev, relaxed_ordering_write) &&
771 	    !MLX5_CAP_GEN(dev->mdev, relaxed_ordering_write_umr))
772 		ret |= IB_ACCESS_RELAXED_ORDERING;
773 
774 	if ((access_flags & IB_ACCESS_RELAXED_ORDERING) &&
775 	    (MLX5_CAP_GEN(dev->mdev, relaxed_ordering_read) ||
776 	     MLX5_CAP_GEN(dev->mdev, relaxed_ordering_read_pci_enabled)) &&
777 	    !MLX5_CAP_GEN(dev->mdev, relaxed_ordering_read_umr))
778 		ret |= IB_ACCESS_RELAXED_ORDERING;
779 
780 	return ret;
781 }
782 
mlx5_mr_cache_alloc(struct mlx5_ib_dev * dev,int access_flags,int access_mode,int ndescs)783 struct mlx5_ib_mr *mlx5_mr_cache_alloc(struct mlx5_ib_dev *dev,
784 				       int access_flags, int access_mode,
785 				       int ndescs)
786 {
787 	struct mlx5r_cache_rb_key rb_key = {
788 		.ndescs = ndescs,
789 		.access_mode = access_mode,
790 		.access_flags = get_unchangeable_access_flags(dev, access_flags)
791 	};
792 	struct mlx5_cache_ent *ent = mkey_cache_ent_from_rb_key(dev, rb_key);
793 
794 	if (!ent)
795 		return ERR_PTR(-EOPNOTSUPP);
796 
797 	return _mlx5_mr_cache_alloc(dev, ent, access_flags);
798 }
799 
mlx5_mkey_cache_debugfs_cleanup(struct mlx5_ib_dev * dev)800 static void mlx5_mkey_cache_debugfs_cleanup(struct mlx5_ib_dev *dev)
801 {
802 	if (!mlx5_debugfs_root || dev->is_rep)
803 		return;
804 
805 	debugfs_remove_recursive(dev->cache.fs_root);
806 	dev->cache.fs_root = NULL;
807 }
808 
mlx5_mkey_cache_debugfs_add_ent(struct mlx5_ib_dev * dev,struct mlx5_cache_ent * ent)809 static void mlx5_mkey_cache_debugfs_add_ent(struct mlx5_ib_dev *dev,
810 					    struct mlx5_cache_ent *ent)
811 {
812 	int order = order_base_2(ent->rb_key.ndescs);
813 	struct dentry *dir;
814 
815 	if (!mlx5_debugfs_root || dev->is_rep)
816 		return;
817 
818 	if (ent->rb_key.access_mode == MLX5_MKC_ACCESS_MODE_KSM)
819 		order = MLX5_IMR_KSM_CACHE_ENTRY + 2;
820 
821 	sprintf(ent->name, "%d", order);
822 	dir = debugfs_create_dir(ent->name, dev->cache.fs_root);
823 	debugfs_create_file("size", 0600, dir, ent, &size_fops);
824 	debugfs_create_file("limit", 0600, dir, ent, &limit_fops);
825 	debugfs_create_ulong("cur", 0400, dir, &ent->mkeys_queue.ci);
826 	debugfs_create_u32("miss", 0600, dir, &ent->miss);
827 }
828 
mlx5_mkey_cache_debugfs_init(struct mlx5_ib_dev * dev)829 static void mlx5_mkey_cache_debugfs_init(struct mlx5_ib_dev *dev)
830 {
831 	struct dentry *dbg_root = mlx5_debugfs_get_dev_root(dev->mdev);
832 	struct mlx5_mkey_cache *cache = &dev->cache;
833 
834 	if (!mlx5_debugfs_root || dev->is_rep)
835 		return;
836 
837 	cache->fs_root = debugfs_create_dir("mr_cache", dbg_root);
838 }
839 
delay_time_func(struct timer_list * t)840 static void delay_time_func(struct timer_list *t)
841 {
842 	struct mlx5_ib_dev *dev = from_timer(dev, t, delay_timer);
843 
844 	WRITE_ONCE(dev->fill_delay, 0);
845 }
846 
mlx5r_mkeys_init(struct mlx5_cache_ent * ent)847 static int mlx5r_mkeys_init(struct mlx5_cache_ent *ent)
848 {
849 	struct mlx5_mkeys_page *page;
850 
851 	page = kzalloc(sizeof(*page), GFP_KERNEL);
852 	if (!page)
853 		return -ENOMEM;
854 	INIT_LIST_HEAD(&ent->mkeys_queue.pages_list);
855 	spin_lock_init(&ent->mkeys_queue.lock);
856 	list_add_tail(&page->list, &ent->mkeys_queue.pages_list);
857 	ent->mkeys_queue.num_pages++;
858 	return 0;
859 }
860 
mlx5r_mkeys_uninit(struct mlx5_cache_ent * ent)861 static void mlx5r_mkeys_uninit(struct mlx5_cache_ent *ent)
862 {
863 	struct mlx5_mkeys_page *page;
864 
865 	WARN_ON(ent->mkeys_queue.ci || ent->mkeys_queue.num_pages > 1);
866 	page = list_last_entry(&ent->mkeys_queue.pages_list,
867 			       struct mlx5_mkeys_page, list);
868 	list_del(&page->list);
869 	kfree(page);
870 }
871 
872 struct mlx5_cache_ent *
mlx5r_cache_create_ent_locked(struct mlx5_ib_dev * dev,struct mlx5r_cache_rb_key rb_key,bool persistent_entry)873 mlx5r_cache_create_ent_locked(struct mlx5_ib_dev *dev,
874 			      struct mlx5r_cache_rb_key rb_key,
875 			      bool persistent_entry)
876 {
877 	struct mlx5_cache_ent *ent;
878 	int order;
879 	int ret;
880 
881 	ent = kzalloc(sizeof(*ent), GFP_KERNEL);
882 	if (!ent)
883 		return ERR_PTR(-ENOMEM);
884 
885 	ret = mlx5r_mkeys_init(ent);
886 	if (ret)
887 		goto mkeys_err;
888 	ent->rb_key = rb_key;
889 	ent->dev = dev;
890 	ent->is_tmp = !persistent_entry;
891 
892 	INIT_DELAYED_WORK(&ent->dwork, delayed_cache_work_func);
893 
894 	ret = mlx5_cache_ent_insert(&dev->cache, ent);
895 	if (ret)
896 		goto ent_insert_err;
897 
898 	if (persistent_entry) {
899 		if (rb_key.access_mode == MLX5_MKC_ACCESS_MODE_KSM)
900 			order = MLX5_IMR_KSM_CACHE_ENTRY;
901 		else
902 			order = order_base_2(rb_key.ndescs) - 2;
903 
904 		if ((dev->mdev->profile.mask & MLX5_PROF_MASK_MR_CACHE) &&
905 		    !dev->is_rep && mlx5_core_is_pf(dev->mdev) &&
906 		    mlx5r_umr_can_load_pas(dev, 0))
907 			ent->limit = dev->mdev->profile.mr_cache[order].limit;
908 		else
909 			ent->limit = 0;
910 
911 		mlx5_mkey_cache_debugfs_add_ent(dev, ent);
912 	}
913 
914 	return ent;
915 ent_insert_err:
916 	mlx5r_mkeys_uninit(ent);
917 mkeys_err:
918 	kfree(ent);
919 	return ERR_PTR(ret);
920 }
921 
mlx5_mkey_cache_init(struct mlx5_ib_dev * dev)922 int mlx5_mkey_cache_init(struct mlx5_ib_dev *dev)
923 {
924 	struct mlx5_mkey_cache *cache = &dev->cache;
925 	struct rb_root *root = &dev->cache.rb_root;
926 	struct mlx5r_cache_rb_key rb_key = {
927 		.access_mode = MLX5_MKC_ACCESS_MODE_MTT,
928 	};
929 	struct mlx5_cache_ent *ent;
930 	struct rb_node *node;
931 	int ret;
932 	int i;
933 
934 	mutex_init(&dev->slow_path_mutex);
935 	mutex_init(&dev->cache.rb_lock);
936 	dev->cache.rb_root = RB_ROOT;
937 	cache->wq = alloc_ordered_workqueue("mkey_cache", WQ_MEM_RECLAIM);
938 	if (!cache->wq) {
939 		mlx5_ib_warn(dev, "failed to create work queue\n");
940 		return -ENOMEM;
941 	}
942 
943 	mlx5_cmd_init_async_ctx(dev->mdev, &dev->async_ctx);
944 	timer_setup(&dev->delay_timer, delay_time_func, 0);
945 	mlx5_mkey_cache_debugfs_init(dev);
946 	mutex_lock(&cache->rb_lock);
947 	for (i = 0; i <= mkey_cache_max_order(dev); i++) {
948 		rb_key.ndescs = MLX5_MR_CACHE_PERSISTENT_ENTRY_MIN_DESCS << i;
949 		ent = mlx5r_cache_create_ent_locked(dev, rb_key, true);
950 		if (IS_ERR(ent)) {
951 			ret = PTR_ERR(ent);
952 			goto err;
953 		}
954 	}
955 
956 	ret = mlx5_odp_init_mkey_cache(dev);
957 	if (ret)
958 		goto err;
959 
960 	mutex_unlock(&cache->rb_lock);
961 	for (node = rb_first(root); node; node = rb_next(node)) {
962 		ent = rb_entry(node, struct mlx5_cache_ent, node);
963 		spin_lock_irq(&ent->mkeys_queue.lock);
964 		queue_adjust_cache_locked(ent);
965 		spin_unlock_irq(&ent->mkeys_queue.lock);
966 	}
967 
968 	return 0;
969 
970 err:
971 	mutex_unlock(&cache->rb_lock);
972 	mlx5_mkey_cache_debugfs_cleanup(dev);
973 	mlx5_ib_warn(dev, "failed to create mkey cache entry\n");
974 	return ret;
975 }
976 
mlx5_mkey_cache_cleanup(struct mlx5_ib_dev * dev)977 void mlx5_mkey_cache_cleanup(struct mlx5_ib_dev *dev)
978 {
979 	struct rb_root *root = &dev->cache.rb_root;
980 	struct mlx5_cache_ent *ent;
981 	struct rb_node *node;
982 
983 	if (!dev->cache.wq)
984 		return;
985 
986 	mutex_lock(&dev->cache.rb_lock);
987 	for (node = rb_first(root); node; node = rb_next(node)) {
988 		ent = rb_entry(node, struct mlx5_cache_ent, node);
989 		spin_lock_irq(&ent->mkeys_queue.lock);
990 		ent->disabled = true;
991 		spin_unlock_irq(&ent->mkeys_queue.lock);
992 		cancel_delayed_work(&ent->dwork);
993 	}
994 	mutex_unlock(&dev->cache.rb_lock);
995 
996 	/*
997 	 * After all entries are disabled and will not reschedule on WQ,
998 	 * flush it and all async commands.
999 	 */
1000 	flush_workqueue(dev->cache.wq);
1001 
1002 	mlx5_mkey_cache_debugfs_cleanup(dev);
1003 	mlx5_cmd_cleanup_async_ctx(&dev->async_ctx);
1004 
1005 	/* At this point all entries are disabled and have no concurrent work. */
1006 	mutex_lock(&dev->cache.rb_lock);
1007 	node = rb_first(root);
1008 	while (node) {
1009 		ent = rb_entry(node, struct mlx5_cache_ent, node);
1010 		node = rb_next(node);
1011 		clean_keys(dev, ent);
1012 		rb_erase(&ent->node, root);
1013 		mlx5r_mkeys_uninit(ent);
1014 		kfree(ent);
1015 	}
1016 	mutex_unlock(&dev->cache.rb_lock);
1017 
1018 	destroy_workqueue(dev->cache.wq);
1019 	del_timer_sync(&dev->delay_timer);
1020 }
1021 
mlx5_ib_get_dma_mr(struct ib_pd * pd,int acc)1022 struct ib_mr *mlx5_ib_get_dma_mr(struct ib_pd *pd, int acc)
1023 {
1024 	struct mlx5_ib_dev *dev = to_mdev(pd->device);
1025 	int inlen = MLX5_ST_SZ_BYTES(create_mkey_in);
1026 	struct mlx5_ib_mr *mr;
1027 	void *mkc;
1028 	u32 *in;
1029 	int err;
1030 
1031 	mr = kzalloc(sizeof(*mr), GFP_KERNEL);
1032 	if (!mr)
1033 		return ERR_PTR(-ENOMEM);
1034 
1035 	in = kzalloc(inlen, GFP_KERNEL);
1036 	if (!in) {
1037 		err = -ENOMEM;
1038 		goto err_free;
1039 	}
1040 
1041 	mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry);
1042 
1043 	MLX5_SET(mkc, mkc, access_mode_1_0, MLX5_MKC_ACCESS_MODE_PA);
1044 	MLX5_SET(mkc, mkc, length64, 1);
1045 	set_mkc_access_pd_addr_fields(mkc, acc | IB_ACCESS_RELAXED_ORDERING, 0,
1046 				      pd);
1047 	MLX5_SET(mkc, mkc, ma_translation_mode, MLX5_CAP_GEN(dev->mdev, ats));
1048 
1049 	err = mlx5_ib_create_mkey(dev, &mr->mmkey, in, inlen);
1050 	if (err)
1051 		goto err_in;
1052 
1053 	kfree(in);
1054 	mr->mmkey.type = MLX5_MKEY_MR;
1055 	mr->ibmr.lkey = mr->mmkey.key;
1056 	mr->ibmr.rkey = mr->mmkey.key;
1057 	mr->umem = NULL;
1058 
1059 	return &mr->ibmr;
1060 
1061 err_in:
1062 	kfree(in);
1063 
1064 err_free:
1065 	kfree(mr);
1066 
1067 	return ERR_PTR(err);
1068 }
1069 
get_octo_len(u64 addr,u64 len,int page_shift)1070 static int get_octo_len(u64 addr, u64 len, int page_shift)
1071 {
1072 	u64 page_size = 1ULL << page_shift;
1073 	u64 offset;
1074 	int npages;
1075 
1076 	offset = addr & (page_size - 1);
1077 	npages = ALIGN(len + offset, page_size) >> page_shift;
1078 	return (npages + 1) / 2;
1079 }
1080 
mkey_cache_max_order(struct mlx5_ib_dev * dev)1081 static int mkey_cache_max_order(struct mlx5_ib_dev *dev)
1082 {
1083 	if (MLX5_CAP_GEN(dev->mdev, umr_extended_translation_offset))
1084 		return MKEY_CACHE_LAST_STD_ENTRY;
1085 	return MLX5_MAX_UMR_SHIFT;
1086 }
1087 
set_mr_fields(struct mlx5_ib_dev * dev,struct mlx5_ib_mr * mr,u64 length,int access_flags,u64 iova)1088 static void set_mr_fields(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr,
1089 			  u64 length, int access_flags, u64 iova)
1090 {
1091 	mr->ibmr.lkey = mr->mmkey.key;
1092 	mr->ibmr.rkey = mr->mmkey.key;
1093 	mr->ibmr.length = length;
1094 	mr->ibmr.device = &dev->ib_dev;
1095 	mr->ibmr.iova = iova;
1096 	mr->access_flags = access_flags;
1097 }
1098 
mlx5_umem_dmabuf_default_pgsz(struct ib_umem * umem,u64 iova)1099 static unsigned int mlx5_umem_dmabuf_default_pgsz(struct ib_umem *umem,
1100 						  u64 iova)
1101 {
1102 	/*
1103 	 * The alignment of iova has already been checked upon entering
1104 	 * UVERBS_METHOD_REG_DMABUF_MR
1105 	 */
1106 	umem->iova = iova;
1107 	return PAGE_SIZE;
1108 }
1109 
alloc_cacheable_mr(struct ib_pd * pd,struct ib_umem * umem,u64 iova,int access_flags,int access_mode)1110 static struct mlx5_ib_mr *alloc_cacheable_mr(struct ib_pd *pd,
1111 					     struct ib_umem *umem, u64 iova,
1112 					     int access_flags, int access_mode)
1113 {
1114 	struct mlx5_ib_dev *dev = to_mdev(pd->device);
1115 	struct mlx5r_cache_rb_key rb_key = {};
1116 	struct mlx5_cache_ent *ent;
1117 	struct mlx5_ib_mr *mr;
1118 	unsigned int page_size;
1119 
1120 	if (umem->is_dmabuf)
1121 		page_size = mlx5_umem_dmabuf_default_pgsz(umem, iova);
1122 	else
1123 		page_size = mlx5_umem_mkc_find_best_pgsz(dev, umem, iova);
1124 	if (WARN_ON(!page_size))
1125 		return ERR_PTR(-EINVAL);
1126 
1127 	rb_key.access_mode = access_mode;
1128 	rb_key.ndescs = ib_umem_num_dma_blocks(umem, page_size);
1129 	rb_key.ats = mlx5_umem_needs_ats(dev, umem, access_flags);
1130 	rb_key.access_flags = get_unchangeable_access_flags(dev, access_flags);
1131 	ent = mkey_cache_ent_from_rb_key(dev, rb_key);
1132 	/*
1133 	 * If the MR can't come from the cache then synchronously create an uncached
1134 	 * one.
1135 	 */
1136 	if (!ent) {
1137 		mutex_lock(&dev->slow_path_mutex);
1138 		mr = reg_create(pd, umem, iova, access_flags, page_size, false, access_mode);
1139 		mutex_unlock(&dev->slow_path_mutex);
1140 		if (IS_ERR(mr))
1141 			return mr;
1142 		mr->mmkey.rb_key = rb_key;
1143 		mr->mmkey.cacheable = true;
1144 		return mr;
1145 	}
1146 
1147 	mr = _mlx5_mr_cache_alloc(dev, ent, access_flags);
1148 	if (IS_ERR(mr))
1149 		return mr;
1150 
1151 	mr->ibmr.pd = pd;
1152 	mr->umem = umem;
1153 	mr->page_shift = order_base_2(page_size);
1154 	set_mr_fields(dev, mr, umem->length, access_flags, iova);
1155 
1156 	return mr;
1157 }
1158 
1159 static struct ib_mr *
reg_create_crossing_vhca_mr(struct ib_pd * pd,u64 iova,u64 length,int access_flags,u32 crossed_lkey)1160 reg_create_crossing_vhca_mr(struct ib_pd *pd, u64 iova, u64 length, int access_flags,
1161 			    u32 crossed_lkey)
1162 {
1163 	struct mlx5_ib_dev *dev = to_mdev(pd->device);
1164 	int access_mode = MLX5_MKC_ACCESS_MODE_CROSSING;
1165 	struct mlx5_ib_mr *mr;
1166 	void *mkc;
1167 	int inlen;
1168 	u32 *in;
1169 	int err;
1170 
1171 	if (!MLX5_CAP_GEN(dev->mdev, crossing_vhca_mkey))
1172 		return ERR_PTR(-EOPNOTSUPP);
1173 
1174 	mr = kzalloc(sizeof(*mr), GFP_KERNEL);
1175 	if (!mr)
1176 		return ERR_PTR(-ENOMEM);
1177 
1178 	inlen = MLX5_ST_SZ_BYTES(create_mkey_in);
1179 	in = kvzalloc(inlen, GFP_KERNEL);
1180 	if (!in) {
1181 		err = -ENOMEM;
1182 		goto err_1;
1183 	}
1184 
1185 	mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry);
1186 	MLX5_SET(mkc, mkc, crossing_target_vhca_id,
1187 		 MLX5_CAP_GEN(dev->mdev, vhca_id));
1188 	MLX5_SET(mkc, mkc, translations_octword_size, crossed_lkey);
1189 	MLX5_SET(mkc, mkc, access_mode_1_0, access_mode & 0x3);
1190 	MLX5_SET(mkc, mkc, access_mode_4_2, (access_mode >> 2) & 0x7);
1191 
1192 	/* for this crossing mkey IOVA should be 0 and len should be IOVA + len */
1193 	set_mkc_access_pd_addr_fields(mkc, access_flags, 0, pd);
1194 	MLX5_SET64(mkc, mkc, len, iova + length);
1195 
1196 	MLX5_SET(mkc, mkc, free, 0);
1197 	MLX5_SET(mkc, mkc, umr_en, 0);
1198 	err = mlx5_ib_create_mkey(dev, &mr->mmkey, in, inlen);
1199 	if (err)
1200 		goto err_2;
1201 
1202 	mr->mmkey.type = MLX5_MKEY_MR;
1203 	set_mr_fields(dev, mr, length, access_flags, iova);
1204 	mr->ibmr.pd = pd;
1205 	kvfree(in);
1206 	mlx5_ib_dbg(dev, "crossing mkey = 0x%x\n", mr->mmkey.key);
1207 
1208 	return &mr->ibmr;
1209 err_2:
1210 	kvfree(in);
1211 err_1:
1212 	kfree(mr);
1213 	return ERR_PTR(err);
1214 }
1215 
1216 /*
1217  * If ibmr is NULL it will be allocated by reg_create.
1218  * Else, the given ibmr will be used.
1219  */
reg_create(struct ib_pd * pd,struct ib_umem * umem,u64 iova,int access_flags,unsigned int page_size,bool populate,int access_mode)1220 static struct mlx5_ib_mr *reg_create(struct ib_pd *pd, struct ib_umem *umem,
1221 				     u64 iova, int access_flags,
1222 				     unsigned int page_size, bool populate,
1223 				     int access_mode)
1224 {
1225 	struct mlx5_ib_dev *dev = to_mdev(pd->device);
1226 	struct mlx5_ib_mr *mr;
1227 	__be64 *pas;
1228 	void *mkc;
1229 	int inlen;
1230 	u32 *in;
1231 	int err;
1232 	bool pg_cap = !!(MLX5_CAP_GEN(dev->mdev, pg)) &&
1233 		(access_mode == MLX5_MKC_ACCESS_MODE_MTT);
1234 	bool ksm_mode = (access_mode == MLX5_MKC_ACCESS_MODE_KSM);
1235 
1236 	if (!page_size)
1237 		return ERR_PTR(-EINVAL);
1238 	mr = kzalloc(sizeof(*mr), GFP_KERNEL);
1239 	if (!mr)
1240 		return ERR_PTR(-ENOMEM);
1241 
1242 	mr->ibmr.pd = pd;
1243 	mr->access_flags = access_flags;
1244 	mr->page_shift = order_base_2(page_size);
1245 
1246 	inlen = MLX5_ST_SZ_BYTES(create_mkey_in);
1247 	if (populate)
1248 		inlen += sizeof(*pas) *
1249 			 roundup(ib_umem_num_dma_blocks(umem, page_size), 2);
1250 	in = kvzalloc(inlen, GFP_KERNEL);
1251 	if (!in) {
1252 		err = -ENOMEM;
1253 		goto err_1;
1254 	}
1255 	pas = (__be64 *)MLX5_ADDR_OF(create_mkey_in, in, klm_pas_mtt);
1256 	if (populate) {
1257 		if (WARN_ON(access_flags & IB_ACCESS_ON_DEMAND || ksm_mode)) {
1258 			err = -EINVAL;
1259 			goto err_2;
1260 		}
1261 		mlx5_ib_populate_pas(umem, 1UL << mr->page_shift, pas,
1262 				     pg_cap ? MLX5_IB_MTT_PRESENT : 0);
1263 	}
1264 
1265 	/* The pg_access bit allows setting the access flags
1266 	 * in the page list submitted with the command.
1267 	 */
1268 	MLX5_SET(create_mkey_in, in, pg_access, !!(pg_cap));
1269 
1270 	mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry);
1271 	set_mkc_access_pd_addr_fields(mkc, access_flags, iova,
1272 				      populate ? pd : dev->umrc.pd);
1273 	/* In case a data direct flow, overwrite the pdn field by its internal kernel PD */
1274 	if (umem->is_dmabuf && ksm_mode)
1275 		MLX5_SET(mkc, mkc, pd, dev->ddr.pdn);
1276 
1277 	MLX5_SET(mkc, mkc, free, !populate);
1278 	MLX5_SET(mkc, mkc, access_mode_1_0, access_mode);
1279 	MLX5_SET(mkc, mkc, umr_en, 1);
1280 
1281 	MLX5_SET64(mkc, mkc, len, umem->length);
1282 	MLX5_SET(mkc, mkc, bsf_octword_size, 0);
1283 	if (ksm_mode)
1284 		MLX5_SET(mkc, mkc, translations_octword_size,
1285 			 get_octo_len(iova, umem->length, mr->page_shift) * 2);
1286 	else
1287 		MLX5_SET(mkc, mkc, translations_octword_size,
1288 			 get_octo_len(iova, umem->length, mr->page_shift));
1289 	MLX5_SET(mkc, mkc, log_page_size, mr->page_shift);
1290 	if (mlx5_umem_needs_ats(dev, umem, access_flags))
1291 		MLX5_SET(mkc, mkc, ma_translation_mode, 1);
1292 	if (populate) {
1293 		MLX5_SET(create_mkey_in, in, translations_octword_actual_size,
1294 			 get_octo_len(iova, umem->length, mr->page_shift));
1295 	}
1296 
1297 	err = mlx5_ib_create_mkey(dev, &mr->mmkey, in, inlen);
1298 	if (err) {
1299 		mlx5_ib_warn(dev, "create mkey failed\n");
1300 		goto err_2;
1301 	}
1302 	mr->mmkey.type = MLX5_MKEY_MR;
1303 	mr->mmkey.ndescs = get_octo_len(iova, umem->length, mr->page_shift);
1304 	mr->umem = umem;
1305 	set_mr_fields(dev, mr, umem->length, access_flags, iova);
1306 	kvfree(in);
1307 
1308 	mlx5_ib_dbg(dev, "mkey = 0x%x\n", mr->mmkey.key);
1309 
1310 	return mr;
1311 
1312 err_2:
1313 	kvfree(in);
1314 err_1:
1315 	kfree(mr);
1316 	return ERR_PTR(err);
1317 }
1318 
mlx5_ib_get_dm_mr(struct ib_pd * pd,u64 start_addr,u64 length,int acc,int mode)1319 static struct ib_mr *mlx5_ib_get_dm_mr(struct ib_pd *pd, u64 start_addr,
1320 				       u64 length, int acc, int mode)
1321 {
1322 	struct mlx5_ib_dev *dev = to_mdev(pd->device);
1323 	int inlen = MLX5_ST_SZ_BYTES(create_mkey_in);
1324 	struct mlx5_ib_mr *mr;
1325 	void *mkc;
1326 	u32 *in;
1327 	int err;
1328 
1329 	mr = kzalloc(sizeof(*mr), GFP_KERNEL);
1330 	if (!mr)
1331 		return ERR_PTR(-ENOMEM);
1332 
1333 	in = kzalloc(inlen, GFP_KERNEL);
1334 	if (!in) {
1335 		err = -ENOMEM;
1336 		goto err_free;
1337 	}
1338 
1339 	mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry);
1340 
1341 	MLX5_SET(mkc, mkc, access_mode_1_0, mode & 0x3);
1342 	MLX5_SET(mkc, mkc, access_mode_4_2, (mode >> 2) & 0x7);
1343 	MLX5_SET64(mkc, mkc, len, length);
1344 	set_mkc_access_pd_addr_fields(mkc, acc, start_addr, pd);
1345 
1346 	err = mlx5_ib_create_mkey(dev, &mr->mmkey, in, inlen);
1347 	if (err)
1348 		goto err_in;
1349 
1350 	kfree(in);
1351 
1352 	set_mr_fields(dev, mr, length, acc, start_addr);
1353 
1354 	return &mr->ibmr;
1355 
1356 err_in:
1357 	kfree(in);
1358 
1359 err_free:
1360 	kfree(mr);
1361 
1362 	return ERR_PTR(err);
1363 }
1364 
mlx5_ib_advise_mr(struct ib_pd * pd,enum ib_uverbs_advise_mr_advice advice,u32 flags,struct ib_sge * sg_list,u32 num_sge,struct uverbs_attr_bundle * attrs)1365 int mlx5_ib_advise_mr(struct ib_pd *pd,
1366 		      enum ib_uverbs_advise_mr_advice advice,
1367 		      u32 flags,
1368 		      struct ib_sge *sg_list,
1369 		      u32 num_sge,
1370 		      struct uverbs_attr_bundle *attrs)
1371 {
1372 	if (advice != IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH &&
1373 	    advice != IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH_WRITE &&
1374 	    advice != IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH_NO_FAULT)
1375 		return -EOPNOTSUPP;
1376 
1377 	return mlx5_ib_advise_mr_prefetch(pd, advice, flags,
1378 					 sg_list, num_sge);
1379 }
1380 
mlx5_ib_reg_dm_mr(struct ib_pd * pd,struct ib_dm * dm,struct ib_dm_mr_attr * attr,struct uverbs_attr_bundle * attrs)1381 struct ib_mr *mlx5_ib_reg_dm_mr(struct ib_pd *pd, struct ib_dm *dm,
1382 				struct ib_dm_mr_attr *attr,
1383 				struct uverbs_attr_bundle *attrs)
1384 {
1385 	struct mlx5_ib_dm *mdm = to_mdm(dm);
1386 	struct mlx5_core_dev *dev = to_mdev(dm->device)->mdev;
1387 	u64 start_addr = mdm->dev_addr + attr->offset;
1388 	int mode;
1389 
1390 	switch (mdm->type) {
1391 	case MLX5_IB_UAPI_DM_TYPE_MEMIC:
1392 		if (attr->access_flags & ~MLX5_IB_DM_MEMIC_ALLOWED_ACCESS)
1393 			return ERR_PTR(-EINVAL);
1394 
1395 		mode = MLX5_MKC_ACCESS_MODE_MEMIC;
1396 		start_addr -= pci_resource_start(dev->pdev, 0);
1397 		break;
1398 	case MLX5_IB_UAPI_DM_TYPE_STEERING_SW_ICM:
1399 	case MLX5_IB_UAPI_DM_TYPE_HEADER_MODIFY_SW_ICM:
1400 	case MLX5_IB_UAPI_DM_TYPE_HEADER_MODIFY_PATTERN_SW_ICM:
1401 	case MLX5_IB_UAPI_DM_TYPE_ENCAP_SW_ICM:
1402 		if (attr->access_flags & ~MLX5_IB_DM_SW_ICM_ALLOWED_ACCESS)
1403 			return ERR_PTR(-EINVAL);
1404 
1405 		mode = MLX5_MKC_ACCESS_MODE_SW_ICM;
1406 		break;
1407 	default:
1408 		return ERR_PTR(-EINVAL);
1409 	}
1410 
1411 	return mlx5_ib_get_dm_mr(pd, start_addr, attr->length,
1412 				 attr->access_flags, mode);
1413 }
1414 
create_real_mr(struct ib_pd * pd,struct ib_umem * umem,u64 iova,int access_flags)1415 static struct ib_mr *create_real_mr(struct ib_pd *pd, struct ib_umem *umem,
1416 				    u64 iova, int access_flags)
1417 {
1418 	struct mlx5_ib_dev *dev = to_mdev(pd->device);
1419 	struct mlx5_ib_mr *mr = NULL;
1420 	bool xlt_with_umr;
1421 	int err;
1422 
1423 	xlt_with_umr = mlx5r_umr_can_load_pas(dev, umem->length);
1424 	if (xlt_with_umr) {
1425 		mr = alloc_cacheable_mr(pd, umem, iova, access_flags,
1426 					MLX5_MKC_ACCESS_MODE_MTT);
1427 	} else {
1428 		unsigned int page_size =
1429 			mlx5_umem_mkc_find_best_pgsz(dev, umem, iova);
1430 
1431 		mutex_lock(&dev->slow_path_mutex);
1432 		mr = reg_create(pd, umem, iova, access_flags, page_size,
1433 				true, MLX5_MKC_ACCESS_MODE_MTT);
1434 		mutex_unlock(&dev->slow_path_mutex);
1435 	}
1436 	if (IS_ERR(mr)) {
1437 		ib_umem_release(umem);
1438 		return ERR_CAST(mr);
1439 	}
1440 
1441 	mlx5_ib_dbg(dev, "mkey 0x%x\n", mr->mmkey.key);
1442 
1443 	atomic_add(ib_umem_num_pages(umem), &dev->mdev->priv.reg_pages);
1444 
1445 	if (xlt_with_umr) {
1446 		/*
1447 		 * If the MR was created with reg_create then it will be
1448 		 * configured properly but left disabled. It is safe to go ahead
1449 		 * and configure it again via UMR while enabling it.
1450 		 */
1451 		err = mlx5r_umr_update_mr_pas(mr, MLX5_IB_UPD_XLT_ENABLE);
1452 		if (err) {
1453 			mlx5_ib_dereg_mr(&mr->ibmr, NULL);
1454 			return ERR_PTR(err);
1455 		}
1456 	}
1457 	return &mr->ibmr;
1458 }
1459 
create_user_odp_mr(struct ib_pd * pd,u64 start,u64 length,u64 iova,int access_flags,struct ib_udata * udata)1460 static struct ib_mr *create_user_odp_mr(struct ib_pd *pd, u64 start, u64 length,
1461 					u64 iova, int access_flags,
1462 					struct ib_udata *udata)
1463 {
1464 	struct mlx5_ib_dev *dev = to_mdev(pd->device);
1465 	struct ib_umem_odp *odp;
1466 	struct mlx5_ib_mr *mr;
1467 	int err;
1468 
1469 	if (!IS_ENABLED(CONFIG_INFINIBAND_ON_DEMAND_PAGING))
1470 		return ERR_PTR(-EOPNOTSUPP);
1471 
1472 	err = mlx5r_odp_create_eq(dev, &dev->odp_pf_eq);
1473 	if (err)
1474 		return ERR_PTR(err);
1475 	if (!start && length == U64_MAX) {
1476 		if (iova != 0)
1477 			return ERR_PTR(-EINVAL);
1478 		if (!(dev->odp_caps.general_caps & IB_ODP_SUPPORT_IMPLICIT))
1479 			return ERR_PTR(-EINVAL);
1480 
1481 		mr = mlx5_ib_alloc_implicit_mr(to_mpd(pd), access_flags);
1482 		if (IS_ERR(mr))
1483 			return ERR_CAST(mr);
1484 		return &mr->ibmr;
1485 	}
1486 
1487 	/* ODP requires xlt update via umr to work. */
1488 	if (!mlx5r_umr_can_load_pas(dev, length))
1489 		return ERR_PTR(-EINVAL);
1490 
1491 	odp = ib_umem_odp_get(&dev->ib_dev, start, length, access_flags,
1492 			      &mlx5_mn_ops);
1493 	if (IS_ERR(odp))
1494 		return ERR_CAST(odp);
1495 
1496 	mr = alloc_cacheable_mr(pd, &odp->umem, iova, access_flags,
1497 				MLX5_MKC_ACCESS_MODE_MTT);
1498 	if (IS_ERR(mr)) {
1499 		ib_umem_release(&odp->umem);
1500 		return ERR_CAST(mr);
1501 	}
1502 	xa_init(&mr->implicit_children);
1503 
1504 	odp->private = mr;
1505 	err = mlx5r_store_odp_mkey(dev, &mr->mmkey);
1506 	if (err)
1507 		goto err_dereg_mr;
1508 
1509 	err = mlx5_ib_init_odp_mr(mr);
1510 	if (err)
1511 		goto err_dereg_mr;
1512 	return &mr->ibmr;
1513 
1514 err_dereg_mr:
1515 	mlx5_ib_dereg_mr(&mr->ibmr, NULL);
1516 	return ERR_PTR(err);
1517 }
1518 
mlx5_ib_reg_user_mr(struct ib_pd * pd,u64 start,u64 length,u64 iova,int access_flags,struct ib_udata * udata)1519 struct ib_mr *mlx5_ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
1520 				  u64 iova, int access_flags,
1521 				  struct ib_udata *udata)
1522 {
1523 	struct mlx5_ib_dev *dev = to_mdev(pd->device);
1524 	struct ib_umem *umem;
1525 	int err;
1526 
1527 	if (!IS_ENABLED(CONFIG_INFINIBAND_USER_MEM))
1528 		return ERR_PTR(-EOPNOTSUPP);
1529 
1530 	mlx5_ib_dbg(dev, "start 0x%llx, iova 0x%llx, length 0x%llx, access_flags 0x%x\n",
1531 		    start, iova, length, access_flags);
1532 
1533 	err = mlx5r_umr_resource_init(dev);
1534 	if (err)
1535 		return ERR_PTR(err);
1536 
1537 	if (access_flags & IB_ACCESS_ON_DEMAND)
1538 		return create_user_odp_mr(pd, start, length, iova, access_flags,
1539 					  udata);
1540 	umem = ib_umem_get(&dev->ib_dev, start, length, access_flags);
1541 	if (IS_ERR(umem))
1542 		return ERR_CAST(umem);
1543 	return create_real_mr(pd, umem, iova, access_flags);
1544 }
1545 
mlx5_ib_dmabuf_invalidate_cb(struct dma_buf_attachment * attach)1546 static void mlx5_ib_dmabuf_invalidate_cb(struct dma_buf_attachment *attach)
1547 {
1548 	struct ib_umem_dmabuf *umem_dmabuf = attach->importer_priv;
1549 	struct mlx5_ib_mr *mr = umem_dmabuf->private;
1550 
1551 	dma_resv_assert_held(umem_dmabuf->attach->dmabuf->resv);
1552 
1553 	if (!umem_dmabuf->sgt)
1554 		return;
1555 
1556 	mlx5r_umr_update_mr_pas(mr, MLX5_IB_UPD_XLT_ZAP);
1557 	ib_umem_dmabuf_unmap_pages(umem_dmabuf);
1558 }
1559 
1560 static struct dma_buf_attach_ops mlx5_ib_dmabuf_attach_ops = {
1561 	.allow_peer2peer = 1,
1562 	.move_notify = mlx5_ib_dmabuf_invalidate_cb,
1563 };
1564 
1565 static struct ib_mr *
reg_user_mr_dmabuf(struct ib_pd * pd,struct device * dma_device,u64 offset,u64 length,u64 virt_addr,int fd,int access_flags,int access_mode)1566 reg_user_mr_dmabuf(struct ib_pd *pd, struct device *dma_device,
1567 		   u64 offset, u64 length, u64 virt_addr,
1568 		   int fd, int access_flags, int access_mode)
1569 {
1570 	bool pinned_mode = (access_mode == MLX5_MKC_ACCESS_MODE_KSM);
1571 	struct mlx5_ib_dev *dev = to_mdev(pd->device);
1572 	struct mlx5_ib_mr *mr = NULL;
1573 	struct ib_umem_dmabuf *umem_dmabuf;
1574 	int err;
1575 
1576 	err = mlx5r_umr_resource_init(dev);
1577 	if (err)
1578 		return ERR_PTR(err);
1579 
1580 	if (!pinned_mode)
1581 		umem_dmabuf = ib_umem_dmabuf_get(&dev->ib_dev,
1582 						 offset, length, fd,
1583 						 access_flags,
1584 						 &mlx5_ib_dmabuf_attach_ops);
1585 	else
1586 		umem_dmabuf = ib_umem_dmabuf_get_pinned_with_dma_device(&dev->ib_dev,
1587 				dma_device, offset, length,
1588 				fd, access_flags);
1589 
1590 	if (IS_ERR(umem_dmabuf)) {
1591 		mlx5_ib_dbg(dev, "umem_dmabuf get failed (%ld)\n",
1592 			    PTR_ERR(umem_dmabuf));
1593 		return ERR_CAST(umem_dmabuf);
1594 	}
1595 
1596 	mr = alloc_cacheable_mr(pd, &umem_dmabuf->umem, virt_addr,
1597 				access_flags, access_mode);
1598 	if (IS_ERR(mr)) {
1599 		ib_umem_release(&umem_dmabuf->umem);
1600 		return ERR_CAST(mr);
1601 	}
1602 
1603 	mlx5_ib_dbg(dev, "mkey 0x%x\n", mr->mmkey.key);
1604 
1605 	atomic_add(ib_umem_num_pages(mr->umem), &dev->mdev->priv.reg_pages);
1606 	umem_dmabuf->private = mr;
1607 	if (!pinned_mode) {
1608 		err = mlx5r_store_odp_mkey(dev, &mr->mmkey);
1609 		if (err)
1610 			goto err_dereg_mr;
1611 	} else {
1612 		mr->data_direct = true;
1613 	}
1614 
1615 	err = mlx5_ib_init_dmabuf_mr(mr);
1616 	if (err)
1617 		goto err_dereg_mr;
1618 	return &mr->ibmr;
1619 
1620 err_dereg_mr:
1621 	__mlx5_ib_dereg_mr(&mr->ibmr);
1622 	return ERR_PTR(err);
1623 }
1624 
1625 static struct ib_mr *
reg_user_mr_dmabuf_by_data_direct(struct ib_pd * pd,u64 offset,u64 length,u64 virt_addr,int fd,int access_flags)1626 reg_user_mr_dmabuf_by_data_direct(struct ib_pd *pd, u64 offset,
1627 				  u64 length, u64 virt_addr,
1628 				  int fd, int access_flags)
1629 {
1630 	struct mlx5_ib_dev *dev = to_mdev(pd->device);
1631 	struct mlx5_data_direct_dev *data_direct_dev;
1632 	struct ib_mr *crossing_mr;
1633 	struct ib_mr *crossed_mr;
1634 	int ret = 0;
1635 
1636 	/* As of HW behaviour the IOVA must be page aligned in KSM mode */
1637 	if (!PAGE_ALIGNED(virt_addr) || (access_flags & IB_ACCESS_ON_DEMAND))
1638 		return ERR_PTR(-EOPNOTSUPP);
1639 
1640 	mutex_lock(&dev->data_direct_lock);
1641 	data_direct_dev = dev->data_direct_dev;
1642 	if (!data_direct_dev) {
1643 		ret = -EINVAL;
1644 		goto end;
1645 	}
1646 
1647 	/* The device's 'data direct mkey' was created without RO flags to
1648 	 * simplify things and allow for a single mkey per device.
1649 	 * Since RO is not a must, mask it out accordingly.
1650 	 */
1651 	access_flags &= ~IB_ACCESS_RELAXED_ORDERING;
1652 	crossed_mr = reg_user_mr_dmabuf(pd, &data_direct_dev->pdev->dev,
1653 					offset, length, virt_addr, fd,
1654 					access_flags, MLX5_MKC_ACCESS_MODE_KSM);
1655 	if (IS_ERR(crossed_mr)) {
1656 		ret = PTR_ERR(crossed_mr);
1657 		goto end;
1658 	}
1659 
1660 	mutex_lock(&dev->slow_path_mutex);
1661 	crossing_mr = reg_create_crossing_vhca_mr(pd, virt_addr, length, access_flags,
1662 						  crossed_mr->lkey);
1663 	mutex_unlock(&dev->slow_path_mutex);
1664 	if (IS_ERR(crossing_mr)) {
1665 		__mlx5_ib_dereg_mr(crossed_mr);
1666 		ret = PTR_ERR(crossing_mr);
1667 		goto end;
1668 	}
1669 
1670 	list_add_tail(&to_mmr(crossed_mr)->dd_node, &dev->data_direct_mr_list);
1671 	to_mmr(crossing_mr)->dd_crossed_mr = to_mmr(crossed_mr);
1672 	to_mmr(crossing_mr)->data_direct = true;
1673 end:
1674 	mutex_unlock(&dev->data_direct_lock);
1675 	return ret ? ERR_PTR(ret) : crossing_mr;
1676 }
1677 
mlx5_ib_reg_user_mr_dmabuf(struct ib_pd * pd,u64 offset,u64 length,u64 virt_addr,int fd,int access_flags,struct uverbs_attr_bundle * attrs)1678 struct ib_mr *mlx5_ib_reg_user_mr_dmabuf(struct ib_pd *pd, u64 offset,
1679 					 u64 length, u64 virt_addr,
1680 					 int fd, int access_flags,
1681 					 struct uverbs_attr_bundle *attrs)
1682 {
1683 	struct mlx5_ib_dev *dev = to_mdev(pd->device);
1684 	int mlx5_access_flags = 0;
1685 	int err;
1686 
1687 	if (!IS_ENABLED(CONFIG_INFINIBAND_USER_MEM) ||
1688 	    !IS_ENABLED(CONFIG_INFINIBAND_ON_DEMAND_PAGING))
1689 		return ERR_PTR(-EOPNOTSUPP);
1690 
1691 	if (uverbs_attr_is_valid(attrs, MLX5_IB_ATTR_REG_DMABUF_MR_ACCESS_FLAGS)) {
1692 		err = uverbs_get_flags32(&mlx5_access_flags, attrs,
1693 					 MLX5_IB_ATTR_REG_DMABUF_MR_ACCESS_FLAGS,
1694 					 MLX5_IB_UAPI_REG_DMABUF_ACCESS_DATA_DIRECT);
1695 		if (err)
1696 			return ERR_PTR(err);
1697 	}
1698 
1699 	mlx5_ib_dbg(dev,
1700 		    "offset 0x%llx, virt_addr 0x%llx, length 0x%llx, fd %d, access_flags 0x%x, mlx5_access_flags 0x%x\n",
1701 		    offset, virt_addr, length, fd, access_flags, mlx5_access_flags);
1702 
1703 	/* dmabuf requires xlt update via umr to work. */
1704 	if (!mlx5r_umr_can_load_pas(dev, length))
1705 		return ERR_PTR(-EINVAL);
1706 
1707 	if (mlx5_access_flags & MLX5_IB_UAPI_REG_DMABUF_ACCESS_DATA_DIRECT)
1708 		return reg_user_mr_dmabuf_by_data_direct(pd, offset, length, virt_addr,
1709 							 fd, access_flags);
1710 
1711 	return reg_user_mr_dmabuf(pd, pd->device->dma_device,
1712 				  offset, length, virt_addr,
1713 				  fd, access_flags, MLX5_MKC_ACCESS_MODE_MTT);
1714 }
1715 
1716 /*
1717  * True if the change in access flags can be done via UMR, only some access
1718  * flags can be updated.
1719  */
can_use_umr_rereg_access(struct mlx5_ib_dev * dev,unsigned int current_access_flags,unsigned int target_access_flags)1720 static bool can_use_umr_rereg_access(struct mlx5_ib_dev *dev,
1721 				     unsigned int current_access_flags,
1722 				     unsigned int target_access_flags)
1723 {
1724 	unsigned int diffs = current_access_flags ^ target_access_flags;
1725 
1726 	if (diffs & ~(IB_ACCESS_LOCAL_WRITE | IB_ACCESS_REMOTE_WRITE |
1727 		      IB_ACCESS_REMOTE_READ | IB_ACCESS_RELAXED_ORDERING |
1728 		      IB_ACCESS_REMOTE_ATOMIC))
1729 		return false;
1730 	return mlx5r_umr_can_reconfig(dev, current_access_flags,
1731 				      target_access_flags);
1732 }
1733 
can_use_umr_rereg_pas(struct mlx5_ib_mr * mr,struct ib_umem * new_umem,int new_access_flags,u64 iova,unsigned long * page_size)1734 static bool can_use_umr_rereg_pas(struct mlx5_ib_mr *mr,
1735 				  struct ib_umem *new_umem,
1736 				  int new_access_flags, u64 iova,
1737 				  unsigned long *page_size)
1738 {
1739 	struct mlx5_ib_dev *dev = to_mdev(mr->ibmr.device);
1740 
1741 	/* We only track the allocated sizes of MRs from the cache */
1742 	if (!mr->mmkey.cache_ent)
1743 		return false;
1744 	if (!mlx5r_umr_can_load_pas(dev, new_umem->length))
1745 		return false;
1746 
1747 	*page_size = mlx5_umem_mkc_find_best_pgsz(dev, new_umem, iova);
1748 	if (WARN_ON(!*page_size))
1749 		return false;
1750 	return (mr->mmkey.cache_ent->rb_key.ndescs) >=
1751 	       ib_umem_num_dma_blocks(new_umem, *page_size);
1752 }
1753 
umr_rereg_pas(struct mlx5_ib_mr * mr,struct ib_pd * pd,int access_flags,int flags,struct ib_umem * new_umem,u64 iova,unsigned long page_size)1754 static int umr_rereg_pas(struct mlx5_ib_mr *mr, struct ib_pd *pd,
1755 			 int access_flags, int flags, struct ib_umem *new_umem,
1756 			 u64 iova, unsigned long page_size)
1757 {
1758 	struct mlx5_ib_dev *dev = to_mdev(mr->ibmr.device);
1759 	int upd_flags = MLX5_IB_UPD_XLT_ADDR | MLX5_IB_UPD_XLT_ENABLE;
1760 	struct ib_umem *old_umem = mr->umem;
1761 	int err;
1762 
1763 	/*
1764 	 * To keep everything simple the MR is revoked before we start to mess
1765 	 * with it. This ensure the change is atomic relative to any use of the
1766 	 * MR.
1767 	 */
1768 	err = mlx5r_umr_revoke_mr(mr);
1769 	if (err)
1770 		return err;
1771 
1772 	if (flags & IB_MR_REREG_PD) {
1773 		mr->ibmr.pd = pd;
1774 		upd_flags |= MLX5_IB_UPD_XLT_PD;
1775 	}
1776 	if (flags & IB_MR_REREG_ACCESS) {
1777 		mr->access_flags = access_flags;
1778 		upd_flags |= MLX5_IB_UPD_XLT_ACCESS;
1779 	}
1780 
1781 	mr->ibmr.iova = iova;
1782 	mr->ibmr.length = new_umem->length;
1783 	mr->page_shift = order_base_2(page_size);
1784 	mr->umem = new_umem;
1785 	err = mlx5r_umr_update_mr_pas(mr, upd_flags);
1786 	if (err) {
1787 		/*
1788 		 * The MR is revoked at this point so there is no issue to free
1789 		 * new_umem.
1790 		 */
1791 		mr->umem = old_umem;
1792 		return err;
1793 	}
1794 
1795 	atomic_sub(ib_umem_num_pages(old_umem), &dev->mdev->priv.reg_pages);
1796 	ib_umem_release(old_umem);
1797 	atomic_add(ib_umem_num_pages(new_umem), &dev->mdev->priv.reg_pages);
1798 	return 0;
1799 }
1800 
mlx5_ib_rereg_user_mr(struct ib_mr * ib_mr,int flags,u64 start,u64 length,u64 iova,int new_access_flags,struct ib_pd * new_pd,struct ib_udata * udata)1801 struct ib_mr *mlx5_ib_rereg_user_mr(struct ib_mr *ib_mr, int flags, u64 start,
1802 				    u64 length, u64 iova, int new_access_flags,
1803 				    struct ib_pd *new_pd,
1804 				    struct ib_udata *udata)
1805 {
1806 	struct mlx5_ib_dev *dev = to_mdev(ib_mr->device);
1807 	struct mlx5_ib_mr *mr = to_mmr(ib_mr);
1808 	int err;
1809 
1810 	if (!IS_ENABLED(CONFIG_INFINIBAND_USER_MEM) || mr->data_direct)
1811 		return ERR_PTR(-EOPNOTSUPP);
1812 
1813 	mlx5_ib_dbg(
1814 		dev,
1815 		"start 0x%llx, iova 0x%llx, length 0x%llx, access_flags 0x%x\n",
1816 		start, iova, length, new_access_flags);
1817 
1818 	if (flags & ~(IB_MR_REREG_TRANS | IB_MR_REREG_PD | IB_MR_REREG_ACCESS))
1819 		return ERR_PTR(-EOPNOTSUPP);
1820 
1821 	if (!(flags & IB_MR_REREG_ACCESS))
1822 		new_access_flags = mr->access_flags;
1823 	if (!(flags & IB_MR_REREG_PD))
1824 		new_pd = ib_mr->pd;
1825 
1826 	if (!(flags & IB_MR_REREG_TRANS)) {
1827 		struct ib_umem *umem;
1828 
1829 		/* Fast path for PD/access change */
1830 		if (can_use_umr_rereg_access(dev, mr->access_flags,
1831 					     new_access_flags)) {
1832 			err = mlx5r_umr_rereg_pd_access(mr, new_pd,
1833 							new_access_flags);
1834 			if (err)
1835 				return ERR_PTR(err);
1836 			return NULL;
1837 		}
1838 		/* DM or ODP MR's don't have a normal umem so we can't re-use it */
1839 		if (!mr->umem || is_odp_mr(mr) || is_dmabuf_mr(mr))
1840 			goto recreate;
1841 
1842 		/*
1843 		 * Only one active MR can refer to a umem at one time, revoke
1844 		 * the old MR before assigning the umem to the new one.
1845 		 */
1846 		err = mlx5r_umr_revoke_mr(mr);
1847 		if (err)
1848 			return ERR_PTR(err);
1849 		umem = mr->umem;
1850 		mr->umem = NULL;
1851 		atomic_sub(ib_umem_num_pages(umem), &dev->mdev->priv.reg_pages);
1852 
1853 		return create_real_mr(new_pd, umem, mr->ibmr.iova,
1854 				      new_access_flags);
1855 	}
1856 
1857 	/*
1858 	 * DM doesn't have a PAS list so we can't re-use it, odp/dmabuf does
1859 	 * but the logic around releasing the umem is different
1860 	 */
1861 	if (!mr->umem || is_odp_mr(mr) || is_dmabuf_mr(mr))
1862 		goto recreate;
1863 
1864 	if (!(new_access_flags & IB_ACCESS_ON_DEMAND) &&
1865 	    can_use_umr_rereg_access(dev, mr->access_flags, new_access_flags)) {
1866 		struct ib_umem *new_umem;
1867 		unsigned long page_size;
1868 
1869 		new_umem = ib_umem_get(&dev->ib_dev, start, length,
1870 				       new_access_flags);
1871 		if (IS_ERR(new_umem))
1872 			return ERR_CAST(new_umem);
1873 
1874 		/* Fast path for PAS change */
1875 		if (can_use_umr_rereg_pas(mr, new_umem, new_access_flags, iova,
1876 					  &page_size)) {
1877 			err = umr_rereg_pas(mr, new_pd, new_access_flags, flags,
1878 					    new_umem, iova, page_size);
1879 			if (err) {
1880 				ib_umem_release(new_umem);
1881 				return ERR_PTR(err);
1882 			}
1883 			return NULL;
1884 		}
1885 		return create_real_mr(new_pd, new_umem, iova, new_access_flags);
1886 	}
1887 
1888 	/*
1889 	 * Everything else has no state we can preserve, just create a new MR
1890 	 * from scratch
1891 	 */
1892 recreate:
1893 	return mlx5_ib_reg_user_mr(new_pd, start, length, iova,
1894 				   new_access_flags, udata);
1895 }
1896 
1897 static int
mlx5_alloc_priv_descs(struct ib_device * device,struct mlx5_ib_mr * mr,int ndescs,int desc_size)1898 mlx5_alloc_priv_descs(struct ib_device *device,
1899 		      struct mlx5_ib_mr *mr,
1900 		      int ndescs,
1901 		      int desc_size)
1902 {
1903 	struct mlx5_ib_dev *dev = to_mdev(device);
1904 	struct device *ddev = &dev->mdev->pdev->dev;
1905 	int size = ndescs * desc_size;
1906 	int add_size;
1907 	int ret;
1908 
1909 	add_size = max_t(int, MLX5_UMR_ALIGN - ARCH_KMALLOC_MINALIGN, 0);
1910 	if (is_power_of_2(MLX5_UMR_ALIGN) && add_size) {
1911 		int end = max_t(int, MLX5_UMR_ALIGN, roundup_pow_of_two(size));
1912 
1913 		add_size = min_t(int, end - size, add_size);
1914 	}
1915 
1916 	mr->descs_alloc = kzalloc(size + add_size, GFP_KERNEL);
1917 	if (!mr->descs_alloc)
1918 		return -ENOMEM;
1919 
1920 	mr->descs = PTR_ALIGN(mr->descs_alloc, MLX5_UMR_ALIGN);
1921 
1922 	mr->desc_map = dma_map_single(ddev, mr->descs, size, DMA_TO_DEVICE);
1923 	if (dma_mapping_error(ddev, mr->desc_map)) {
1924 		ret = -ENOMEM;
1925 		goto err;
1926 	}
1927 
1928 	return 0;
1929 err:
1930 	kfree(mr->descs_alloc);
1931 
1932 	return ret;
1933 }
1934 
1935 static void
mlx5_free_priv_descs(struct mlx5_ib_mr * mr)1936 mlx5_free_priv_descs(struct mlx5_ib_mr *mr)
1937 {
1938 	if (!mr->umem && !mr->data_direct && mr->descs) {
1939 		struct ib_device *device = mr->ibmr.device;
1940 		int size = mr->max_descs * mr->desc_size;
1941 		struct mlx5_ib_dev *dev = to_mdev(device);
1942 
1943 		dma_unmap_single(&dev->mdev->pdev->dev, mr->desc_map, size,
1944 				 DMA_TO_DEVICE);
1945 		kfree(mr->descs_alloc);
1946 		mr->descs = NULL;
1947 	}
1948 }
1949 
cache_ent_find_and_store(struct mlx5_ib_dev * dev,struct mlx5_ib_mr * mr)1950 static int cache_ent_find_and_store(struct mlx5_ib_dev *dev,
1951 				    struct mlx5_ib_mr *mr)
1952 {
1953 	struct mlx5_mkey_cache *cache = &dev->cache;
1954 	struct mlx5_cache_ent *ent;
1955 	int ret;
1956 
1957 	if (mr->mmkey.cache_ent) {
1958 		spin_lock_irq(&mr->mmkey.cache_ent->mkeys_queue.lock);
1959 		mr->mmkey.cache_ent->in_use--;
1960 		goto end;
1961 	}
1962 
1963 	mutex_lock(&cache->rb_lock);
1964 	ent = mkey_cache_ent_from_rb_key(dev, mr->mmkey.rb_key);
1965 	if (ent) {
1966 		if (ent->rb_key.ndescs == mr->mmkey.rb_key.ndescs) {
1967 			if (ent->disabled) {
1968 				mutex_unlock(&cache->rb_lock);
1969 				return -EOPNOTSUPP;
1970 			}
1971 			mr->mmkey.cache_ent = ent;
1972 			spin_lock_irq(&mr->mmkey.cache_ent->mkeys_queue.lock);
1973 			mutex_unlock(&cache->rb_lock);
1974 			goto end;
1975 		}
1976 	}
1977 
1978 	ent = mlx5r_cache_create_ent_locked(dev, mr->mmkey.rb_key, false);
1979 	mutex_unlock(&cache->rb_lock);
1980 	if (IS_ERR(ent))
1981 		return PTR_ERR(ent);
1982 
1983 	mr->mmkey.cache_ent = ent;
1984 	spin_lock_irq(&mr->mmkey.cache_ent->mkeys_queue.lock);
1985 
1986 end:
1987 	ret = push_mkey_locked(mr->mmkey.cache_ent, mr->mmkey.key);
1988 	spin_unlock_irq(&mr->mmkey.cache_ent->mkeys_queue.lock);
1989 	return ret;
1990 }
1991 
mlx5_ib_revoke_data_direct_mr(struct mlx5_ib_mr * mr)1992 static int mlx5_ib_revoke_data_direct_mr(struct mlx5_ib_mr *mr)
1993 {
1994 	struct mlx5_ib_dev *dev = to_mdev(mr->ibmr.device);
1995 	struct ib_umem_dmabuf *umem_dmabuf = to_ib_umem_dmabuf(mr->umem);
1996 	int err;
1997 
1998 	lockdep_assert_held(&dev->data_direct_lock);
1999 	mr->revoked = true;
2000 	err = mlx5r_umr_revoke_mr(mr);
2001 	if (WARN_ON(err))
2002 		return err;
2003 
2004 	ib_umem_dmabuf_revoke(umem_dmabuf);
2005 	return 0;
2006 }
2007 
mlx5_ib_revoke_data_direct_mrs(struct mlx5_ib_dev * dev)2008 void mlx5_ib_revoke_data_direct_mrs(struct mlx5_ib_dev *dev)
2009 {
2010 	struct mlx5_ib_mr *mr, *next;
2011 
2012 	lockdep_assert_held(&dev->data_direct_lock);
2013 
2014 	list_for_each_entry_safe(mr, next, &dev->data_direct_mr_list, dd_node) {
2015 		list_del(&mr->dd_node);
2016 		mlx5_ib_revoke_data_direct_mr(mr);
2017 	}
2018 }
2019 
mlx5_revoke_mr(struct mlx5_ib_mr * mr)2020 static int mlx5_revoke_mr(struct mlx5_ib_mr *mr)
2021 {
2022 	struct mlx5_ib_dev *dev = to_mdev(mr->ibmr.device);
2023 	struct mlx5_cache_ent *ent = mr->mmkey.cache_ent;
2024 
2025 	if (mr->mmkey.cacheable && !mlx5r_umr_revoke_mr(mr) && !cache_ent_find_and_store(dev, mr)) {
2026 		ent = mr->mmkey.cache_ent;
2027 		/* upon storing to a clean temp entry - schedule its cleanup */
2028 		spin_lock_irq(&ent->mkeys_queue.lock);
2029 		if (ent->is_tmp && !ent->tmp_cleanup_scheduled) {
2030 			mod_delayed_work(ent->dev->cache.wq, &ent->dwork,
2031 					 msecs_to_jiffies(30 * 1000));
2032 			ent->tmp_cleanup_scheduled = true;
2033 		}
2034 		spin_unlock_irq(&ent->mkeys_queue.lock);
2035 		return 0;
2036 	}
2037 
2038 	if (ent) {
2039 		spin_lock_irq(&ent->mkeys_queue.lock);
2040 		ent->in_use--;
2041 		mr->mmkey.cache_ent = NULL;
2042 		spin_unlock_irq(&ent->mkeys_queue.lock);
2043 	}
2044 	return destroy_mkey(dev, mr);
2045 }
2046 
__mlx5_ib_dereg_mr(struct ib_mr * ibmr)2047 static int __mlx5_ib_dereg_mr(struct ib_mr *ibmr)
2048 {
2049 	struct mlx5_ib_mr *mr = to_mmr(ibmr);
2050 	struct mlx5_ib_dev *dev = to_mdev(ibmr->device);
2051 	int rc;
2052 
2053 	/*
2054 	 * Any async use of the mr must hold the refcount, once the refcount
2055 	 * goes to zero no other thread, such as ODP page faults, prefetch, any
2056 	 * UMR activity, etc can touch the mkey. Thus it is safe to destroy it.
2057 	 */
2058 	if (IS_ENABLED(CONFIG_INFINIBAND_ON_DEMAND_PAGING) &&
2059 	    refcount_read(&mr->mmkey.usecount) != 0 &&
2060 	    xa_erase(&mr_to_mdev(mr)->odp_mkeys, mlx5_base_mkey(mr->mmkey.key)))
2061 		mlx5r_deref_wait_odp_mkey(&mr->mmkey);
2062 
2063 	if (ibmr->type == IB_MR_TYPE_INTEGRITY) {
2064 		xa_cmpxchg(&dev->sig_mrs, mlx5_base_mkey(mr->mmkey.key),
2065 			   mr->sig, NULL, GFP_KERNEL);
2066 
2067 		if (mr->mtt_mr) {
2068 			rc = mlx5_ib_dereg_mr(&mr->mtt_mr->ibmr, NULL);
2069 			if (rc)
2070 				return rc;
2071 			mr->mtt_mr = NULL;
2072 		}
2073 		if (mr->klm_mr) {
2074 			rc = mlx5_ib_dereg_mr(&mr->klm_mr->ibmr, NULL);
2075 			if (rc)
2076 				return rc;
2077 			mr->klm_mr = NULL;
2078 		}
2079 
2080 		if (mlx5_core_destroy_psv(dev->mdev,
2081 					  mr->sig->psv_memory.psv_idx))
2082 			mlx5_ib_warn(dev, "failed to destroy mem psv %d\n",
2083 				     mr->sig->psv_memory.psv_idx);
2084 		if (mlx5_core_destroy_psv(dev->mdev, mr->sig->psv_wire.psv_idx))
2085 			mlx5_ib_warn(dev, "failed to destroy wire psv %d\n",
2086 				     mr->sig->psv_wire.psv_idx);
2087 		kfree(mr->sig);
2088 		mr->sig = NULL;
2089 	}
2090 
2091 	/* Stop DMA */
2092 	rc = mlx5_revoke_mr(mr);
2093 	if (rc)
2094 		return rc;
2095 
2096 	if (mr->umem) {
2097 		bool is_odp = is_odp_mr(mr);
2098 
2099 		if (!is_odp)
2100 			atomic_sub(ib_umem_num_pages(mr->umem),
2101 				   &dev->mdev->priv.reg_pages);
2102 		ib_umem_release(mr->umem);
2103 		if (is_odp)
2104 			mlx5_ib_free_odp_mr(mr);
2105 	}
2106 
2107 	if (!mr->mmkey.cache_ent)
2108 		mlx5_free_priv_descs(mr);
2109 
2110 	kfree(mr);
2111 	return 0;
2112 }
2113 
dereg_crossing_data_direct_mr(struct mlx5_ib_dev * dev,struct mlx5_ib_mr * mr)2114 static int dereg_crossing_data_direct_mr(struct mlx5_ib_dev *dev,
2115 					struct mlx5_ib_mr *mr)
2116 {
2117 	struct mlx5_ib_mr *dd_crossed_mr = mr->dd_crossed_mr;
2118 	int ret;
2119 
2120 	ret = __mlx5_ib_dereg_mr(&mr->ibmr);
2121 	if (ret)
2122 		return ret;
2123 
2124 	mutex_lock(&dev->data_direct_lock);
2125 	if (!dd_crossed_mr->revoked)
2126 		list_del(&dd_crossed_mr->dd_node);
2127 
2128 	ret = __mlx5_ib_dereg_mr(&dd_crossed_mr->ibmr);
2129 	mutex_unlock(&dev->data_direct_lock);
2130 	return ret;
2131 }
2132 
mlx5_ib_dereg_mr(struct ib_mr * ibmr,struct ib_udata * udata)2133 int mlx5_ib_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata)
2134 {
2135 	struct mlx5_ib_mr *mr = to_mmr(ibmr);
2136 	struct mlx5_ib_dev *dev = to_mdev(ibmr->device);
2137 
2138 	if (mr->data_direct)
2139 		return dereg_crossing_data_direct_mr(dev, mr);
2140 
2141 	return __mlx5_ib_dereg_mr(ibmr);
2142 }
2143 
mlx5_set_umr_free_mkey(struct ib_pd * pd,u32 * in,int ndescs,int access_mode,int page_shift)2144 static void mlx5_set_umr_free_mkey(struct ib_pd *pd, u32 *in, int ndescs,
2145 				   int access_mode, int page_shift)
2146 {
2147 	struct mlx5_ib_dev *dev = to_mdev(pd->device);
2148 	void *mkc;
2149 
2150 	mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry);
2151 
2152 	/* This is only used from the kernel, so setting the PD is OK. */
2153 	set_mkc_access_pd_addr_fields(mkc, IB_ACCESS_RELAXED_ORDERING, 0, pd);
2154 	MLX5_SET(mkc, mkc, free, 1);
2155 	MLX5_SET(mkc, mkc, translations_octword_size, ndescs);
2156 	MLX5_SET(mkc, mkc, access_mode_1_0, access_mode & 0x3);
2157 	MLX5_SET(mkc, mkc, access_mode_4_2, (access_mode >> 2) & 0x7);
2158 	MLX5_SET(mkc, mkc, umr_en, 1);
2159 	MLX5_SET(mkc, mkc, log_page_size, page_shift);
2160 	if (access_mode == MLX5_MKC_ACCESS_MODE_PA ||
2161 	    access_mode == MLX5_MKC_ACCESS_MODE_MTT)
2162 		MLX5_SET(mkc, mkc, ma_translation_mode, MLX5_CAP_GEN(dev->mdev, ats));
2163 }
2164 
_mlx5_alloc_mkey_descs(struct ib_pd * pd,struct mlx5_ib_mr * mr,int ndescs,int desc_size,int page_shift,int access_mode,u32 * in,int inlen)2165 static int _mlx5_alloc_mkey_descs(struct ib_pd *pd, struct mlx5_ib_mr *mr,
2166 				  int ndescs, int desc_size, int page_shift,
2167 				  int access_mode, u32 *in, int inlen)
2168 {
2169 	struct mlx5_ib_dev *dev = to_mdev(pd->device);
2170 	int err;
2171 
2172 	mr->access_mode = access_mode;
2173 	mr->desc_size = desc_size;
2174 	mr->max_descs = ndescs;
2175 
2176 	err = mlx5_alloc_priv_descs(pd->device, mr, ndescs, desc_size);
2177 	if (err)
2178 		return err;
2179 
2180 	mlx5_set_umr_free_mkey(pd, in, ndescs, access_mode, page_shift);
2181 
2182 	err = mlx5_ib_create_mkey(dev, &mr->mmkey, in, inlen);
2183 	if (err)
2184 		goto err_free_descs;
2185 
2186 	mr->mmkey.type = MLX5_MKEY_MR;
2187 	mr->ibmr.lkey = mr->mmkey.key;
2188 	mr->ibmr.rkey = mr->mmkey.key;
2189 
2190 	return 0;
2191 
2192 err_free_descs:
2193 	mlx5_free_priv_descs(mr);
2194 	return err;
2195 }
2196 
mlx5_ib_alloc_pi_mr(struct ib_pd * pd,u32 max_num_sg,u32 max_num_meta_sg,int desc_size,int access_mode)2197 static struct mlx5_ib_mr *mlx5_ib_alloc_pi_mr(struct ib_pd *pd,
2198 				u32 max_num_sg, u32 max_num_meta_sg,
2199 				int desc_size, int access_mode)
2200 {
2201 	int inlen = MLX5_ST_SZ_BYTES(create_mkey_in);
2202 	int ndescs = ALIGN(max_num_sg + max_num_meta_sg, 4);
2203 	int page_shift = 0;
2204 	struct mlx5_ib_mr *mr;
2205 	u32 *in;
2206 	int err;
2207 
2208 	mr = kzalloc(sizeof(*mr), GFP_KERNEL);
2209 	if (!mr)
2210 		return ERR_PTR(-ENOMEM);
2211 
2212 	mr->ibmr.pd = pd;
2213 	mr->ibmr.device = pd->device;
2214 
2215 	in = kzalloc(inlen, GFP_KERNEL);
2216 	if (!in) {
2217 		err = -ENOMEM;
2218 		goto err_free;
2219 	}
2220 
2221 	if (access_mode == MLX5_MKC_ACCESS_MODE_MTT)
2222 		page_shift = PAGE_SHIFT;
2223 
2224 	err = _mlx5_alloc_mkey_descs(pd, mr, ndescs, desc_size, page_shift,
2225 				     access_mode, in, inlen);
2226 	if (err)
2227 		goto err_free_in;
2228 
2229 	mr->umem = NULL;
2230 	kfree(in);
2231 
2232 	return mr;
2233 
2234 err_free_in:
2235 	kfree(in);
2236 err_free:
2237 	kfree(mr);
2238 	return ERR_PTR(err);
2239 }
2240 
mlx5_alloc_mem_reg_descs(struct ib_pd * pd,struct mlx5_ib_mr * mr,int ndescs,u32 * in,int inlen)2241 static int mlx5_alloc_mem_reg_descs(struct ib_pd *pd, struct mlx5_ib_mr *mr,
2242 				    int ndescs, u32 *in, int inlen)
2243 {
2244 	return _mlx5_alloc_mkey_descs(pd, mr, ndescs, sizeof(struct mlx5_mtt),
2245 				      PAGE_SHIFT, MLX5_MKC_ACCESS_MODE_MTT, in,
2246 				      inlen);
2247 }
2248 
mlx5_alloc_sg_gaps_descs(struct ib_pd * pd,struct mlx5_ib_mr * mr,int ndescs,u32 * in,int inlen)2249 static int mlx5_alloc_sg_gaps_descs(struct ib_pd *pd, struct mlx5_ib_mr *mr,
2250 				    int ndescs, u32 *in, int inlen)
2251 {
2252 	return _mlx5_alloc_mkey_descs(pd, mr, ndescs, sizeof(struct mlx5_klm),
2253 				      0, MLX5_MKC_ACCESS_MODE_KLMS, in, inlen);
2254 }
2255 
mlx5_alloc_integrity_descs(struct ib_pd * pd,struct mlx5_ib_mr * mr,int max_num_sg,int max_num_meta_sg,u32 * in,int inlen)2256 static int mlx5_alloc_integrity_descs(struct ib_pd *pd, struct mlx5_ib_mr *mr,
2257 				      int max_num_sg, int max_num_meta_sg,
2258 				      u32 *in, int inlen)
2259 {
2260 	struct mlx5_ib_dev *dev = to_mdev(pd->device);
2261 	u32 psv_index[2];
2262 	void *mkc;
2263 	int err;
2264 
2265 	mr->sig = kzalloc(sizeof(*mr->sig), GFP_KERNEL);
2266 	if (!mr->sig)
2267 		return -ENOMEM;
2268 
2269 	/* create mem & wire PSVs */
2270 	err = mlx5_core_create_psv(dev->mdev, to_mpd(pd)->pdn, 2, psv_index);
2271 	if (err)
2272 		goto err_free_sig;
2273 
2274 	mr->sig->psv_memory.psv_idx = psv_index[0];
2275 	mr->sig->psv_wire.psv_idx = psv_index[1];
2276 
2277 	mr->sig->sig_status_checked = true;
2278 	mr->sig->sig_err_exists = false;
2279 	/* Next UMR, Arm SIGERR */
2280 	++mr->sig->sigerr_count;
2281 	mr->klm_mr = mlx5_ib_alloc_pi_mr(pd, max_num_sg, max_num_meta_sg,
2282 					 sizeof(struct mlx5_klm),
2283 					 MLX5_MKC_ACCESS_MODE_KLMS);
2284 	if (IS_ERR(mr->klm_mr)) {
2285 		err = PTR_ERR(mr->klm_mr);
2286 		goto err_destroy_psv;
2287 	}
2288 	mr->mtt_mr = mlx5_ib_alloc_pi_mr(pd, max_num_sg, max_num_meta_sg,
2289 					 sizeof(struct mlx5_mtt),
2290 					 MLX5_MKC_ACCESS_MODE_MTT);
2291 	if (IS_ERR(mr->mtt_mr)) {
2292 		err = PTR_ERR(mr->mtt_mr);
2293 		goto err_free_klm_mr;
2294 	}
2295 
2296 	/* Set bsf descriptors for mkey */
2297 	mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry);
2298 	MLX5_SET(mkc, mkc, bsf_en, 1);
2299 	MLX5_SET(mkc, mkc, bsf_octword_size, MLX5_MKEY_BSF_OCTO_SIZE);
2300 
2301 	err = _mlx5_alloc_mkey_descs(pd, mr, 4, sizeof(struct mlx5_klm), 0,
2302 				     MLX5_MKC_ACCESS_MODE_KLMS, in, inlen);
2303 	if (err)
2304 		goto err_free_mtt_mr;
2305 
2306 	err = xa_err(xa_store(&dev->sig_mrs, mlx5_base_mkey(mr->mmkey.key),
2307 			      mr->sig, GFP_KERNEL));
2308 	if (err)
2309 		goto err_free_descs;
2310 	return 0;
2311 
2312 err_free_descs:
2313 	destroy_mkey(dev, mr);
2314 	mlx5_free_priv_descs(mr);
2315 err_free_mtt_mr:
2316 	mlx5_ib_dereg_mr(&mr->mtt_mr->ibmr, NULL);
2317 	mr->mtt_mr = NULL;
2318 err_free_klm_mr:
2319 	mlx5_ib_dereg_mr(&mr->klm_mr->ibmr, NULL);
2320 	mr->klm_mr = NULL;
2321 err_destroy_psv:
2322 	if (mlx5_core_destroy_psv(dev->mdev, mr->sig->psv_memory.psv_idx))
2323 		mlx5_ib_warn(dev, "failed to destroy mem psv %d\n",
2324 			     mr->sig->psv_memory.psv_idx);
2325 	if (mlx5_core_destroy_psv(dev->mdev, mr->sig->psv_wire.psv_idx))
2326 		mlx5_ib_warn(dev, "failed to destroy wire psv %d\n",
2327 			     mr->sig->psv_wire.psv_idx);
2328 err_free_sig:
2329 	kfree(mr->sig);
2330 
2331 	return err;
2332 }
2333 
__mlx5_ib_alloc_mr(struct ib_pd * pd,enum ib_mr_type mr_type,u32 max_num_sg,u32 max_num_meta_sg)2334 static struct ib_mr *__mlx5_ib_alloc_mr(struct ib_pd *pd,
2335 					enum ib_mr_type mr_type, u32 max_num_sg,
2336 					u32 max_num_meta_sg)
2337 {
2338 	struct mlx5_ib_dev *dev = to_mdev(pd->device);
2339 	int inlen = MLX5_ST_SZ_BYTES(create_mkey_in);
2340 	int ndescs = ALIGN(max_num_sg, 4);
2341 	struct mlx5_ib_mr *mr;
2342 	u32 *in;
2343 	int err;
2344 
2345 	mr = kzalloc(sizeof(*mr), GFP_KERNEL);
2346 	if (!mr)
2347 		return ERR_PTR(-ENOMEM);
2348 
2349 	in = kzalloc(inlen, GFP_KERNEL);
2350 	if (!in) {
2351 		err = -ENOMEM;
2352 		goto err_free;
2353 	}
2354 
2355 	mr->ibmr.device = pd->device;
2356 	mr->umem = NULL;
2357 
2358 	switch (mr_type) {
2359 	case IB_MR_TYPE_MEM_REG:
2360 		err = mlx5_alloc_mem_reg_descs(pd, mr, ndescs, in, inlen);
2361 		break;
2362 	case IB_MR_TYPE_SG_GAPS:
2363 		err = mlx5_alloc_sg_gaps_descs(pd, mr, ndescs, in, inlen);
2364 		break;
2365 	case IB_MR_TYPE_INTEGRITY:
2366 		err = mlx5_alloc_integrity_descs(pd, mr, max_num_sg,
2367 						 max_num_meta_sg, in, inlen);
2368 		break;
2369 	default:
2370 		mlx5_ib_warn(dev, "Invalid mr type %d\n", mr_type);
2371 		err = -EINVAL;
2372 	}
2373 
2374 	if (err)
2375 		goto err_free_in;
2376 
2377 	kfree(in);
2378 
2379 	return &mr->ibmr;
2380 
2381 err_free_in:
2382 	kfree(in);
2383 err_free:
2384 	kfree(mr);
2385 	return ERR_PTR(err);
2386 }
2387 
mlx5_ib_alloc_mr(struct ib_pd * pd,enum ib_mr_type mr_type,u32 max_num_sg)2388 struct ib_mr *mlx5_ib_alloc_mr(struct ib_pd *pd, enum ib_mr_type mr_type,
2389 			       u32 max_num_sg)
2390 {
2391 	return __mlx5_ib_alloc_mr(pd, mr_type, max_num_sg, 0);
2392 }
2393 
mlx5_ib_alloc_mr_integrity(struct ib_pd * pd,u32 max_num_sg,u32 max_num_meta_sg)2394 struct ib_mr *mlx5_ib_alloc_mr_integrity(struct ib_pd *pd,
2395 					 u32 max_num_sg, u32 max_num_meta_sg)
2396 {
2397 	return __mlx5_ib_alloc_mr(pd, IB_MR_TYPE_INTEGRITY, max_num_sg,
2398 				  max_num_meta_sg);
2399 }
2400 
mlx5_ib_alloc_mw(struct ib_mw * ibmw,struct ib_udata * udata)2401 int mlx5_ib_alloc_mw(struct ib_mw *ibmw, struct ib_udata *udata)
2402 {
2403 	struct mlx5_ib_dev *dev = to_mdev(ibmw->device);
2404 	int inlen = MLX5_ST_SZ_BYTES(create_mkey_in);
2405 	struct mlx5_ib_mw *mw = to_mmw(ibmw);
2406 	unsigned int ndescs;
2407 	u32 *in = NULL;
2408 	void *mkc;
2409 	int err;
2410 	struct mlx5_ib_alloc_mw req = {};
2411 	struct {
2412 		__u32	comp_mask;
2413 		__u32	response_length;
2414 	} resp = {};
2415 
2416 	err = ib_copy_from_udata(&req, udata, min(udata->inlen, sizeof(req)));
2417 	if (err)
2418 		return err;
2419 
2420 	if (req.comp_mask || req.reserved1 || req.reserved2)
2421 		return -EOPNOTSUPP;
2422 
2423 	if (udata->inlen > sizeof(req) &&
2424 	    !ib_is_udata_cleared(udata, sizeof(req),
2425 				 udata->inlen - sizeof(req)))
2426 		return -EOPNOTSUPP;
2427 
2428 	ndescs = req.num_klms ? roundup(req.num_klms, 4) : roundup(1, 4);
2429 
2430 	in = kzalloc(inlen, GFP_KERNEL);
2431 	if (!in)
2432 		return -ENOMEM;
2433 
2434 	mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry);
2435 
2436 	MLX5_SET(mkc, mkc, free, 1);
2437 	MLX5_SET(mkc, mkc, translations_octword_size, ndescs);
2438 	MLX5_SET(mkc, mkc, pd, to_mpd(ibmw->pd)->pdn);
2439 	MLX5_SET(mkc, mkc, umr_en, 1);
2440 	MLX5_SET(mkc, mkc, lr, 1);
2441 	MLX5_SET(mkc, mkc, access_mode_1_0, MLX5_MKC_ACCESS_MODE_KLMS);
2442 	MLX5_SET(mkc, mkc, en_rinval, !!((ibmw->type == IB_MW_TYPE_2)));
2443 	MLX5_SET(mkc, mkc, qpn, 0xffffff);
2444 
2445 	err = mlx5_ib_create_mkey(dev, &mw->mmkey, in, inlen);
2446 	if (err)
2447 		goto free;
2448 
2449 	mw->mmkey.type = MLX5_MKEY_MW;
2450 	ibmw->rkey = mw->mmkey.key;
2451 	mw->mmkey.ndescs = ndescs;
2452 
2453 	resp.response_length =
2454 		min(offsetofend(typeof(resp), response_length), udata->outlen);
2455 	if (resp.response_length) {
2456 		err = ib_copy_to_udata(udata, &resp, resp.response_length);
2457 		if (err)
2458 			goto free_mkey;
2459 	}
2460 
2461 	if (IS_ENABLED(CONFIG_INFINIBAND_ON_DEMAND_PAGING)) {
2462 		err = mlx5r_store_odp_mkey(dev, &mw->mmkey);
2463 		if (err)
2464 			goto free_mkey;
2465 	}
2466 
2467 	kfree(in);
2468 	return 0;
2469 
2470 free_mkey:
2471 	mlx5_core_destroy_mkey(dev->mdev, mw->mmkey.key);
2472 free:
2473 	kfree(in);
2474 	return err;
2475 }
2476 
mlx5_ib_dealloc_mw(struct ib_mw * mw)2477 int mlx5_ib_dealloc_mw(struct ib_mw *mw)
2478 {
2479 	struct mlx5_ib_dev *dev = to_mdev(mw->device);
2480 	struct mlx5_ib_mw *mmw = to_mmw(mw);
2481 
2482 	if (IS_ENABLED(CONFIG_INFINIBAND_ON_DEMAND_PAGING) &&
2483 	    xa_erase(&dev->odp_mkeys, mlx5_base_mkey(mmw->mmkey.key)))
2484 		/*
2485 		 * pagefault_single_data_segment() may be accessing mmw
2486 		 * if the user bound an ODP MR to this MW.
2487 		 */
2488 		mlx5r_deref_wait_odp_mkey(&mmw->mmkey);
2489 
2490 	return mlx5_core_destroy_mkey(dev->mdev, mmw->mmkey.key);
2491 }
2492 
mlx5_ib_check_mr_status(struct ib_mr * ibmr,u32 check_mask,struct ib_mr_status * mr_status)2493 int mlx5_ib_check_mr_status(struct ib_mr *ibmr, u32 check_mask,
2494 			    struct ib_mr_status *mr_status)
2495 {
2496 	struct mlx5_ib_mr *mmr = to_mmr(ibmr);
2497 	int ret = 0;
2498 
2499 	if (check_mask & ~IB_MR_CHECK_SIG_STATUS) {
2500 		pr_err("Invalid status check mask\n");
2501 		ret = -EINVAL;
2502 		goto done;
2503 	}
2504 
2505 	mr_status->fail_status = 0;
2506 	if (check_mask & IB_MR_CHECK_SIG_STATUS) {
2507 		if (!mmr->sig) {
2508 			ret = -EINVAL;
2509 			pr_err("signature status check requested on a non-signature enabled MR\n");
2510 			goto done;
2511 		}
2512 
2513 		mmr->sig->sig_status_checked = true;
2514 		if (!mmr->sig->sig_err_exists)
2515 			goto done;
2516 
2517 		if (ibmr->lkey == mmr->sig->err_item.key)
2518 			memcpy(&mr_status->sig_err, &mmr->sig->err_item,
2519 			       sizeof(mr_status->sig_err));
2520 		else {
2521 			mr_status->sig_err.err_type = IB_SIG_BAD_GUARD;
2522 			mr_status->sig_err.sig_err_offset = 0;
2523 			mr_status->sig_err.key = mmr->sig->err_item.key;
2524 		}
2525 
2526 		mmr->sig->sig_err_exists = false;
2527 		mr_status->fail_status |= IB_MR_CHECK_SIG_STATUS;
2528 	}
2529 
2530 done:
2531 	return ret;
2532 }
2533 
2534 static int
mlx5_ib_map_pa_mr_sg_pi(struct ib_mr * ibmr,struct scatterlist * data_sg,int data_sg_nents,unsigned int * data_sg_offset,struct scatterlist * meta_sg,int meta_sg_nents,unsigned int * meta_sg_offset)2535 mlx5_ib_map_pa_mr_sg_pi(struct ib_mr *ibmr, struct scatterlist *data_sg,
2536 			int data_sg_nents, unsigned int *data_sg_offset,
2537 			struct scatterlist *meta_sg, int meta_sg_nents,
2538 			unsigned int *meta_sg_offset)
2539 {
2540 	struct mlx5_ib_mr *mr = to_mmr(ibmr);
2541 	unsigned int sg_offset = 0;
2542 	int n = 0;
2543 
2544 	mr->meta_length = 0;
2545 	if (data_sg_nents == 1) {
2546 		n++;
2547 		mr->mmkey.ndescs = 1;
2548 		if (data_sg_offset)
2549 			sg_offset = *data_sg_offset;
2550 		mr->data_length = sg_dma_len(data_sg) - sg_offset;
2551 		mr->data_iova = sg_dma_address(data_sg) + sg_offset;
2552 		if (meta_sg_nents == 1) {
2553 			n++;
2554 			mr->meta_ndescs = 1;
2555 			if (meta_sg_offset)
2556 				sg_offset = *meta_sg_offset;
2557 			else
2558 				sg_offset = 0;
2559 			mr->meta_length = sg_dma_len(meta_sg) - sg_offset;
2560 			mr->pi_iova = sg_dma_address(meta_sg) + sg_offset;
2561 		}
2562 		ibmr->length = mr->data_length + mr->meta_length;
2563 	}
2564 
2565 	return n;
2566 }
2567 
2568 static int
mlx5_ib_sg_to_klms(struct mlx5_ib_mr * mr,struct scatterlist * sgl,unsigned short sg_nents,unsigned int * sg_offset_p,struct scatterlist * meta_sgl,unsigned short meta_sg_nents,unsigned int * meta_sg_offset_p)2569 mlx5_ib_sg_to_klms(struct mlx5_ib_mr *mr,
2570 		   struct scatterlist *sgl,
2571 		   unsigned short sg_nents,
2572 		   unsigned int *sg_offset_p,
2573 		   struct scatterlist *meta_sgl,
2574 		   unsigned short meta_sg_nents,
2575 		   unsigned int *meta_sg_offset_p)
2576 {
2577 	struct scatterlist *sg = sgl;
2578 	struct mlx5_klm *klms = mr->descs;
2579 	unsigned int sg_offset = sg_offset_p ? *sg_offset_p : 0;
2580 	u32 lkey = mr->ibmr.pd->local_dma_lkey;
2581 	int i, j = 0;
2582 
2583 	mr->ibmr.iova = sg_dma_address(sg) + sg_offset;
2584 	mr->ibmr.length = 0;
2585 
2586 	for_each_sg(sgl, sg, sg_nents, i) {
2587 		if (unlikely(i >= mr->max_descs))
2588 			break;
2589 		klms[i].va = cpu_to_be64(sg_dma_address(sg) + sg_offset);
2590 		klms[i].bcount = cpu_to_be32(sg_dma_len(sg) - sg_offset);
2591 		klms[i].key = cpu_to_be32(lkey);
2592 		mr->ibmr.length += sg_dma_len(sg) - sg_offset;
2593 
2594 		sg_offset = 0;
2595 	}
2596 
2597 	if (sg_offset_p)
2598 		*sg_offset_p = sg_offset;
2599 
2600 	mr->mmkey.ndescs = i;
2601 	mr->data_length = mr->ibmr.length;
2602 
2603 	if (meta_sg_nents) {
2604 		sg = meta_sgl;
2605 		sg_offset = meta_sg_offset_p ? *meta_sg_offset_p : 0;
2606 		for_each_sg(meta_sgl, sg, meta_sg_nents, j) {
2607 			if (unlikely(i + j >= mr->max_descs))
2608 				break;
2609 			klms[i + j].va = cpu_to_be64(sg_dma_address(sg) +
2610 						     sg_offset);
2611 			klms[i + j].bcount = cpu_to_be32(sg_dma_len(sg) -
2612 							 sg_offset);
2613 			klms[i + j].key = cpu_to_be32(lkey);
2614 			mr->ibmr.length += sg_dma_len(sg) - sg_offset;
2615 
2616 			sg_offset = 0;
2617 		}
2618 		if (meta_sg_offset_p)
2619 			*meta_sg_offset_p = sg_offset;
2620 
2621 		mr->meta_ndescs = j;
2622 		mr->meta_length = mr->ibmr.length - mr->data_length;
2623 	}
2624 
2625 	return i + j;
2626 }
2627 
mlx5_set_page(struct ib_mr * ibmr,u64 addr)2628 static int mlx5_set_page(struct ib_mr *ibmr, u64 addr)
2629 {
2630 	struct mlx5_ib_mr *mr = to_mmr(ibmr);
2631 	__be64 *descs;
2632 
2633 	if (unlikely(mr->mmkey.ndescs == mr->max_descs))
2634 		return -ENOMEM;
2635 
2636 	descs = mr->descs;
2637 	descs[mr->mmkey.ndescs++] = cpu_to_be64(addr | MLX5_EN_RD | MLX5_EN_WR);
2638 
2639 	return 0;
2640 }
2641 
mlx5_set_page_pi(struct ib_mr * ibmr,u64 addr)2642 static int mlx5_set_page_pi(struct ib_mr *ibmr, u64 addr)
2643 {
2644 	struct mlx5_ib_mr *mr = to_mmr(ibmr);
2645 	__be64 *descs;
2646 
2647 	if (unlikely(mr->mmkey.ndescs + mr->meta_ndescs == mr->max_descs))
2648 		return -ENOMEM;
2649 
2650 	descs = mr->descs;
2651 	descs[mr->mmkey.ndescs + mr->meta_ndescs++] =
2652 		cpu_to_be64(addr | MLX5_EN_RD | MLX5_EN_WR);
2653 
2654 	return 0;
2655 }
2656 
2657 static int
mlx5_ib_map_mtt_mr_sg_pi(struct ib_mr * ibmr,struct scatterlist * data_sg,int data_sg_nents,unsigned int * data_sg_offset,struct scatterlist * meta_sg,int meta_sg_nents,unsigned int * meta_sg_offset)2658 mlx5_ib_map_mtt_mr_sg_pi(struct ib_mr *ibmr, struct scatterlist *data_sg,
2659 			 int data_sg_nents, unsigned int *data_sg_offset,
2660 			 struct scatterlist *meta_sg, int meta_sg_nents,
2661 			 unsigned int *meta_sg_offset)
2662 {
2663 	struct mlx5_ib_mr *mr = to_mmr(ibmr);
2664 	struct mlx5_ib_mr *pi_mr = mr->mtt_mr;
2665 	int n;
2666 
2667 	pi_mr->mmkey.ndescs = 0;
2668 	pi_mr->meta_ndescs = 0;
2669 	pi_mr->meta_length = 0;
2670 
2671 	ib_dma_sync_single_for_cpu(ibmr->device, pi_mr->desc_map,
2672 				   pi_mr->desc_size * pi_mr->max_descs,
2673 				   DMA_TO_DEVICE);
2674 
2675 	pi_mr->ibmr.page_size = ibmr->page_size;
2676 	n = ib_sg_to_pages(&pi_mr->ibmr, data_sg, data_sg_nents, data_sg_offset,
2677 			   mlx5_set_page);
2678 	if (n != data_sg_nents)
2679 		return n;
2680 
2681 	pi_mr->data_iova = pi_mr->ibmr.iova;
2682 	pi_mr->data_length = pi_mr->ibmr.length;
2683 	pi_mr->ibmr.length = pi_mr->data_length;
2684 	ibmr->length = pi_mr->data_length;
2685 
2686 	if (meta_sg_nents) {
2687 		u64 page_mask = ~((u64)ibmr->page_size - 1);
2688 		u64 iova = pi_mr->data_iova;
2689 
2690 		n += ib_sg_to_pages(&pi_mr->ibmr, meta_sg, meta_sg_nents,
2691 				    meta_sg_offset, mlx5_set_page_pi);
2692 
2693 		pi_mr->meta_length = pi_mr->ibmr.length;
2694 		/*
2695 		 * PI address for the HW is the offset of the metadata address
2696 		 * relative to the first data page address.
2697 		 * It equals to first data page address + size of data pages +
2698 		 * metadata offset at the first metadata page
2699 		 */
2700 		pi_mr->pi_iova = (iova & page_mask) +
2701 				 pi_mr->mmkey.ndescs * ibmr->page_size +
2702 				 (pi_mr->ibmr.iova & ~page_mask);
2703 		/*
2704 		 * In order to use one MTT MR for data and metadata, we register
2705 		 * also the gaps between the end of the data and the start of
2706 		 * the metadata (the sig MR will verify that the HW will access
2707 		 * to right addresses). This mapping is safe because we use
2708 		 * internal mkey for the registration.
2709 		 */
2710 		pi_mr->ibmr.length = pi_mr->pi_iova + pi_mr->meta_length - iova;
2711 		pi_mr->ibmr.iova = iova;
2712 		ibmr->length += pi_mr->meta_length;
2713 	}
2714 
2715 	ib_dma_sync_single_for_device(ibmr->device, pi_mr->desc_map,
2716 				      pi_mr->desc_size * pi_mr->max_descs,
2717 				      DMA_TO_DEVICE);
2718 
2719 	return n;
2720 }
2721 
2722 static int
mlx5_ib_map_klm_mr_sg_pi(struct ib_mr * ibmr,struct scatterlist * data_sg,int data_sg_nents,unsigned int * data_sg_offset,struct scatterlist * meta_sg,int meta_sg_nents,unsigned int * meta_sg_offset)2723 mlx5_ib_map_klm_mr_sg_pi(struct ib_mr *ibmr, struct scatterlist *data_sg,
2724 			 int data_sg_nents, unsigned int *data_sg_offset,
2725 			 struct scatterlist *meta_sg, int meta_sg_nents,
2726 			 unsigned int *meta_sg_offset)
2727 {
2728 	struct mlx5_ib_mr *mr = to_mmr(ibmr);
2729 	struct mlx5_ib_mr *pi_mr = mr->klm_mr;
2730 	int n;
2731 
2732 	pi_mr->mmkey.ndescs = 0;
2733 	pi_mr->meta_ndescs = 0;
2734 	pi_mr->meta_length = 0;
2735 
2736 	ib_dma_sync_single_for_cpu(ibmr->device, pi_mr->desc_map,
2737 				   pi_mr->desc_size * pi_mr->max_descs,
2738 				   DMA_TO_DEVICE);
2739 
2740 	n = mlx5_ib_sg_to_klms(pi_mr, data_sg, data_sg_nents, data_sg_offset,
2741 			       meta_sg, meta_sg_nents, meta_sg_offset);
2742 
2743 	ib_dma_sync_single_for_device(ibmr->device, pi_mr->desc_map,
2744 				      pi_mr->desc_size * pi_mr->max_descs,
2745 				      DMA_TO_DEVICE);
2746 
2747 	/* This is zero-based memory region */
2748 	pi_mr->data_iova = 0;
2749 	pi_mr->ibmr.iova = 0;
2750 	pi_mr->pi_iova = pi_mr->data_length;
2751 	ibmr->length = pi_mr->ibmr.length;
2752 
2753 	return n;
2754 }
2755 
mlx5_ib_map_mr_sg_pi(struct ib_mr * ibmr,struct scatterlist * data_sg,int data_sg_nents,unsigned int * data_sg_offset,struct scatterlist * meta_sg,int meta_sg_nents,unsigned int * meta_sg_offset)2756 int mlx5_ib_map_mr_sg_pi(struct ib_mr *ibmr, struct scatterlist *data_sg,
2757 			 int data_sg_nents, unsigned int *data_sg_offset,
2758 			 struct scatterlist *meta_sg, int meta_sg_nents,
2759 			 unsigned int *meta_sg_offset)
2760 {
2761 	struct mlx5_ib_mr *mr = to_mmr(ibmr);
2762 	struct mlx5_ib_mr *pi_mr = NULL;
2763 	int n;
2764 
2765 	WARN_ON(ibmr->type != IB_MR_TYPE_INTEGRITY);
2766 
2767 	mr->mmkey.ndescs = 0;
2768 	mr->data_length = 0;
2769 	mr->data_iova = 0;
2770 	mr->meta_ndescs = 0;
2771 	mr->pi_iova = 0;
2772 	/*
2773 	 * As a performance optimization, if possible, there is no need to
2774 	 * perform UMR operation to register the data/metadata buffers.
2775 	 * First try to map the sg lists to PA descriptors with local_dma_lkey.
2776 	 * Fallback to UMR only in case of a failure.
2777 	 */
2778 	n = mlx5_ib_map_pa_mr_sg_pi(ibmr, data_sg, data_sg_nents,
2779 				    data_sg_offset, meta_sg, meta_sg_nents,
2780 				    meta_sg_offset);
2781 	if (n == data_sg_nents + meta_sg_nents)
2782 		goto out;
2783 	/*
2784 	 * As a performance optimization, if possible, there is no need to map
2785 	 * the sg lists to KLM descriptors. First try to map the sg lists to MTT
2786 	 * descriptors and fallback to KLM only in case of a failure.
2787 	 * It's more efficient for the HW to work with MTT descriptors
2788 	 * (especially in high load).
2789 	 * Use KLM (indirect access) only if it's mandatory.
2790 	 */
2791 	pi_mr = mr->mtt_mr;
2792 	n = mlx5_ib_map_mtt_mr_sg_pi(ibmr, data_sg, data_sg_nents,
2793 				     data_sg_offset, meta_sg, meta_sg_nents,
2794 				     meta_sg_offset);
2795 	if (n == data_sg_nents + meta_sg_nents)
2796 		goto out;
2797 
2798 	pi_mr = mr->klm_mr;
2799 	n = mlx5_ib_map_klm_mr_sg_pi(ibmr, data_sg, data_sg_nents,
2800 				     data_sg_offset, meta_sg, meta_sg_nents,
2801 				     meta_sg_offset);
2802 	if (unlikely(n != data_sg_nents + meta_sg_nents))
2803 		return -ENOMEM;
2804 
2805 out:
2806 	/* This is zero-based memory region */
2807 	ibmr->iova = 0;
2808 	mr->pi_mr = pi_mr;
2809 	if (pi_mr)
2810 		ibmr->sig_attrs->meta_length = pi_mr->meta_length;
2811 	else
2812 		ibmr->sig_attrs->meta_length = mr->meta_length;
2813 
2814 	return 0;
2815 }
2816 
mlx5_ib_map_mr_sg(struct ib_mr * ibmr,struct scatterlist * sg,int sg_nents,unsigned int * sg_offset)2817 int mlx5_ib_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg, int sg_nents,
2818 		      unsigned int *sg_offset)
2819 {
2820 	struct mlx5_ib_mr *mr = to_mmr(ibmr);
2821 	int n;
2822 
2823 	mr->mmkey.ndescs = 0;
2824 
2825 	ib_dma_sync_single_for_cpu(ibmr->device, mr->desc_map,
2826 				   mr->desc_size * mr->max_descs,
2827 				   DMA_TO_DEVICE);
2828 
2829 	if (mr->access_mode == MLX5_MKC_ACCESS_MODE_KLMS)
2830 		n = mlx5_ib_sg_to_klms(mr, sg, sg_nents, sg_offset, NULL, 0,
2831 				       NULL);
2832 	else
2833 		n = ib_sg_to_pages(ibmr, sg, sg_nents, sg_offset,
2834 				mlx5_set_page);
2835 
2836 	ib_dma_sync_single_for_device(ibmr->device, mr->desc_map,
2837 				      mr->desc_size * mr->max_descs,
2838 				      DMA_TO_DEVICE);
2839 
2840 	return n;
2841 }
2842