NDK_FN_REGISTER_MR回调函数 (ndkpi.h)

NdkRegisterMr (NDK_FN_REGISTER_MR) 函数使用 NDK 适配器注册几乎连续的内存区域。

语法

NDK_FN_REGISTER_MR NdkFnRegisterMr;

NTSTATUS NdkFnRegisterMr(
  [in]           NDK_MR *pNdkMr,
  [in]           MDL *Mdl,
  [in]           SIZE_T Length,
  [in]           ULONG Flags,
  [in]           NDK_FN_REQUEST_COMPLETION RequestCompletion,
  [in, optional] PVOID RequestContext
)
{...}

参数

[in] pNdkMr

指向 NDK 内存区域的指针 (MR) 对象 (NDK_MR) 。

[in] Mdl

一个 MDL 或 MDL 链,表示从起始虚拟地址到 Length 参数中指定的字节数几乎连续的内存区域。

[in] Length

从第一个 MDL 的虚拟地址开始注册的字节数。 可以通过调用 MmGetMdlVirtualAddress 宏来获取第一个 MDL 的虚拟地址。 长度不得超过 MDL 链表示的字节总数。

[in] Flags

为已注册的内存区域指定访问权限的标志的位掩码。 可以设置以下标志:

含义
NDK_MR_FLAG_ALLOW_LOCAL_READ
0x00000000
NDK_MR_FLAG_ALLOW_LOCAL_WRITE
0x00000001
NDK_MR_FLAG_ALLOW_REMOTE_READ
0x00000002
NDK_MR_FLAG_ALLOW_REMOTE_WRITE
0x00000005
NDK_MR_FLAG_RDMA_READ_SINK
0x00000008

[in] RequestCompletion

指向请求完成回调例程 NdkRequestCompletion 的指针 (NDK_FN_REQUEST_COMPLETION) 。

[in, optional] RequestContext

要传递给 RequestCompletion 参数中指定的回调函数的 Context 参数的上下文值。

返回值

NdkRegisterMr 函数返回以下 NTSTATUS 代码之一。

返回代码 说明
STATUS_SUCCESS
MR 注册已成功完成。
STATUS_PENDING
操作处于挂起状态,稍后将完成。 驱动程序将调用指定的 RequestCompletion (NDK_FN_REQUEST_COMPLETION) 函数来完成挂起的操作。
STATUS_INVALID_PARAMETER
从起始虚拟地址到字节长度的 MDL 链部分并不表示几乎连续的内存区域。
STATUS_INSUFFICIENT_RESOURCES
由于资源不足,请求失败。
重要 请求可能会因此状态代码而以异步方式内联失败。
 
其他状态代码
出现了错误。

注解

在创建且 FastRegister 参数设置为 FALSE 的 NDK_MR 对象上,NdkRegisterMr 用于向适配器注册几乎连续的内存区域。

NDK 使用者必须传递表示固定在物理内存中的几乎连续内存区域的 MDL 或 MDL 链。 要注册的内存区域的基虚拟地址是由 MmGetMdlVirtualAddress 宏指示的虚拟地址。 如果 MDL 链不表示从起始虚拟地址到指定长度(以字节为单位)的几乎连续内存区域,则 NDK 提供程序必须使请求失败。

提供程序必须将 MmGetMdlVirtualAddress 返回的虚拟地址视为要注册的内存区域开头的索引。 提供程序不得将虚拟地址用作读取或写入缓冲区内容的有效虚拟地址。

在注册请求挂起时,NDK 使用者不得使用 MDL 链。

NdkRegisterMr 不支持从零开始的虚拟地址。

NDK 使用者在注册可用作 RDMA 读取请求的接收器缓冲区的内存时,必须传递 NDK_MR_FLAG_RDMA_READ_SINK 标志。 某些 NDK 提供程序可能需要在接收器缓冲区上为 RDMA 读取请求启用特殊访问权限,这些适配器未在 NDK_ADAPTER_INFO 结构的 AdapterFlags 成员中为其设置NDK_ADAPTER_FLAG_RDMA_READ_SINK_NOT_REQUIRED标志。 NDK_MR_FLAG_RDMA_READ_SINK标志允许此类提供程序相应地支持注册请求。

注意 可以出于多种目的注册缓冲区。 因此, NDK_MR_FLAG_RDMA_READ_SINK 标志可能附带其他标志。
 
如果 NDK 使用者在NDK_ADAPTER_INFO结构的 AdapterFlags 成员中为其设置了NDK_ADAPTER_FLAG_RDMA_READ_SINK_NOT_REQUIRED标志的适配器上传递NDK_MR_FLAG_RDMA_READ_SINK标志,则提供程序不需要处理NDK_MR_FLAG_RDMA_READ_SINK标志,并且不得由于存在此标志而使请求失败。

若要取消注册内存区域,请使用 NdkDeregisterMr (NDK_FN_DEREGISTER_MR) 函数。

要求

要求
最低受支持的客户端 不支持,NDIS 6.30 及更高版本支持。
最低受支持的服务器 Windows Server 2012
目标平台 Windows
标头 ndkpi.h (包括 Ndkpi.h)
IRQL <=DISPATCH_LEVEL

另请参阅

MmGetMdlVirtualAddress

NDKPI 对象生存期要求

NDK_ADAPTER_INFO

NDK_FN_DEREGISTER_MR

NDK_FN_REQUEST_COMPLETION

NDK_MR