You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 22:57:27