免费注册 查看新帖 |

Chinaunix

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

[网络子系统] ip_append_data函数中一个难以理解的条件判断【已解决】 [复制链接]

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-09-29 21:39 |只看该作者 |倒序浏览
本帖最后由 jiufei19 于 2016-10-10 13:07 编辑

之前的帖子一直无法解决这个疑问,在此我将此问题单独提出,希望能得到大家的帮助。

多个内核版本均如此,包括V3.x,只是对应代码行数略微有差别而已,在此我以版本V2.6.23为例

在ip_append_data()函数的第997行有如下判断

   ...           ...
   994             if (page && (left = PAGE_SIZE - off) > 0) {
   995                 if (copy >= left)
   996                     copy = left;
   997                 if (page != frag->page) {
   998                     if (i == MAX_SKB_FRAGS) {
   999                         err = -EMSGSIZE;
  1000                         goto error;
  1001                     }

  ...            ...


第997行,为啥要进行此判断,我仔细阅读了代码,假设了各种场景,都只能得到page==frag->page的情况,到底什么样的场景会导致这2者不相等呢?

论坛徽章:
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 [报告]
发表于 2016-10-06 20:47 |只看该作者
回复 1# jiufei19

话说现在都是4.x的代码了,checkout到2.6.23看了一下。

1、弄清楚两个page的含义
    page=sk->sk_sndmsg_page 是指本传输块最近一次分配的页面
    frag->page 是指skb分片数据的最后一页

2、一般情况下,这两个页面是相同的

3、但是在特殊情况下,page跟frag->page是不同的,比如

    看net/ipv4/tcp.c 中的tcp_sndmsg函数,在第789行,申请page成功,但是数据copy失败的情况下。

    page=sk->sk_sndmsg_page 会指向最新分配的page;//796行
    而frag->page 由于数据copy没有成功,并不会更新指向这个page;//只有copy数据成功后,才会更新frag-page, 807行

   

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
3 [报告]
发表于 2016-10-06 21:50 |只看该作者
回复 2# 瀚海书香

感谢版主。
不过我有点疑问,我的问题是在ip_append_data()函数中出现的问题,而版主给出的例子是在tcp_sendmsg函数中,我核对了下,tcp_sendmsg好像和ip_append_data没有关系呢?

论坛徽章:
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 [报告]
发表于 2016-10-08 08:44 |只看该作者
回复 3# jiufei19 同一个sock,可以被tcp_sendmsg和ip_append_data调用,考虑如下调用逻辑:

1、申请一个sock
2、调用tcp_sendmsg发送数据【copy失败】
3、调用ip_append_data直接发送raw数据【触发上述场景】




另外,Google的Eric Dumazet将tcp_sendmsg中cache page的管理,将per-socket转换为per-task。

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
5 [报告]
发表于 2016-10-08 09:55 |只看该作者
回复 4# 瀚海书香

再次感谢版主的热心解答。
虽然,逻辑上该问题的产生一定是某次使用page进行发送时,因某种原因没有调整frags->page为sk->sk_sndmsg_page才导致的,但是因为我没有找到具体什么应用或内核的什么具体操作会这样,故产生了这一疑问,而版主给出了可能出现这一问题的场景,但是,似乎仍然是一个假想的场景,而非内核中具体一个存在的调用场景,我的理解正确吗?

论坛徽章:
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
6 [报告]
发表于 2016-10-08 15:50 |只看该作者
回复 5# jiufei19

1、既然ip_append_data这个接口是可以给上层调用的,那么这个接口的内部就要处理这种可能发生的场景。2、看一下这个处理逻辑
     tcp_v4_send_ack --->ip_send_unicast_reply--->ip_appsend_data

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
7 [报告]
发表于 2016-10-10 13:07 |只看该作者
回复 6# 瀚海书香

似乎有点明白了,非常感谢版主的解惑

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
8 [报告]
发表于 2016-10-20 21:03 |只看该作者
本帖最后由 nswcfd 于 2016-10-20 21:12 编辑

per task的page(s)是怎么在(单个task的)多个sock之间共享的?
会出现同个page存放不同sock的data的情况么?

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
9 [报告]
发表于 2016-10-20 21:30 |只看该作者
好像没有理由不可以?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP