免费注册 查看新帖 |

Chinaunix

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

[中断] 线上讨论之linux中断总结分享 [复制链接]

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
71 [报告]
发表于 2011-12-04 10:26 |只看该作者
本帖最后由 embeddedlwp 于 2011-12-04 10:29 编辑
  1. 221static void flush_cpu_workqueue(struct cpu_workqueue_struct *cwq)
  2. 222{
  3. 223        if (cwq->thread == current) {
  4. 224                /*
  5. 225                 * Probably keventd trying to flush its own queue. So simply run
  6. 226                 * it by hand rather than deadlocking.
  7. 227                 */
  8. 228                run_workqueue(cwq);
  9. 229        } else {
  10. 230                DEFINE_WAIT(wait);
  11. 231                long sequence_needed;
  12. 232
  13. 233                spin_lock_irq(&cwq->lock);
  14. 234                sequence_needed = cwq->insert_sequence;
  15. 235
  16. 236                while (sequence_needed - cwq->remove_sequence > 0) {
  17. 237                        prepare_to_wait(&cwq->work_done, &wait,
  18. 238                                        TASK_UNINTERRUPTIBLE);
  19. 239                        spin_unlock_irq(&cwq->lock);
  20. 240                        schedule();
  21. 241                        spin_lock_irq(&cwq->lock);
  22. 242                }
  23. 243                finish_wait(&cwq->work_done, &wait);
  24. 244                spin_unlock_irq(&cwq->lock);
  25. 245        }
  26. 246}
复制代码
在cpu_workqueue_struct结构中两个字段:
  1. 42        long remove_sequence;   /* Least-recently added (next to run) */
  2.   43        long insert_sequence;   /* Next to add */
复制代码
看到在queue_work中每插入一个work,会执行:
  1. cwq->insert_sequence++;
复制代码
在run_workqueue中每执行一个work,会执行:
  1. cwq->remove_sequence++;
复制代码
ULK3上说“flush_workqueue函数接收workqueue_struct描述符的地址,并且在工作队列中的所有挂起函数结束之前使调用进程一直处于阻塞状态。但是该函数不会等待在调用flush_workqueue之后新加入工作队列的挂起函数,每个cpu_workqueue_struct描述符的remove_sequence字段和insert_sequence字段用于识别新增加的挂起函数”。

两个问题:

1) “但是该函数不会等待在调用flush_workqueue之后新加入工作队列的挂起函数”,怎么做到的?
2) 每个cpu_workqueue_struct描述符的remove_sequence字段和insert_sequence字段用于识别新增加的挂起函数,上边程序“while (sequence_needed - cwq->remove_sequence > 0)”这个是在干吗?(其实我就是对那两个字段到底是干嘛的不理解!)

论坛徽章:
0
72 [报告]
发表于 2011-12-04 12:14 |只看该作者
再过来看看,密切关注这个话题

论坛徽章:
0
73 [报告]
发表于 2011-12-04 14:04 |只看该作者

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
74 [报告]
发表于 2011-12-04 19:17 |只看该作者
本帖最后由 embeddedlwp 于 2011-12-04 19:20 编辑

当进程在它的时间片到期的时候可以被抢占。此时,当前进程的thread_info结构中的TIF_NEED_RESCHED标志被置位,以便时钟中断处理程序终止时调度程序被调用。


但是在时钟中断的bh,run_timer_softirq函数中我并没有找到检查TIF_NEED_RESCHED标志是否被置位,并调用调度程序的地方啊!

求指点!

下边是2.6.11中的代码:
  1. 434static inline void __run_timers(tvec_base_t *base)
  2. 435{
  3. 436        struct timer_list *timer;
  4. 437
  5. 438        spin_lock_irq(&base->lock);
  6. 439        while (time_after_eq(jiffies, base->timer_jiffies)) {
  7. 440                struct list_head work_list = LIST_HEAD_INIT(work_list);
  8. 441                struct list_head *head = &work_list;
  9. 442                int index = base->timer_jiffies & TVR_MASK;
  10. 443
  11. 444                /*
  12. 445                 * Cascade timers:
  13. 446                 */
  14. 447                if (!index &&
  15. 448                        (!cascade(base, &base->tv2, INDEX(0))) &&
  16. 449                                (!cascade(base, &base->tv3, INDEX(1))) &&
  17. 450                                        !cascade(base, &base->tv4, INDEX(2)))
  18. 451                        cascade(base, &base->tv5, INDEX(3));
  19. 452                ++base->timer_jiffies;
  20. 453                list_splice_init(base->tv1.vec + index, &work_list);
  21. 454repeat:
  22. 455                if (!list_empty(head)) {
  23. 456                        void (*fn)(unsigned long);
  24. 457                        unsigned long data;
  25. 458
  26. 459                        timer = list_entry(head->next,struct timer_list,entry);
  27. 460                        fn = timer->function;
  28. 461                        data = timer->data;
  29. 462
  30. 463                        list_del(&timer->entry);
  31. 464                        set_running_timer(base, timer);
  32. 465                        smp_wmb();
  33. 466                        timer->base = NULL;
  34. 467                        spin_unlock_irq(&base->lock);
  35. 468                        {
  36. 469                                u32 preempt_count = preempt_count();
  37. 470                                fn(data);
  38. 471                                if (preempt_count != preempt_count()) {
  39. 472                                        printk("huh, entered %p with %08x, exited with %08x?\n", fn, preempt_count, preempt_count());
  40. 473                                        BUG();
  41. 474                                }
  42. 475                        }
  43. 476                        spin_lock_irq(&base->lock);
  44. 477                        goto repeat;
  45. 478                }
  46. 479        }
  47. 480        set_running_timer(base, NULL);
  48. 481        spin_unlock_irq(&base->lock);
  49. 482}
复制代码

论坛徽章:
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
75 [报告]
发表于 2011-12-05 08:25 |只看该作者
回复 74# embeddedlwp
__run_timers是用来完成动态定时器的。比如:add_timer添加的动作等等。

而你所说的TIF_NEED_RESCHED 应该是在周期性调度器里面置位的。

论坛徽章:
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
76 [报告]
发表于 2011-12-05 08:27 |只看该作者
回复 74# embeddedlwp
周期性调度的执行函数流程简化为:

tick_handle_periodic-->tick_periodic-->update_process_times-->scheduler_tick

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
77 [报告]
发表于 2011-12-05 08:42 |只看该作者
回复 76# 瀚海书香


    70楼和71楼的问题您怎么看?

论坛徽章:
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
78 [报告]
发表于 2011-12-05 10:53 |只看该作者
回复 77# embeddedlwp
70楼的问题也没太看懂。如果找不到合适的理由,就猜测是中文翻译的问题吧

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
79 [报告]
发表于 2011-12-05 19:25 |只看该作者
回复 78# 瀚海书香


    大哥,那71楼呢,小弟愚钝,求指点!

论坛徽章:
0
80 [报告]
发表于 2011-12-06 09:21 |只看该作者
顶一下。。。留着学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP