NewMemoryFile creates a MemoryFile backed by the given file. If NewMemoryFile succeeds, ownership of file is transferred to the returned MemoryFile.
(file *os.File, opts MemoryFileOpts)
| 421 | // NewMemoryFile succeeds, ownership of file is transferred to the returned |
| 422 | // MemoryFile. |
| 423 | func NewMemoryFile(file *os.File, opts MemoryFileOpts) (*MemoryFile, error) { |
| 424 | switch opts.DelayedEviction { |
| 425 | case DelayedEvictionDefault: |
| 426 | opts.DelayedEviction = DelayedEvictionEnabled |
| 427 | case DelayedEvictionDisabled, DelayedEvictionManual: |
| 428 | opts.UseHostMemcgPressure = false |
| 429 | case DelayedEvictionEnabled: |
| 430 | // ok |
| 431 | default: |
| 432 | return nil, fmt.Errorf("invalid MemoryFileOpts.DelayedEviction: %v", opts.DelayedEviction) |
| 433 | } |
| 434 | |
| 435 | // Truncate the file to 0 bytes first to ensure that it's empty. |
| 436 | if err := file.Truncate(0); err != nil { |
| 437 | return nil, err |
| 438 | } |
| 439 | f := &MemoryFile{ |
| 440 | opts: opts, |
| 441 | file: file, |
| 442 | } |
| 443 | f.initFields() |
| 444 | |
| 445 | if f.opts.DelayedEviction == DelayedEvictionEnabled && f.opts.UseHostMemcgPressure { |
| 446 | stop, err := hostmm.NotifyCurrentMemcgPressureCallback(func() { |
| 447 | f.mu.Lock() |
| 448 | startedAny := f.startEvictionsLocked() |
| 449 | f.mu.Unlock() |
| 450 | if startedAny { |
| 451 | log.Debugf("pgalloc.MemoryFile performing evictions due to memcg pressure") |
| 452 | } |
| 453 | }, "low") |
| 454 | if err != nil { |
| 455 | return nil, fmt.Errorf("failed to configure memcg pressure level notifications: %v", err) |
| 456 | } |
| 457 | f.stopNotifyPressure = stop |
| 458 | } |
| 459 | |
| 460 | go f.releaserMain() // S/R-SAFE: f.mu |
| 461 | |
| 462 | if !opts.DisableIMAWorkAround { |
| 463 | IMAWorkAroundForMemFile(file.Fd()) |
| 464 | } |
| 465 | return f, nil |
| 466 | } |
| 467 | |
| 468 | func (f *MemoryFile) initFields() { |
| 469 | // Initially, all pages are void. |
no test coverage detected
searching dependent graphs…