?ksphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget/infiniband/user_madmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/zh_TW/infiniband/user_madmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/it_IT/infiniband/user_madmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/ja_JP/infiniband/user_madmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/ko_KR/infiniband/user_madmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/sp_SP/infiniband/user_madmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageChinese (Simplified)uh1h hh _documenthsourceNlineNubhnote)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]h paragraph)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh5Documentation/translations/zh_CN/disclaimer-zh_CN.rsthKhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh field_list)}(hhh](hfield)}(hhh](h field_name)}(hOriginalh]hOriginal}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhT/var/lib/git/docbuild/linux/Documentation/translations/zh_CN/infiniband/user_mad.rsthKubh field_body)}(h&Documentation/infiniband/user_mad.rst h]h)}(h%Documentation/infiniband/user_mad.rsth]h%Documentation/infiniband/user_mad.rst}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h翻译h]h翻译}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhKubh)}(h-司延腾 Yanteng Si h]h)}(h,司延腾 Yanteng Si h](h司延腾 Yanteng Si <}(hjhhhNhNubh reference)}(hsiyanteng@loongson.cnh]hsiyanteng@loongson.cn}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurimailto:siyanteng@loongson.cnuh1jhjubh>}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h校译h]h校译}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>hhhKubh)}(hS王普宇 Puyu Wang 时奎亮 Alex Shi h]h)}(hR王普宇 Puyu Wang 时奎亮 Alex Shi h](h王普宇 Puyu Wang <}(hjShhhNhNubj)}(hrealpuyuwang@gmail.comh]hrealpuyuwang@gmail.com}(hj[hhhNhNubah}(h]h ]h"]h$]h&]refurimailto:realpuyuwang@gmail.comuh1jhjSubh> 时奎亮 Alex Shi <}(hjShhhNhNubj)}(halexs@kernel.orgh]halexs@kernel.org}(hjohhhNhNubah}(h]h ]h"]h$]h&]refurimailto:alexs@kernel.orguh1jhjSubh>}(hjShhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK hjOubah}(h]h ]h"]h$]h&]uh1hhj>ubeh}(h]h ]h"]h$]h&]uh1hhhhK hhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhtarget)}(h.. _cn_infiniband_user_mad:h]h}(h]h ]h"]h$]h&]refidcn-infiniband-user-maduh1jhKhhhhhhubhsection)}(hhh](htitle)}(h用户空间MAD访问h]h用户空间MAD访问}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhhhKubj)}(hhh](j)}(h 设备文件h]h 设备文件}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhhhKubh block_quote)}(hX每个InfiniBand设备的每个端口都有一个“umad”设备和一个“issm”设备连接。 例如,一个双端口的HCA将有两个umad设备和两个issm设备,而一个交换机将 有每个类型的一个设备(对于交换机端口0)。 h]h)}(hX每个InfiniBand设备的每个端口都有一个“umad”设备和一个“issm”设备连接。 例如,一个双端口的HCA将有两个umad设备和两个issm设备,而一个交换机将 有每个类型的一个设备(对于交换机端口0)。h]hX每个InfiniBand设备的每个端口都有一个“umad”设备和一个“issm”设备连接。 例如,一个双端口的HCA将有两个umad设备和两个issm设备,而一个交换机将 有每个类型的一个设备(对于交换机端口0)。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhhhKhjhhubeh}(h]id1ah ]h"] 设备文件ah$]h&]uh1jhjhhhhhKubj)}(hhh](j)}(h创建MAD代理h]h创建MAD代理}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhhhKubj)}(hX一个MAD代理可以通过填写一个结构体ib_user_mad_reg_req来创建,然后在 适当的设备文件的文件描述符上调用IB_USER_MAD_REGISTER_AGENT ioctl。 如果注册请求成功,结构体中会返回一个32位的ID。比如说:: struct ib_user_mad_reg_req req = { /* ... */ }; ret = ioctl(fd, IB_USER_MAD_REGISTER_AGENT, (char *) &req); if (!ret) my_agent = req.id; else perror("agent register"); 代理可以通过IB_USER_MAD_UNREGISTER_AGENT ioctl取消注册。另外,所有 通过文件描述符注册的代理在描述符关闭时将被取消注册。 2014 现在提供了一个新的注册IOctl,允许在注册时提供额外的字段。这个注册 调用的用户隐含了对pkey_index的使用(见下文)。现在提供了一个新的 注册IOctl,允许在注册时提供额外的字段。这个注册调用的用户隐含了对 pkey_index的使用(见下文)。 h](h)}(h一个MAD代理可以通过填写一个结构体ib_user_mad_reg_req来创建,然后在 适当的设备文件的文件描述符上调用IB_USER_MAD_REGISTER_AGENT ioctl。 如果注册请求成功,结构体中会返回一个32位的ID。比如说::h]h一个MAD代理可以通过填写一个结构体ib_user_mad_reg_req来创建,然后在 适当的设备文件的文件描述符上调用IB_USER_MAD_REGISTER_AGENT ioctl。 如果注册请求成功,结构体中会返回一个32位的ID。比如说:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubh literal_block)}(hstruct ib_user_mad_reg_req req = { /* ... */ }; ret = ioctl(fd, IB_USER_MAD_REGISTER_AGENT, (char *) &req); if (!ret) my_agent = req.id; else perror("agent register");h]hstruct ib_user_mad_reg_req req = { /* ... */ }; ret = ioctl(fd, IB_USER_MAD_REGISTER_AGENT, (char *) &req); if (!ret) my_agent = req.id; else perror("agent register");}hjsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1jhhhK"hjubh)}(h代理可以通过IB_USER_MAD_UNREGISTER_AGENT ioctl取消注册。另外,所有 通过文件描述符注册的代理在描述符关闭时将被取消注册。h]h代理可以通过IB_USER_MAD_UNREGISTER_AGENT ioctl取消注册。另外,所有 通过文件描述符注册的代理在描述符关闭时将被取消注册。}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK)hjubhdefinition_list)}(hhh]hdefinition_list_item)}(hXG2014 现在提供了一个新的注册IOctl,允许在注册时提供额外的字段。这个注册 调用的用户隐含了对pkey_index的使用(见下文)。现在提供了一个新的 注册IOctl,允许在注册时提供额外的字段。这个注册调用的用户隐含了对 pkey_index的使用(见下文)。 h](hterm)}(h2014h]h2014}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1j?hhhK0hj;ubh definition)}(hhh]h)}(hXA现在提供了一个新的注册IOctl,允许在注册时提供额外的字段。这个注册 调用的用户隐含了对pkey_index的使用(见下文)。现在提供了一个新的 注册IOctl,允许在注册时提供额外的字段。这个注册调用的用户隐含了对 pkey_index的使用(见下文)。h]hXA现在提供了一个新的注册IOctl,允许在注册时提供额外的字段。这个注册 调用的用户隐含了对pkey_index的使用(见下文)。现在提供了一个新的 注册IOctl,允许在注册时提供额外的字段。这个注册调用的用户隐含了对 pkey_index的使用(见下文)。}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK-hjQubah}(h]h ]h"]h$]h&]uh1jOhj;ubeh}(h]h ]h"]h$]h&]uh1j9hhhK0hj6ubah}(h]h ]h"]h$]h&]uh1j4hjubeh}(h]h ]h"]h$]h&]uh1jhhhKhjhhubeh}(h]id2ah ]h"]创建mad代理ah$]h&]uh1jhjhhhhhKubj)}(hhh](j)}(h 接收MADsh]h 接收MADs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhhhK3ubj)}(hX_使用read()接收MAD。现在接收端支持RMPP。传给read()的缓冲区必须至少是 一个struct ib_user_mad + 256字节。比如说: 如果传递的缓冲区不足以容纳收到的MAD(RMPP),errno被设置为ENOSPC,需 要的缓冲区长度被设置在mad.length中。 正常MAD(非RMPP)的读取示例:: struct ib_user_mad *mad; mad = malloc(sizeof *mad + 256); ret = read(fd, mad, sizeof *mad + 256); if (ret != sizeof mad + 256) { perror("read"); free(mad); } RMPP读取示例:: struct ib_user_mad *mad; mad = malloc(sizeof *mad + 256); ret = read(fd, mad, sizeof *mad + 256); if (ret == -ENOSPC)) { length = mad.length; free(mad); mad = malloc(sizeof *mad + length); ret = read(fd, mad, sizeof *mad + length); } if (ret < 0) { perror("read"); free(mad); } 除了实际的MAD内容外,其他结构体ib_user_mad字段将被填入收到的MAD的信 息。例如,远程LID将在mad.lid中。 如果发送超时,将产生一个接收,mad.status设置为ETIMEDOUT。否则,当一个 MAD被成功接收后,mad.status将是0。 poll()/select()可以用来等待一个MAD可以被读取。 poll()/select()可以用来等待,直到可以读取一个MAD。 h](h)}(h使用read()接收MAD。现在接收端支持RMPP。传给read()的缓冲区必须至少是 一个struct ib_user_mad + 256字节。比如说:h]h使用read()接收MAD。现在接收端支持RMPP。传给read()的缓冲区必须至少是 一个struct ib_user_mad + 256字节。比如说:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK5hjubh)}(h如果传递的缓冲区不足以容纳收到的MAD(RMPP),errno被设置为ENOSPC,需 要的缓冲区长度被设置在mad.length中。h]h如果传递的缓冲区不足以容纳收到的MAD(RMPP),errno被设置为ENOSPC,需 要的缓冲区长度被设置在mad.length中。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK8hjubh)}(h#正常MAD(非RMPP)的读取示例::h]h"正常MAD(非RMPP)的读取示例:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK;hjubj)}(hstruct ib_user_mad *mad; mad = malloc(sizeof *mad + 256); ret = read(fd, mad, sizeof *mad + 256); if (ret != sizeof mad + 256) { perror("read"); free(mad); }h]hstruct ib_user_mad *mad; mad = malloc(sizeof *mad + 256); ret = read(fd, mad, sizeof *mad + 256); if (ret != sizeof mad + 256) { perror("read"); free(mad); }}hjsbah}(h]h ]h"]h$]h&]j$j%uh1jhhhK=hjubh)}(hRMPP读取示例::h]hRMPP读取示例:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKEhjubj)}(hXEstruct ib_user_mad *mad; mad = malloc(sizeof *mad + 256); ret = read(fd, mad, sizeof *mad + 256); if (ret == -ENOSPC)) { length = mad.length; free(mad); mad = malloc(sizeof *mad + length); ret = read(fd, mad, sizeof *mad + length); } if (ret < 0) { perror("read"); free(mad); }h]hXEstruct ib_user_mad *mad; mad = malloc(sizeof *mad + 256); ret = read(fd, mad, sizeof *mad + 256); if (ret == -ENOSPC)) { length = mad.length; free(mad); mad = malloc(sizeof *mad + length); ret = read(fd, mad, sizeof *mad + length); } if (ret < 0) { perror("read"); free(mad); }}hjsbah}(h]h ]h"]h$]h&]j$j%uh1jhhhKGhjubh)}(h除了实际的MAD内容外,其他结构体ib_user_mad字段将被填入收到的MAD的信 息。例如,远程LID将在mad.lid中。h]h除了实际的MAD内容外,其他结构体ib_user_mad字段将被填入收到的MAD的信 息。例如,远程LID将在mad.lid中。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKUhjubh)}(h如果发送超时,将产生一个接收,mad.status设置为ETIMEDOUT。否则,当一个 MAD被成功接收后,mad.status将是0。h]h如果发送超时,将产生一个接收,mad.status设置为ETIMEDOUT。否则,当一个 MAD被成功接收后,mad.status将是0。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKXhjubh)}(hdata */ mad->hdr.id = my_agent; /* req.id from agent registration */ mad->hdr.lid = my_dest; /* in network byte order... */ /* etc. */ ret = write(fd, &mad, sizeof *mad + mad_length); if (ret != sizeof *mad + mad_length) perror("write"); h](h)}(hMADs是用write()发送的。发送的代理ID应该填入MAD的id字段,目的地LID应该 填入lid字段,以此类推。发送端确实支持RMPP,所以可以发送任意长度的MAD。 比如说::h]hMADs是用write()发送的。发送的代理ID应该填入MAD的id字段,目的地LID应该 填入lid字段,以此类推。发送端确实支持RMPP,所以可以发送任意长度的MAD。 比如说:}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKbhjBubj)}(hXZstruct ib_user_mad *mad; mad = malloc(sizeof *mad + mad_length); /* fill in mad->data */ mad->hdr.id = my_agent; /* req.id from agent registration */ mad->hdr.lid = my_dest; /* in network byte order... */ /* etc. */ ret = write(fd, &mad, sizeof *mad + mad_length); if (ret != sizeof *mad + mad_length) perror("write");h]hXZstruct ib_user_mad *mad; mad = malloc(sizeof *mad + mad_length); /* fill in mad->data */ mad->hdr.id = my_agent; /* req.id from agent registration */ mad->hdr.lid = my_dest; /* in network byte order... */ /* etc. */ ret = write(fd, &mad, sizeof *mad + mad_length); if (ret != sizeof *mad + mad_length) perror("write");}hjTsbah}(h]h ]h"]h$]h&]j$j%uh1jhhhKfhjBubeh}(h]h ]h"]h$]h&]uh1jhhhKbhj1hhubeh}(h]id3ah ]h"] 发送madsah$]h&]uh1jhjhhhhhK`ubj)}(hhh](j)}(h 交换IDsh]h 交换IDs}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjphhhhhKuubj)}(humad设备的用户可以在发送的MAD中使用交换ID字段的低32位(也就是网络字节顺序中 最小有效的一半字段)来匹配请求/响应对。上面的32位是保留给内核使用的,在发送 MAD之前会被改写。 h]h)}(humad设备的用户可以在发送的MAD中使用交换ID字段的低32位(也就是网络字节顺序中 最小有效的一半字段)来匹配请求/响应对。上面的32位是保留给内核使用的,在发送 MAD之前会被改写。h]humad设备的用户可以在发送的MAD中使用交换ID字段的低32位(也就是网络字节顺序中 最小有效的一半字段)来匹配请求/响应对。上面的32位是保留给内核使用的,在发送 MAD之前会被改写。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKwhjubah}(h]h ]h"]h$]h&]uh1jhhhKwhjphhubeh}(h]idsah ]h"] 交换idsah$]h&]uh1jhjhhhhhKuubj)}(hhh](j)}(hP_Key索引处理h]hP_Key索引处理}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhhhK|ubj)}(hXU旧的ib_umad接口不允许为发送的MAD设置P_Key索引,也没有提供获取接收的MAD的 P_Key索引的方法。一个带有pkey_index成员的struct ib_user_mad_hdr的新布局已 经被定义;然而,为了保持与旧的应用程序的二进制兼容性,除非在文件描述符被用于 其他用途之前调用IB_USER_MAD_ENABLE_PKEY或IB_USER_MAD_REGISTER_AGENT2 ioctl 之一,否则不会使用这种新布局。 在2008年9月,IB_USER_MAD_ABI_VERSION将被增加到6,默认使用新的ib_user_mad_hdr 结构布局,并且IB_USER_MAD_ENABLE_PKEY ioctl将被删除。 h](h)}(hX旧的ib_umad接口不允许为发送的MAD设置P_Key索引,也没有提供获取接收的MAD的 P_Key索引的方法。一个带有pkey_index成员的struct ib_user_mad_hdr的新布局已 经被定义;然而,为了保持与旧的应用程序的二进制兼容性,除非在文件描述符被用于 其他用途之前调用IB_USER_MAD_ENABLE_PKEY或IB_USER_MAD_REGISTER_AGENT2 ioctl 之一,否则不会使用这种新布局。h]hX旧的ib_umad接口不允许为发送的MAD设置P_Key索引,也没有提供获取接收的MAD的 P_Key索引的方法。一个带有pkey_index成员的struct ib_user_mad_hdr的新布局已 经被定义;然而,为了保持与旧的应用程序的二进制兼容性,除非在文件描述符被用于 其他用途之前调用IB_USER_MAD_ENABLE_PKEY或IB_USER_MAD_REGISTER_AGENT2 ioctl 之一,否则不会使用这种新布局。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK~hjubh)}(h在2008年9月,IB_USER_MAD_ABI_VERSION将被增加到6,默认使用新的ib_user_mad_hdr 结构布局,并且IB_USER_MAD_ENABLE_PKEY ioctl将被删除。h]h在2008年9月,IB_USER_MAD_ABI_VERSION将被增加到6,默认使用新的ib_user_mad_hdr 结构布局,并且IB_USER_MAD_ENABLE_PKEY ioctl将被删除。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubeh}(h]h ]h"]h$]h&]uh1jhhhK~hjhhubeh}(h]p-keyah ]h"]p_key索引处理ah$]h&]uh1jhjhhhhhK|ubj)}(hhh](j)}(h设置IsSM功能位h]h设置IsSM功能位}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhhhKubj)}(hXu要为一个端口设置IsSM功能位,只需打开相应的issm设备文件。如果IsSM位已经被设置,那 么打开调用将阻塞,直到该位被清除(或者如果O_NONBLOCK标志被传递给open(),则立即返 回,errno设置为EAGAIN)。当issm文件被关闭时,IsSM位将被清除。在issm文件上不能进 行任何读、写或其他操作。 h]h)}(hXt要为一个端口设置IsSM功能位,只需打开相应的issm设备文件。如果IsSM位已经被设置,那 么打开调用将阻塞,直到该位被清除(或者如果O_NONBLOCK标志被传递给open(),则立即返 回,errno设置为EAGAIN)。当issm文件被关闭时,IsSM位将被清除。在issm文件上不能进 行任何读、写或其他操作。h]hXt要为一个端口设置IsSM功能位,只需打开相应的issm设备文件。如果IsSM位已经被设置,那 么打开调用将阻塞,直到该位被清除(或者如果O_NONBLOCK标志被传递给open(),则立即返 回,errno设置为EAGAIN)。当issm文件被关闭时,IsSM位将被清除。在issm文件上不能进 行任何读、写或其他操作。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhhhKhjhhubeh}(h]issmah ]h"]设置issm功能位ah$]h&]uh1jhjhhhhhKubj)}(hhh](j)}(h /dev文件h]h /dev文件}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhhhKubh)}(hF为了用 udev自动创建相应的字符设备文件,一个类似::h]hE为了用 udev自动创建相应的字符设备文件,一个类似:}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(hX KERNEL=="umad*", NAME="infiniband/%k" KERNEL=="issm*", NAME="infiniband/%k" 的规则可以被使用。它将创建节点的名字:: /dev/infiniband/umad0 /dev/infiniband/issm0 为第一个端口,以此类推。与这些设备相关的infiniband设备和端口可以从以下文件中确定:: /sys/class/infiniband_mad/umad0/ibdev /sys/class/infiniband_mad/umad0/port 和:: /sys/class/infiniband_mad/issm0/ibdev /sys/class/infiniband_mad/issm0/porth]hX KERNEL=="umad*", NAME="infiniband/%k" KERNEL=="issm*", NAME="infiniband/%k" 的规则可以被使用。它将创建节点的名字:: /dev/infiniband/umad0 /dev/infiniband/issm0 为第一个端口,以此类推。与这些设备相关的infiniband设备和端口可以从以下文件中确定:: /sys/class/infiniband_mad/umad0/ibdev /sys/class/infiniband_mad/umad0/port 和:: /sys/class/infiniband_mad/issm0/ibdev /sys/class/infiniband_mad/issm0/port}hj0sbah}(h]h ]h"]h$]h&]j$j%uh1jhhhKhjhhubeh}(h]devah ]h"] /dev文件ah$]h&]uh1jhjhhhhhKubeh}(h](madjeh ]h"](用户空间mad访问cn_infiniband_user_madeh$]h&]uh1jhhhhhhhKexpect_referenced_by_name}jLjsexpect_referenced_by_id}jjsubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(jN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjverror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh، _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}j]jasnameids}(jLjjKjHjjjj|j.j+jmjjjjjjjj jCj@u nametypes}(jLjKjjj.jmjjjjCuh}(jjjHjjjj|jj+jjjj1jjpjjj jj@ju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}jKsRparse_messages]transform_messages]hsystem_message)}(hhh]h)}(hhh]h