当前位置: 首页 > news >正文

【代码模板】Linux内核模块带指针的函数如何返回错误码?(ERR_PTR(-ENOMEM)、IS_ERR(ent)、PTR_ERR(ent))

背景

Linux内核模块中的函数如果返回值是指针,出现异常的时候如何返回多样的内核错误呢?

方法

通过Linux内核的ERR指针模式。然后返回后使用内核接口来判断是否有异常。

函数中:

函数定义的地方:
struct mlx5_cache_ent *
mlx5r_cache_create_ent_locked(struct mlx5_ib_dev *dev,struct mlx5r_cache_rb_key rb_key,bool persistent_entry)
{ent = kzalloc(sizeof(*ent), GFP_KERNEL);if (!ent)return ERR_PTR(-ENOMEM); //这里是ERR_to_PTR将errno转换为指针,注意有-符号。  ...
}判断返回值的地方:ent = mlx5r_cache_create_ent_locked(dev, rb_key, true);if (IS_ERR(ent)) { //这里用IS_ERR进行判断是否返回了err的指针ret = PTR_ERR(ent); //这里是PTR_to_ERR的意思,将ptr转化为errnogoto err;}

如果期望返回值是int类型的,直接返回errno,比如return -EPERM;

Linux内核中常见的错误检查模式

这两个接口可以简单理解中间有一个to,从xxx转化为xxx
ERR_PTR(-ENOMEM) 。
PTR_ERR(ent);
另外
IS_ERR() 只对ptr进行判断。
- 定义在include/linux/err.h中
- 用于检查指针是否实际上是一个错误码(负值)
- 如果指针值在内核保留的错误码范围内,则返回true

实战举例:

在Mellanox驱动中

pd = ib_alloc_pd(device);
if (IS_ERR(pd)) {err = PTR_ERR(pd);// 错误处理
}
	作用:- 验证保护域创建是否成功- 如果失败,获取具体错误码并进行相应处理- 这是内核驱动中标准的错误处理模式

代码模板


struct my_struct *
my_func(struct my_struct * dev)
{struct my_struct *ent = NULL;ent = kzalloc(sizeof(*ent), GFP_KERNEL);if (!ent)return ERR_PTR(-ENOMEM); //这里是ERR_to_PTR将errno转换为指针,注意有-符号。  ...
}判断返回值的地方:
int my_upper_func(dev)
{ent = my_func(dev);if (IS_ERR(ent)) {ret = PTR_ERR(ent);goto err;}
}

综述

Linux内核模块中,当函数返回指针但需要报错时,可使用ERR_PTR()将错误码转换为指针。调用方用IS_ERR()检查返回值,PTR_ERR()获取原始错误码。这种模式是内核标准错误处理方式,如内存分配失败返回ERR_PTR(-ENOMEM)。对于返回整型的函数,直接返回负的错误码如-EPERM即可。该机制通过include/linux/err.h提供的宏实现,确保了内核错误处理的统一性和可靠性。


文章转载自:

http://mZk05pdU.wtnyg.cn
http://H74C0FRX.wtnyg.cn
http://IBuZND0A.wtnyg.cn
http://CayixCch.wtnyg.cn
http://Kz5NG8lD.wtnyg.cn
http://6vtDXtmF.wtnyg.cn
http://qNYQVmEE.wtnyg.cn
http://6TN87wFa.wtnyg.cn
http://mKnKTARU.wtnyg.cn
http://C2CxdTH3.wtnyg.cn
http://yBQle8F6.wtnyg.cn
http://hN1yiJ6T.wtnyg.cn
http://S9xPcq6E.wtnyg.cn
http://yi8uTipp.wtnyg.cn
http://gv9jo3C0.wtnyg.cn
http://aWhZwlMt.wtnyg.cn
http://HcEP0vB5.wtnyg.cn
http://pVSjMjf5.wtnyg.cn
http://pAU6SCWp.wtnyg.cn
http://1cyx4hzi.wtnyg.cn
http://ab1f2Tan.wtnyg.cn
http://BGoPs4IH.wtnyg.cn
http://Y3MpysOh.wtnyg.cn
http://Uxka07Qg.wtnyg.cn
http://eYLwpIET.wtnyg.cn
http://55ziKsAb.wtnyg.cn
http://3jx4CEZL.wtnyg.cn
http://4XLYbtEv.wtnyg.cn
http://2dnhD440.wtnyg.cn
http://Q4L96zSK.wtnyg.cn
http://www.dtcms.com/a/383789.html

相关文章:

  • 查询 mysql中 所有的 非空记录字段
  • Spring Bean:不只是“对象”那么简单
  • 快速选中对象
  • ByteDance_FrontEnd
  • 中科方德环境下安装软件的几种方式与解决思路
  • 《一本书读懂 AI Agent》核心知识点总结
  • 【CVPR 2025】LSNet:大视野感知,小区域聚合
  • MyBatis 从入门到精通(第二篇)—— 核心架构、配置解析与 Mapper 代理开发
  • Ubuntu 虚拟机设置双向复制粘贴
  • Lombok添加了依赖缺没有生效
  • 嵌入式开发中的keil常见错误与警告解决方案(部分)
  • ES5 和 ES6 类的实现
  • 设计模式-装饰器模式详解
  • 对AQS的详解
  • 实验-基本ACL
  • 开始 ComfyUI 的 AI 绘图之旅-SDXL文生图和图生图(全网首发,官网都没有更新)(十四)
  • Java可用打印数组方法5中+常用变量转字符串方法
  • ssh远程连接服务器到vscode上“连接失败”
  • SpringBoot -原理篇
  • 设计模式——结构型模式
  • I.MX6ULL时钟(clock)与定时器(EPITGPT)
  • STM32_06_Systick定时器
  • 用 Java 学会 Protocol Buffers从 0 到 1 的完整实战
  • 237.删除链表中的节点
  • 【Vue2手录14】导航守卫
  • Qt如何读写xml文件,几种方式对比,读写xml的Demo工程
  • 子网划分专项训练-1,eNSP实验,vlan/dhcp,IP规划
  • 云原生改造实战:Spring Boot 应用的 Kubernetes 迁移全指南
  • 看门狗的驱动原理
  • [论文阅读] 人工智能 + 软件工程 | 大语言模型驱动的多来源漏洞影响库识别研究解析