在为IB设计驱动程序时,以下结构和功能的用途是什么?
struct ib_sa_client {
atomic_t users;
struct completion comp;
};
/**
* ib_sa_register_client - Register an SA client.
*/
void ib_sa_register_client(struct ib_sa_client *client);
解释这些问题会非常有人。
答案 0 :(得分:3)
这用于希望执行SA(子网管理员)查询的更高级别驱动程序的引用计数/生命周期处理。 SA查询包括路径记录或服务记录查找 - 基本上是将查询发送到子网管理器以获取有关结构上其他实体的信息的任何内容。
这些查询是使用ib_sa_path_rec_get
之类的函数完成的,这些函数的第一个参数是指向struct ib_sa_client
的指针。这是必需的,因为这些查询是到子网管理器的网络消息,我们需要等待响应,因此查询函数也需要一个回调参数。如果用户删除了启动SA查询的模块,我们就不想要悬空回调。
因此IB核心会阻止ib_sa_unregister_client
返回,直到所有挂起的查询完成为止;任何执行SA查询的模块都需要在其清理路径上调用unregister函数。这样可以防止内核在启动它的模块被删除后完成查询,这会导致跳转到其代码位于释放内存中的回调函数。