在为 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);
它会非常好心的人来解释这些。
在为 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);
它会非常好心的人来解释这些。
这用于想要进行 SA(子网管理员)查询的高级驱动程序的引用计数/生命周期处理。SA 查询包括路径记录或服务记录查找——基本上是向子网管理器发送查询以获取有关结构上其他实体的信息的任何内容。
这些查询是使用函数完成的,ib_sa_path_rec_get
这些函数的第一个参数是指向 a 的指针struct ib_sa_client
。这是必需的,因为这些查询是发送给子网管理器的网络消息,我们需要等待响应,因此查询函数也需要一个回调参数。如果用户删除了启动 SA 查询的模块,我们不希望悬挂回调。
因此 IB 核心阻止ib_sa_unregister_client
返回,直到所有未决查询完成;任何进行 SA 查询的模块都需要在其清理路径上调用 unregister 函数。这可以防止内核在启动它的模块被删除后完成查询,这将导致跳转到其代码在已释放内存中的回调函数。