免费注册 查看新帖 |

Chinaunix

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

[网络子系统] SPINLOCK问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-16 15:53 |只看该作者 |倒序浏览
本帖最后由 funtasty 于 2012-07-19 08:33 编辑

我有两个 处理数据报的缓冲队列,一个高速, 一个低速。 分别要记数。fast_len, slow_len.
而且 要在无数据报的时候 释放CPU。
代码大致如下:

while(1)
{
    if (fast_len > 0)
    {
        spin_lock_bh(fast_lock);
        fast_len--;
       spin_unlock_bh(fast_lock);
    } else if (slow_len > 0)
    {
        spin_lock_bh(slow_lock);
        slow_len--;
       spin_unlock_bh(slow_lock);
    }
     else
     {
           schedule_timeout(1);
     }
}
现在存在的问题。INSMOD 之后会提示 bug : scheduling while atomic.
但是 schedule_timeout 没有在 锁中呀。。
求斑竹和达人给 点提示  给 跪谢了。

另一个线程做的操作跟这个线程差不多。 就是收数据包然后将计数+1.
    if (iph->tos == fast)
    {
        spin_lock_bh(fast_lock);
        fast_len++;
       spin_unlock_bh(fast_lock);
    } else if (iph->tos == slow)
    {
        spin_lock_bh(slow_lock);
        slow_len++;
       spin_unlock_bh(slow_lock);
    }

锁问题已经解决了, 可以现在带来了一个新问题就是 收发效率过低。速度衰减了100倍。
求达人指点。 怎么在多核高使用率的情况下提高效率呢。

其实代码逻辑也非常简单。 两个线程 一个收包,一个发包, 两种数据包 快速慢速, 两把锁。
收包和发包肯定有同时进行的时候, 缓冲队列中没有包, 发包线程让出cpu一段时间。

godbach 版主 help~~~

论坛徽章:
0
2 [报告]
发表于 2012-07-16 16:30 来自手机 |只看该作者
这个代码是一个出队线程。还有一个入队线程。这个出队线程是一直运行。在没有数据包的时候就是两个len都不为空时出对。为空时释放cpu。

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
3 [报告]
发表于 2012-07-16 19:10 |只看该作者
大致代码,估计大家大致都不知道具体原因!

论坛徽章:
0
4 [报告]
发表于 2012-07-16 21:17 |只看该作者
回复 3# cdtits

那个timeout 的函数能和上面的两个一起执行吗? 在多核的情况下。。
锁的位置对吗? 判断的时候也要锁上吗?
   

论坛徽章:
0
5 [报告]
发表于 2012-07-16 21:20 |只看该作者
cpu之间会互相影响吗? 一个 cpu 在 scheduling_timeout .  另一个在 lock。 会互相影响吗?

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
6 [报告]
发表于 2012-07-17 00:24 |只看该作者
你的代码太简单了,无从猜测,无法推测

论坛徽章:
0
7 [报告]
发表于 2012-07-17 22:18 |只看该作者
回复 1# funtasty

你这个循环是在什么上下文执行的? 内核线程? 软中断?
   

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
8 [报告]
发表于 2012-07-18 19:22 |只看该作者
回复 1# funtasty
如果只看这部分代码,不会有问题,需要多一些的背景知识:
运行环境, cpu? 代码运行在哪个进程上?系统共有多少个进程? 每个进程大致任务?等等

   

论坛徽章:
0
9 [报告]
发表于 2012-07-19 08:26 |只看该作者
回复 7# honkiko

这两段代码。 下面的代码(收包)是内核从网卡队列中拷贝过来后执行的,
   上面的代码(发包)是驱动注册的时候执行的。

下面代码检测缓冲中是否有包, 然后发包。 没有就释放一段时间cpu。

论坛徽章:
0
10 [报告]
发表于 2012-07-19 08:28 |只看该作者
回复 8# linuxfellow

嗯。谢谢关注。 现在又有了一个新问题, 达人有思路吗?
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP