免费注册 查看新帖 |

Chinaunix

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

TCP协议栈提前拷贝到用户缓冲区的问题 [复制链接]

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

最近看TCP协议栈时在tcp_rcv_established函数里看到这么一段
  1. if ([color=Red]tp->ucopy.task == current[/color] &&
  2.     sock_owned_by_user(sk) && !copied_early) {
  3.         __set_current_state(TASK_RUNNING);

  4.         /*tcp_copy_to_iovec返回0为成功*/
  5.         if (!tcp_copy_to_iovec(sk, skb, tcp_header_len))
  6.                 eaten = 1;
  7. }
复制代码
上面红字部分不明白有什么用,为什么一定要保证ucopy.task==current?
实际上一般进程调用recv阻塞后不就切换走了?上面这个条件如何满足?
我觉得可能是在进程上下文处理prequeue或者backlog时才会进入这个条件,但如果是这种情况,似乎又不需要__set_current_state(TASK_RUNNING)这句话了。
特来求助。

多谢!

论坛徽章:
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
2 [报告]
发表于 2012-02-27 12:08 |只看该作者
本帖最后由 瀚海书香 于 2012-02-27 13:27 编辑

回复 1# peimichael
刚才看了下代码,以前没注意个这个地方。佩服楼主看代码这么仔细啊。。。

貌似流程是:current系统调用recv-->软中断打断-->tcp_rcv_established,但是好像current的状态是RUNNING的
??


   

论坛徽章:
0
3 [报告]
发表于 2012-02-27 12:14 |只看该作者
回复 2# 瀚海书香


    tcp_recvmsg是用户进程recv系统调用调到的函数啊,为啥会在软中断被调用?楼上是指“tcp_v4_rcv”吗?

论坛徽章:
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
4 [报告]
发表于 2012-02-27 13:27 |只看该作者
回复 3# peimichael
已经改过来了

   

论坛徽章:
0
5 [报告]
发表于 2012-02-27 13:45 |只看该作者
current系统调用recv-->软中断打断-->tcp_rcv_established,但是好像current的状态是RUNNING的

我就是觉得奇怪,系统调用recv之后不是就进入sleep状态了吗,如果说必须是"在进入recv后,进程切换之前"正好被软中断打断,这个概率是不是小了点。
还有就算等待在socket上的进程不是current进程会有什么影响吗?为啥一定要是current?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP