免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: zhongyuan_sh
打印 上一主题 下一主题

[中断] 中断上半部分是否能被打断 [复制链接]

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
21 [报告]
发表于 2012-10-30 22:59 |只看该作者

只是mark一下.

个人也想整理一个关于这个方面的东西.

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
22 [报告]
发表于 2012-10-31 10:51 |只看该作者
回复 20# blake326
但是比较新的内核38以后代码都变了,没有这个标志了,所以一直是关中断的。

刚才看了下V3.7-rc3的内核,的确是这样的,最新的内核因为中断线程化的支持,已经不允许中断上半部的时候嵌套了。
内核建议把中断上半部中的处理放到线程中处理,在ISR中是禁止中断嵌套的。
  1. irqreturn_t
  2. handle_irq_event_percpu(struct irq_desc *desc, struct irqaction *action)
  3. {
  4.         irqreturn_t retval = IRQ_NONE;
  5.         unsigned int flags = 0, irq = desc->irq_data.irq;

  6.         do {
  7.                 irqreturn_t res;

  8.                 trace_irq_handler_entry(irq, action);
  9.                 res = action->handler(irq, action->dev_id);
  10.                 trace_irq_handler_exit(irq, action, res);

  11.                 if (WARN_ONCE(!irqs_disabled(),"irq %u handler %pF enabled interrupts\n",
  12.                               irq, action->handler))
  13.                         local_irq_disable();
  14.                 //内核担心老的驱动仍然在ISR中开启中断,打印警告信息,并强制把中断关闭。

  15.                 switch (res) {
  16.                 case IRQ_WAKE_THREAD:
  17.                 //根据返回值,如果ISR线程化了中断,那么就唤起处理线程
  18.                         /*
  19.                          * Catch drivers which return WAKE_THREAD but
  20.                          * did not set up a thread function
  21.                          */
  22.                         if (unlikely(!action->thread_fn)) {
  23.                                 warn_no_thread(irq, action);
  24.                                 break;
  25.                         }

  26.                         irq_wake_thread(desc, action);

  27.                         /* Fall through to add to randomness */
  28.                 case IRQ_HANDLED:
  29.                 //ISR直接在中断中处理了
  30.                         flags |= action->flags;
  31.                         break;

  32.                 default:
  33.                         break;
  34.                 }

  35.                 retval |= res;
  36.                 action = action->next;
  37.         } while (action);

  38.         add_interrupt_randomness(irq, flags);

  39.         if (!noirqdebug)
  40.                 note_interrupt(irq, desc, retval);
  41.         return retval;
  42. }
复制代码

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
23 [报告]
发表于 2012-10-31 22:08 |只看该作者
本帖最后由 tempname2 于 2012-10-31 22:10 编辑

回复 22# 瀚海书香

上次一个搞MIPS的哥们就提了吧,还把Ingo的commit message都发上来了。

lockdep也是个很大的理由。另外并非禁止上半部嵌套,我记得commit message里说ISR想打开中断可以自己打开。(没看过代码)

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
24 [报告]
发表于 2012-11-01 08:30 |只看该作者
回复 23# tempname2
我记得commit message里说ISR想打开中断可以自己打开。(没看过代码)

看我上面代码的注释,如果ISR中打开中断,内核强制给你关掉,并打印WARN信息。

   

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
25 [报告]
发表于 2013-04-05 11:03 |只看该作者
本帖最后由 chishanmingshen 于 2013-04-05 11:05 编辑

回复 6# stephen_du


buffer着?不会吧?


疑惑中~~
   

论坛徽章:
0
26 [报告]
发表于 2013-04-05 16:24 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
27 [报告]
发表于 2013-04-09 14:01 |只看该作者
LINUX内核设计与实现.pdf

论坛徽章:
0
28 [报告]
发表于 2013-07-31 17:33 |只看该作者
完全是乱扯

论坛徽章:
0
29 [报告]
发表于 2013-07-31 17:33 |只看该作者
完全是乱扯
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP