运行时流程
网络运行时由两级执行器组成:fixed-CPU queue executor 处理 IRQ/DMA/queue,唯一 protocol executor 处理 smoltcp/socket/control plane。流程中的跨 CPU 边界只传递 move-only token/frame 与 protocol generation。
1. 启动流程
没有物理 NIC 时 runtime 直接发布 loopback-only service。发现物理设备但 parts、IRQ、 fixed affinity、mask/rearm 或 worker pin 不完整时,初始化 panic/返回错误,不降级为 polling。
2. Affinity domain
builder 收集每个 group endpoint 的 source ID → physical IrqId 映射。任意两个 group
共享 IRQ 时合并到同一 domain;domain 按稳定顺序分配在线 CPU。独立 MSI-X source 可
落到不同 CPU。
worker 必须在 registration 前完成:
set_current_affinity(AxCpuMask::one_shot(owner_cpu))
-> yield
-> this_cpu_id == owner_cpu
-> affinity-ready
registration 使用 NonReentrant + AutoEnable::No + Fixed(owner_cpu)。shared action
affinity 不一致时 framework 拒绝。
3. Hard IRQ 流程
hard IRQ 不访问 DMA payload,不调用 protocol,不分配,不取 sleeping lock,不调用任意 waker,也不在 virtio gate 上自旋。callback CPU 与 owner CPU 不一致时 group fail-stop, remote wake 计数增加并作为契约失败。
4. Queue poll 流程
owner executor claim SCHEDULED -> POLLING 后先 quiesce(),随后按顺序处理:
TX completion budget 64
TX submission budget 64(批次结束后 flush)
RX recycle budget 64
RX reclaim budget 64
per-CPU round total 256
budget 用尽或硬件仍有 work:保持 IRQ mask,group 回 SCHEDULED。ring full:token 保留
在 pending_*,group 留在 blocked polling state;protocol owner 释放空间后精准 schedule。
空闲完成:
POLLING --CAS--> IDLE
-> rearm_and_check()
-> Idle: wait for next IRQ
-> WorkPending: mask + schedule same group
IRQ 在 CAS 前到来会设置 MISSED;CAS 后到来由 rearm status check 或已经 unmask 的
fixed callback 捕获。
5. RX packet 流程
queue owner publish completion 后调用 request_poll()。protocol owner读取 DMA frame,
归还 recycle token,再解封装 IPv4/ARP。DHCP/TCP SYN snoop 使用 ingress
InterfaceId;smoltcp 更新 socket readiness 时产生的 PollSet wake 延迟到
SocketSet 解锁后执行。
6. TX packet 流程
loopback route 直接把 IP packet 注入 Router RX buffer。普通 NIC 路径由 protocol owner
从 TX-free ring 取 token,写 frame 后 move 到 TX-ready。submit retry 返回同一 token
并保留在 queue owner;completion token 回到 free ring。
7. Protocol generation
socket、RX batch、TX completion、DHCP/DNS timer、deferred readiness 和同步 flush 都
调用 ProtocolPollRuntime::request()/schedule()。worker 流程:
wait until scheduled or protocol timer deadline
-> drain deferred wakes
-> target = requested_generation
-> poll Service/Interface until idle
-> completed = target
-> drain deferred wakes
-> clear scheduled and recheck requested/completed
flush_egress() 等待自己的 generation,调用线程不进入 Service::poll()。因此生产
初始化、split-route helper 或任意 socket caller 都不能形成第二 owner。
8. Blocking socket 与 readiness
TCP/UDP/raw 操作只在短临界区修改对应 smoltcp socket,然后 request_poll() 并通过
Pollable/poll_io 等待 readiness。readiness waker 不绑定某个硬件 queue domain;目标 queue
事件先到 protocol executor,socket 状态改变后才唤醒等待者。
- nonblocking/
MSG_DONTWAIT在当前状态 would-block 时返回EAGAIN; - 没有
SA_RESTART的可投递 signal 打断 blocking wait,返回EINTR; - peer close 经 protocol poll 产生 EOF/HUP/EPOLLRDHUP;
- close 与最后一次 UDP send 使用 generation completion 保证发 送已离开 socket TX buffer,但不会让 close caller成为 poll owner。
Starry grouped test-tcp-napi-runtime 固定 blocking/nonblocking connect/accept、
send/recv、poll/epoll、peer close 与 signal-interrupted recv 的 Linux-visible 语义。
9. DHCP 与 DNS
DHCP client/server 与 DNS socket 都由唯一 protocol executor 推进。NIC RX ingress ID
决定 DHCP state;ACK 通过 commit_interface_update() 同步更新 smoltcp address、
NetControl、route 与 DNS source。DNS query 创建临时 smoltcp socket,完成/失败后由
guard 移除。
protocol timer deadline 可以唤醒 protocol executor,但不会唤醒空闲 queue executor, 也不会用于弥补设备 IRQ。
10. Wi-Fi reconfigure
AIC RX、TX、firmware command response、EAPOL 与 AP events 都由同一 queue owner cooperatively 推进。没有独立 AIC task/kicker。
11. Stop 与 rollback
reject/complete pending Wi-Fi requests
-> disable and synchronize all IRQ leases
-> stop queue executors
-> owner executor quiesce + driver DMA shutdown proof
-> join
-> drop proven-safe resources or quarantine the complete group
builder 任一步失败使用相同反向顺序。service 在 builder 成功前不可见。
12. 流程速查
| 事件 | 发布者 | 推进者 | 结果 |
|---|---|---|---|
| NIC RX/TX IRQ | hard endpoint | fixed-CPU queue executor | completion/token 到 SPSC |
| virtio gate busy | hard endpoint ProbeDeferred | 同 CPU queue executor | task-context transport probe |
| socket send/connect | caller generation | protocol executor | smoltcp/Router TX |
| socket wait signal | signal subsystem | blocked caller | EINTR 或 restart policy |
| peer close | protocol RX/state | protocol executor | EOF/HUP readiness |
| DHCP/DNS timer | protocol deadline | protocol executor | control state/packet progress |
| Wi-Fi mode change | caller transaction | queue owner then protocol owner | hardware state后控制面提交 |
禁止从 hard IRQ 或 queue executor 进入 smoltcp,禁止调用者同步 poll,禁止用 timer、 remote IPI 或 wake-all 替代目标 group 的本地 IRQ activation。