BUG: scheduling while atomic

▌▌上篇文章的内容还没有结束

中断处理函数中如果执行了调度,会发生什么

▌这次,我修改了程序,在中断处理函数中调用了msleep

程序执行后,会有这样的日志

▌关键就是这句

BUG: scheduling while atomic

我们追代码,可以看到这个打印调用是这样的

msleep() -> schedule() ->__schedule() ->schedule_debug()

继续

▌这个日志已经明确说明这是一个bug

宏 in_atomic_preempt_off()用于判断当前的上下文是否在原子上下文(atomic context)中,并且禁用了抢占(preemptdisable)。原子上下文是指不允许发生调度的上下文,例如中断处理程序、软中断或其他关键部分。

在Linux内核中,preempt_count() 函数返回当前的抢占计数,这个计数用来跟踪当前上下文是否可以发生抢占。`PREEMPT_DISABLE_OFFSET` 是一个常量,它的值通常设置为0,表示没有禁用抢占时的抢占计数。

▌因此,in_atomic_preempt_off() 宏的作用是:

1)调用 `preempt_count()` 获取当前的抢占计数。

2)比较这个计数是否不等于 `PREEMPT_DISABLE_OFFSET`(即是否不等于0)。

3)如果返回值不为0,说明当前上下文禁用了抢占,可能是在原子上下文中。

这个宏通常用于调试或在内核调度器代码中检查当前上下文的状态,以确保在不允许抢占的上下文中不会执行可能导致调度的操作。如果在这个宏返回非零值的情况下发生了调度,就会触发 "scheduling while atomic" 的错误。

▌在看这个宏上面还有一个宏

这两个宏内容是一样的,只是名字略微不同,并且说明了这个宏不能在驱动代码上使用。

关于不能在中断执行msleep这个事情咨询了两个大佬

▌谢宝友老师

谢老师的观点有点和窝窝的观点一致,以理解为主

https://www.cnblogs.com/zzb-Dream-90Time/p/9394248.html

▌韦老师的观点

msleep是给线程用的,中断没有线程的概念,调用msleep简直牛头不对马嘴。

好啦,这个问题就到此为止咯,后续有新的发现再研究

相关推荐
Harm灬小海3 分钟前
【云计算学习之路】学习Centos7系统-Linux软件包管理
linux·运维·服务器·学习·云计算·yum·rpm
189228048615 分钟前
NY379固态MT29F32T08GSLBHL8-36QA:B
大数据·服务器·人工智能·科技·缓存
caicai_xiaobai6 分钟前
Ubuntu上Git安装步骤
linux·git·ubuntu
平行云16 分钟前
实时云渲染平台数据通道,支持3D应用文件上传下载分享无缝交互
linux·unity·云原生·ue5·gpu算力·实时云渲染·像素流送
谪星·阿凯30 分钟前
Linux提权全攻略博客
linux·运维·服务器·网络安全
风度前端31 分钟前
阿里云宝塔面板部署https证书
linux·后端·https
Yeats_Liao32 分钟前
物联网接入层技术剖析(二):epoll到底是怎么工作的
java·linux·网络·物联网·信息与通信
带带弟弟学爬虫__37 分钟前
dyAPP数据采集-个人主页、发布、搜索、评论
服务器·python·算法·flutter·java-ee·django
Donk_6741 分钟前
什么是虚拟化
linux·运维
Shadow(⊙o⊙)41 分钟前
Shell进程替换,自定义Shell解释器——字符串库函数灵活操作!
linux·运维·服务器·开发语言·c++·学习