免费注册 查看新帖 |

Chinaunix

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

请教大家如何验证jiffy的错误是否会导致系统处理poll的timeout错误 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-05-26 16:29 |只看该作者
系统是别人的,poll的代码拿不到,
系统要把poll的timeout参数转换成要jiffies的个数,
所以才猜测会不会在这个地方出问题了。

论坛徽章:
5
12 [报告]
发表于 2009-05-26 16:38 |只看该作者

回复 #11 abcf987 的帖子

明白你的意思了.

poll函数会根据timeout值, 转换成jiffies, 来判断是否超时.

现在又不能改OS(jiffies), 又没有poll()源码. 只能猜测问题所在. 确实有难度.

论坛徽章:
5
13 [报告]
发表于 2009-05-26 17:06 |只看该作者
跳出你的圈子, 来分析一般的情况.

现在有一输入(jiffies)和一处理函数poll(). 我们不清楚输入值, 也不清楚函数内部, 怎样分析输入值导致函数出问题?

论坛徽章:
0
14 [报告]
发表于 2009-05-26 18:03 |只看该作者
原帖由 abcf987 于 2009-5-26 15:17 发表
一个嵌入式系统,内核是linux2。6的,自己裁减的,
我们公司的程序在上面跑了一年多了,突然有一天cpu100%了,
通过gdb看core,发现是下面这样一段代码deadloop了,
while ...


see include/linux/jiffies.h

/*
* Have the 32 bit jiffies value wrap 5 minutes after boot
* so jiffies wrap bugs show up earlier.
*/
#define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ))

所以应该不是jiffies wrap bugs...

论坛徽章:
5
15 [报告]
发表于 2009-05-26 22:03 |只看该作者

回复 #14 eexplorer 的帖子

你这是哪个kernel版本?
初始值并不一样的。

论坛徽章:
0
16 [报告]
发表于 2009-05-27 11:06 |只看该作者
明白eexplorer 的意思了,
如果是jiffy的溢出,变成零,
因为jiffies的初始是负的,应该在5min内就能发现问题了,
看来不是这个原因了。

论坛徽章:
5
17 [报告]
发表于 2009-05-27 11:14 |只看该作者

回复 #16 abcf987 的帖子

你OS下的jiffy初始值, 未必就是他的初始值. 要确定一下.

论坛徽章:
0
18 [报告]
发表于 2009-05-27 11:39 |只看该作者
谢谢!
确认过了,jiffy的初始值是那样的。
拿到os代码了,查了一下,不知道下面的代码是不是是poll的实现
static int do_poll(unsigned int nfds,  struct poll_list *list,
                        struct poll_wqueues *wait, long timeout)
{
        int count = 0;
        poll_table* pt = &wait->pt;

        if (!timeout)
                pt = NULL;

        for (; {
                struct poll_list *walk;
                set_current_state(TASK_INTERRUPTIBLE);
                walk = list;
                while(walk != NULL) {
                        do_pollfd( walk->len, walk->entries, &pt, &count);
                        walk = walk->next;
                }
                pt = NULL;
                if (count || !timeout || signal_pending(current))
                        break;
                count = wait->error;
                if (count)
                        break;
                timeout = schedule_timeout(timeout);
        }
        __set_current_state(TASK_RUNNING);
        return count;
}
从这段代码看,
可能的原因就是是不是thread不停的收到singal,
所以就直接return了。
但是当时没有连接,不应该收到signal而wakeup的啊!

论坛徽章:
0
19 [报告]
发表于 2009-05-27 16:57 |只看该作者
原帖由 abcf987 于 2009-5-27 11:39 发表
谢谢!
确认过了,jiffy的初始值是那样的。
拿到os代码了,查了一下,不知道下面的代码是不是是poll的实现
static int do_poll(unsigned int nfds,  struct poll_list *list,
                        struct poll_wq ...


你们的kernel是2.6.X?如果单纯是signal导致的退出,应该查看一下poll的return value (errno = EINTR).

还有poll是在监控什么fd, tcp socket还是你们自己写的device driver?

论坛徽章:
0
20 [报告]
发表于 2009-05-27 17:18 |只看该作者
poll的return value是0
监视tcpsocket,是个server端的socket,
没有连接,只是出在listen状态的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP