Files
substrate/internal
Benjamin Elder 421b7ac701 ateomnet: create the actor veth peer inside the actor netns
SetupActorNetwork built the veth pair in the worker pod netns with the peer
under a temporary name, moved the peer into the actor netns with LinkSetNsFd,
and renamed it to eth0 on the far side. The temporary name existed only because
the pod netns has an eth0 of its own for the peer to collide with.

Those two operations were 13.8ms of the 15.0ms of veth work: each drives a
netdev unregister/register with an RCU grace period taken under the global RTNL
lock. Neither parallelizes, so the fix is to not do them. Creating the pair with
PeerName plus PeerNamespace has the peer born in the actor netns already called
eth0, which costs neither: the name is resolved in the peer's namespace, so it
never sees the pod's eth0.

Measured on the real function, 200 activations on a 6.8 kernel:

  before  SetupActorNetwork  mean=18.07ms  p50=17.83ms  p99=26.81ms
  after   SetupActorNetwork  mean=2.96ms   p50=2.69ms   p99=5.72ms

That is ~15ms off every actor resume, against a 100ms p95 activation target,
since RestoreWorkload calls this before runsc restore. CleanupActorNetwork is
unchanged at ~16ms; that cost is the veth delete and it lands on suspend.

The resulting namespace is identical, which is what the new tests assert: they
pin the end state gVisor and the micro-VM guest read -- which links exist, in
which namespace, with which addresses and routes -- rather than the sequence of
netlink calls that produced it. They also cover repeated activation on a reused
worker, cleanup idempotency, and the two micro-VM options (the fixed host veth
MAC that keeps a restored guest's frozen ARP entry valid, and the interior link
sweep). They run in throwaway anonymous namespaces, so they leave nothing behind
on the machine, and are root-gated via internal/roottest like the other
privileged tests.

ActorVethTempName goes away with its last user.

The two LinkNotFoundError checks in CleanupActorNetwork move from a bare type
assertion to errors.AsType at the same time, so the rewritten cleanup does not
match the same error type two different ways.
2026-08-11 08:31:36 -07:00
..
2026-08-10 23:28:07 -07:00
2026-08-07 18:20:22 +00:00