Skip to content

Commit a8876ec

Browse files
author
zc-stack-spec-leader
committed
docs(zc_stack_user_spec): native ZC-send spec (30-40, S2-S8)
Adds the implementation-grade spec set for migrating FSTACK_ZC_SEND from the FSTACK_ZC_MAGIC + m_uiotombuf hack to the FreeBSD-native sosend(top) path via a new symmetric kern_zc_sendit kernel entry. Spec only; no implementation in this round. 12 new docs under docs/zc_stack_user_spec/zh_cn/: 30-spec-overview scope C+A+A decisions, glossary, motivation (incl. F-Stack issue #712 + 2-3% perf data) 31-current-state-and-rem 17-row modification map of the existing FSTACK_ZC_SEND hack + per-line removal anchors (c-precision-surgery format) 32-native-arch-design symmetric arch with kern_zc_recvit (5-axis mirror table); diagrams of old vs new path 33-kernel-patch-spec kern_zc_sendit decl + impl with full code, error/MAC/SIGPIPE handling; m_uiotombuf rollback to vanilla; sys_generic.c uio_offset guard removal 34-userspace-api-spec ff_zc_send rewrite (kern_writev->kern_zc_sendit), ff_zc_mbuf_get +M_PKTHDR, ff_zc_mbuf_write maintains pkthdr.len; ABI invariance 35-mbuf-lifecycle-spec S0-S4 ownership state machine, INV-1/2/3 invariants, sosend error-path m_freem matrix 36-boundary-and-fallback socket-type x flag matrix, atomic+sb_max constraint (root cause of issue #712) 37-test-spec CMocka unit (12) + integration (10) + INV memory-safety cases (5) 38-perf-baseline-spec wrk T1/T2/T3 + large-payload P1-P4 with AC3 dlt<=3% threshold, references 21-m2 39-migration-guide ABI-stable migration steps; emphasizes 'make clean' (M2 incremental-build trap) 40-acceptance-and-milestones AC1-6 + M0-M5 implementation milestones 49-spec-review gatekeeper audit (D1 18/18 PASS after R1 anchor fix; D2/D3/D4 PASS); bounce counter max=1 (per memory rule 86071475) All claims grounded in actual code (uipc_socket.c:2599 sosend, :2325 atomic, :2338-2343 resid 3-way, :2456-2462 if uio==NULL, :2354 EOR EINVAL, mbuf.h:1856-1869 MAGIC, etc). External cross-check: FreeBSD sosend(9) manpage (R. Watson, FreeBSD 7.0+), F-Stack issue #712 (open since 2022-11), Tencent Cloud article on current 2-3% gain. S5 had 1 bounce (D1 #10b sys_generic.c anchor context misaligned in 33 §5.1 / 31 §3.3, fixed in R1; bounce counter < 3, no human escalation).
1 parent 303609e commit a8876ec

12 files changed

Lines changed: 2704 additions & 0 deletions
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
# 30. 用户态零拷贝栈 spec — 总览
2+
3+
> 范围:完整"用户态零拷贝栈"(zc_stack_user)spec
4+
> 关键变更:新增对称的 `kern_zc_sendit`**替换**现有 `FSTACK_ZC_MAGIC` + `m_uiotombuf` 内核魔改方案
5+
> 目录:`docs/zc_stack_user_spec/zh_cn/`(仅中文)
6+
> 状态:spec 阶段(不实现代码)
7+
8+
---
9+
10+
## §1 背景与动机
11+
12+
f-stack 在 M8 阶段(commit ca83653c1 等)落地了 `FSTACK_ZC_SEND` 应用层 → 协议栈零拷贝,并已在更近期实现了 `FSTACK_ZC_RECV`(M0+M1, commit b87f5f0d2)。两条路径独立设计、机制不对称:
13+
14+
| 维度 | ZC-send(现状)| ZC-recv(已落地)|
15+
|---|---|---|
16+
| 内核入口 | 魔改 `m_uiotombuf``#ifdef FSTACK_ZC_SEND` 分支 | 新增 `kern_zc_recvit` 透传 `soreceive``mp0` 出参 |
17+
| 哨兵机制 | 依赖 `uio->uio_offset == FSTACK_ZC_MAGIC`(off_t 0xF8AC2C00F8AC2C00)+ `UIO_SYSSPACE/UIO_WRITE` 三件套 | **无哨兵**:直接走 FreeBSD 原生 `mp0` 出参契约 |
18+
| 上游一致性 | 低(5 处文件魔改 + uio_offset 在 syscall 全路径透传)| 高(仅 2 个新函数;soreceive 核心 0 改动)|
19+
| 误触风险 | **存在**(普通 `ff_write/ff_writev` 须显式 `uio_offset=0` opt-out 防误触;M2 阶段曾因 stale .o 缺 hook 致 GPF)||
20+
| 升级维护成本 | 高(FreeBSD 15.x → N.0 时 `m_uiotombuf` 周边需重新审计)| 低(只新增、不改动)|
21+
22+
外网交叉验证(详见 31):
23+
- F-Stack 官方文档(腾讯云开发者社区,2022-04-17)声明 ZC-send 性能提升仅 2-3%;
24+
- F-Stack 上游 issue [#712](https://github.com/F-Stack/f-stack/issues/712)(2022-11-01 至今 OPEN):大数据量发送会 crash/hang,社区无修复;
25+
- FreeBSD `sosend(9)` 手册(FreeBSD 7.0 起,作者 Robert Watson)原文:"Data may be sent ... as an mbuf chain via *top*, **avoiding a data copy**. Only one of the *uio* or *top* pointers may be non-NULL."
26+
27+
**结论**:FreeBSD 15.0 已经原生支持等价的发送端零拷贝(`sosend(uio=NULL, top=链)`),现 `FSTACK_ZC_MAGIC` 方案是上游已有能力的"非必要重新发明",应改用原生路径。
28+
29+
---
30+
31+
## §2 目标
32+
33+
| 编号 | 目标 |
34+
|---|---|
35+
| G1 | 新增 `kern_zc_sendit(td, s, top, flags)` 内核入口,直接调用 `sosend(uio=NULL, top=链)`(uipc_socket.c:2599)|
36+
| G2 | 拆除 `FSTACK_ZC_MAGIC` 宏 + `m_uiotombuf``#ifdef FSTACK_ZC_SEND` 分支 + `kern_writev``uio_offset` 保留逻辑 + `ff_write/ff_writev``uio_offset=0` opt-out(共 5 处)|
37+
| G3 | 修复 `ff_zc_mbuf_get`/`ff_zc_mbuf_write``M_PKTHDR`/`pkthdr.len` 缺口(sosend 在 `uio==NULL` 分支以 `top->m_pkthdr.len` 作 resid,缺则 resid=0 不发送任何数据)|
38+
| G4 | 保持外部 ABI 不变:`ff_zc_send` / `ff_zc_mbuf_get` / `ff_zc_mbuf_write` 函数签名与 example/main_zc.c 调用序列**零修改**`FF_ZC_SEND` Makefile 开关名保留(仅含义切换)|
39+
| G5 |`kern_zc_recvit` 形成完全对称的"用户态零拷贝栈"(API 形态、生命周期、错误路径、ABI 增量、Makefile 开关)|
40+
| G6 | 性能与现魔改方案 Δ ≤ ±3%(噪声内);功能 example curl http=200 PASS |
41+
42+
---
43+
44+
## §3 范围(scope)
45+
46+
### §3.1 In-scope(本期 spec 必须覆盖)
47+
48+
| 模块 | spec 文档 |
49+
|---|---|
50+
| 现状测绘与拆除清单 | 31-current-state-and-removal.md |
51+
| 对称架构设计 | 32-native-arch-design.md |
52+
| 内核 patch 详规(含锚点) | 33-kernel-patch-spec.md |
53+
| 用户态 API 规格(ABI 不变 + M_PKTHDR 修复)| 34-userspace-api-spec.md |
54+
| mbuf 链所有权状态机 + 不变量 | 35-mbuf-lifecycle-spec.md |
55+
| 边界与回退矩阵(TCP/UDP/SCTP/ATOMIC/NBIO/SCM/aio/PAGE_ARRAY 等)| 36-boundary-and-fallback-spec.md |
56+
| CMocka 测试规格 | 37-test-spec.md |
57+
| 性能基线规格(wrk + 大 payload)| 38-perf-baseline-spec.md |
58+
| 已部署项目迁移指南 | 39-migration-guide.md |
59+
| 验收 + M0-M5 里程碑 | 40-acceptance-and-milestones.md |
60+
| 门禁审核与 bounce counter | 49-spec-review.md |
61+
62+
### §3.2 Out-of-scope(本期不处理)
63+
64+
- 实施代码(本期 spec only,实施期独立 plan 启动)。
65+
- ZC-recv(kern_zc_recvit/mp0)已落地,本 spec 仅在"对称参考"小节复用其模式;不重写 11-17 系列既有 ZC-recv spec。
66+
- `FF_USE_PAGE_ARRAY`(协议栈 → DPDK 阶段一零拷贝):与本 spec 无直接耦合,仅在 36 边界矩阵中出现。
67+
- 英文版文档:人工审计后再议。
68+
69+
---
70+
71+
## §4 术语(Glossary)
72+
73+
| 术语 | 定义 / 锚点 |
74+
|---|---|
75+
| **ZC-send(zero-copy send)** | 应用层 → 协议栈方向的零拷贝发送,对应 `FSTACK_ZC_SEND` 编译开关 |
76+
| **ZC-recv(zero-copy receive)** | 协议栈 → 应用层方向的零拷贝接收,对应 `FSTACK_ZC_RECV` 编译开关 |
77+
| **FSTACK_ZC_MAGIC(旧)** | `((off_t)0xF8AC2C00F8AC2C00LL)`,freebsd/sys/mbuf.h:1868;本 spec 删除 |
78+
| **`top` 参数** | `sosend()` 第 4 参(`struct mbuf *top`),uipc_socket.c:2600;FreeBSD 原生零拷贝发送入口 |
79+
| **`mp0` 参数** | `soreceive()` 第 4 参(`struct mbuf **mp0`);FreeBSD 原生零拷贝接收出参 |
80+
| **kern_zc_sendit** | 本 spec 新增内核函数,sousrsend 的零拷贝兄弟函数(`top!=NULL` 路径) |
81+
| **kern_zc_recvit** | 已落地(uipc_syscalls.c:1049),kern_recvit 的零拷贝兄弟函数(`mp0!=NULL` 路径)|
82+
| **ff_zc_mbuf** | `struct ff_zc_mbuf { void *bsd_mbuf; void *bsd_mbuf_off; int off; int len; }`,ff_api.h:347 |
83+
| **PR_ATOMIC** | protosw 标志,要求一次性投递(UDP/SCTP/UNIX dgram);详见 36 |
84+
| **bounce counter** | 单步骤打回计数,门禁失败计入;上限 3 次(per memory rule 86071475)|
85+
86+
---
87+
88+
## §5 决策表(用户已确认 C+A+A)
89+
90+
| 决策项 | 选择 | 含义 | 影响 spec |
91+
|---|---|---|---|
92+
| 范围(scope) | **C** | 完整"用户态零拷贝栈" spec | 33-40 全集,含 ZC-recv 对称参考小节 |
93+
| 旧路径处置(compat) | **A** | 立即拆除 | 31 删除清单 + 33 内核 patch 同期生效 |
94+
| 改名时机(rename) | **A** | plan 第一步 git mv + 修复 self-ref | S1 已完成 |
95+
96+
---
97+
98+
## §6 与既有文档关系
99+
100+
```
101+
docs/zc_stack_user_spec/zh_cn/
102+
├── 00-09 可行性研究(PRESERVED,commit 875532e35)
103+
├── 10-19 ZC-recv 首版 spec(PRESERVED,commit e62afc541)
104+
├── 20-22 实施期产物(20 执行 plan / 21 M2 测试报告 / 22 native ZC-send 调研)
105+
│ ↑ 本 spec 直接前置(22 的结论"是—— sosend(top) 原生支持")
106+
├── 29 本期 spec 阶段 plan
107+
├── 30 本文件
108+
├── 31-40 ZC-send 原生化 spec(本期新增)
109+
└── 49 门禁审核记录
110+
```
111+
112+
22-research(commit 0294a9baa)已实测验证 sosend `top` 在 FreeBSD 15.0 区段无任何 `FSTACK_*` 魔改、`uio==NULL` 时跳过 `m_uiotombuf` 拷贝、resid 取自 `top->m_pkthdr.len`(uipc_socket.c:2341/2170)—— 是 30+ 系列 spec 的**全局技术前提**
113+
114+
---
115+
116+
## §7 强制规约(贯穿全 spec 阶段)
117+
118+
1. **实测优先**:每条 spec 条目须有 `file:line:symbol` 实测来源;外网仅交叉验证;冲突以代码为准。
119+
2. **harness 多 agent 门禁回退**(memory 86071475):单步骤打回循环上限 3 次,第 4 次失败立即停止任务转人工。
120+
3. **rm/kill/chmod 走脚本**(memories 81725399 / 90098233 / 21626578):所有 shell 命令字符串严禁直接 `rm`/`kill`/`pkill`/`killall`/`chmod`/`setfacl`/`install -m`/`find -delete`/`shred`;统一走 `/data/workspace/{rm_tmp_file,kill_process,chmod_modify}.sh`**spec 文档示例同样遵守**
121+
4. commit message 英文(memory 73362122),对话中文。
122+
5. spec 不得提供"如何 patch"的可执行命令;必须提供 c-precision-surgery 风格的"行号 + 上下文锚点",由实施期 agent 转换为 patch。
123+
124+
---
125+
126+
## §8 阅读路径建议
127+
128+
| 角色 | 顺序 |
129+
|---|---|
130+
| 设计审计者 | 30 → 31 → 32 → 35 → 36 → 40 |
131+
| 内核实现工程师 | 30 → 32 → 33 → 35 → 36 |
132+
| 用户态实现工程师 | 30 → 32 → 34 → 35 → 39 |
133+
| QA / 测试工程师 | 30 → 35 → 36 → 37 → 38 → 40 |
134+
| 上游迁移工程师 | 30 → 39 → 40 |
135+
136+
下一篇:**31-current-state-and-removal.md**(现状测绘 + 5 处删除清单)。

0 commit comments

Comments
 (0)