编程接口指南

分散/集中访问

rsm_memseg_import_putv()rsm_memseg_import_getv() 函数允许使用 I/O 请求列表来替代单个源地址和单个目标地址。

函数原型:

int rsm_memseg_import_putv(rsm_scat_gath_t *sg_io);
int rsm_memseg_import_getv(rsm_scat_gath_t *sg_io);

使用分散/集中列表的 I/O 向量部分 (sg_io) 可以指定本地虚拟地址或 local_memory_handles。句柄是一种重复使用本地地址范围的有效方法。在释放句柄之前,已分配的系统资源(如已锁定的本地内存)会一直保留。句柄的支持函数包括 rsm_create_localmemory_handle()rsm_free_localmemory_handle()

可以将虚拟地址或句柄收集到向量中,以便写入单个远程段。另外,还可以将从单个远程段读取的结果分散到虚拟地址或句柄的向量中。

整个向量的 I/O 会在返回之前启动。导入段的屏障 (barrier) 模式属性可确定 I/O 是否在函数返回之前已完成。将屏障 (barrier) 模式属性设置为 implicit 可保证数据传送按照在向量中的输入顺序完成。在每个列表项开始时会执行隐式屏障 (barrier) 打开,在每个列表项结束时会执行隐式屏障 (barrier) 关闭。如果检测到错误,向量的 I/O 会终止并且函数会立即返回。剩余计数表示其 I/O 尚未完成或尚未启动的项数。

可以指定在 putvgetv 操作成功时,向目标段发送通知事件。要指定传送通知事件,请在 rsm_scat_gath_t 结构的 flags 项中指定 RSM_IMPLICIT_SIGPOST 值。flags 项还可以包含值 RSM_SIGPOST_NO_ACCUMULATE,该值在设置了 RSM_IMPLICIT_SIGPOST 的情况下会传递给信号传递操作。

返回值:如果成功,则返回 0。否则返回错误值。

RSMERR_BAD_SGIO

分散/集中结构指针无效

RSMERR_BAD_SEG_HNDL

段句柄无效

RSMERR_BAD_CTLR_HNDL

控制器句柄无效

RSMERR_BAD_ADDR

地址错误

RSMERR_BAD_OFFSET

偏移无效

RSMERR_BAD_LENGTH

长度无效

RSMERR_PERM_DENIED

权限被拒绝

RSMERR_BARRIER_FAILURE

I/O 完成错误

RSMERR_CONN_ABORTED

连接异常中止

RSMERR_INSUFFICIENT_RESOURCES

资源不足

RSMERR_INTERRUPTED

操作被信号中断

获取本地句柄

int rsm_create_localmemory_handle(rsmapi_controller_handle_t cntrl_handle, rsm_localmemory_handle_t *local_handle, caddr_t local_vaddr, size_t length);

此函数可用于获取本地句柄,以便在后续调用 putvgetv 时用于 I/O 向量。尽快释放句柄可节省系统资源(特别是本地句柄占用的内存),这些资源可能会锁定。

返回值:如果成功,则返回 0。否则返回错误值。

RSMERR_BAD_CTLR_HNDL

控制器句柄无效

RSMERR_BAD_LOCALMEM_HNDL

本地内存句柄无效

RSMERR_BAD_LENGTH

长度无效

RSMERR_BAD_ADDR

地址无效

RSMERR_INSUFFICIENT_MEM

内存不足

释放本地句柄

rsm_free_localmemory_handle(rsmapi_controller_handle_t cntrl_handle, rsm_localmemory_handle_t handle);

此函数可用于释放与本地句柄关联的系统资源。由于进程退出时会释放属于该进程的所有句柄,因此调用此函数可节省系统资源。

返回值:如果成功,则返回 0。否则返回错误值。

RSMERR_BAD_CTLR_HNDL

控制器句柄无效

RSMERR_BAD_LOCALMEM_HNDL

本地内存句柄无效

以下示例说明了主数据结构的定义。


示例 2–1 主数据结构

typedef void *rsm_localmemory_handle_t

typedef struct {

   ulong_t	io_request_count;	number of rsm_iovec_t entries

   ulong_t	io_residual_count;	rsm_iovec_t entries not completed 



   in	flags;      

   rsm_memseg_import_handle_t		remote_handle; opaque handle for

                                                    import segment

   rsm_iovec_t							*iovec;		  pointer to

                                                    array of io_vec_t

} rsm_scat_gath_t;



typedef struct {

   int	io_type;		HANDLE or VA_IMMEDIATE

   union {

        rsm_localmemory_handle_t	handle;			used with HANDLE

        caddr_t						virtual_addr;		used with

                                                         VA_IMMEDIATE

    } local;

   size_t          local_offset;		       offset from handle base vaddr

   size_t          import_segment_offset;    offset from segment base vaddr

   size_t          transfer_length; 

} rsm_iovec_t;