From 5d05f308748c525e92668718905e903d60af3454 Mon Sep 17 00:00:00 2001 From: yuhao_zhang Date: Mon, 15 Dec 2025 06:48:24 +0800 Subject: [PATCH] fixes typo and update interface description Signed-off-by: yuhao_zhang --- doc/README.md | 8 ---- doc/obmm.md | 12 ++--- doc/obmm_export.md | 95 +++++++++++++++++++++++++------------ doc/obmm_import.md | 16 +++---- doc/obmm_preimport_sysfs.md | 4 +- doc/obmm_query.md | 4 +- doc/obmm_set_ownership.md | 1 + doc/obmm_shmdev.md | 72 ++++++++++++++++++++++++++++ doc/obmm_shmdev_sysfs.md | 19 +++++--- doc/obmm_unimport.md | 3 -- doc/obmm_unpreimport.md | 2 +- 11 files changed, 168 insertions(+), 68 deletions(-) diff --git a/doc/README.md b/doc/README.md index 9108d91..d85dc00 100644 --- a/doc/README.md +++ b/doc/README.md @@ -8,10 +8,6 @@ 2. 设备文档,对应 UNIX man pages section 4 3. sysfs文档,对应 UNIX man pages section 5 -非标准的杂项文档请移步 OBMM wiki。 - - - 用户态库接口文档 | 文档 | 内容 | @@ -27,7 +23,6 @@ | obmm_query.md | `obmm_query_memid_by_pa()`, `obmm_query_pa_by_memid()` 接口说明 | - 设备文档 | 文档 | 内容 | @@ -36,7 +31,6 @@ | obmm_shmdev.md | obmm_shmdev\${mem_id} 设备使用说明 | - sysfs 文档 | 文档 | 内容 | @@ -44,6 +38,4 @@ sysfs 文档 | obmm_shmdev_sysfs.md | /sys/devices/obmm/obmm_shmdev\${mem_id}/ 维测目录内容说明 | | obmm_preimport_sysfs.md | /proc/obmm/preimport_info 维测文件格式说明 | - - 目前各文档已初步成型。errno、编程 demo 持续补充中。 diff --git a/doc/obmm.md b/doc/obmm.md index 9e7d1c2..8a78076 100644 --- a/doc/obmm.md +++ b/doc/obmm.md @@ -16,7 +16,7 @@ OBMM 内核模块插入后,会生成一个 misc 设备 /dev/obmm。该设备 OBMM 内核模块可以发起多个 UB memory 访存相关的硬件配置 * MMU 页表 -* UB memory decoder 翻译表 +* UB memory decoder 翻译表(当前由管控组件配置) * UMMU 翻译表 正确配置各组件后,数据通路将被打通,访存流程如下图所示(未显示response) @@ -40,8 +40,8 @@ UB memory 对提供方的内存有连续性、缓存属性等方面的要求, | 类型 | 申请内存来源 | 申请内存粒度 | UMMU页表粒度配置(支持2M,4M,……,256M \ 最大借出内存为128K * 2 * 页表粒度) | 其他限制 | | --- | --- | --- | --- | --- | | hugetlb_pmd | hugetlbfs中的pmd粒度大页 | PMD(PAGE_SIZE为4K时,PMD为2M) | 必须配置为2M | 仅支持pmd_mapping == 100%时使用,需要由用户或者kernel cmdline预留pmd大页内存 | -| hugetlb_pud | hugetlbfs中的pud粒度大页 | PMD(PAGE_SIZE为4K时,PMD为1G) | 可以配置为任意值(推荐32M) | 不受pmd_mapping限制,需要由用户或者kernel cmdline预留pud大页内存 | -| buddy_highmem | 直接从buddy或者使用pfn申请内存 | PMD(PAGE_SIZE为4K时,PMD为2M) | 必须配置为2M | 必须配置pmd_mapping,对pmd_mapping的值没有限制,pmd_mapping的值为借出内存的理论上限 | +| hugetlb_pud | hugetlbfs中的pud粒度大页 | PUD(PAGE_SIZE为4K时,PUD为1G) | 可以配置为任意值(推荐32M) | 不受pmd_mapping限制,需要由用户或者kernel cmdline预留pud大页内存 | +| buddy_highmem | 直接从buddy或者使用pfn申请内存 | 通过驱动加载mem_allocator_granu参数配置,必须是UMMU页表粒度的整数倍 | 可以配置为任意值(推荐2M 或者32M) | 必须配置pmd_mapping,对pmd_mapping的值没有限制,pmd_mapping的值为借出内存的理论上限 | 内存来源在插入obmm.ko内核模块时通过mempool_allocator模块参数配置,不允许运行时修改,不允许多个内存来源共存。 @@ -90,16 +90,16 @@ OBMM内核模块依赖以下内核参数: ###前置内核模块依赖 除了模块本身依赖的ubus,ubcore,hisi_ummu_core,hisi_soc_cache_framework驱动外,为了正确使能刷cache功能,需要插入hisi_soc_hha模块。 依赖的模块中,以下参数会对OBMM的导入导出产生影响: -- UMMU 模块 ubm_granule参数影响OBMM分配的连续内存最小粒度。该参数配置为0以外的值时,OBMM申请内存的最小粒度须相应提升。即:*该参数配置为0以外的值时,当前OBMM须配置mempool_allocator=hugetlb_pud*。 -- UBUS 模块 um_entry_size参数影响OBMM导入内存的最小粒度。该参数配置成1以外的值时,OBMM导入内存的最小粒度会相应提升。 +- UMMU 模块 ubm_granule参数影响OBMM分配的连续内存最小粒度。该参数配置为0以外的值时,OBMM申请内存的最小粒度须相应提升, 需正确选择内存来源。 ### OBMM模块参数 -OBMM 内核模块为 `obmm.ko` ,支持下列 3 个内核启动参数: +OBMM 内核模块为 `obmm.ko` ,支持下列 4 个内核启动参数: 1. **mempool_size=(\\d+)[KMG]**:默认为1G,OBMM模块参数,指定每个本地Numa维护的内存池的扩展上限,内存池的维护是动态的,仅保证内存池中的内存快速借出。 2. **mempool_refill_timeout=(\\d+)**(单位为毫秒):默认为100,OBMM模块参数,在本地内存不足的情况下,内存池会缩减为0,该参数指示,在已经检测到内存不足后,经过一段时间后,尝试重新扩充内存池。 3. **mempool_allocator**:字符串参数。指定OBMM导出内存时的内存来源。当前支持hugetlb_pmd, hugetlb_pud, buddy_highmem三种。未指定时,通过kernel命令行中的pmd_mapping参数来指定内存来源。pmd_mapping=100%时使用hugetlb_pmd,pmd_mapping<100%时使用buddy_highmem。 +4. **mem_allocator_granu**:字符串参数。指定OBMM导出内存时申请内存的粒度,支持以M,G为单位配置大小。未指定时,配置为mempool_allocator支持的最小粒度。 ## OBMM 设备 diff --git a/doc/obmm_export.md b/doc/obmm_export.md index 975ad42..6aba7a7 100644 --- a/doc/obmm_export.md +++ b/doc/obmm_export.md @@ -48,14 +48,14 @@ length需要满足如下要求: struct obmm_mem_desc { uint64_t addr; // 出参:返回此次export生成的uba uint64_t length; // 出参:返回length中各元素之和 - /* 128bit eid, ordered by small-endian */ + /* 128bit eid, ordered by little-endian */ uint8_t seid[16]; // export流程忽略 uint8_t deid[16]; // 入参:指定借出内存所在bus controller的eid uint32_t tokenid; // 出参:返回此次export生成的tokenid uint32_t scna; // export流程忽略 uint32_t dcna; // export流程忽略 uint16_t priv_len; // 入参:指定priv[]的长度 - uint8_t priv[]; // 入参:可选,用户私有、vendor数据 + uint8_t priv[]; // 入参:可选,用户私有数据 } ``` @@ -69,31 +69,32 @@ struct obmm_mem_desc { - 该接口调用的目标地址段须按照PMD_SIZE对齐,并且其中的映射粒度需要最小是PMD_SIZE,且不低于UMMU粒度约束。目前可以支持hugetlb,或者THP方式的映射。 - 该接口调用后,目标内存会被pin住。 - 该接口调用后,直到unexport执行前,内核态访问目标内存会造成宿主机panic。 - +- 该接口只能导出权限为可读可写的地址空间。 +- 该接口导出的内存,必须在同一个socket内。 #### Input Parameters -**pid**: 被调用进程的pid。 +**pid**: 指定进程的pid。pid=0 时指定当前调用接口的进程。 **va**: 目标内存虚拟地址段的首指针。 **length**: 目标内存的长度。 length需要满足如下要求: 1. length必须按OBMM基础粒度对齐,同时满足内存分配器与UMMU的粒度约束。 -**flags**: 导出内存的属性,当前仅支持0。 +**flags**: 导出内存属性。(预留,当前未使用,必须配置为0) **desc**: 指向一个OBMM的内存描述符,用于传入内存的属性参数,同时接收地址信息。其中deid、priv_len、priv域段为入参,addr,length,tokenid域段为出参,其他参数会被忽略。 ```c struct obmm_mem_desc { uint64_t addr; // 出参:返回此次export生成的uba - uint64_t length; // 出参:返回length中各元素之和 - /* 128bit eid, ordered by small-endian */ + uint64_t length; // 出参:返回导出内存的总大小 + /* 128bit eid, ordered by little-endian */ uint8_t seid[16]; // export流程忽略 uint8_t deid[16]; // 入参:指定借出内存所在bus controller的eid uint32_t tokenid; // 出参:返回此次export生成的tokenid uint32_t scna; // export流程忽略 uint32_t dcna; // export流程忽略 uint16_t priv_len; // 入参:指定priv[]的长度 - uint8_t priv[]; // 入参:可选,用户私有、vendor数据 + uint8_t priv[]; // 入参:可选,用户私有数据 } ``` @@ -113,7 +114,7 @@ struct obmm_mem_desc { * 确保所有 NUMA 节点属于同一 cpu socket 中; * 每个非零节点内存没有对齐到`OBMM_MEMSEG_SIZE`; * 导出内存总和大小不能为 0; - * flags 允许值有:`OBMM_EXPORT_FLAG_FAST` 和 `OBMM_EXPORT_FLAG_ALLOW_MMAP`。 + * flags不为0。 * `ENODEV`: 只允许从已上线的本地NUMA节点分配内存。 * `ENOMEM`:系统内存不足。 * `EEXIST:` 申请`region` 已存在。 @@ -175,40 +176,72 @@ int export_interface_demo(void) return 0; } +``` + +下面示例展示如何在当前进程中申请一页 2MB 的大页(hugetlb/THP), +然后调用 `obmm_export_useraddr` 导出该地址空间。示例中对可能的失败情况做了基本检查;在真实运行环境中,使用者需确保系统已为大页做好配置(例如挂载 hugetlbfs 或启用 THP),且有足够权限。 + +```c +#include +#include +#include +#include +#include +#include +#include +#include + +#define SZ_2M (1UL << 21) int export_useraddr_interface_demo(void) { - unsigned int device_deid = 0x101; - int ret; + uint32_t device_deid = 0x101; + size_t size = SZ_2M; + void *ptr = MAP_FAILED; mem_id id; - /* Export 2M memory from node 0 and no memory from other nodes. */ - size_t length[OBMM_MAX_LOCAL_NUMA_NODES] = { SZ_2M }; - /* Allocate memory only from OBMM buffer and create a mappable memory device. */ - unsigned long flags = OBMM_EXPORT_FLAG_FAST | OBMM_EXPORT_FLAG_ALLOW_MMAP; - /* Specify that this memory device has no private data. */ - struct obmm_mem_desc desc = { - .priv_len = 0 - }; - memcpy(desc.deid, &device_deid, 4); - /* Export memory from OBMM. */ - id = obmm_export_useraddr(length, flags, &desc); + int ret; + + ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0); + if (ptr == MAP_FAILED) { + perror("mmap(hugepage) failed"); + return -1; + } + + struct obmm_mem_desc *desc = malloc(sizeof(*desc)); + if (!desc) { + perror("malloc desc failed"); + munmap(ptr, size); + return -1; + } + memset(desc, 0, sizeof(*desc)); + desc->priv_len = 0; + /* 将设备 deid 写入 desc(只写低位 4 字节作为示例) */ + memcpy(desc->deid, &device_deid, 4); + + /* 导出当前进程的这段地址空间(pid=0 表示当前进程) */ + id = obmm_export_useraddr(0, ptr, size, 0, desc); if (id == OBMM_INVALID_MEMID) { - /* Export failed. */ - perror("obmm_export() failed.\n"); + perror("obmm_export_useraddr() failed"); + free(desc); + munmap(ptr, size); return -1; } - /* Export succeeded. Key parameters written to @desc. */ - /* Do your work here... */ + printf("exported mem id: %llu, uba: 0x%llx, size: 0x%llx\n", + (unsigned long long)id, + (unsigned long long)desc->addr, + (unsigned long long)desc->length); - /* Unexport memory. */ - flags = 0; - ret = obmm_unexport(id, flags); + /* 结束使用:先 unexport,再释放本地映射 */ + ret = obmm_unexport(id, 0); if (ret) { - perror("obmm_unexport() failed.\n"); - return -1; + perror("obmm_unexport() failed"); + /* 继续释放本地资源 */ } + free(desc); + munmap(ptr, size); return 0; } ``` diff --git a/doc/obmm_import.md b/doc/obmm_import.md index c80ecf3..0b4f355 100644 --- a/doc/obmm_import.md +++ b/doc/obmm_import.md @@ -39,13 +39,13 @@ mem_id obmm_import(const struct obmm_mem_desc *desc, unsigned long flags, int ba | 字段 | 描述 | | --------- | --------------------------------------------- | -| addr | 远端内存对应的物理地址(由预填decoder者提供) | +| addr | 远端内存对应的物理地址(由预填decoder者提供) | | length | import的内存大小 | | tokenid | 忽略 | -| deid | 忽略 | +| deid | 提供方提供内存的UB controller的EID,当前仅用于记账 | | seid | 使用方引入内存的UB controller的EID | -| scna | 使用方引入内存的UB controller的CNA地址 | -| dcna | 忽略 | +| scna | 使用方引入内存的UB controller的CNA地址 | +| dcna | 提供方提供内存的UB controller的EID,当前仅用于记账 | | priv_len | 私有数据长度 | | priv | 私有数据,仅呈现在sysfs中,不影响通路 | @@ -68,9 +68,9 @@ mem_id obmm_import(const struct obmm_mem_desc *desc, unsigned long flags, int ba **base_dist**:引入内存上线作为远端 NUMA 节点上线的基础距离。即该远端NUMA节点(n_r)到引入物理芯片所在本地 NUMA (基准NUMA,n_b)的距离。 -* `base_dist`等于0时,新节点到其他本地节点的距离定义为100,新节点到其他远端节点的距离为254。 -* `base_dist`不等于0且小于等于10,或`base_dist`大于254时,接口报非法参数错误。 -* `base_dist`大于11且小于等于254时,新节点到其他远端节点的距离为254,新节点到其他本地的本地节点的距离为: dist(n, n_b) + dist(n_b, n_r) - dist(n_b, n_b)。如果该值大于 254,则定义距离为254。 +* `base_dist`等于0时,新节点到其他本地节点的距离定义为100,新节点到其他远端节点的距离为255。 +* `base_dist`不等于0且小于等于10,或`base_dist`大于255时,接口报非法参数错误。 +* `base_dist`大于11且小于等于255时,新节点到其他远端节点的距离为255,新节点到其他本地的本地节点的距离为: dist(n, n_b) + dist(n_b, n_r) - dist(n_b, n_b)。如果该值大于 255,则定义距离为255。 未指定*OBMM_IMPORT_FLAG_NUMA_REMOTE*时,或指定*OBMM_IMPORT_FLAG_PREIMPORT*时,base_dist参数将被忽略。 @@ -112,7 +112,7 @@ mem_id obmm_import(const struct obmm_mem_desc *desc, unsigned long flags, int ba * priv_len 的长度超出 `OBMM_MAX_PRIV_LEN`; * 申请内存大小不能为零; * flags 含有无效标志位;参数 `ALLOW_MMAP`和 `NUMA_REMOTE` 必须且只能指定一个;在指定 `OBMM_IMPORT_FLAG_PREIMPORT` 时,必须指定 `OBMM_IMPORT_FLAG_NUMA_REMOTE`; - * `base_dist` 不等于0且小于等于10,或大于254; + * `base_dist` 不等于0且小于等于10,或大于255; * 传入的地址和内存长度没有按照OBMM基础粒度对齐;pa 为 0 或 pa + size 溢出; * preimport 模式引入的内存,物理地址没有落在节点预留内存中; * 导入的 scna、seid、dcna、deid 和预引入时使用 scna、seid、dcna、deid 不匹配。 diff --git a/doc/obmm_preimport_sysfs.md b/doc/obmm_preimport_sysfs.md index 4c091c4..b303a89 100644 --- a/doc/obmm_preimport_sysfs.md +++ b/doc/obmm_preimport_sysfs.md @@ -11,8 +11,8 @@ obmm_preimport sysfs ,为囊括系统内所有预引入地址段的 sysfs 文 * 起始物理地址:十六进制数,预引入地址段的最小有效地址。 * 结束物理地址:十六进制数,预引入地址段的最大有效地址。 * scna:十六进制数,内存使用方 bus controller 的 clan network address,含义详见 UB 协议。 -* dcna:十六进制数,内存提供方 bus controller 的 clan network address,含义详见 UB 协议。该列的值没有实际意义。 -* seid:十六进制数,内存使用方 bus controller 的 entity id,含义详见 UB 协议。仅记录,不参与通路配置。以u64 : u64 格式打印 +* dcna:十六进制数,内存提供方 bus controller 的 clan network address,含义详见 UB 协议。仅记录,不参与通路配置 +* seid:十六进制数,内存使用方 bus controller 的 entity id,含义详见 UB 协议。与scna归属同一个bus controller。以u64 : u64 格式打印 * deid:十六进制数,内存提供方 bus controller 的 entity id,含义详见 UB 协议。仅记录,不参与通路配置。以u64 : u64 格式打印 * numa_id:十进制数,预引入地址段所属 的 NUMA 节点。 diff --git a/doc/obmm_query.md b/doc/obmm_query.md index 4a94f68..fabc032 100644 --- a/doc/obmm_query.md +++ b/doc/obmm_query.md @@ -30,7 +30,7 @@ int obmm_query_pa_by_memid(memid id, unsigned long offset, unsigned long *pa); * 在 export 方,PA一般不连续,二者无明确对应关系 * 在 import 方,当前版本的硬件上,PA和UBA有线性对应关系,PA offset = UBA offset * VA offset 和 UBA offset - * 如果 VA 是通过OBMM设备mmap的(对应legacy接口的共享模式),VA和UBA有线性对应关系,VA offset = UBA offset + * 如果 VA 是通过OBMM设备mmap的,VA和UBA有线性对应关系,VA offset = UBA offset * 如果 VA 是由 NUMA 管理的,VA和UBA无明确对应关系 ## 返回值 RETURN VALUE @@ -43,7 +43,7 @@ int obmm_query_pa_by_memid(memid id, unsigned long offset, unsigned long *pa); 故障码对应的部分情形如下: -* `ENOENT`:ID为`memid`的OBMM内存不存在(原海思 auto-align 接口中,还包括“使用方 pa 没有对应的远端内存”这种情况)。 +* `ENOENT`:ID为`memid`的OBMM内存不存在。 * `EINVAL`:`memid`对应的OBMM内存存在,但是`offset` 越界。 ## 约束 CONSTRAINTS diff --git a/doc/obmm_set_ownership.md b/doc/obmm_set_ownership.md index 92ec34d..3edeef4 100644 --- a/doc/obmm_set_ownership.md +++ b/doc/obmm_set_ownership.md @@ -73,3 +73,4 @@ int obmm_set_ownership(int fd, void *start, void *end, int prot); ## 附注 NOTES 暂无 + \ No newline at end of file diff --git a/doc/obmm_shmdev.md b/doc/obmm_shmdev.md index d3babae..feff263 100644 --- a/doc/obmm_shmdev.md +++ b/doc/obmm_shmdev.md @@ -57,6 +57,21 @@ OBMM支持部分映射,同一进程mmap和munmap的范围必须保持一致, 当 obmm_shmdev 设备被打开或 mmap 时,内存设备均无法销毁。销毁内存设备时,用户应先解除映射,关闭文件描述符。 +#### PMD映射 +obmm_shmdev字符设备mmap提供PMD映射方式,通过增加映射粒度来降低Page Table Walk耗时,降低TLB Miss率,从而降低平均访存时延。 + +##### 使用方式 +`#define OBMM_MMAP_FLAG_HUGETLB_PMD (1UL << 63)` +在mmap时,通过指定偏移为(`OBMM_MAP_FLAG_HUGETLB_PMD` | offset)实现指定PMD映射的效果。 + +mmap其余参数描述有所变化: +* addr:置为 NULL时由内核申请PMD_SIZE对齐的虚拟地址,不为NULL时则以用户传入值为基准,内核自动调整到PMD_SIZE对齐。 +* length:映射内存的长度,此参数必须按PMD_SIZE大小对齐。 + +##### 使用约束 +1. 一个obmm_shmdev不允许混合不同粒度映射。设备首次映射时会记录映射粒度。 +2. 通过PMD方式映射的虚拟地址不支持使用`obmm_set_ownership`接口维护一致性。 + ## 样例 以下函数展示了应用通过 POSIX 标准接口访问 OBMM 内存设备的过程。函数使用 open(2), mmap(2) 映射内存设备。使用 cacheable 内存时,需要使用 obmm_set_ownership(3) 接口维护 libobmm(3) 中描述的一致性模型。访问结束后,函数使用 munmap(2) 和 close(2) 解除了对设备的映射和占用。 @@ -128,3 +143,60 @@ int memdev_demo(mem_id id, size_t size) return 0; } ``` + +以下函数展示了应用通过 POSIX 标准接口访问 OBMM 内存设备的过程。函数使用 open(2), mmap(2) 以PMD方式映射non_cachable属性内存设备,访问结束后,函数使用 munmap(2) 和 close(2) 解除了对设备的映射和占用。 + +```c +#include +#include +#include +#include +#include +#include + +#define SZ_2M (1UL << 21) + +#define MAX_OBMM_MEMDEV_PATH 128 +int memdev_demo(mem_id id, size_t size) +{ + int ret, fd, *value; + void *ptr; + char memdev_path[128]; + + ret = snprintf(memdev_path, sizeof(memdev_path), "/dev/obmm_shmdev%lu", id); + if (ret < 0 || ret >= (int)sizeof(memdev_path)) { + fprintf(stderr, "Failed to construct OBMM memdev path.\n"); + exit(EXIT_FAILURE); + } + + fd = open(memdev_path, O_RDWR|O_SYNC); + if (fd == -1) { + perror("open() failed on OBMM memdev.\n"); + exit(EXIT_FAILURE); + } + + /* Map the memory device with NONE access right. */ + ptr = mmap(NULL, size, PROT_NONE, MAP_SHARED, fd, OBMM_MMAP_FLAG_HUGETLB_PMD); + if (ptr == MAP_FAILED) { + perror("mmap() failed on OBMM memdev.\n"); + exit(EXIT_FAILURE); + } + /* Map char device succeeded. */ + value = (int*)ptr; + *value = *value + 1; + /* Cleanup.*/ + ret = munmap(ptr, size); + if (ret == -1) { + perror("munmap() failed on OBMM memdev pointer.\n"); + exit(EXIT_FAILURE); + } + + ret = close(fd); + if (ret == -1) { + perror("close() failed on OBMM memdev.\n"); + exit(EXIT_FAILURE); + } + + return 0; +} +``` \ No newline at end of file diff --git a/doc/obmm_shmdev_sysfs.md b/doc/obmm_shmdev_sysfs.md index fb36a02..69fa91c 100644 --- a/doc/obmm_shmdev_sysfs.md +++ b/doc/obmm_shmdev_sysfs.md @@ -98,7 +98,11 @@ obmm_shmdev${id}/ **import_info/dcna** 类型:文本、十六进制数 -描述:内存使用方 bus controller 的 clan network address,含义详见 UB 协议。 +描述:内存提供方 bus controller 的 clan network address,含义详见 UB 协议。 + +**import_info/deid** +类型:文本、十六进制数, 以u64 : u64 格式打印 +描述:内存使用方 bus controller 的 entity id,含义详见 UB 协议。 **import_info/seid** 类型:文本、十六进制数, 以u64 : u64 格式打印 @@ -114,14 +118,15 @@ obmm_shmdev${id}/ 使用方信息是否适用受 OBMM 工作模式、import flags 配置等多方面的影响。下表为其总览表: -| 属性 | 适用场景 | -| --------- | ------------------------- | +| 属性 | 适用场景 | +| --------- | ------------------------ | | pa | 所有场景 | | scna | 所有场景 | -| deid | 仅记录 | -| seid | 仅记录 | -| numa_id | 内存以 NUMA 方式引入 | -| preimport | 内存以 NUMA 方式引入 | +| dcna | 所有场景,仅记录用户入参 | +| seid | 所有场景 | +| deid | 所有场景,仅记录用户入参 | +| numa_id | 内存以 NUMA 方式引入 | +| preimport | 内存以 NUMA 方式引入 | # 常见问题 diff --git a/doc/obmm_unimport.md b/doc/obmm_unimport.md index 58ff779..82a99c9 100644 --- a/doc/obmm_unimport.md +++ b/doc/obmm_unimport.md @@ -19,9 +19,6 @@ int obmm_unimport(mem_id id, unsigned long flags); 内存使用方根据内存编号释放引入内存。 -当以 cacheable 方式引入的内存被 unimport 时,所有有关的缓存都会被 invalidate ,不会被 writeback 。 -如果需要确保数据变更不丢失,unimport 前需手动调用 obmm_set_ownership(3) 触发回写。 - ### Input Parameters **id**:要回收的内存的编号 diff --git a/doc/obmm_unpreimport.md b/doc/obmm_unpreimport.md index ccd9a7d..835e093 100644 --- a/doc/obmm_unpreimport.md +++ b/doc/obmm_unpreimport.md @@ -56,7 +56,7 @@ int obmm_unpreimport(const struct obmm_preimport_info *preimport_info, unsigned 故障码对应的部分情形如下: * `ENOENT`:要移除的远程内存块不存在或已被释放。 -* `EINVAL`:传入的 preimport_info 为空;无效的CNA对; flags 包含未定义位;物理地址 pa 对应非预导入区域;卸载区段起始地址和长度未精准匹配。 +* `EINVAL`:传入的 preimport_info 为空;flags 包含未定义位;物理地址 pa 对应非预导入区域;卸载区段起始地址和长度未精准匹配。 * `EAGAIN`: 预导入过程未完成,稍后再试。 * `EBUSY` : 待卸载区域正在使用,被其他进程占用。 * `EFAULT`: 未找到物理地址对应信息。 -- Gitee