Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F157415706
D32193.id95850.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
7 KB
Referenced Files
None
Subscribers
None
D32193.id95850.diff
View Options
diff --git a/contrib/ofed/libmlx5/buf.c b/contrib/ofed/libmlx5/buf.c
--- a/contrib/ofed/libmlx5/buf.c
+++ b/contrib/ofed/libmlx5/buf.c
@@ -320,6 +320,36 @@
mlx5_spin_unlock(&ctx->hugetlb_lock);
}
+void mlx5_free_buf_extern(struct mlx5_context *ctx, struct mlx5_buf *buf)
+{
+ ibv_dofork_range(buf->buf, buf->length);
+ ctx->extern_alloc.free(buf->buf, ctx->extern_alloc.data);
+}
+
+int mlx5_alloc_buf_extern(struct mlx5_context *ctx, struct mlx5_buf *buf,
+ size_t size)
+{
+ void *addr;
+
+ addr = ctx->extern_alloc.alloc(size, ctx->extern_alloc.data);
+ if (addr || size == 0) {
+ if (ibv_dontfork_range(addr, size)) {
+ mlx5_dbg(stderr, MLX5_DBG_CONTIG,
+ "External mode dontfork_range failed\n");
+ ctx->extern_alloc.free(addr,
+ ctx->extern_alloc.data);
+ return -1;
+ }
+ buf->buf = addr;
+ buf->length = size;
+ buf->type = MLX5_ALLOC_TYPE_EXTERNAL;
+ return 0;
+ }
+
+ mlx5_dbg(stderr, MLX5_DBG_CONTIG, "External alloc failed\n");
+ return -1;
+}
+
int mlx5_alloc_prefered_buf(struct mlx5_context *mctx,
struct mlx5_buf *buf,
size_t size, int page_size,
@@ -362,6 +392,9 @@
"Contig allocation failed, fallback to default mode\n");
}
+ if (type == MLX5_ALLOC_TYPE_EXTERNAL)
+ return mlx5_alloc_buf_extern(mctx, buf, size);
+
return mlx5_alloc_buf(buf, size, page_size);
}
@@ -382,6 +415,11 @@
case MLX5_ALLOC_TYPE_CONTIG:
mlx5_free_buf_contig(ctx, buf);
break;
+
+ case MLX5_ALLOC_TYPE_EXTERNAL:
+ mlx5_free_buf_extern(ctx, buf);
+ break;
+
default:
fprintf(stderr, "Bad allocation type\n");
}
@@ -414,7 +452,13 @@
return r;
}
-void mlx5_get_alloc_type(const char *component,
+bool mlx5_is_extern_alloc(struct mlx5_context *context)
+{
+ return context->extern_alloc.alloc && context->extern_alloc.free;
+}
+
+void mlx5_get_alloc_type(struct mlx5_context *context,
+ const char *component,
enum mlx5_alloc_type *alloc_type,
enum mlx5_alloc_type default_type)
@@ -422,6 +466,11 @@
char *env_value;
char name[128];
+ if (mlx5_is_extern_alloc(context)) {
+ *alloc_type = MLX5_ALLOC_TYPE_EXTERNAL;
+ return;
+ }
+
snprintf(name, sizeof(name), "%s_ALLOC_TYPE", component);
*alloc_type = default_type;
diff --git a/contrib/ofed/libmlx5/cq.c b/contrib/ofed/libmlx5/cq.c
--- a/contrib/ofed/libmlx5/cq.c
+++ b/contrib/ofed/libmlx5/cq.c
@@ -1499,7 +1499,7 @@
if (mlx5_use_huge("HUGE_CQ"))
default_type = MLX5_ALLOC_TYPE_HUGE;
- mlx5_get_alloc_type(MLX5_CQ_PREFIX, &type, default_type);
+ mlx5_get_alloc_type(mctx, MLX5_CQ_PREFIX, &type, default_type);
ret = mlx5_alloc_prefered_buf(mctx, buf,
align(nent * cqe_sz, dev->page_size),
diff --git a/contrib/ofed/libmlx5/dbrec.c b/contrib/ofed/libmlx5/dbrec.c
--- a/contrib/ofed/libmlx5/dbrec.c
+++ b/contrib/ofed/libmlx5/dbrec.c
@@ -53,6 +53,7 @@
int pp;
int i;
int nlong;
+ int ret;
pp = ps / context->cache_line_size;
nlong = (pp + 8 * sizeof(long) - 1) / (8 * sizeof(long));
@@ -61,7 +62,11 @@
if (!page)
return NULL;
- if (mlx5_alloc_buf(&page->buf, ps, ps)) {
+ if (mlx5_is_extern_alloc(context))
+ ret = mlx5_alloc_buf_extern(context, &page->buf, ps);
+ else
+ ret = mlx5_alloc_buf(&page->buf, ps, ps);
+ if (ret) {
free(page);
return NULL;
}
@@ -139,7 +144,11 @@
if (page->next)
page->next->prev = page->prev;
- mlx5_free_buf(&page->buf);
+ if (page->buf.type == MLX5_ALLOC_TYPE_EXTERNAL)
+ mlx5_free_buf_extern(context, &page->buf);
+ else
+ mlx5_free_buf(&page->buf);
+
free(page);
}
diff --git a/contrib/ofed/libmlx5/libmlx5.map b/contrib/ofed/libmlx5/libmlx5.map
--- a/contrib/ofed/libmlx5/libmlx5.map
+++ b/contrib/ofed/libmlx5/libmlx5.map
@@ -14,4 +14,5 @@
MLX5_1.2 {
global:
mlx5dv_init_obj;
+ mlx5dv_set_context_attr;
} MLX5_1.1;
diff --git a/contrib/ofed/libmlx5/mlx5.h b/contrib/ofed/libmlx5/mlx5.h
--- a/contrib/ofed/libmlx5/mlx5.h
+++ b/contrib/ofed/libmlx5/mlx5.h
@@ -162,6 +162,7 @@
MLX5_ALLOC_TYPE_CONTIG,
MLX5_ALLOC_TYPE_PREFER_HUGE,
MLX5_ALLOC_TYPE_PREFER_CONTIG,
+ MLX5_ALLOC_TYPE_EXTERNAL,
MLX5_ALLOC_TYPE_ALL
};
@@ -268,6 +269,7 @@
uint32_t uar_size;
uint64_t vendor_cap_flags; /* Use enum mlx5_vendor_cap_flags */
struct mlx5dv_cqe_comp_caps cqe_comp_caps;
+ struct mlx5dv_ctx_allocators extern_alloc;
};
struct mlx5_bitmap {
@@ -558,10 +560,15 @@
enum mlx5_alloc_type alloc_type,
const char *component);
int mlx5_free_actual_buf(struct mlx5_context *ctx, struct mlx5_buf *buf);
-void mlx5_get_alloc_type(const char *component,
+void mlx5_get_alloc_type(struct mlx5_context *context,
+ const char *component,
enum mlx5_alloc_type *alloc_type,
enum mlx5_alloc_type default_alloc_type);
int mlx5_use_huge(const char *key);
+bool mlx5_is_extern_alloc(struct mlx5_context *context);
+int mlx5_alloc_buf_extern(struct mlx5_context *ctx, struct mlx5_buf *buf,
+ size_t size);
+void mlx5_free_buf_extern(struct mlx5_context *ctx, struct mlx5_buf *buf);
__be32 *mlx5_alloc_dbrec(struct mlx5_context *context);
void mlx5_free_db(struct mlx5_context *context, __be32 *db);
diff --git a/contrib/ofed/libmlx5/mlx5.c b/contrib/ofed/libmlx5/mlx5.c
--- a/contrib/ofed/libmlx5/mlx5.c
+++ b/contrib/ofed/libmlx5/mlx5.c
@@ -736,6 +736,22 @@
return ret;
}
+int mlx5dv_set_context_attr(struct ibv_context *ibv_ctx,
+ enum mlx5dv_set_ctx_attr_type type, void *attr)
+{
+ struct mlx5_context *ctx = to_mctx(ibv_ctx);
+
+ switch (type) {
+ case MLX5DV_CTX_ATTR_BUF_ALLOCATORS:
+ ctx->extern_alloc = *((struct mlx5dv_ctx_allocators *)attr);
+ break;
+ default:
+ return ENOTSUP;
+ }
+
+ return 0;
+}
+
static void adjust_uar_info(struct mlx5_device *mdev,
struct mlx5_context *context,
struct mlx5_alloc_ucontext_resp resp)
diff --git a/contrib/ofed/libmlx5/mlx5dv.h b/contrib/ofed/libmlx5/mlx5dv.h
--- a/contrib/ofed/libmlx5/mlx5dv.h
+++ b/contrib/ofed/libmlx5/mlx5dv.h
@@ -620,4 +620,24 @@
seg->inline_hdr_sz = htobe16(inline_hdr_sz);
memcpy(seg->inline_hdr_start, inline_hdr_start, inline_hdr_sz);
}
+
+enum mlx5dv_set_ctx_attr_type {
+ MLX5DV_CTX_ATTR_BUF_ALLOCATORS = 1,
+};
+
+struct mlx5dv_ctx_allocators {
+ void *(*alloc)(size_t size, void *priv_data);
+ void (*free)(void *ptr, void *priv_data);
+ void *data;
+};
+
+/*
+ * Generic context attributes set API
+ *
+ * Returns 0 on success, or the value of errno on failure
+ * (which indicates the failure reason).
+ */
+int mlx5dv_set_context_attr(struct ibv_context *context,
+ enum mlx5dv_set_ctx_attr_type type, void *attr);
+
#endif /* _MLX5DV_H_ */
diff --git a/contrib/ofed/libmlx5/verbs.c b/contrib/ofed/libmlx5/verbs.c
--- a/contrib/ofed/libmlx5/verbs.c
+++ b/contrib/ofed/libmlx5/verbs.c
@@ -1077,7 +1077,7 @@
if (mlx5_use_huge(qp_huge_key))
default_alloc_type = MLX5_ALLOC_TYPE_HUGE;
- mlx5_get_alloc_type(MLX5_QP_PREFIX, &alloc_type,
+ mlx5_get_alloc_type(to_mctx(context), MLX5_QP_PREFIX, &alloc_type,
default_alloc_type);
err = mlx5_alloc_prefered_buf(to_mctx(context), &qp->buf,
@@ -2002,7 +2002,10 @@
int size)
{
int err;
- enum mlx5_alloc_type default_alloc_type = MLX5_ALLOC_TYPE_PREFER_CONTIG;
+ enum mlx5_alloc_type alloc_type;
+
+ mlx5_get_alloc_type(to_mctx(context), MLX5_RWQ_PREFIX,
+ &alloc_type, MLX5_ALLOC_TYPE_ANON);
rwq->rq.wrid = malloc(rwq->rq.wqe_cnt * sizeof(uint64_t));
if (!rwq->rq.wrid) {
@@ -2014,7 +2017,7 @@
align(rwq->buf_size, to_mdev
(context->device)->page_size),
to_mdev(context->device)->page_size,
- default_alloc_type,
+ alloc_type,
MLX5_RWQ_PREFIX);
if (err) {
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, May 22, 4:28 AM (16 h, 57 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33414655
Default Alt Text
D32193.id95850.diff (7 KB)
Attached To
Mode
D32193: libmlx5: External memory binding for HW resources
Attached
Detach File
Event Timeline
Log In to Comment