免费注册 查看新帖 |

Chinaunix

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

[中断] ksoftirqd 被中断-小问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-02-01 21:00 |只看该作者 |倒序浏览
本帖最后由 wzw200 于 2015-02-01 22:00 编辑

内核线程ksoftirqd 在执行do_softirq处理一个软中断--taskletA时候被中断的了,
进而执行irq_exit->do_softirq--taskletA,这个函数又是可重入的了
这样会不会出问题


1、中断退出执行的irq_exit
2、内核线程ksoftirqd

这两种情况是怎能么实现互互斥的呢,


http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1966733

asmlinkage void do_softirq(void)
{
        __u32 pending;
        unsigned long flags;
        //
        // 这个函数判断,如果当前有硬件中断嵌套,或者
        // 有软中断正在执行时候,则马上返回。在这个
        // 入口判断主要是为了与 ksoftirqd 互斥。
        //
        if (in_interrupt())

                return;

没看明白!

论坛徽章:
0
2 [报告]
发表于 2015-02-01 21:25 |只看该作者
do_softirq  
{
        //禁止中断,保存中断标志
        local_irq_save(flags);
                。。。。。。。
                //恢复之
        local_irq_restore(flags);
}
看了其它人的帖子,好像有这个

论坛徽章:
0
3 [报告]
发表于 2015-02-01 21:55 |只看该作者
软中断是不能再被其他软中断打断的,只有硬中断可以打断软中断去执行中断上半部,所以你说的这个问题应该不存在啊。

论坛徽章:
0
4 [报告]
发表于 2015-02-01 22:03 |只看该作者
回复 3# ran4029

那个软中断线程,在执行do_softirq的时候,应该是这样的,只是想不通他是怎么实现的


   

论坛徽章:
0
5 [报告]
发表于 2015-02-01 22:12 |只看该作者
do_softirq()中有两个非常值得注意的地方:

asmlinkage void do_softirq(void)
{
/* 如果当前CPU指令运行于中断或者软中断文境中,必须直接返回。
   这可以回答guotie的问题, local_bh_disable()的实际作用是标志当前任务_互斥_软中断。
   1. 如果软中断文境下,任务在__do_softirq()函数时,被中断打断,进入中断处理,中断执行完后,再次进入软中断,到达这里就会返回。
   2. 还有一个,就是如果在内核任务ksoftirqd文境中执行 do_softirq()的时候,被中断打断后,也不会实质进入软中断,这样可以避免大部分的内核同步问题 */
if (in_interrupt())
return;

local_irq_save(flags);

if (local_softirq_pending()) {
curctx = current_thread_info();

这是我查的资料,我想不通,第二种情况是怎么实现的,

论坛徽章:
0
6 [报告]
发表于 2015-02-01 22:17 |只看该作者
asmlinkage void do_softirq(void)
{
        __u32 pending;
        unsigned long flags;

        if (in_interrupt())
                return;

        local_irq_save(flags);

        pending = local_softirq_pending();

        if (pending)
                __do_softirq();

        local_irq_restore(flags);
}

asmlinkage void __do_softirq(void)
{
        struct softirq_action *h;
        __u32 pending;
        int max_restart = MAX_SOFTIRQ_RESTART;
        int cpu;

        pending = local_softirq_pending();
        account_system_vtime(current);

        __local_bh_disable((unsigned long)__builtin_return_address(0));
        lockdep_softirq_enter();

        cpu = smp_processor_id();
        ............................
        _local_bh_enable();
}

static inline void __local_bh_disable(unsigned long ip)
{
        add_preempt_count(SOFTIRQ_OFFSET);
        barrier();
}

好吧,我想明白了

论坛徽章:
0
7 [报告]
发表于 2015-02-03 14:26 |只看该作者
回复 6# wzw200

http://bbs.chinaunix.net/thread-4165519-1-1.html
我之前有发过一个帖子。应该跟你这个疑问略有相同之处。只不过我现在也还未完全明白

其中的关键点儿应该集中在 中断返回 时  堆栈恢复 与 软中断调度的区别


   

论坛徽章:
0
8 [报告]
发表于 2015-02-03 16:39 |只看该作者
回复 7# anyhit


中断返回 时  堆栈恢复 与 软中断调度的区别

这个这几天,我看明白了,我一会到你那里给你回下,
我看这块的时候,都是自己想偏了,CPU怎么运行,还要看代码
QQ:88486969

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP