mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
52692c3647
FDTable.descriptorTable is a slice of unsafe.Pointer-s and its maximum length is MaxInt32. It requires up to 16GB of memory. A process can use just a few descriptors but sets one or more of them to high numbers. In this case, FDTable.descriptorTable is extended to the maximum size. The problem here is that go-runtime zeros memory regions when they are reused. In the case of fdtable, the memory region is 16GB, so it is a time consuming operation. Second, it forces the kernel to allocate physical pages to the entire region. This change adds another level to descriptorTable, so the first level is a slice of buckets where each bucket is a slice of descriptors. The bucket size is fixed to 512 entries to fit one page. Before: BenchmarkFDLookupAndDecRef-12 50834290 23.70 ns/op BenchmarkCreateWithMaxFD-12 2 7194873988 ns/op BenchmarkFDLookupAndDecRefConcurrent-12 23775555 49.68 ns/op BenchmarkTableLookup-12 412888780 2.835 ns/op BenchmarkTableMapLookup-12 87944782 12.84 ns/op After: BenchmarkFDLookupAndDecRef-12 46229940 25.03 ns/op BenchmarkCreateWithMaxFD-12 13 82573899 ns/op BenchmarkFDLookupAndDecRefConcurrent-12 21889380 54.13 ns/op BenchmarkTableLookup-12 415851230 2.821 ns/op BenchmarkTableMapLookup-12 97236267 11.89 ns/op Reported-by: syzbot+af17678e3bfb7ca7c65a@syzkaller.appspotmail.com PiperOrigin-RevId: 539138632