* Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.
* ubs-engine is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
#ifndef UBS_ENGINE_MEM_H
#define UBS_ENGINE_MEM_H
#include <stdint.h>
#include <sys/types.h>
#include "ubs_engine_topo.h"
#ifdef __cplusplus
extern "C" {
#endif
#define UBS_MEM_MAX_SLOT_NUM 16
#define UBS_MEM_MAX_MEMID_NUM 2048
#define UBS_MEM_MAX_NAME_LENGTH 48
#define UBSE_MAX_USR_INFO_LENGTH 32
#define UBS_MEM_MIN_SIZE (4ULL * 1024ULL * 1024ULL)
#define UBS_MEM_MAX_LENDER_CNT 4
#define UBS_MEM_FLAG_NO_WR_DELAY 0x1
#define UBS_MEM_FLAG_SHM_ANONYMOUS 0x2
#define UBS_MEM_FLAG_CACHEABLE 0x4
#define UBS_MEM_MAX_DESC_LIST 2000
typedef enum
{
NUMA_LOCAL,
NUMA_REMOTE
} ubs_mem_numa_type_t;
typedef enum
{
UBSE_NOT_EXIST = 0,
UBSE_CREATING = 1,
UBSE_DELETING = 2,
UBSE_EXIST = 3,
UBSE_ERR_ONLY_IMPORT = 4,
UBSE_ERR_WAIT_UNEXPORT = 5,
UBSE_ERR_ABNORMAL = 6,
UBSE_END = 7
} ubs_mem_stage;
typedef struct {
uint32_t slot_id;
uint32_t socket_id;
uint32_t numa_id;
ubs_mem_numa_type_t numa_type;
uint32_t mem_lend_ratio;
uint64_t mem_total;
uint64_t mem_free;
uint32_t huge_pages_2M;
uint32_t free_huge_pages_2M;
uint32_t huge_pages_1G;
uint32_t free_huge_pages_1G;
uint64_t mem_borrow;
uint64_t mem_lend;
} ubs_mem_numastat_t;
* @brief 查询指定节点numa信息,仅返回可用节点的numa信息,当前只支持本地内存,后续会增加远端numa
*
* @param slot_id [IN] 节点id
* @param numa_mems [OUT] 节点numa信息数组, 调用方需要使用free接口主动释放内存
* @param numa_mem_cnt [OUT] 节点numa信息个数, 范围 [0, UBS_TOPO_NUMA_NUM]
* @return UBS_SUCCESS:操作成功;
* UBS_ERR_NULL_POINTER:空指针;
* UBS_ERR_NOT_SUPPORTED:内存特性不支持;
* UBS_ENGINE_ERR_CONNECTION_FAILED:连接UBSE服务端失败;
* UBS_ENGINE_ERR_AUTH_FAILED:UBSE服务端鉴权不通过;
* UBS_ENGINE_ERR_TIMEOUT:UBSE服务端处理超时;
* UBS_ENGINE_ERR_INTERNAL:UBSE服务端内部错误
* UBS_ENGINE_ERR_NODE_NOT_EXISTS:查询节点不存在
* UBS_ENGINE_ERR_NODE_FAULT:查询节点故障
*/
int32_t ubs_mem_numastat_get(uint32_t slot_id, ubs_mem_numastat_t** numa_mems, uint32_t* numa_mem_cnt);
typedef struct {
uid_t uid;
gid_t gid;
pid_t pid;
} ubs_mem_fd_owner_t;
typedef enum
{
MEM_DISTANCE_L0,
MEM_DISTANCE_L1,
MEM_DISTANCE_L2
} ubs_mem_distance_t;
typedef struct {
uint64_t lender_size;
uint32_t slot_id;
uint32_t socket_id;
uint32_t numa_id;
uint32_t port_id;
} ubs_mem_lender_t;
#define UBS_MEM_DEV_NAME_PREFIX "obmm_shmdev"
#define UBS_MEM_DEV_PATH "/dev/" UBS_MEM_DEV_NAME_PREFIX
typedef struct {
char name[UBS_MEM_MAX_NAME_LENGTH];
uint32_t memid_cnt;
uint64_t memids[UBS_MEM_MAX_MEMID_NUM];
uint64_t mem_size;
size_t unit_size;
ubs_topo_node_t export_node;
ubs_topo_node_t import_node;
ubs_mem_stage mem_stage;
} ubs_mem_fd_desc_t;
* @brief 在本节点创建fd形态的远端内存,该资源的管理权限属于调用者
* 调用者的标识处理原则:能够获取username,则使用username;无法获取username,则使用uid;
*
* @param name [IN] 借用标识, name最大长度48字节, 含结尾字符\0; name在节点内保持唯一性
* @param size [IN] 借用大小, 单位Byte, 取值范围大于等于4*1024*1024
* @param owner [IN] 内存资源使用者属主信息, 可选参数, Null不关注该字段
* @param mode [IN] 内存资源使用者访问权限, 可选参数, 0则不关注该字段
* @param distance [IN] 内存访问距离
* @param fd_desc [OUT] 内存描述信息
* @return UBS_SUCCESS:操作成功;
* UBS_ERR_NULL_POINTER:空指针;
* UBS_ENGINE_ERR_OUT_OF_RANGE:name或者size参数超出范围;
* UBS_ENGINE_ERR_CONNECTION_FAILED:连接UBSE服务端失败;
* UBS_ENGINE_ERR_AUTH_FAILED:UBSE服务端鉴权不通过;
* UBS_ENGINE_ERR_EXISTED:借用关系已存在;
* UBS_ENGINE_ERR_TIMEOUT:UBSE服务端处理超时;
* UBS_ENGINE_ERR_INTERNAL:UBSE服务端内部错误
*/
int32_t ubs_mem_fd_create(const char* name, uint64_t size, const ubs_mem_fd_owner_t* owner, mode_t mode,
ubs_mem_distance_t distance, ubs_mem_fd_desc_t* fd_desc);
* @brief 指定借出信息,在本节点创建fd形态的远端内存,该资源的管理权限属于调用者
* 调用者的标识处理原则:能够获取username,则使用username;无法获取username,则使用uid;
*
* @param name [IN] 借用标识, name最大长度48字节, 含结尾字符\0; name仅可包括大小写字母、数字、"."、":"、"-"以及"_"; name在节点内保持唯一性
* @param owner [IN] 内存资源属主信息, 可选参数, Null不关注该字段
* @param mode [IN] 内存资源的访问权限, 可选参数, 0则不关注该字段
* @param lender [IN] 借出信息
* @param lender_cnt [IN] 借出信息个数, 最大为UBS_MEM_MAX_LENDER_CNT
* @param fd_desc [OUT] 内存描述信息
* @return UBS_SUCCESS:操作成功;
* UBS_ERR_NULL_POINTER:空指针;
* UBS_ENGINE_ERR_OUT_OF_RANGE:name参数超出范围;
* UBS_ENGINE_ERR_CONNECTION_FAILED:连接UBSE服务端失败;
* UBS_ENGINE_ERR_AUTH_FAILED:UBSE服务端鉴权不通过;
* UBS_ENGINE_ERR_EXISTED:借用关系已存在;
* UBS_ENGINE_ERR_TIMEOUT:UBSE服务端处理超时;
* UBS_ENGINE_ERR_INTERNAL:UBSE服务端内部错误
*/
int32_t ubs_mem_fd_create_with_lender(const char* name, const ubs_mem_fd_owner_t* owner, mode_t mode,
const ubs_mem_lender_t* lender, uint32_t lender_cnt, ubs_mem_fd_desc_t* fd_desc);
* @brief 指定候选借出节点范围,在本节点创建fd形态的远端内存,该资源的管理权限属于调用者
* 调用者的标识处理原则:能够获取username,则使用username;无法获取username,则使用uid;
* 候选节点与当前借入节点,必须满足直连要求
*
* @param name [IN] 借用标识, name最大长度48字节, 含结尾字符\0; name仅可包括大小写字母、数字、"."、":"、"-"以及"_"; name在节点内保持唯一性
* @param size [IN] 借用大小, 单位Byte, 取值范围大于等于4*1024*1024
* @param owner [IN] 内存资源属主信息, 可选参数, Null不关注该字段
* @param mode [IN] 内存资源的访问权限, 可选参数, 0则不关注该字段
* @param slot_ids [IN] 候选借出节点范围, 最大为16
* @param slot_cnt [IN] 候选借出节点个数
* @param fd_desc [OUT] 内存描述信息
* @return UBS_SUCCESS:操作成功;
* UBS_ERR_NULL_POINTER:空指针;
* UBS_ENGINE_ERR_OUT_OF_RANGE:name参数超出范围;
* UBS_ENGINE_ERR_CONNECTION_FAILED:连接UBSE服务端失败;
* UBS_ENGINE_ERR_AUTH_FAILED:UBSE服务端鉴权不通过;
* UBS_ENGINE_ERR_EXISTED:借用关系已存在;
* UBS_ENGINE_ERR_TIMEOUT:UBSE服务端处理超时;
* UBS_ENGINE_ERR_INTERNAL:UBSE服务端内部错误
*/
int32_t ubs_mem_fd_create_with_candidate(const char* name, uint64_t size, const ubs_mem_fd_owner_t* owner, mode_t mode,
const uint32_t* slot_ids, uint32_t slot_cnt, ubs_mem_fd_desc_t* fd_desc);
* @brief 改变本节点fd形态远端内存的permission信息; 调用该接口能操控的资源:创建资源时的标识与本次调用方的标识相同;
* 调用者的标识处理原则:能够获取username,则使用username;无法获取username,则使用uid;
*
* @param name [IN] 借用标识, name最大长度48字节, 含结尾字符\0; name仅可包括大小写字母、数字、"."、":"、"-"以及"_"; name在节点内保持唯一性
* @param owner [IN] 内存资源属主信息, 必选参数, 不允许为Null
* @param mode [IN] 内存资源的访问权限, 必选参数, 不允许为0
* @return UBS_SUCCESS:操作成功;
* UBS_ERR_NULL_POINTER:空指针;
* UBS_ENGINE_ERR_OUT_OF_RANGE:name参数超出范围;
* UBS_ENGINE_ERR_CONNECTION_FAILED:连接UBSE服务端失败;
* UBS_ENGINE_ERR_AUTH_FAILED:UBSE服务端鉴权不通过;
* UBS_ENGINE_ERR_NOT_EXIST:借用关系不存在;
* UBS_ENGINE_ERR_TIMEOUT:UBSE服务端处理超时;
* UBS_ENGINE_ERR_INTERNAL:UBSE服务端内部错误
*/
int32_t ubs_mem_fd_permission(const char* name, const ubs_mem_fd_owner_t* owner, mode_t mode);
* @brief 查询本节点fd形态远端内存; 调用该接口能操控的资源:创建资源时的标识与本次调用方的标识相同;
* 调用者的标识处理原则:能够获取username,则使用username;无法获取username,则使用uid;
*
* @param name [IN] 借用标识, name最大长度48字节, 含结尾字符\0; name仅可包括大小写字母、数字、"."、":"、"-"以及"_"; name在节点内保持唯一性
* @param fd_desc [OUT] fd内存信息
* @return UBS_SUCCESS:操作成功;
* UBS_ERR_NULL_POINTER:空指针;
* UBS_ENGINE_ERR_OUT_OF_RANGE:name参数超出范围;
* UBS_ENGINE_ERR_CONNECTION_FAILED:连接UBSE服务端失败;
* UBS_ENGINE_ERR_AUTH_FAILED:UBSE服务端鉴权不通过;
* UBS_ENGINE_ERR_NOT_EXIST:借用关系不存在;
* UBS_ENGINE_ERR_TIMEOUT:UBSE服务端处理超时;
* UBS_ENGINE_ERR_INTERNAL:UBSE服务端内部错误
*/
int32_t ubs_mem_fd_get(const char* name, ubs_mem_fd_desc_t* fd_desc);
* @brief 查询本节点所有fd形态远端内存; 调用该接口能操控的资源:创建资源时的标识与本次调用方的标识相同;
* 调用者的标识处理原则:能够获取username,则使用username;无法获取username,则使用uid;
*
* @param fd_descs [OUT] fd内存描述信息数组, 调用成功时,调用方需要使用free接口主动释放内存
* @param fd_desc_cnt [OUT] fd内存描述信息数组中的元素个数, 范围 [0, UBS_MEM_MAX_DESC_LIST]
* @return UBS_SUCCESS:操作成功;
* UBS_ERR_NULL_POINTER:空指针;
* UBS_ENGINE_ERR_OUT_OF_RANGE:name前缀参数超出范围;
* UBS_ENGINE_ERR_CONNECTION_FAILED:连接UBSE服务端失败;
* UBS_ENGINE_ERR_AUTH_FAILED:UBSE服务端鉴权不通过;
* UBS_ENGINE_ERR_NOT_EXIST:借用关系不存在;
* UBS_ENGINE_ERR_TIMEOUT:UBSE服务端处理超时;
* UBS_ENGINE_ERR_INTERNAL:UBSE服务端内部错误
*/
int32_t ubs_mem_fd_list(ubs_mem_fd_desc_t** fd_descs, uint32_t* fd_desc_cnt);
* @brief 删除本节点指定fd远端内存; 调用该接口能操控的资源:创建资源时的标识与本次调用方的标识相同;
* 调用者的标识处理原则:能够获取username,则使用username;无法获取username,则使用uid;
*
* @param name [IN] 借用标识, name最大长度48字节, 含结尾字符\0; name仅可包括大小写字母、数字、"."、":"、"-"以及"_"; name在节点内保持唯一性
* @return UBS_SUCCESS:操作成功;
* UBS_ERR_NULL_POINTER:空指针;
* UBS_ENGINE_ERR_OUT_OF_RANGE:name参数超出范围;
* UBS_ENGINE_ERR_CONNECTION_FAILED:连接UBSE服务端失败;
* UBS_ENGINE_ERR_AUTH_FAILED:UBSE服务端鉴权不通过;
* UBS_ENGINE_ERR_NOT_EXIST:借用关系不存在;
* UBS_ENGINE_ERR_IMPORT_ABSENT:IMPORT不在位, 无法删除;
* UBS_ENGINE_ERR_CREATING:正在创建过程中;
* UBS_ENGINE_ERR_DELETING:正在删除过程中;
* UBS_ENGINE_ERR_UNIMPORT_SUCCESS:UNIMPORT已经成功, unexport失败, 资源没有释放完全, 后续对账能自动回收;
* UBS_ENGINE_ERR_TIMEOUT:UBSE服务端处理超时;
* UBS_ENGINE_ERR_INTERNAL:UBSE服务端内部错误
*/
int32_t ubs_mem_fd_delete(const char* name);
typedef struct {
char name[UBS_MEM_MAX_NAME_LENGTH];
int64_t numaid;
ubs_topo_node_t export_node;
ubs_topo_node_t import_node;
uint64_t size;
ubs_mem_stage mem_stage;
uint8_t usrInfo[UBSE_MAX_USR_INFO_LENGTH];
} ubs_mem_numa_desc_t;
* @brief 在本节点创建numa形态的远端内存,该资源的管理权限属于调用者
* 调用者的标识处理原则:能够获取username,则使用username;无法获取username,则使用uid;
*
* @param name [IN] 借用标识, name最大长度48, 含结尾字符\0; name仅可包括大小写字母、数字、"."、":"、"-"以及"_"; name在节点内保持唯一性
* @param size [IN] 借用大小, 单位Byte, 取值范围大于等于4*1024*1024
* @param distance [IN] 内存访问跳数
* @param numa_desc [OUT] 借用形成的远端numa信息
* @return UBS_SUCCESS:操作成功;
* UBS_ERR_NULL_POINTER:空指针;
* UBS_ENGINE_ERR_OUT_OF_RANGE:name或者size参数超出范围;
* UBS_ENGINE_ERR_CONNECTION_FAILED:连接UBSE服务端失败;
* UBS_ENGINE_ERR_AUTH_FAILED:UBSE服务端鉴权不通过;
* UBS_ENGINE_ERR_EXISTED:借用关系已存在;
* UBS_ENGINE_ERR_TIMEOUT:UBSE服务端处理超时;
* UBS_ENGINE_ERR_INTERNAL:UBSE服务端内部错误
*/
int32_t ubs_mem_numa_create(const char* name, uint64_t size, ubs_mem_distance_t distance,
ubs_mem_numa_desc_t* numa_desc);
* @brief 指定借出信息,在本节点创建numa形态的远端内存,该资源的管理权限属于调用者
* 调用者的标识处理原则:能够获取username,则使用username;无法获取username,则使用uid;
*
* @param name [IN] 借用标识, name最大长度48, 含结尾字符\0; name仅可包括大小写字母、数字、"."、":"、"-"以及"_"; name在节点内保持唯一性
* @param lender [IN] 借出信息
* @param lender_cnt [IN] 借出信息个数, 最大为UBS_MEM_MAX_LENDER_CNT
* @param numa_desc [OUT] 借用形成的远端numa信息
* @return UBS_SUCCESS:操作成功;
* UBS_ERR_NULL_POINTER:空指针;
* UBS_ENGINE_ERR_OUT_OF_RANGE:name参数超出范围;
* UBS_ENGINE_ERR_CONNECTION_FAILED:连接UBSE服务端失败;
* UBS_ENGINE_ERR_AUTH_FAILED:UBSE服务端鉴权不通过;
* UBS_ENGINE_ERR_EXISTED:借用关系已存在;
* UBS_ENGINE_ERR_TIMEOUT:UBSE服务端处理超时;
* UBS_ENGINE_ERR_INTERNAL:UBSE服务端内部错误
*/
int32_t ubs_mem_numa_create_with_lender(const char* name, const ubs_mem_lender_t* lender, uint32_t lender_cnt,
ubs_mem_numa_desc_t* numa_desc);
* @brief 指定候选借出节点,在本节点创建numa形态的远端内存,该资源的管理权限属于调用者
* 调用者的标识处理原则:能够获取username,则使用username;无法获取username,则使用uid;
* 候选节点与当前借入节点,必须满足直连要求
*
* @param name [IN] 借用标识, name最大长度48字节, 含结尾字符\0; name仅可包括大小写字母、数字、"."、":"、"-"以及"_"; name在节点内保持唯一性
* @param size [IN] 借用大小, 单位Byte, 取值范围大于等于4*1024*1024
* @param slot_ids [IN] 候选借出节点范围
* @param slot_cnt [IN] 候选借出节点个数, 最大为16
* @param numa_desc [OUT] 借用形成的远端numa信息
* @return UBS_SUCCESS:操作成功;
* UBS_ERR_NULL_POINTER:空指针;
* UBS_ENGINE_ERR_OUT_OF_RANGE:name参数超出范围;
* UBS_ENGINE_ERR_CONNECTION_FAILED:连接UBSE服务端失败;
* UBS_ENGINE_ERR_AUTH_FAILED:UBSE服务端鉴权不通过;
* UBS_ENGINE_ERR_EXISTED:借用关系已存在;
* UBS_ENGINE_ERR_TIMEOUT:UBSE服务端处理超时;
* UBS_ENGINE_ERR_INTERNAL:UBSE服务端内部错误
*/
int32_t ubs_mem_numa_create_with_candidate(const char* name, uint64_t size, const uint32_t* slot_ids, uint32_t slot_cnt,
ubs_mem_numa_desc_t* numa_desc);
* @brief 查询本节点numa形态远端内存信息; 调用该接口能操控的资源:创建资源时的标识与本次调用方的标识相同;
* 调用者的标识处理原则:能够获取username,则使用username;无法获取username,则使用uid;
*
* @param name [IN] 借用标识, name最大长度48字节, 含结尾字符\0; name仅可包括大小写字母、数字、"."、":"、"-"以及"_"; name在节点内保持唯一性
* @param numa_desc [OUT] 借用形成的远端numa信息
* @return UBS_SUCCESS:操作成功;
* UBS_ERR_NULL_POINTER:空指针;
* UBS_ENGINE_ERR_OUT_OF_RANGE:name参数超出范围;
* UBS_ENGINE_ERR_CONNECTION_FAILED:连接UBSE服务端失败;
* UBS_ENGINE_ERR_AUTH_FAILED:UBSE服务端鉴权不通过;
* UBS_ENGINE_ERR_NOT_EXIST:借用关系不存在;
* UBS_ENGINE_ERR_TIMEOUT:UBSE服务端处理超时;
* UBS_ENGINE_ERR_INTERNAL:UBSE服务端内部错误
*/
int32_t ubs_mem_numa_get(const char* name, ubs_mem_numa_desc_t* numa_desc);
* @brief 查询本节点所有numa形态远端内存; 调用该接口能操控的资源:创建资源时的标识与本次调用方的标识相同;
* 调用者的标识处理原则:能够获取username,则使用username;无法获取username,则使用uid;
*
* @param numa_desc [OUT] numa内存描述信息数组调用成功时, 调用成功时, 调用方需要使用free接口主动释放内存
* @param numa_desc_cnt [OUT] numa内存描述信息数组中的元素个数
* @return UBS_SUCCESS:操作成功;
* UBS_ERR_NULL_POINTER:空指针;
* UBS_ENGINE_ERR_OUT_OF_RANGE:name参数超出范围;
* UBS_ENGINE_ERR_CONNECTION_FAILED:连接UBSE服务端失败;
* UBS_ENGINE_ERR_AUTH_FAILED:UBSE服务端鉴权不通过;
* UBS_ENGINE_ERR_NOT_EXIST:借用关系不存在
* UBS_ENGINE_ERR_TIMEOUT:UBSE服务端处理超时;
* UBS_ENGINE_ERR_INTERNAL:UBSE服务端内部错误
*/
int32_t ubs_mem_numa_list(ubs_mem_numa_desc_t** numa_descs, uint32_t* numa_desc_cnt);
* @brief 删除本节点指定numa远端内存; 调用该接口能操控的资源:创建资源时的标识与本次调用方的标识相同
* 调用者的标识处理原则:能够获取username,则使用username;无法获取username,则使用uid;
*
* @param name [IN] 借用标识, name最大长度48字节, 含结尾字符\0; name仅可包括大小写字母、数字、"."、":"、"-"以及"_"; name在节点内保持唯一性
* @return UBS_SUCCESS:操作成功;
* UBS_ERR_NULL_POINTER:空指针;
* UBS_ENGINE_ERR_OUT_OF_RANGE:name参数超出范围;
* UBS_ENGINE_ERR_CONNECTION_FAILED:连接UBSE服务端失败;
* UBS_ENGINE_ERR_AUTH_FAILED:UBSE服务端鉴权不通过;
* UBS_ENGINE_ERR_NOT_EXIST:借用关系不存在;
* UBS_ENGINE_ERR_IMPORT_ABSENT:IMPORT不在位, 无法删除;
* UBS_ENGINE_ERR_CREATING:正在创建过程中;
* UBS_ENGINE_ERR_DELETING:正在删除过程中;
* UBS_ENGINE_ERR_UNIMPORT_SUCCESS:UNIMPORT已经成功, unexport失败, 资源没有释放完全, 后续对账能自动回收;
* UBS_ENGINE_ERR_TIMEOUT:UBSE服务端处理超时;
* UBS_ENGINE_ERR_INTERNAL:UBSE服务端内部错误
*/
int32_t ubs_mem_numa_delete(const char* name);
typedef struct {
uint32_t node_cnt;
uint32_t slot_ids[UBS_MEM_MAX_SLOT_NUM];
} ubs_mem_nodes_t;
#define UBS_MEM_MAX_USR_INFO_LEN 32
* @brief
* 创建共享形态的远端内存,该资源的管理权限属于调用者
* 调用者的标识处理原则:能够获取username,则使用username;无法获取username,则使用uid;
* 算法决策借出节点,指定资源提供方,则从中选择,没有指定,则从region中选择;确保所有节点均能使用共享内存
*
* @param name [IN] 借用标识, name最大长度48字节, 含结尾字符\0; name仅可包括大小写字母、数字、"."、":"、"-"以及"_"; name全局保持唯一性
* @param size [IN] 借用大小, 单位Byte, 取值范围大于等于4*1024*1024
* @param usr_info [IN] 调用方私有数据(当前有NC/CC信息), UBSE只负责保存,get时原样返回
* @param flag [IN] 额外的内存借用属性,目前支持写接力
* @param region [IN] 后续使用共享内存的节点范围, region内的节点必须能通过公共节点直连, 可选参数, NULL表示取集群中全量节点
* @param provider [IN] 资源提供方节点范围, null表示不指定, 非null表示指定
* @return UBS_SUCCESS:操作成功;
* UBS_ERR_NULL_POINTER:空指针;
* UBS_ENGINE_ERR_OUT_OF_RANGE:name或者size参数超出范围;
* UBS_ENGINE_ERR_CONNECTION_FAILED:连接UBSE服务端失败;
* UBS_ENGINE_ERR_AUTH_FAILED:UBSE服务端鉴权不通过;
* UBS_ENGINE_ERR_EXISTED:借用关系已存在;
* UBS_ENGINE_ERR_TIMEOUT:UBSE服务端处理超时;
* UBS_ENGINE_ERR_INTERNAL:UBSE服务端内部错误
*/
int32_t ubs_mem_shm_create(const char* name, uint64_t size, uint8_t usr_info[32], uint64_t flag,
const ubs_mem_nodes_t* region, const ubs_mem_nodes_t* provider);
* @brief
* 创建共享形态的远端内存,该资源的管理权限属于调用者
* 调用者的标识处理原则:能够获取username,则使用username;无法获取username,则使用uid;
* 算法决策借出节点,指定资源提供方,则从中选择,没有指定,则从region中选择;确保所有节点均能使用共享内存
*
* @param name [IN] 借用标识, name最大长度48字节, 含结尾字符\0; name仅可包括大小写字母、数字、"."、":"、"-"以及"_"; name全局保持唯一性
* @param size [IN] 借用大小, 单位Byte, 取值范围大于等于4*1024*1024
* @param affinity_socket_id [IN] 亲和的cpu socket_id
* @param usr_info [IN] 调用方私有数据(当前有NC/CC信息), UBSE只负责保存,get时原样返回
* @param flag [IN] 额外的内存借用属性,目前支持写接力
* 传递给OBMM的内存访问属性;全0表示无效,UBSE自行组装访问属性;非全零,直接使用该字段传递给OBMM
* @param region [IN] 后续使用共享内存的节点范围, region内的节点必须能通过公共节点直连, 可选参数, NULL表示取集群中全量节点
* @param provider [IN] 资源提供方节点范围, null表示不指定, 非null表示指定
* @return UBS_SUCCESS:操作成功;
* UBS_ERR_NULL_POINTER:空指针;
* UBS_ENGINE_ERR_OUT_OF_RANGE:name或者size参数超出范围;
* UBS_ENGINE_ERR_CONNECTION_FAILED:连接UBSE服务端失败;
* UBS_ENGINE_ERR_AUTH_FAILED:UBSE服务端鉴权不通过;
* UBS_ENGINE_ERR_EXISTED:借用关系已存在;
* UBS_ENGINE_ERR_TIMEOUT:UBSE服务端处理超时;
* UBS_ENGINE_ERR_INTERNAL:UBSE服务端内部错误
*/
int32_t ubs_mem_shm_create_with_affinity(const char* name, uint64_t size, uint32_t affinity_socket_id,
uint8_t usr_info[32], uint64_t flag, const ubs_mem_nodes_t* region,
const ubs_mem_nodes_t* provider);
* @brief
* 指定numa创建共享内存,该资源的管理权限属于调用者
* 调用者的标识处理原则:能够获取username,则使用username;无法获取username,则使用uid;
* 算法决策借出节点,指定资源提供方,则从中选择,没有指定,则从region中选择;确保所有节点均能使用共享内存
*
* @param name [IN] 借用标识, name最大长度48字节, 含结尾字符\0; name仅可包括大小写字母、数字、"."、":"、"-"以及"_"; name全局保持唯一性
* @param usr_info [IN] 调用方私有数据(当前有NC/CC信息), usr_info应为32字节大小,UBSE只负责保存,get时原样返回,
* @param flag [IN] 额外的内存借用属性,目前支持写接力
* 传递给OBMM的内存访问属性;全0表示无效,UBSE自行组装访问属性;非全零,直接使用该字段传递给OBMM
* @param region [IN] 后续使用共享内存的节点范围, region内的节点必须能通过公共节点直连, 可选参数, NULL表示取集群中全量节点
* @param lender [IN] 借出方信息
* @return UBS_SUCCESS:操作成功;
* UBS_ERR_NULL_POINTER:空指针;
* UBS_ENGINE_ERR_OUT_OF_RANGE:name或者size参数超出范围;
* UBS_ENGINE_ERR_CONNECTION_FAILED:连接UBSE服务端失败;
* UBS_ENGINE_ERR_AUTH_FAILED:UBSE服务端鉴权不通过;
* UBS_ENGINE_ERR_EXISTED:借用关系已存在;
* UBS_ENGINE_ERR_TIMEOUT:UBSE服务端处理超时;
* UBS_ENGINE_ERR_INTERNAL:UBSE服务端内部错误
*/
int32_t ubs_mem_shm_create_with_lender(const char* name, uint8_t usr_info[UBS_MEM_MAX_USR_INFO_LEN], uint64_t flag,
const ubs_mem_nodes_t* region, const ubs_mem_lender_t* lender);
typedef struct {
uint32_t memid_cnt;
uint64_t memids[UBS_MEM_MAX_MEMID_NUM];
ubs_topo_node_t import_node;
ubs_mem_stage mem_stage;
} ubs_mem_shm_import_desc_t;
typedef struct {
char name[UBS_MEM_MAX_NAME_LENGTH];
uint64_t mem_size;
size_t unit_size;
ubs_topo_node_t export_node;
uint8_t usr_info[UBS_MEM_MAX_USR_INFO_LEN];
uint32_t import_desc_cnt;
ubs_mem_stage mem_stage;
ubs_mem_shm_import_desc_t* import_desc;
} ubs_mem_shm_desc_t;
* @brief 导入共享形态的远端内存;
* 调用该接口返回的shm_desc中,import_desc仅包含当前节点的导入信息;
* 调用该接口能操控的资源:创建资源时的标识与本次调用方的标识相同;
* 调用者的标识处理原则:能够获取username,则使用username;无法获取username,则使用uid;
*
* @param name [IN] 借用标识, name最大长度48字节, 含结尾字符\0; name仅可包括大小写字母、数字、"."、":"、"-"以及"_"; name全局保持唯一性
* @param owner [IN] 内存资源属主信息, 可选参数, Null不关注该字段
* @param mode [IN] 内存资源的访问权限, 可选参数, 0则不关注该字段
* @param shm_desc [OUT] 内存描述信息, 调用方需要使用free接口主动释放内存
* @return UBS_SUCCESS:操作成功;
* UBS_ERR_NULL_POINTER:空指针;
* UBS_ENGINE_ERR_OUT_OF_RANGE:name参数超出范围;
* UBS_ENGINE_ERR_CONNECTION_FAILED:连接UBSE服务端失败;
* UBS_ENGINE_ERR_AUTH_FAILED:UBSE服务端鉴权不通过;
* UBS_ENGINE_ERR_SHM_NO_CREATE:共享内存未创建;
* UBS_ENGINE_ERR_CREATING:正在创建过程中;
* UBS_ENGINE_ERR_DELETING:正在删除过程中;
* UBS_ENGINE_ERR_TIMEOUT:UBSE服务端处理超时;
* UBS_ENGINE_ERR_INTERNAL:UBSE服务端内部错误
*/
int32_t ubs_mem_shm_attach(const char* name, const ubs_mem_fd_owner_t* owner, mode_t mode,
ubs_mem_shm_desc_t** shm_desc);
* @brief 查询指定共享形态远端内存; 调用该接口能操控的资源:创建资源时的标识与本次调用方的标识相同;
* 调用者的标识处理原则:能够获取username,则使用username;无法获取username,则使用uid;
*
* @param name [IN] 借用标识前缀, 最大长度48字节, 含结尾字符\0; name仅可包括大小写字母、数字、"."、":"、"-"以及"_"; name全局保持唯一性
* @param shm_desc [OUT] 借用形成的远端fd信息, 调用方需要使用free接口主动释放内存
* @return UBS_SUCCESS:操作成功;
* UBS_ERR_NULL_POINTER:空指针;
* UBS_ENGINE_ERR_OUT_OF_RANGE:name参数超出范围;
* UBS_ENGINE_ERR_CONNECTION_FAILED:连接UBSE服务端失败;
* UBS_ENGINE_ERR_AUTH_FAILED:UBSE服务端鉴权不通过;
* UBS_ENGINE_ERR_NOT_EXIST:借用关系不存在
* UBS_ENGINE_ERR_TIMEOUT:UBSE服务端处理超时;
* UBS_ENGINE_ERR_INTERNAL:UBSE服务端内部错误
*/
int32_t ubs_mem_shm_get(const char* name, ubs_mem_shm_desc_t** shm_desc);
* @brief 查询指定借用标识前缀的共享形态远端内存; 调用该接口能操控的资源:创建资源时的标识与本次调用方的标识相同;
* 调用者的标识处理原则:能够获取username,则使用username;无法获取username,则使用uid;
*
* @param shm_descs [OUT] numa内存描述信息数组调用成功时, 调用成功时, 调用方需要使用free接口主动释放内存
* @param shm_desc_cnt [OUT] numa内存描述信息数组中的元素个数, 范围 [0, UBS_MEM_MAX_DESC_LIST]
* @return UBS_SUCCESS:操作成功;
* UBS_ERR_NULL_POINTER:空指针;
* UBS_ENGINE_ERR_OUT_OF_RANGE:name参数超出范围;
* UBS_ENGINE_ERR_CONNECTION_FAILED:连接UBSE服务端失败;
* UBS_ENGINE_ERR_AUTH_FAILED:UBSE服务端鉴权不通过;
* UBS_ENGINE_ERR_NOT_EXIST:借用关系不存在
* UBS_ENGINE_ERR_TIMEOUT:UBSE服务端处理超时;
* UBS_ENGINE_ERR_INTERNAL:UBSE服务端内部错误
*/
int32_t ubs_mem_shm_list(ubs_mem_shm_desc_t** shm_descs, uint32_t* shm_desc_cnt);
* @brief 查询指定借用标识前缀的共享形态远端内存; 最多查询到2000条借用内存;
* 调用该接口能操控的资源:创建资源时的标识与本次调用方的标识相同;
* 调用者的标识处理原则:能够获取username,则使用username;无法获取username,则使用uid;
*
* @param name_prefix [IN] 指定借用标识前缀
* @param shm_descs [OUT] 共享内存描述信息数组, 调用成功时, 调用方需要使用free接口主动释放内存
* @param shm_desc_cnt [OUT] 共享内存描述信息数组中的元素个数, 范围 [0, UBS_MEM_MAX_DESC_LIST]
* @return UBS_SUCCESS:操作成功;
* UBS_ERR_NULL_POINTER:空指针;
* UBS_ENGINE_ERR_OUT_OF_RANGE:name_prefix参数超出范围;
* UBS_ENGINE_ERR_CONNECTION_FAILED:连接UBSE服务端失败;
* UBS_ENGINE_ERR_AUTH_FAILED:UBSE服务端鉴权不通过;
* UBS_ENGINE_ERR_NOT_EXIST:借用关系不存在;
* UBS_ENGINE_ERR_TIMEOUT:UBSE服务端处理超时;
* UBS_ENGINE_ERR_INTERNAL:UBSE服务端内部错误
*/
int32_t ubs_mem_shm_list_with_prefix(const char* name_prefix, ubs_mem_shm_desc_t** shm_descs, uint32_t* shm_desc_cnt);
* @brief 删除导入共享形态的远端内存; 调用该接口能操控的资源:创建资源时的标识与本次调用方的标识相同
* 调用者的标识处理原则:能够获取username,则使用username;无法获取username,则使用uid;
*
* @param name [IN] 借用标识, name最大长度48字节, 含结尾字符\0; name仅可包括大小写字母、数字、"."、":"、"-"以及"_"; name全局保持唯一性
* @return UBS_SUCCESS:操作成功;
* UBS_ERR_NULL_POINTER:空指针;
* UBS_ENGINE_ERR_OUT_OF_RANGE:name参数超出范围;
* UBS_ENGINE_ERR_CONNECTION_FAILED:连接UBSE服务端失败;
* UBS_ENGINE_ERR_AUTH_FAILED:UBSE服务端鉴权不通过;
* UBS_ENGINE_ERR_SHM_NO_ATTACH:共享内存未导入;
* UBS_ENGINE_ERR_SHM_ATTACHING:正在导入共享内存过程中;
* UBS_ENGINE_ERR_SHM_DETACHING:正在删除导入共享内存过程中;
* UBS_ENGINE_ERR_TIMEOUT:UBSE服务端处理超时;
* UBS_ENGINE_ERR_INTERNAL:UBSE服务端内部错误
*/
int32_t ubs_mem_shm_detach(const char* name);
* @brief 删除指定共享形态远端内存; 调用该接口能操控的资源:创建资源时的标识与本次调用方的标识相同
* 调用者的标识处理原则:能够获取username,则使用username;无法获取username,则使用uid;
* 该接口只设置删除标记,等到所有attach都解除之后才删除;
* 标记删除后,原有attach能继续使用,新的attach返回失败;
* 标记删除后,借出节点重启,即使attach还存在,也会完成真正删除
*
* @param name [IN] 借用标识, name最大长度48字节, 含结尾字符\0; name仅可包括大小写字母、数字、"."、":"、"-"以及"_"; name全局保持唯一性
* @return UBS_SUCCESS:操作成功;
* UBS_ERR_NULL_POINTER:空指针;
* UBS_ENGINE_ERR_OUT_OF_RANGE:name参数超出范围;
* UBS_ENGINE_ERR_CONNECTION_FAILED:连接UBSE服务端失败;
* UBS_ENGINE_ERR_AUTH_FAILED:UBSE服务端鉴权不通过;
* UBS_ENGINE_ERR_NOT_EXIST:借用关系不存在;
* UBS_ENGINE_ERR_CREATING:正在创建过程中;
* UBS_ENGINE_ERR_DELETING:正在删除过程中;
* UBS_ENGINE_ERR_TIMEOUT:UBSE服务端处理超时;
* UBS_ENGINE_ERR_INTERNAL:UBSE服务端内部错误
*/
int32_t ubs_mem_shm_delete(const char* name);
typedef enum
{
UB_MEM_ATOMIC_DATA_ERR = 0,
UB_MEM_READ_DATA_ERR,
UB_MEM_FLOW_POISON,
UB_MEM_FLOW_READ_AUTH_POISON,
UB_MEM_FLOW_READ_AUTH_RESPERR,
UB_MEM_TIMEOUT_POISON,
UB_MEM_TIMEOUT_RESPERR,
UB_MEM_READ_DATA_POISON,
UB_MEM_READ_DATA_RESPERR,
MAR_NOPORT_VLD_INT_ERR,
MAR_FLUX_INT_ERR,
MAR_WITHOUT_CXT_ERR,
RSP_BKPRE_OVER_TIMEOUT_ERR,
MAR_NEAR_AUTH_FAIL_ERR,
MAR_FAR_AUTH_FAIL_ERR,
MAR_TIMEOUT_ERR,
MAR_ILLEGAL_ACCESS_ERR,
REMOTE_READ_DATA_ERR_OR_WRITE_RESPONSE_ERR,
MEM_EXPORT_FAULT,
MEM_LINK_DOWN,
MEM_LINK_UP,
UB_MEM_HEALTHY = 1000,
} ubs_mem_fault_type_t;
typedef struct {
uint32_t memid_cnt;
uint64_t memids[UBS_MEM_MAX_MEMID_NUM];
ubs_mem_fault_type_t memid_status[UBS_MEM_MAX_MEMID_NUM];
} ubs_mem_memids_fault_t;
typedef int32_t (*ubs_mem_shm_fault_handler)(const char* name, uint64_t memid, ubs_mem_fault_type_t type);
typedef int32_t (*ubs_mem_fd_fault_handler)(const char* name, uint64_t memid, ubs_mem_fault_type_t type);
typedef int32_t (*ubs_mem_numa_fault_handler)(const char* name, uint64_t numaid, ubs_mem_fault_type_t type);
* @brief 查询指定共享远端内存的状态; 调用该接口能操控的资源:创建资源时的标识与本次调用方的标识相同;
* 调用者的标识处理原则:能够获取username,则使用username;无法获取username,则使用uid;
*
* @param name [IN] 借用标识, 最大长度48字节, 含结尾字符\0; name仅可包括大小写字母、数字、"."、":"、"-"以及"_"; name全局保持唯一性
* @param shm_status [OUT] 内存块的健康状态
* @return UBS_SUCCESS:操作成功;
* UBS_ERR_NULL_POINTER:空指针;
* UBS_ENGINE_ERR_OUT_OF_RANGE:name参数超出范围;
* UBS_ENGINE_ERR_CONNECTION_FAILED:连接UBSE服务端失败;
* UBS_ENGINE_ERR_AUTH_FAILED:UBSE服务端鉴权不通过;
* UBS_ENGINE_ERR_NOT_EXIST:借用关系不存在
* UBS_ENGINE_ERR_TIMEOUT:UBSE服务端处理超时;
* UBS_ENGINE_ERR_INTERNAL:UBSE服务端内部错误
*/
int32_t ubs_mem_shm_fault_get(const char* name, ubs_mem_memids_fault_t* fault);
* @brief 客户端订阅共享内存故障事件
* @param[in] registerFunc: 共享内存故障事件响应处理函数
* @return 成功返回0, 失败返回非0
*/
int32_t ubs_mem_shm_fault_register(ubs_mem_shm_fault_handler handler);
* @brief 客户端订阅fd内存故障事件
* @param[in] registerFunc: fd内存故障事件响应处理函数
* @return 成功返回0, 失败返回非0
*/
int32_t ubs_mem_fd_fault_register(ubs_mem_fd_fault_handler handler);
* @brief 客户端订阅numa内存故障事件
* @param[in] registerFunc: numa内存故障事件响应处理函数
* @return 成功返回0, 失败返回非0
*/
int32_t ubs_mem_numa_fault_register(ubs_mem_numa_fault_handler handler);
typedef struct {
uint32_t export_slot_id;
uint64_t export_memid;
} ubs_mem_export_memid_t;
* @brief 通过指定fd形态导入端memid查询导出端memid;
* 调用者的标识处理原则:能够获取username,则使用username;无法获取username,则使用uid;
*
* @param name [IN] 借用标识, 最大长度48字节, 含结尾字符\0; name仅可包括大小写字母、数字、"."、":"、"-"以及"_";
* @param import_memid [IN] 导入memid
* @param mem_info [OUT] 导出mem信息
* @return UBS_SUCCESS:操作成功;
* UBS_ERR_NULL_POINTER:空指针;
* UBS_ERR_INVALID_ARG:参数无效;
* UBS_ENGINE_ERR_CONNECTION_FAILED:连接UBSE服务端失败;
* UBS_ENGINE_ERR_AUTH_FAILED:UBSE服务端鉴权不通过;
* UBS_ENGINE_ERR_NOT_EXIST:借用关系不存在
* UBS_ENGINE_ERR_CREATING:正在创建过程中;
* UBS_ENGINE_ERR_DELETING:正在删除过程中;
* UBS_ENGINE_ERR_EXPORT_LEDGERING: 导出节点对账中、调用方进行重试
* UBS_ENGINE_ERR_TIMEOUT:UBSE服务端处理超时;
* UBS_ENGINE_ERR_INTERNAL:UBSE服务端内部错误
*/
int32_t ubs_mem_fd_get_memid_by_import(const char* name, uint64_t import_memid, ubs_mem_export_memid_t* mem_info);
* @brief 通过指定numa形态导入端memid查询导出端memid;
* 调用者的标识处理原则:能够获取username,则使用username;无法获取username,则使用uid;
*
* @param name [IN] 借用标识, 最大长度48字节, 含结尾字符\0; name仅可包括大小写字母、数字、"."、":"、"-"以及"_";
* @param import_memid [IN] 导入memid
* @param mem_info [OUT] 导出mem信息
* @return UBS_SUCCESS:操作成功;
* UBS_ERR_NULL_POINTER:空指针;
* UBS_ERR_INVALID_ARG:参数无效;
* UBS_ENGINE_ERR_CONNECTION_FAILED:连接UBSE服务端失败;
* UBS_ENGINE_ERR_AUTH_FAILED:UBSE服务端鉴权不通过;
* UBS_ENGINE_ERR_NOT_EXIST:借用关系不存在
* UBS_ENGINE_ERR_CREATING:正在创建过程中;
* UBS_ENGINE_ERR_DELETING:正在删除过程中;
* UBS_ENGINE_ERR_EXPORT_LEDGERING: 导出节点对账中、调用方进行重试
* UBS_ENGINE_ERR_TIMEOUT:UBSE服务端处理超时;
* UBS_ENGINE_ERR_INTERNAL:UBSE服务端内部错误
*/
int32_t ubs_mem_numa_get_memid_by_import(const char* name, uint64_t import_memid, ubs_mem_export_memid_t* mem_info);
* @brief 通过指定shm形态导入端memid查询导出端memid;
* 调用者的标识处理原则:能够获取username,则使用username;无法获取username,则使用uid;
*
* @param name [IN] 借用标识, 最大长度48字节, 含结尾字符\0; name仅可包括大小写字母、数字、"."、":"、"-"以及"_";
* @param import_memid [IN] 导入memid
* @param mem_info [OUT] 导出mem信息
* @return UBS_SUCCESS:操作成功;
* UBS_ERR_NULL_POINTER:空指针;
* UBS_ERR_INVALID_ARG:参数无效;
* UBS_ENGINE_ERR_CONNECTION_FAILED:连接UBSE服务端失败;
* UBS_ENGINE_ERR_AUTH_FAILED:UBSE服务端鉴权不通过;
* UBS_ENGINE_ERR_NOT_EXIST:借用关系不存在
* UBS_ENGINE_ERR_CREATING:正在创建过程中;
* UBS_ENGINE_ERR_DELETING:正在删除过程中;
* UBS_ENGINE_ERR_EXPORT_LEDGERING: 导出节点对账中、调用方进行重试
* UBS_ENGINE_ERR_TIMEOUT:UBSE服务端处理超时;
* UBS_ENGINE_ERR_INTERNAL:UBSE服务端内部错误
*/
int32_t ubs_mem_shm_get_memid_by_import(const char* name, uint64_t import_memid, ubs_mem_export_memid_t* mem_info);
#ifdef __cplusplus
}
#endif
#endif