Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
0433025
feat: update Firecracker client to v1.14
bchalios Feb 19, 2026
4b028c3
orchestrator: add support for Firecracker v1.14
bchalios Feb 13, 2026
7b71471
feat(uffd): add page state tracking for guest memory
bchalios Feb 20, 2026
0c1cb6d
uffd: export more CGO bindings for UFFD
bchalios Feb 12, 2026
f0bcd53
uffd: handle remove events from the file descriptor
bchalios Feb 20, 2026
b771198
feat: enable free page reporting
bchalios Feb 12, 2026
89bf52f
chore: auto-commit generated changes
github-actions[bot] Feb 23, 2026
8c8c3de
Cleanup and move free page reporting field to API
ValentaTomas Feb 28, 2026
e0cb013
Cleanup
ValentaTomas Feb 28, 2026
c596541
Wrap onFailure
ValentaTomas Feb 28, 2026
08bac56
Clarify prefetch remove handling
ValentaTomas Mar 3, 2026
843b282
Cleanup
ValentaTomas Mar 4, 2026
9a6f394
Fix lint
ValentaTomas Mar 4, 2026
01183ce
Fix lint supress
ValentaTomas Mar 4, 2026
30c581c
Clarify behavior; Fix bug
ValentaTomas Mar 4, 2026
f23b1fb
Cleanup
ValentaTomas Mar 4, 2026
430f224
Fix version check for major > 2
ValentaTomas Mar 4, 2026
550f432
fix(uffd): clarifications and minor fixes
bchalios Mar 6, 2026
891deb2
fix: prefault with UFFD_COPY_MODE_WP
bchalios Mar 9, 2026
2184a67
fix(uffd): don't pass UFFD_COPY_MODE_WP when zeroing a page
bchalios Mar 9, 2026
ede5946
fix(uffd): sanitize error recording while prefaulting
bchalios Mar 9, 2026
82cd6f8
fix(uffd): handle 4K write protection correctly
bchalios Mar 10, 2026
823e844
Add feature flag for free page reporting
ValentaTomas Mar 10, 2026
49350ad
Add WP mode test for prefetch
ValentaTomas Mar 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/actions/build-sandbox-template/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ runs:
env:
TEMPLATE_ID: "2j6ly824owf4awgai1xo"
KERNEL_VERSION: "vmlinux-6.1.158"
FIRECRACKER_VERSION: "v1.12.1_a41d3fb"
FIRECRACKER_VERSION: "v1.14.1_aa14c57"
run: |
# Generate an unique build ID for the template for this run
export BUILD_ID=$(uuidgen)
Expand Down
10 changes: 9 additions & 1 deletion packages/api/internal/sandbox/sandbox_features.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,15 @@ func (v *VersionInfo) Version() semver.Version {
}

func (v *VersionInfo) HasHugePages() bool {
if v.lastReleaseVersion.Major() >= 1 && v.lastReleaseVersion.Minor() >= 7 {
if v.lastReleaseVersion.Major() == 1 && v.lastReleaseVersion.Minor() >= 7 {
return true
}

return false
}

func (v *VersionInfo) HasFreePageReporting() bool {
if v.lastReleaseVersion.Major() == 1 && v.lastReleaseVersion.Minor() >= 14 {
return true
}

Expand Down
4 changes: 4 additions & 0 deletions packages/api/internal/template-manager/create_template.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import (
"github.com/e2b-dev/infra/packages/api/internal/utils"
"github.com/e2b-dev/infra/packages/db/pkg/types"
"github.com/e2b-dev/infra/packages/db/queries"
featureflags "github.com/e2b-dev/infra/packages/shared/pkg/feature-flags"
templatemanagergrpc "github.com/e2b-dev/infra/packages/shared/pkg/grpc/template-manager"
"github.com/e2b-dev/infra/packages/shared/pkg/id"
"github.com/e2b-dev/infra/packages/shared/pkg/logger"
Expand Down Expand Up @@ -109,6 +110,8 @@ func (tm *TemplateManager) CreateTemplate(
return fmt.Errorf("failed to convert image registry: %w", err)
}

freePageReporting := features.HasFreePageReporting() && tm.featureFlags.BoolFlag(ctx, featureflags.FreePageReportingFlag, featureflags.TeamContext(teamID.String()))

template := &templatemanagergrpc.TemplateConfig{
TeamID: teamID.String(),
TemplateID: templateID,
Expand All @@ -119,6 +122,7 @@ func (tm *TemplateManager) CreateTemplate(
KernelVersion: kernelVersion,
FirecrackerVersion: firecrackerVersion,
HugePages: features.HasHugePages(),
FreePageReporting: &freePageReporting,
StartCommand: startCmd,
ReadyCommand: readyCmd,
Force: force,
Expand Down
2 changes: 1 addition & 1 deletion packages/orchestrator/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ Flags:
- `-template <id>` - Template ID (default: `local-template`)
- `-storage <path>` - Local path or `gs://bucket` (enables local mode with auto-download of kernel/FC)
- `-kernel <version>` - Kernel version (default: `vmlinux-6.1.102`)
- `-firecracker <version>` - Firecracker version (default: `v1.12.1_a41d3fb`)
- `-firecracker <version>` - Firecracker version (default: `v1.14.1_aa14c57`)
- `-vcpu <n>` - vCPUs (default: `1`)
- `-memory <mb>` - Memory in MB (default: `512`)
- `-disk <mb>` - Disk in MB (default: `1000`)
Expand Down
30 changes: 27 additions & 3 deletions packages/orchestrator/cmd/create-build/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ func main() {
memory := flag.Int("memory", 1024, "memory MB")
disk := flag.Int("disk", 1024, "disk MB")
hugePages := flag.Bool("hugepages", true, "use 2MB huge pages for memory (false = 4KB pages)")
freePageReporting := flag.Bool("free-page-reporting", false, "enable free page reporting via balloon device (requires Firecracker v1.14+)")
startCmd := flag.String("start-cmd", "", "start command")
setupCmd := flag.String("setup-cmd", "", "setup command to run during build (e.g., install deps)")
readyCmd := flag.String("ready-cmd", "", "ready check command")
Expand Down Expand Up @@ -96,7 +97,16 @@ func main() {
log.Fatalf("network config: %v", err)
}

err = doBuild(ctx, *templateID, *toBuild, *fromBuild, *kernel, *fc, *vcpu, *memory, *disk, *hugePages, *startCmd, *setupCmd, *readyCmd, localMode, *verbose, *timeout, builderConfig, networkConfig)
// Detect if --free-page-reporting was explicitly set; if not, pass nil so
// doBuild can default based on the Firecracker version.
var fprOverride *bool
flag.Visit(func(f *flag.Flag) {
if f.Name == "free-page-reporting" {
fprOverride = freePageReporting
}
})

err = doBuild(ctx, *templateID, *toBuild, *fromBuild, *kernel, *fc, *vcpu, *memory, *disk, *hugePages, fprOverride, *startCmd, *setupCmd, *readyCmd, localMode, *verbose, *timeout, builderConfig, networkConfig)
if err != nil {
log.Fatal(err)
}
Expand Down Expand Up @@ -174,9 +184,10 @@ func setupEnv(ctx context.Context, storagePath, kernel, fc string, localMode boo

func doBuild(
parentCtx context.Context,
templateID, buildID, fromBuild, kernel, fc string,
templateID, buildID, fromBuild, kernel, fcVersion string,
vcpu, memory, disk int,
hugePages bool,
freePageReporting *bool,
startCmd, setupCmd, readyCmd string,
localMode, verbose bool,
timeout int,
Expand Down Expand Up @@ -316,6 +327,18 @@ func doBuild(
})
}

// Default FPR to enabled when the FC version supports it (v1.14+); explicit flag overrides.
var fprEnabled bool
if freePageReporting != nil {
fprEnabled = *freePageReporting
} else {
versionOnly, _, _ := strings.Cut(fcVersion, "_")
supported, err := utils.IsGTEVersion(versionOnly, "v1.14.0")
if err == nil {
fprEnabled = supported
}
}

tmpl := config.TemplateConfig{
Version: templates.TemplateV2LatestVersion,
TemplateID: templateID,
Expand All @@ -324,10 +347,11 @@ func doBuild(
MemoryMB: int64(memory),
DiskSizeMB: int64(disk),
HugePages: hugePages,
FreePageReporting: fprEnabled,
StartCmd: startCmd,
ReadyCmd: readyCmd,
KernelVersion: kernel,
FirecrackerVersion: fc,
FirecrackerVersion: fcVersion,
Steps: steps,
}

Expand Down
2 changes: 1 addition & 1 deletion packages/orchestrator/internal/portmap/recover.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ func (h *recovery) PMAPPROC_CALLIT(args rfc1057.Call_args) rfc1057.Call_result {
}

func (h *recovery) tryRecovery(name string) {
if r := recover(); r != nil { //nolint:revive // recover is called from a deferred named function, which is valid Go
if r := recover(); r != nil { //nolint:revive // recover works fine — always called via defer
logger.L().Error(h.ctx, fmt.Sprintf("panic in %q portmap handler", name), zap.Any("panic", r))
}
}
80 changes: 0 additions & 80 deletions packages/orchestrator/internal/sandbox/block/tracker.go

This file was deleted.

173 changes: 0 additions & 173 deletions packages/orchestrator/internal/sandbox/block/tracker_test.go

This file was deleted.

Loading
Loading