xref: /openbmc/linux/Documentation/translations/zh_CN/infiniband/user_verbs.rst (revision 762f99f4f3cb41a775b5157dd761217beba65873)
1*4d488433SYanteng Si.. include:: ../disclaimer-zh_CN.rst
2*4d488433SYanteng Si
3*4d488433SYanteng Si:Original: Documentation/infiniband/user_verbs.rst
4*4d488433SYanteng Si
5*4d488433SYanteng Si:翻译:
6*4d488433SYanteng Si
7*4d488433SYanteng Si 司延腾 Yanteng Si <siyanteng@loongson.cn>
8*4d488433SYanteng Si
9*4d488433SYanteng Si:校译:
10*4d488433SYanteng Si
11*4d488433SYanteng Si 王普宇 Puyu Wang <realpuyuwang@gmail.com>
12*4d488433SYanteng Si 时奎亮 Alex Shi <alexs@kernel.org>
13*4d488433SYanteng Si
14*4d488433SYanteng Si.. _cn_infiniband_user_verbs:
15*4d488433SYanteng Si
16*4d488433SYanteng Si=================
17*4d488433SYanteng Si用户空间verbs访问
18*4d488433SYanteng Si=================
19*4d488433SYanteng Si
20*4d488433SYanteng Si  ib_uverbs模块,通过启用CONFIG_INFINIBAND_USER_VERBS构建,使用户空间
21*4d488433SYanteng Si  通过“verbs”直接访问IB硬件,如InfiniBand架构规范第11章所述。
22*4d488433SYanteng Si
23*4d488433SYanteng Si  要使用verbs,需要libibverbs库,可从https://github.com/linux-rdma/rdma-core24*4d488433SYanteng Si  libibverbs包含一个独立于设备的API,用于使用ib_uverbs接口。libibverbs
25*4d488433SYanteng Si  还需要为你的InfiniBand硬件提供适当的独立于设备的内核和用户空间驱动。例如,
26*4d488433SYanteng Si  要使用Mellanox HCA,你需要安装ib_mthca内核模块和libmthca用户空间驱动。
27*4d488433SYanteng Si
28*4d488433SYanteng Si用户-内核通信
29*4d488433SYanteng Si=============
30*4d488433SYanteng Si
31*4d488433SYanteng Si  用户空间通过/dev/infiniband/uverbsN字符设备与内核进行慢速路径、资源管理
32*4d488433SYanteng Si  操作的通信。快速路径操作通常是通过直接写入硬件寄存器mmap()到用户空间来完成
33*4d488433SYanteng Si  的,没有系统调用或上下文切换到内核。
34*4d488433SYanteng Si
35*4d488433SYanteng Si  命令是通过在这些设备文件上的write()s发送给内核的。ABI在
36*4d488433SYanteng Si  drivers/infiniband/include/ib_user_verbs.h中定义。需要内核响应的命令的结
37*4d488433SYanteng Si  构包含一个64位字段,用来传递一个指向输出缓冲区的指针。状态作为write()系统调
38*4d488433SYanteng Si  用的返回值被返回到用户空间。
39*4d488433SYanteng Si
40*4d488433SYanteng Si资源管理
41*4d488433SYanteng Si========
42*4d488433SYanteng Si
43*4d488433SYanteng Si  由于所有IB资源的创建和销毁都是通过文件描述符传递的命令完成的,所以内核可以跟
44*4d488433SYanteng Si  踪那些被附加到给定用户空间上下文的资源。ib_uverbs模块维护着idr表,用来在
45*4d488433SYanteng Si  内核指针和不透明的用户空间句柄之间进行转换,这样内核指针就不会暴露给用户空间,
46*4d488433SYanteng Si  而用户空间也无法欺骗内核去跟踪一个假的指针。
47*4d488433SYanteng Si
48*4d488433SYanteng Si  这也允许内核在一个进程退出时进行清理,并防止一个进程触及另一个进程的资源。
49*4d488433SYanteng Si
50*4d488433SYanteng Si内存固定
51*4d488433SYanteng Si========
52*4d488433SYanteng Si
53*4d488433SYanteng Si  直接的用户空间I/O要求与作为潜在I/O目标的内存区域保持在同一物理地址上。ib_uverbs
54*4d488433SYanteng Si  模块通过get_user_pages()和put_page()调用来管理内存区域的固定和解除固定。它还核
55*4d488433SYanteng Si  算进程的pinned_vm中被固定的内存量,并检查非特权进程是否超过其RLIMIT_MEMLOCK限制。
56*4d488433SYanteng Si
57*4d488433SYanteng Si  被多次固定的页面在每次被固定时都会被计数,所以pinned_vm的值可能会高估一个进程所
58*4d488433SYanteng Si  固定的页面数量。
59*4d488433SYanteng Si
60*4d488433SYanteng Si/dev文件
61*4d488433SYanteng Si========
62*4d488433SYanteng Si
63*4d488433SYanteng Si  要想用udev自动创建适当的字符设备文件,可以采用如下规则::
64*4d488433SYanteng Si
65*4d488433SYanteng Si    KERNEL=="uverbs*", NAME="infiniband/%k"
66*4d488433SYanteng Si
67*4d488433SYanteng Si  可以使用。 这将创建设备节点,名为::
68*4d488433SYanteng Si
69*4d488433SYanteng Si    /dev/infiniband/uverbs0
70*4d488433SYanteng Si
71*4d488433SYanteng Si  等等。由于InfiniBand的用户空间verbs对于非特权进程来说应该是安全的,因此在udev规
72*4d488433SYanteng Si  则中加入适当的MODE或GROUP可能是有用的。
73