1
2
3
4
5#include <stddef.h>
6#include <errno.h>
7#include <string.h>
8#include <stdint.h>
9#include <unistd.h>
10#include <sys/mman.h>
11#include <inttypes.h>
12
13#include <rte_errno.h>
14#include <rte_eal_paging.h>
15
16#include "mlx5_common_utils.h"
17#include "mlx5_common_log.h"
18#include "mlx5_autoconf.h"
19#include <mlx5_glue.h>
20#include <mlx5_malloc.h>
21#include <mlx5_common.h>
22#include <mlx5_common_mr.h>
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38static void *
39mlx5_alloc_verbs_buf(size_t size, void *data)
40{
41 struct rte_device *dev = data;
42 void *ret;
43 size_t alignment = rte_mem_page_size();
44 if (alignment == (size_t)-1) {
45 DRV_LOG(ERR, "Failed to get mem page size");
46 rte_errno = ENOMEM;
47 return NULL;
48 }
49
50 MLX5_ASSERT(data != NULL);
51 ret = mlx5_malloc(0, size, alignment, dev->numa_node);
52 if (!ret && size)
53 rte_errno = ENOMEM;
54 return ret;
55}
56
57
58
59
60
61
62
63
64
65static void
66mlx5_free_verbs_buf(void *ptr, void *data __rte_unused)
67{
68 MLX5_ASSERT(data != NULL);
69 mlx5_free(ptr);
70}
71
72
73
74
75
76
77
78void
79mlx5_set_context_attr(struct rte_device *dev, struct ibv_context *ctx)
80{
81 struct mlx5dv_ctx_allocators allocator = {
82 .alloc = &mlx5_alloc_verbs_buf,
83 .free = &mlx5_free_verbs_buf,
84 .data = dev,
85 };
86
87
88 mlx5_glue->dv_set_context_attr(ctx, MLX5DV_CTX_ATTR_BUF_ALLOCATORS,
89 (void *)((uintptr_t)&allocator));
90}
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108int
109mlx5_common_verbs_reg_mr(void *pd, void *addr, size_t length,
110 struct mlx5_pmd_mr *pmd_mr)
111{
112 struct ibv_mr *ibv_mr;
113
114 ibv_mr = mlx5_glue->reg_mr(pd, addr, length,
115 IBV_ACCESS_LOCAL_WRITE |
116 (haswell_broadwell_cpu ? 0 :
117 IBV_ACCESS_RELAXED_ORDERING));
118 if (!ibv_mr)
119 return -1;
120
121 *pmd_mr = (struct mlx5_pmd_mr){
122 .lkey = ibv_mr->lkey,
123 .addr = ibv_mr->addr,
124 .len = ibv_mr->length,
125 .obj = (void *)ibv_mr,
126 };
127 return 0;
128}
129
130
131
132
133
134
135
136
137void
138mlx5_common_verbs_dereg_mr(struct mlx5_pmd_mr *pmd_mr)
139{
140 if (pmd_mr && pmd_mr->obj != NULL) {
141 claim_zero(mlx5_glue->dereg_mr(pmd_mr->obj));
142 memset(pmd_mr, 0, sizeof(*pmd_mr));
143 }
144}
145
146
147
148
149
150
151
152
153
154void
155mlx5_os_set_reg_mr_cb(mlx5_reg_mr_t *reg_mr_cb, mlx5_dereg_mr_t *dereg_mr_cb)
156{
157 *reg_mr_cb = mlx5_common_verbs_reg_mr;
158 *dereg_mr_cb = mlx5_common_verbs_dereg_mr;
159}
160