`sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget/infiniband/core_lockingmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/zh_TW/infiniband/core_lockingmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/it_IT/infiniband/core_lockingmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/ja_JP/infiniband/core_lockingmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/ko_KR/infiniband/core_lockingmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/sp_SP/infiniband/core_lockingmodnameN 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&]uh1hhhhX/var/lib/git/docbuild/linux/Documentation/translations/zh_CN/infiniband/core_locking.rsthKubh field_body)}(h*Documentation/infiniband/core_locking.rst h]h)}(h)Documentation/infiniband/core_locking.rsth]h)Documentation/infiniband/core_locking.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_core_locking:h]h}(h]h ]h"]h$]h&]refidcn-infiniband-core-lockinguh1jhKhhhhhhubhsection)}(hhh](htitle)}(hinfiniband中间层锁h]hinfiniband中间层锁}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhhhKubh block_quote)}(h本指南试图明确infiniband中间层的锁假设。它描述了对位于中间层以下的低 级驱动程序和使用中间层的上层协议的要求。 h]h)}(h本指南试图明确infiniband中间层的锁假设。它描述了对位于中间层以下的低 级驱动程序和使用中间层的上层协议的要求。h]h本指南试图明确infiniband中间层的锁假设。它描述了对位于中间层以下的低 级驱动程序和使用中间层的上层协议的要求。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhhhKhjhhubj)}(hhh](j)}(h睡眠和中断环境h]h睡眠和中断环境}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhhhKubj)}(hX除了以下异常情况,ib_device结构体中所有方法的低级驱动实现都可以睡眠。 这些异常情况是列表中的任意的方法: - create_ah - modify_ah - query_ah - destroy_ah - post_send - post_recv - poll_cq - req_notify_cq 他们可能不可以睡眠,而且必须可以从任何上下文中调用。 向上层协议使用者输出的相应函数: - rdma_create_ah - rdma_modify_ah - rdma_query_ah - rdma_destroy_ah - ib_post_send - ib_post_recv - ib_req_notify_cq 因此,在任何情况下都可以安全调用(它们)。 此外,该函数 - ib_dispatch_event 被底层驱动用来通过中间层调度异步事件的“A”,也可以从任何上下文中安全调 用。 h](h)}(h除了以下异常情况,ib_device结构体中所有方法的低级驱动实现都可以睡眠。 这些异常情况是列表中的任意的方法:h]h除了以下异常情况,ib_device结构体中所有方法的低级驱动实现都可以睡眠。 这些异常情况是列表中的任意的方法:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubj)}(hX- create_ah - modify_ah - query_ah - destroy_ah - post_send - post_recv - poll_cq - req_notify_cq 他们可能不可以睡眠,而且必须可以从任何上下文中调用。 向上层协议使用者输出的相应函数: - rdma_create_ah - rdma_modify_ah - rdma_query_ah - rdma_destroy_ah - ib_post_send - ib_post_recv - ib_req_notify_cq 因此,在任何情况下都可以安全调用(它们)。 h](h bullet_list)}(hhh](h list_item)}(h create_ahh]h)}(hjh]h create_ah}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h modify_ahh]h)}(hjh]h modify_ah}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hquery_ahh]h)}(hj6h]hquery_ah}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hj4ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h destroy_ahh]h)}(hjMh]h destroy_ah}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK!hjKubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h post_sendh]h)}(hjdh]h post_send}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK"hjbubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h post_recvh]h)}(hj{h]h post_recv}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK#hjyubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hpoll_cqh]h)}(hjh]hpoll_cq}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK$hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hreq_notify_cq h]h)}(h req_notify_cqh]h req_notify_cq}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK%hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]bullet-uh1jhhhKhjubh)}(hN他们可能不可以睡眠,而且必须可以从任何上下文中调用。h]hN他们可能不可以睡眠,而且必须可以从任何上下文中调用。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK'hjubh)}(h.向上层协议使用者输出的相应函数:h]h.向上层协议使用者输出的相应函数:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK)hjubj)}(hhh](j)}(hrdma_create_ahh]h)}(hjh]hrdma_create_ah}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK+hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hrdma_modify_ahh]h)}(hjh]hrdma_modify_ah}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK,hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h rdma_query_ahh]h)}(hjh]h rdma_query_ah}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK-hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hrdma_destroy_ahh]h)}(hj-h]hrdma_destroy_ah}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK.hj+ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h ib_post_sendh]h)}(hjDh]h ib_post_send}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK/hjBubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h ib_post_recvh]h)}(hj[h]h ib_post_recv}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK0hjYubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hib_req_notify_cq h]h)}(hib_req_notify_cqh]hib_req_notify_cq}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK1hjpubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhhhK+hjubh)}(h?因此,在任何情况下都可以安全调用(它们)。h]h?因此,在任何情况下都可以安全调用(它们)。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK3hjubeh}(h]h ]h"]h$]h&]uh1jhhhKhjubh)}(h此外,该函数h]h此外,该函数}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK5hjubj)}(h- ib_dispatch_event h]j)}(hhh]j)}(hib_dispatch_event h]h)}(hib_dispatch_eventh]hib_dispatch_event}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK7hjubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhhhK7hjubah}(h]h ]h"]h$]h&]uh1jhhhK7hjubh)}(hq被底层驱动用来通过中间层调度异步事件的“A”,也可以从任何上下文中安全调 用。h]hq被底层驱动用来通过中间层调度异步事件的“A”,也可以从任何上下文中安全调 用。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK9hjubeh}(h]h ]h"]h$]h&]uh1jhhhKhjhhubj)}(hhh](j)}(h 可重入性h]h 可重入性}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhhhK=ubj)}(hXy由低级驱动程序导出的ib_device结构体中的所有方法必须是完全可重入的。 即使使用同一对象的多个函数调用被同时运行,低级驱动程序也需要执行所有 必要的同步以保持一致性。 IB中间层不执行任何函数调用的序列化。 因为低级驱动程序是可重入的,所以不要求上层协议使用者任何顺序执行。然 而,为了得到合理的结果,可能需要一些顺序。例如,一个使用者可以在多个 CPU上同时安全地调用ib_poll_cq()。然而,不同的ib_poll_cq()调用之间 的工作完成信息的顺序没有被定义。 h](h)}(h由低级驱动程序导出的ib_device结构体中的所有方法必须是完全可重入的。 即使使用同一对象的多个函数调用被同时运行,低级驱动程序也需要执行所有 必要的同步以保持一致性。h]h由低级驱动程序导出的ib_device结构体中的所有方法必须是完全可重入的。 即使使用同一对象的多个函数调用被同时运行,低级驱动程序也需要执行所有 必要的同步以保持一致性。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK?hjubh)}(h5IB中间层不执行任何函数调用的序列化。h]h5IB中间层不执行任何函数调用的序列化。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKChjubh)}(hXS因为低级驱动程序是可重入的,所以不要求上层协议使用者任何顺序执行。然 而,为了得到合理的结果,可能需要一些顺序。例如,一个使用者可以在多个 CPU上同时安全地调用ib_poll_cq()。然而,不同的ib_poll_cq()调用之间 的工作完成信息的顺序没有被定义。h]hXS因为低级驱动程序是可重入的,所以不要求上层协议使用者任何顺序执行。然 而,为了得到合理的结果,可能需要一些顺序。例如,一个使用者可以在多个 CPU上同时安全地调用ib_poll_cq()。然而,不同的ib_poll_cq()调用之间 的工作完成信息的顺序没有被定义。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKEhjubeh}(h]h ]h"]h$]h&]uh1jhhhK?hjhhubeh}(h]id2ah ]h"] 可重入性ah$]h&]uh1jhjhhhhhK=ubj)}(hhh](j)}(h回调h]h回调}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<hhhhhKKubj)}(hXx低级驱动程序不得直接从与ib_device方法调用相同的调用链中执行回调。例 如,低级驱动程序不允许从post_send方法直接调用使用者的完成事件处理程 序。相反,低级驱动程序应该推迟这个回调,例如,调度一个tasklet来执行 这个回调。 低层驱动负责确保同一CQ的多个完成事件处理程序不被同时调用。驱动程序必 须保证一个给定的CQ的事件处理程序在同一时间只有一个在运行。换句话说, 以下情况是不允许的:: CPU1 CPU2 low-level driver -> consumer CQ event callback: /* ... */ ib_req_notify_cq(cq, ...); low-level driver -> /* ... */ consumer CQ event callback: /* ... */ return from CQ event handler 完成事件和异步事件回调的运行环境没有被定义。 根据低级别的驱动程序,它可能是 进程上下文、softirq上下文或中断上下文。上层协议使用者可能不会在回调中睡眠。 h](h)}(hX3低级驱动程序不得直接从与ib_device方法调用相同的调用链中执行回调。例 如,低级驱动程序不允许从post_send方法直接调用使用者的完成事件处理程 序。相反,低级驱动程序应该推迟这个回调,例如,调度一个tasklet来执行 这个回调。h]hX3低级驱动程序不得直接从与ib_device方法调用相同的调用链中执行回调。例 如,低级驱动程序不允许从post_send方法直接调用使用者的完成事件处理程 序。相反,低级驱动程序应该推迟这个回调,例如,调度一个tasklet来执行 这个回调。}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKMhjMubh)}(h低层驱动负责确保同一CQ的多个完成事件处理程序不被同时调用。驱动程序必 须保证一个给定的CQ的事件处理程序在同一时间只有一个在运行。换句话说, 以下情况是不允许的::h]h低层驱动负责确保同一CQ的多个完成事件处理程序不被同时调用。驱动程序必 须保证一个给定的CQ的事件处理程序在同一时间只有一个在运行。换句话说, 以下情况是不允许的:}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKRhjMubh literal_block)}(hXe CPU1 CPU2 low-level driver -> consumer CQ event callback: /* ... */ ib_req_notify_cq(cq, ...); low-level driver -> /* ... */ consumer CQ event callback: /* ... */ return from CQ event handlerh]hXe CPU1 CPU2 low-level driver -> consumer CQ event callback: /* ... */ ib_req_notify_cq(cq, ...); low-level driver -> /* ... */ consumer CQ event callback: /* ... */ return from CQ event handler}hjosbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1jmhhhKVhjMubh)}(h完成事件和异步事件回调的运行环境没有被定义。 根据低级别的驱动程序,它可能是 进程上下文、softirq上下文或中断上下文。上层协议使用者可能不会在回调中睡眠。h]h完成事件和异步事件回调的运行环境没有被定义。 根据低级别的驱动程序,它可能是 进程上下文、softirq上下文或中断上下文。上层协议使用者可能不会在回调中睡眠。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKahjMubeh}(h]h ]h"]h$]h&]uh1jhhhKMhj<hhubeh}(h]id3ah ]h"]回调ah$]h&]uh1jhjhhhhhKKubj)}(hhh](j)}(h 热插拔h]h 热插拔}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhhhKeubj)}(hX当一个低级驱动程序调用ib_register_device()时,它宣布一个设备已经 准备好供使用者使用,所有的初始化必须在这个调用之前完成。设备必须保 持可用,直到驱动对ib_unregister_device()的调用返回。 低级驱动程序必须从进程上下文调用ib_register_device()和 ib_unregister_device()。如果使用者在这些调用中回调到驱动程序,它 不能持有任何可能导致死锁的semaphores。 一旦其结构体ib_client的add方法被调用,上层协议使用者就可以开始使用 一个IB设备。使用者必须在从移除方法返回之前完成所有的清理工作并释放 与设备相关的所有资源。 使用者被允许在其添加和删除方法中睡眠。h](h)}(h当一个低级驱动程序调用ib_register_device()时,它宣布一个设备已经 准备好供使用者使用,所有的初始化必须在这个调用之前完成。设备必须保 持可用,直到驱动对ib_unregister_device()的调用返回。h]h当一个低级驱动程序调用ib_register_device()时,它宣布一个设备已经 准备好供使用者使用,所有的初始化必须在这个调用之前完成。设备必须保 持可用,直到驱动对ib_unregister_device()的调用返回。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKghjubh)}(h低级驱动程序必须从进程上下文调用ib_register_device()和 ib_unregister_device()。如果使用者在这些调用中回调到驱动程序,它 不能持有任何可能导致死锁的semaphores。h]h低级驱动程序必须从进程上下文调用ib_register_device()和 ib_unregister_device()。如果使用者在这些调用中回调到驱动程序,它 不能持有任何可能导致死锁的semaphores。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKkhjubh)}(h一旦其结构体ib_client的add方法被调用,上层协议使用者就可以开始使用 一个IB设备。使用者必须在从移除方法返回之前完成所有的清理工作并释放 与设备相关的所有资源。h]h一旦其结构体ib_client的add方法被调用,上层协议使用者就可以开始使用 一个IB设备。使用者必须在从移除方法返回之前完成所有的清理工作并释放 与设备相关的所有资源。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKohjubh)}(h9使用者被允许在其添加和删除方法中睡眠。h]h9使用者被允许在其添加和删除方法中睡眠。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKshjubeh}(h]h ]h"]h$]h&]uh1jhhhKghjhhubeh}(h]id4ah ]h"] 热插拔ah$]h&]uh1jhjhhhhhKeubeh}(h]id1ah ]h"]睡眠和中断环境ah$]h&]uh1jhjhhhhhKubeh}(h]( infinibandjeh ]h"](infiniband中间层锁cn_infiniband_core_lockingeh$]h&]uh1jhhhhhhhKexpect_referenced_by_name}jjsexpect_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_handlerj.error_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}(jjjjjjj9j6jjjju nametypes}(jjjj9jjuh}(jjjjjjj6jjj<jju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}j<KsRparse_messages]transform_messages]hsystem_message)}(hhh]h)}(hhh]h@Hyperlink target "cn-infiniband-core-locking" is not referenced.}hjsbah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypeINFOsourceh،lineKuh1juba transformerN include_log]