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不可能为空,原检查属于冗余逻辑。
最优修复步骤
- 修改函数签名:将
static int mv_pp_uio_remove(struct platform_device *pdev)改为:
static void mv_pp_uio_remove(struct platform_device *pdev)
- 处理冗余检查:直接移除
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; // 退出函数,无返回值 }
- 清理返回语句:移除原函数中所有
return语句(包括return 0;),因为void类型函数不需要返回值。
修复合理性说明
- 符合内核6.11+的API规范,解决编译错误
- 利用
devm机制的特性,移除冗余检查不会引入风险 - 若保留告警逻辑,可在极端异常场景下快速定位问题,不影响正常功能
内容的提问来源于stack exchange,提问作者routing_loop
相关产品推荐
相关产品推荐

