Back to home page

OSCL-LXR

 
 

    


0001 
0002 .. include:: ../disclaimer-zh_CN.rst
0003 
0004 :Original: Documentation/infiniband/core_locking.rst
0005 
0006 :翻译:
0007 
0008  司延腾 Yanteng Si <siyanteng@loongson.cn>
0009 
0010 :校译:
0011 
0012  王普宇 Puyu Wang <realpuyuwang@gmail.com>
0013  时奎亮 Alex Shi <alexs@kernel.org>
0014 
0015 .. _cn_infiniband_core_locking:
0016 
0017 ==================
0018 infiniband中间层锁
0019 ==================
0020 
0021   本指南试图明确infiniband中间层的锁假设。它描述了对位于中间层以下的低
0022   级驱动程序和使用中间层的上层协议的要求。
0023 
0024 睡眠和中断环境
0025 ==============
0026 
0027   除了以下异常情况,ib_device结构体中所有方法的低级驱动实现都可以睡眠。
0028   这些异常情况是列表中的任意的方法:
0029 
0030     - create_ah
0031     - modify_ah
0032     - query_ah
0033     - destroy_ah
0034     - post_send
0035     - post_recv
0036     - poll_cq
0037     - req_notify_cq
0038 
0039     他们可能不可以睡眠,而且必须可以从任何上下文中调用。
0040 
0041     向上层协议使用者输出的相应函数:
0042 
0043     - rdma_create_ah
0044     - rdma_modify_ah
0045     - rdma_query_ah
0046     - rdma_destroy_ah
0047     - ib_post_send
0048     - ib_post_recv
0049     - ib_req_notify_cq
0050 
0051     因此,在任何情况下都可以安全调用(它们)。
0052 
0053   此外,该函数
0054 
0055     - ib_dispatch_event
0056 
0057   被底层驱动用来通过中间层调度异步事件的“A”,也可以从任何上下文中安全调
0058   用。
0059 
0060 可重入性
0061 --------
0062 
0063   由低级驱动程序导出的ib_device结构体中的所有方法必须是完全可重入的。
0064   即使使用同一对象的多个函数调用被同时运行,低级驱动程序也需要执行所有
0065   必要的同步以保持一致性。
0066 
0067   IB中间层不执行任何函数调用的序列化。
0068 
0069   因为低级驱动程序是可重入的,所以不要求上层协议使用者任何顺序执行。然
0070   而,为了得到合理的结果,可能需要一些顺序。例如,一个使用者可以在多个
0071   CPU上同时安全地调用ib_poll_cq()。然而,不同的ib_poll_cq()调用之间
0072   的工作完成信息的顺序没有被定义。
0073 
0074 回调
0075 ----
0076 
0077   低级驱动程序不得直接从与ib_device方法调用相同的调用链中执行回调。例
0078   如,低级驱动程序不允许从post_send方法直接调用使用者的完成事件处理程
0079   序。相反,低级驱动程序应该推迟这个回调,例如,调度一个tasklet来执行
0080   这个回调。
0081 
0082   低层驱动负责确保同一CQ的多个完成事件处理程序不被同时调用。驱动程序必
0083   须保证一个给定的CQ的事件处理程序在同一时间只有一个在运行。换句话说,
0084   以下情况是不允许的::
0085 
0086           CPU1                                    CPU2
0087 
0088     low-level driver ->
0089       consumer CQ event callback:
0090         /* ... */
0091         ib_req_notify_cq(cq, ...);
0092                                           low-level driver ->
0093         /* ... */                           consumer CQ event callback:
0094                                               /* ... */
0095         return from CQ event handler
0096 
0097   完成事件和异步事件回调的运行环境没有被定义。 根据低级别的驱动程序,它可能是
0098   进程上下文、softirq上下文或中断上下文。上层协议使用者可能不会在回调中睡眠。
0099 
0100 热插拔
0101 ------
0102 
0103   当一个低级驱动程序调用ib_register_device()时,它宣布一个设备已经
0104   准备好供使用者使用,所有的初始化必须在这个调用之前完成。设备必须保
0105   持可用,直到驱动对ib_unregister_device()的调用返回。
0106 
0107   低级驱动程序必须从进程上下文调用ib_register_device()和
0108   ib_unregister_device()。如果使用者在这些调用中回调到驱动程序,它
0109   不能持有任何可能导致死锁的semaphores。
0110 
0111   一旦其结构体ib_client的add方法被调用,上层协议使用者就可以开始使用
0112   一个IB设备。使用者必须在从移除方法返回之前完成所有的清理工作并释放
0113   与设备相关的所有资源。
0114 
0115   使用者被允许在其添加和删除方法中睡眠。