Skip to content

Commit 06a6402

Browse files
authored
refactor(uffd): extract Prefault to its own file (#2441)
Move Prefault and the directDataSource helper from userfaultfd.go into a dedicated prefault.go. Pure file move, no behavior change.
1 parent d434ccd commit 06a6402

2 files changed

Lines changed: 41 additions & 33 deletions

File tree

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package userfaultfd
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
"github.com/e2b-dev/infra/packages/orchestrator/pkg/sandbox/block"
8+
)
9+
10+
// Prefault proactively copies a page to guest memory at the given offset.
11+
// This is used to speed up sandbox starts by prefetching pages that are known to be needed.
12+
// Returns nil on success, or if the page is already mapped (EEXIST is handled gracefully).
13+
func (u *Userfaultfd) Prefault(ctx context.Context, offset int64, data []byte) error {
14+
ctx, span := tracer.Start(ctx, "prefault page")
15+
defer span.End()
16+
17+
addr, err := u.ma.GetHostVirtAddr(offset)
18+
if err != nil {
19+
return fmt.Errorf("failed to get host virtual address: %w", err)
20+
}
21+
22+
if len(data) != int(u.pageSize) {
23+
return fmt.Errorf("data length (%d) does not match pagesize (%d)", len(data), u.pageSize)
24+
}
25+
26+
return u.faultPage(ctx, addr, offset, directDataSource{data, int64(u.pageSize)}, nil, block.Prefetch)
27+
}
28+
29+
// directDataSource wraps a byte slice to implement block.Slicer for prefaulting.
30+
type directDataSource struct {
31+
data []byte
32+
pagesize int64
33+
}
34+
35+
func (d directDataSource) Slice(_ context.Context, _, _ int64) ([]byte, error) {
36+
return d.data, nil
37+
}
38+
39+
func (d directDataSource) BlockSize() int64 {
40+
return d.pagesize
41+
}

packages/orchestrator/pkg/sandbox/uffd/userfaultfd/userfaultfd.go

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -288,39 +288,6 @@ func (u *Userfaultfd) PrefetchData() block.PrefetchData {
288288
return u.prefetchTracker.PrefetchData()
289289
}
290290

291-
// Prefault proactively copies a page to guest memory at the given offset.
292-
// This is used to speed up sandbox starts by prefetching pages that are known to be needed.
293-
// Returns nil on success, or if the page is already mapped (EEXIST is handled gracefully).
294-
func (u *Userfaultfd) Prefault(ctx context.Context, offset int64, data []byte) error {
295-
ctx, span := tracer.Start(ctx, "prefault page")
296-
defer span.End()
297-
298-
addr, err := u.ma.GetHostVirtAddr(offset)
299-
if err != nil {
300-
return fmt.Errorf("failed to get host virtual address: %w", err)
301-
}
302-
303-
if len(data) != int(u.pageSize) {
304-
return fmt.Errorf("data length (%d) does not match pagesize (%d)", len(data), u.pageSize)
305-
}
306-
307-
return u.faultPage(ctx, addr, offset, directDataSource{data, int64(u.pageSize)}, nil, block.Prefetch)
308-
}
309-
310-
// directDataSource wraps a byte slice to implement block.Slicer for prefaulting.
311-
type directDataSource struct {
312-
data []byte
313-
pagesize int64
314-
}
315-
316-
func (d directDataSource) Slice(_ context.Context, _, _ int64) ([]byte, error) {
317-
return d.data, nil
318-
}
319-
320-
func (d directDataSource) BlockSize() int64 {
321-
return d.pagesize
322-
}
323-
324291
func (u *Userfaultfd) faultPage(
325292
ctx context.Context,
326293
addr uintptr,

0 commit comments

Comments
 (0)