免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3261 | 回复: 3
打印 上一主题 下一主题

关于linux内核中handle_edge_irq [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-26 20:46 |只看该作者 |倒序浏览
问题1
这段代码有什么玄机?
if (unlikely((desc->status &(IRQ_PENDING | IRQ_MASKED | IRQ_DISABLED)) == (IRQ_PENDING | IRQ_MASKED)))

是否可以改为
if(desc->status &(IRQ_PENDING | IRQ_MASKED))

问题2
   
C/C++ code
  1. do {
  2.         struct irqaction *action = desc->action;
  3.         irqreturn_t action_ret;

  4.         if (unlikely(!action)) {
  5.             mask_irq(desc, irq);
  6.             goto out_unlock;
  7.         }
  8.                ....
  9.                 action_ret = handle_IRQ_event(irq, action);
  10.              }while(.....)
复制代码


判断action是否可以不要,为什么?(我认为可以不要,因为不会出现action为空的情况。即使其他cpu在该cpu执行handle_IRQ_event的时候,准备释放该action,也会等待这次中断执行完毕后再释放)

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
2 [报告]
发表于 2011-07-26 22:20 |只看该作者
1,2个代码根本不等价,没什么可说的
2,应该是ACTION没注册,那么就相当与没有与此相关的驱动存在

论坛徽章:
0
3 [报告]
发表于 2011-07-27 09:11 |只看该作者
1.同意楼上,LZ逻辑出现混乱了

2.正是unlikely存在的必要,小概率事件必然发生

论坛徽章:
0
4 [报告]
发表于 2011-07-27 20:27 |只看该作者
关于问题1

  1. #define IRQ_DISABLED                0x00000200       
  2. #define IRQ_PENDING                0x00000400       
  3. #define IRQ_MASKED                0x00008000
复制代码
为什么需要并上IRQ_DISABLED? 大虾能否说详细点,我看了很久确实不知道问什么。


关于问题2
重新看了一下free_irq, 我想应该这样解释。

当A cpu在执行  handle_IRQ_event(irq, action)时,是没有加任何锁得。这时 B cpu可以有机会正在释放该中断,free_irq将会按下面的代码顺序执行:

  1.         raw_spin_lock_irqsave(&desc->lock, flags);
  2. 。。。。
  3.         action_ptr = &desc->action;
  4.         for (;;) {
  5.                 action = *action_ptr;

  6.                 if (!action) {
  7.                         WARN(1, "Trying to free already-free IRQ %d\n", irq);
  8.                         raw_spin_unlock_irqrestore(&desc->lock, flags);

  9.                         return NULL;
  10.                 }

  11.                 if (action->dev_id == dev_id)
  12.                         break;
  13.                 action_ptr = &action->next;
  14.         }
  15. 。。。。。。。

  16.         *action_ptr = action->next;
  17. 。。。。。。。
  18.         raw_spin_unlock_irqrestore(&desc->lock, flags);
  19. 。。。。。。。。
  20.         synchronize_irq(irq);
复制代码
当b释放锁后,一直处在无限循环中,等待a把最后一个中断执行完,然后清除IRQ_INPROGRESS.
当a获得锁后,发现action被注销,屏蔽掉该中断,跳出循环。清除IRQ_INPROGRESS.
无限循环中的b检测到IRQ_INPROGRESS标志清除,退出循环。

还有unlikely的意思,应该是告诉编译器对这段不常执行的代码进行分支优化吧。

ps:问题1,真的没想通,再请大虾详解!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP