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

Linux内核6.12/6.13下musdk模块编译报错:remove函数指针类型不兼容

针对Linux 6.11+内核的musdk-marvell-SDK mv_pp_uio模块编译错误修复方案

问题背景

编译musdk-marvell-SDK12.24.10中的mv_pp_uio模块时,在Linux 6.12/6.13-rc系列内核下触发如下编译错误:

CC [M]  mv_pp_uio.o
mv_pp_uio.c:196:19: error: initialization of 'void (*)(struct platform_device *)' from incompatible pointer type 'int (*)(struct platform_device *)' [-Werror=incompatible-pointer-types]
 196 |         .remove = mv_pp_uio_remove,
     |                   ^~~~~~~~~~~~~~~~
mv_pp_uio.c:196:19: note: (near initialization for 'mv_pp_uio_driver.<anonymous>.remove')

原因是Linux内核6.11版本起,platform_driver结构体的remove成员函数签名要求返回void,不再支持原有的int返回类型。

原代码问题分析

原mv_pp_uio_remove函数中有如下检查逻辑:

if (!uio_pdrv_pp) return -EINVAL;

其中uio_pdrv_pp是通过devm_kzalloc分配的资源,而devm_系列分配器的核心特性是资源与设备生命周期绑定:

  • 只有当probe函数成功返回0时,分配的资源才会被加入设备的资源管理链表
  • 如果probe失败,devm会自动释放已分配的所有资源,且不会触发remove函数调用

因此在remove函数执行时,uio_pdrv_pp不可能为空,原检查属于冗余逻辑。

最优修复步骤

  1. 修改函数签名:将static int mv_pp_uio_remove(struct platform_device *pdev)改为:
static void mv_pp_uio_remove(struct platform_device *pdev)
  1. 处理冗余检查:直接移除if (!uio_pdrv_pp) return -EINVAL;语句。如果需要保留异常场景的监控,可以替换为日志告警(非必须):
if (!uio_pdrv_pp) {
    dev_err(&pdev->dev, "Unexpected NULL pointer: uio_pdrv_pp\n");
    WARN_ON(1); // 触发内核警告,仅用于调试
    return; // 退出函数,无返回值
}
  1. 清理返回语句:移除原函数中所有return语句(包括return 0;),因为void类型函数不需要返回值。

修复合理性说明

  • 符合内核6.11+的API规范,解决编译错误
  • 利用devm机制的特性,移除冗余检查不会引入风险
  • 若保留告警逻辑,可在极端异常场景下快速定位问题,不影响正常功能

内容的提问来源于stack exchange,提问作者routing_loop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 22:16:06