http://bbs.csdn.net/topics/391048758?page=1#post-399361268
有人在论坛提了下面的问题,比较典型。

最近在调试SPI子系统时发现如下错误:[ 3777.005000] BUG: scheduling while atomic: spi0/25/0x00000002
[ 3777.005000] Modules linked in: focal_fp_sensor(O) rtl8192cu(O) snd_soc_tiny4412_wm8960 snd_soc_wm8960 [last unloaded: focal_fp_sensor]
[ 3777.005000] [<c0015484>] (unwind_backtrace+0x0/0xf0) from [<c0058084>] (__schedule_bug+0x44/0x58)
[ 3777.010000] [<c0058084>] (__schedule_bug+0x44/0x58) from [<c058b180>] (__schedule+0x760/0x830)
[ 3777.020000] [<c058b180>] (__schedule+0x760/0x830) from [<c025343c>] (rpm_resume+0x12c/0x640)
[ 3777.025000] [<c025343c>] (rpm_resume+0x12c/0x640) from [<c0253bb8>] (__pm_runtime_resume+0x48/0x60)
[ 3777.035000] [<c0253bb8>] (__pm_runtime_resume+0x48/0x60) from [<c0219f18>] (pl330_alloc_chan_resources+0x1bc/0x1f0)
[ 3777.045000] [<c0219f18>] (pl330_alloc_chan_resources+0x1bc/0x1f0) from [<c021898c>] (dma_chan_get+0x5c/0xfc)
[ 3777.055000] [<c021898c>] (dma_chan_get+0x5c/0xfc) from [<c0219144>] (__dma_request_channel+0x110/0x1d4)
[ 3777.065000] [<c0219144>] (__dma_request_channel+0x110/0x1d4) from [<c0027324>] (samsung_dmadev_request+0x40/0x4c)
[ 3777.075000] [<c0027324>] (samsung_dmadev_request+0x40/0x4c) from [<c027a034>] (s3c64xx_spi_prepare_transfer+0x44/0x88)
[ 3777.085000] [<c027a034>] (s3c64xx_spi_prepare_transfer+0x44/0x88) from [<c0277d08>] (spi_pump_messages+0xe8/0x160)
[ 3777.095000] [<c0277d08>] (spi_pump_messages+0xe8/0x160) from [<c004b504>] (kthread_worker_fn+0x4c/0x164)
[ 3777.105000] [<c004b504>] (kthread_worker_fn+0x4c/0x164) from [<c004b710>] (kthread+0x8c/0x98)
[ 3777.115000] [<c004b710>] (kthread+0x8c/0x98) from [<c000f598>] (kernel_thread_exit+0x0/0x8)该错误是概率性的,并不是每次都出现,我google和百度发现类似问题的原因是如下:
中断处理函数中调用了可以休眠的函数,如semaphore,mutex,sleep之类的可休眠的函数,
而linux内核要求在中断处理的时候,不允许系统调度,不允许抢占,要等到中断处理完成才能做其他事情。
因此,要充分考虑中断处理的时间,一定不能太久。但是我这边并不是在中断系统中,发了几天时间也没有找出原因来,我追踪源码最后到了pl330_request_channel里面的pm_runtime_get_sync(pl330->pinfo->dev); 这个RPM函数因为调用__schedule 而发生原子错误,由于这个错误时概率性事件,小弟百思不得其解,求大神们指点一二。我的子系统驱动函数应该没有问题,内核版本为三星平台3.5,开发板是用的友善之臂的。我通过修改内核源码是解决了这个问题,我的修改如下,我基本上是吧DMA的RPM唤醒机制屏蔽掉了。
1.将pl330_probe函数里的pm_runtime_put(&adev->dev); 注释掉;
2.将pl330_request_channel的pm_runtime_get_sync注释掉;
3.将pl330_release_channel的pm_runtime_put(pl330->pinfo->dev);注释掉;
这样修改之后不会出现上述问题,具体请看下面注释:static int s3c64xx_spi_prepare_transfer(struct spi_master *spi)
{
struct s3c64xx_spi_driver_data *sdd = spi_master_get_devdata(spi);/* Acquire DMA channels */
while (!acquire_dma(sdd))  //原先这里面有调用pm_runtime_  就把里面的注释了
msleep(10);pm_runtime_get_sync(&sdd->pdev->dev);//但是为什么这里调用就不会出现原子错误呢???return 0;
}static int s3c64xx_spi_unprepare_transfer(struct spi_master *spi)
{
struct s3c64xx_spi_driver_data *sdd = spi_master_get_devdata(spi);/* Free DMA channels */
sdd->ops->release(sdd->rx_dma.ch, &s3c64xx_spi_dma_client);//原先这里面也有调用pm_runtime_  就把里面的注释了
sdd->ops->release(sdd->tx_dma.ch, &s3c64xx_spi_dma_client);//原先这里面也有调用pm_runtime_  就把里面的注释了pm_runtime_put(&sdd->pdev->dev);return 0;
}求大神指点!感激万分!!谢谢!!

以下是我的回复

网上说“中断处理函数中调用了可以休眠的函数,如semaphore,mutex,sleep之类的可休眠的函数”就会打印
“[ 3777.005000] BUG: scheduling while atomic: spi0/25/0x00000002”这种log。
这种说法有一定道理,但没有说到本质。
我想你也找过打印上面log的地方,就在__schedule_bug()函数里。
运行__schedule_bug()函数的条件是
static inline void schedule_debug(struct task_struct *prev)
if (unlikely(in_atomic_preempt_off() && !prev->exit_state))
__schedule_bug(prev);
}
所以打印上面Log的条件是在preempt_disable的进程里,运行schedule()函数。
也就是说某个进程已经不允许其他进程抢占,但在这个进程的某个函数里边却运行了schedule()试图放弃当前的进程执行权。
你可以看一下“[ 3777.005000] BUG: scheduling while atomic: spi0/25/0x00000002”里边0x00000002代表的意思,
其实就是preempt_count的值,这个值大于0表示当前进程不能被抢占。
那可以找一下在哪里会增加preempt_count的值。我没有你的代码,所以看不到详细的内容。
但我找了我本地的代码,可能是三星的spi驱动里边设置的spinlock函数。
你可以找一下spinlock的实现,里边都有增加preempt_count。
所以要避免出现上面的错误,必须要注意spinlock lock和spinlock unlock的地方。最好在schedule之前解spinlock锁,在schedule之后再打开。
以避免出现上面的错误

Linux内核相关论坛问题回复(1)相关推荐

  1. linux内核相关知识

    参考https://www.cnblogs.com/xdyixia/p/9248240.html linux内核启动过程 一个嵌入式 Linux 系统从软件角度看可以分为四个部分:引导加载程序(Boo ...

  2. Linux内核相关书籍

    书籍资源:https://download.csdn.net/download/Rong_Toa/12555531 Understanding the Linux Kernel linux-kerne ...

  3. linux内核层功能 和核心,Linux内核研发工程师

    岗位职责: 1.根据软件技术方案完成对内核特性的深层次改进或全新功能的开发.调试工作: 2.熟练运用各种系统性能分析工具,熟悉性能优化,能够完成子系统级的性能优化工作: 3.参与虚拟化底层技术的研究和 ...

  4. Linux内核--1,2章

    网络的东西,暂且停一段,开始看linux内核相关的内容了.... 周一开始看的,看了两张 前两章一个是简介,一个是安装内核 简介的东西就不说了,反正就是那些事,Multix-unix-minix-li ...

  5. 【Linux 内核】实时调度类 ① ( 进程分类 | 实时进程、普通进程 | Linux 内核 SCHED_FIFO、SCHED_RR 调度策略 | 实时调度实体 sched_rt_entity )

    文章目录 一.进程分类 ( 实时进程 | 普通进程 ) 二.Linux 内核调度策略 1.SCHED_FIFO 调度策略 2.SCHED_RR 调度策略 三.实时调度实体 sched_rt_entit ...

  6. Linux内核裁剪及编译

    Linux内核裁剪及编译可加载模块 一 Linux基础知识 linux内核组要由五个子系统组成: 进程调度 内存管理 文件系统 网络接口 进程间通信 Linux源码目录 arch    目录中包含于体 ...

  7. 《Linux内核设计与实现》读书笔记(十八)- 内核调试

    内核调试的难点在于它不能像用户态程序调试那样打断点,随时暂停查看各个变量的状态. 也不能像用户态程序那样崩溃后迅速的重启,恢复初始状态. 用户态程序和内核交互,用户态程序的各种状态,错误等可以由内核来 ...

  8. android 4.4 linux 内核版本,稳定内核版本和更新  |  Android 开源项目  |  Android Open Source Project...

    由于之前的内核开发模型(每 2-3 个月发布一次新版本)被认为无法满足大多数用户的需求,Linux 内核稳定版模型于 2005 年随之诞生.用户希望实际用到在 2-3 个月内提交的错误修复程序,但 L ...

  9. linux内核make menuconfig执行过程

    近两年一直有着写linux内核相关的想法,比如从Makefile执行 make menuconfig.make,到x86架构的引导启动过程.由于网上有较多相关的文章,便有些羞涩于自己动手写.现在想着无 ...

最新文章

  1. 【linux高级程序设计】(第十一章)System V进程间通信 3
  2. (原+转)linux安装rtl 8812au驱动
  3. 你写的Python代码规范吗?
  4. 真正厉害的产品经理,都是“数据思维”的高手
  5. 7月国内手机出货量3419.9万部 5G手机果然还是很少!
  6. MongoDB和Elasticsearch的各使用场景对比
  7. ios ffmpeg(libfdk-aac) aac encode
  8. golang 数据一   (字符串、数组和数组指针)
  9. 2-Twelfth Scrum Meeting20151212
  10. Spring Boot 2.x(十四):整合Redis,看这一篇就够了
  11. ansys轴对称模型之二维模型
  12. Linux操作系统 第六章
  13. johnson_trotter(生成排列算法)
  14. 【论文学习】《Who is Real Bob? Adversarial Attacks on Speaker Recognition Systems》
  15. 打开Qt Creator软件时报警告:xxx.exe应用程序错误
  16. UBNT路由模式设置
  17. 20161221windows的snmp端口号更改
  18. 智慧养老系统(社区+居家+机构养老)
  19. IBM于天津成立咨询业务团队;爱彼迎将合作全球20个目的地支持远程办公 | 美通企业日报...
  20. 你不知道的CRM销售漏斗管理的真正价值

热门文章

  1. VS2022,C#中对PostgreSQL数据库增删改查实例记录
  2. 建立强大的verilog编写环境
  3. 讲师秀之7:林仕鼎谈架构设计与架构师
  4. 前端开发的 20 年变迁史~
  5. cad2016中选择全图字体怎么操作_CAD2016 软件安装教程
  6. 合并单元格如何快速填充序列
  7. 在人脸识别、机器视觉中USB免驱摄像头拍照颜色不对怎么办?大影30~1600万像素多种摄像头方案通过一次白平衡解决偏色问题。
  8. matlab实现从s域变成z域、matlab实现长除法逆z变换实例
  9. html5 o2o,基于HTML5的O2O团购平台的设计与实现
  10. 重庆移动4G资费出炉 600M流量售50元