使用container_of访问resctrl_schema的conf_type成员遇编译错误求助
问题:resctrl_schema结构体conf_type成员访问失败的编译错误解决
结构体定义
struct resctrl_schema { struct list_head list; char name[8]; enum resctrl_conf_type conf_type; struct rdt_resource *res; u32 num_closid; int max_data_width; };
问题场景与尝试方案
需要在不修改上述结构体定义的前提下,从resctrl_arch_update_domains函数中访问conf_type成员,尝试使用container_of宏修改代码,修改后的代码片段如下:
@@ -990,9 +994,12 @@ int resctrl_arch_update_domains(struct rdt_resource *r, u32 closid) struct rdt_domain *d; enum resctrl_conf_type t; struct resctrl_staged_config *cfg; + struct resctrl_schema *my_container; lockdep_assert_cpus_held(); lockdep_assert_irqs_enabled(); + + my_container = container_of(r, struct resctrl_schema, res);
编译错误信息
触发静态断言失败错误:
./include/linux/build_bug.h:78:41: error: static assertion failed: "pointer type mismatch in container_of()" 78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
原因分析与解决方法
错误原因
container_of宏的核心逻辑是通过结构体成员的内存地址反推整个结构体的地址,但这里存在逻辑错误:
res是struct resctrl_schema中的指针类型成员,存储的是struct rdt_resource对象的地址- 你传入的
r是struct rdt_resource*,即res指向的对象地址,而非res这个成员本身在结构体中的地址,完全不符合container_of的使用条件,因此触发类型不匹配断言。
正确解决方案
查看内核resctrl架构的关联逻辑可知,struct rdt_resource中存在struct resctrl_schema *schema成员,用于反向关联所属的schema结构体。直接通过该成员访问即可:
@@ -990,9 +994,11 @@ int resctrl_arch_update_domains(struct rdt_resource *r, u32 closid) struct rdt_domain *d; enum resctrl_conf_type t; struct resctrl_staged_config *cfg; + struct resctrl_schema *my_schema; lockdep_assert_cpus_held(); lockdep_assert_irqs_enabled(); + + my_schema = r->schema; + t = my_schema->conf_type; // 直接访问目标成员
这种方式无需使用container_of,直接利用架构本身的双向关联字段,既符合代码逻辑,也避免了编译错误。
内容的提问来源于stack exchange,提问作者Milan
相关产品推荐
相关产品推荐

