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