mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Update Waitable API.
Instead of passing the event mask at registratrion time, pass the mask as part of the waiter. This makes the mask immutable and simplifies the architecture of waiters. This is also necessary for a future fix that will allow the fdnotifier to keep persistent entries, as opposed to requiring constant updates. This change is intended to be a no-op in terms of function. The only exception is signalfd, where this mask was abused. To handle this case, the operation of signalfd changed to allow one layer of indirection. PiperOrigin-RevId: 409702998
This commit is contained in:
committed by
gVisor bot
parent
66fb6859d1
commit
91f58d2cc8
@@ -152,8 +152,8 @@ func (fd *tunFD) Readiness(mask waiter.EventMask) waiter.EventMask {
|
||||
}
|
||||
|
||||
// EventRegister implements watier.Waitable.EventRegister.
|
||||
func (fd *tunFD) EventRegister(e *waiter.Entry, mask waiter.EventMask) {
|
||||
fd.device.EventRegister(e, mask)
|
||||
func (fd *tunFD) EventRegister(e *waiter.Entry) {
|
||||
fd.device.EventRegister(e)
|
||||
}
|
||||
|
||||
// EventUnregister implements watier.Waitable.EventUnregister.
|
||||
|
||||
@@ -158,8 +158,8 @@ func (n *netTunFileOperations) Readiness(mask waiter.EventMask) waiter.EventMask
|
||||
}
|
||||
|
||||
// EventRegister implements watier.Waitable.EventRegister.
|
||||
func (n *netTunFileOperations) EventRegister(e *waiter.Entry, mask waiter.EventMask) {
|
||||
n.device.EventRegister(e, mask)
|
||||
func (n *netTunFileOperations) EventRegister(e *waiter.Entry) {
|
||||
n.device.EventRegister(e)
|
||||
}
|
||||
|
||||
// EventUnregister implements watier.Waitable.EventUnregister.
|
||||
|
||||
@@ -99,8 +99,8 @@ func (p *pipeOperations) init() error {
|
||||
}
|
||||
|
||||
// EventRegister implements waiter.Waitable.EventRegister.
|
||||
func (p *pipeOperations) EventRegister(e *waiter.Entry, mask waiter.EventMask) {
|
||||
p.Queue.EventRegister(e, mask)
|
||||
func (p *pipeOperations) EventRegister(e *waiter.Entry) {
|
||||
p.Queue.EventRegister(e)
|
||||
fdnotifier.UpdateFD(int32(p.file.FD()))
|
||||
}
|
||||
|
||||
|
||||
@@ -182,8 +182,8 @@ func (f *File) Readiness(mask waiter.EventMask) waiter.EventMask {
|
||||
}
|
||||
|
||||
// EventRegister implements waiter.Waitable.EventRegister.
|
||||
func (f *File) EventRegister(e *waiter.Entry, mask waiter.EventMask) {
|
||||
f.FileOperations.EventRegister(e, mask)
|
||||
func (f *File) EventRegister(e *waiter.Entry) {
|
||||
f.FileOperations.EventRegister(e)
|
||||
}
|
||||
|
||||
// EventUnregister implements waiter.Waitable.EventUnregister.
|
||||
|
||||
@@ -100,14 +100,14 @@ func (f *overlayFileOperations) Release(ctx context.Context) {
|
||||
}
|
||||
|
||||
// EventRegister implements FileOperations.EventRegister.
|
||||
func (f *overlayFileOperations) EventRegister(we *waiter.Entry, mask waiter.EventMask) {
|
||||
func (f *overlayFileOperations) EventRegister(we *waiter.Entry) {
|
||||
f.upperMu.Lock()
|
||||
defer f.upperMu.Unlock()
|
||||
if f.upper != nil {
|
||||
f.upper.EventRegister(we, mask)
|
||||
f.upper.EventRegister(we)
|
||||
return
|
||||
}
|
||||
f.lower.EventRegister(we, mask)
|
||||
f.lower.EventRegister(we)
|
||||
}
|
||||
|
||||
// EventUnregister implements FileOperations.Unregister.
|
||||
|
||||
@@ -149,8 +149,8 @@ func newFile(ctx context.Context, dirent *fs.Dirent, flags fs.FileFlags, iops *i
|
||||
}
|
||||
|
||||
// EventRegister implements waiter.Waitable.EventRegister.
|
||||
func (f *fileOperations) EventRegister(e *waiter.Entry, mask waiter.EventMask) {
|
||||
f.iops.fileState.queue.EventRegister(e, mask)
|
||||
func (f *fileOperations) EventRegister(e *waiter.Entry) {
|
||||
f.iops.fileState.queue.EventRegister(e)
|
||||
fdnotifier.UpdateFD(int32(f.iops.fileState.FD()))
|
||||
}
|
||||
|
||||
|
||||
@@ -46,8 +46,8 @@ func TestWait(t *testing.T) {
|
||||
t.Fatalf("File is ready for read when it shouldn't be.")
|
||||
}
|
||||
|
||||
e, ch := waiter.NewChannelEntry(nil)
|
||||
file.EventRegister(&e, waiter.ReadableEvents)
|
||||
e, ch := waiter.NewChannelEntry(waiter.ReadableEvents)
|
||||
file.EventRegister(&e)
|
||||
defer file.EventUnregister(&e)
|
||||
|
||||
// Check that there are no notifications yet.
|
||||
|
||||
@@ -163,8 +163,8 @@ func (l *Locks) LockRegion(uid UniqueID, ownerPID int32, t LockType, r LockRange
|
||||
// continue blocking.
|
||||
res := l.locks.lock(uid, ownerPID, t, r)
|
||||
if !res && block != nil {
|
||||
e, ch := waiter.NewChannelEntry(nil)
|
||||
l.blockedQueue.EventRegister(&e, EventMaskAll)
|
||||
e, ch := waiter.NewChannelEntry(EventMaskAll)
|
||||
l.blockedQueue.EventRegister(&e)
|
||||
l.mu.Unlock()
|
||||
if err := block.Block(ch); err != nil {
|
||||
// We were interrupted, the caller can translate this to EINTR if applicable.
|
||||
|
||||
@@ -108,8 +108,8 @@ func (t *TimerOperations) Readiness(mask waiter.EventMask) waiter.EventMask {
|
||||
}
|
||||
|
||||
// EventRegister implements waiter.Waitable.EventRegister.
|
||||
func (t *TimerOperations) EventRegister(e *waiter.Entry, mask waiter.EventMask) {
|
||||
t.events.EventRegister(e, mask)
|
||||
func (t *TimerOperations) EventRegister(e *waiter.Entry) {
|
||||
t.events.EventRegister(e)
|
||||
}
|
||||
|
||||
// EventUnregister implements waiter.Waitable.EventUnregister.
|
||||
|
||||
@@ -128,8 +128,8 @@ func (mf *masterFileOperations) Release(ctx context.Context) {
|
||||
}
|
||||
|
||||
// EventRegister implements waiter.Waitable.EventRegister.
|
||||
func (mf *masterFileOperations) EventRegister(e *waiter.Entry, mask waiter.EventMask) {
|
||||
mf.t.ld.masterWaiter.EventRegister(e, mask)
|
||||
func (mf *masterFileOperations) EventRegister(e *waiter.Entry) {
|
||||
mf.t.ld.masterWaiter.EventRegister(e)
|
||||
}
|
||||
|
||||
// EventUnregister implements waiter.Waitable.EventUnregister.
|
||||
|
||||
@@ -113,8 +113,8 @@ func (sf *replicaFileOperations) Release(context.Context) {
|
||||
}
|
||||
|
||||
// EventRegister implements waiter.Waitable.EventRegister.
|
||||
func (sf *replicaFileOperations) EventRegister(e *waiter.Entry, mask waiter.EventMask) {
|
||||
sf.si.t.ld.replicaWaiter.EventRegister(e, mask)
|
||||
func (sf *replicaFileOperations) EventRegister(e *waiter.Entry) {
|
||||
sf.si.t.ld.replicaWaiter.EventRegister(e)
|
||||
}
|
||||
|
||||
// EventUnregister implements waiter.Waitable.EventUnregister.
|
||||
|
||||
@@ -56,12 +56,6 @@ func TestSimpleMasterToReplica(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
type callback func(*waiter.Entry, waiter.EventMask)
|
||||
|
||||
func (cb callback) Callback(entry *waiter.Entry, mask waiter.EventMask) {
|
||||
cb(entry, mask)
|
||||
}
|
||||
|
||||
func TestEchoDeadlock(t *testing.T) {
|
||||
ctx := contexttest.Context(t)
|
||||
termios := linux.DefaultReplicaTermios
|
||||
@@ -69,11 +63,11 @@ func TestEchoDeadlock(t *testing.T) {
|
||||
ld := newLineDiscipline(termios)
|
||||
outBytes := make([]byte, 32)
|
||||
dst := usermem.BytesIOSequence(outBytes)
|
||||
entry := &waiter.Entry{Callback: callback(func(*waiter.Entry, waiter.EventMask) {
|
||||
entry := waiter.NewFunctionEntry(waiter.ReadableEvents, func(waiter.EventMask) {
|
||||
ld.inputQueueRead(ctx, dst)
|
||||
})}
|
||||
ld.masterWaiter.EventRegister(entry, waiter.ReadableEvents)
|
||||
defer ld.masterWaiter.EventUnregister(entry)
|
||||
})
|
||||
ld.masterWaiter.EventRegister(&entry)
|
||||
defer ld.masterWaiter.EventUnregister(&entry)
|
||||
inBytes := []byte("hello, tty\n")
|
||||
n, err := ld.inputQueueWrite(ctx, usermem.BytesIOSequence(inBytes))
|
||||
if err != nil {
|
||||
|
||||
@@ -103,8 +103,8 @@ func (mfd *masterFileDescription) Release(ctx context.Context) {
|
||||
}
|
||||
|
||||
// EventRegister implements waiter.Waitable.EventRegister.
|
||||
func (mfd *masterFileDescription) EventRegister(e *waiter.Entry, mask waiter.EventMask) {
|
||||
mfd.t.ld.masterWaiter.EventRegister(e, mask)
|
||||
func (mfd *masterFileDescription) EventRegister(e *waiter.Entry) {
|
||||
mfd.t.ld.masterWaiter.EventRegister(e)
|
||||
}
|
||||
|
||||
// EventUnregister implements waiter.Waitable.EventUnregister.
|
||||
|
||||
@@ -112,8 +112,8 @@ var _ vfs.FileDescriptionImpl = (*replicaFileDescription)(nil)
|
||||
func (rfd *replicaFileDescription) Release(ctx context.Context) {}
|
||||
|
||||
// EventRegister implements waiter.Waitable.EventRegister.
|
||||
func (rfd *replicaFileDescription) EventRegister(e *waiter.Entry, mask waiter.EventMask) {
|
||||
rfd.inode.t.ld.replicaWaiter.EventRegister(e, mask)
|
||||
func (rfd *replicaFileDescription) EventRegister(e *waiter.Entry) {
|
||||
rfd.inode.t.ld.replicaWaiter.EventRegister(e)
|
||||
}
|
||||
|
||||
// EventUnregister implements waiter.Waitable.EventUnregister.
|
||||
|
||||
@@ -266,8 +266,8 @@ func (efd *EventFileDescription) Readiness(mask waiter.EventMask) waiter.EventMa
|
||||
}
|
||||
|
||||
// EventRegister implements waiter.Waitable.EventRegister.
|
||||
func (efd *EventFileDescription) EventRegister(entry *waiter.Entry, mask waiter.EventMask) {
|
||||
efd.queue.EventRegister(entry, mask)
|
||||
func (efd *EventFileDescription) EventRegister(entry *waiter.Entry) {
|
||||
efd.queue.EventRegister(entry)
|
||||
|
||||
efd.mu.Lock()
|
||||
defer efd.mu.Unlock()
|
||||
|
||||
@@ -48,8 +48,8 @@ func TestEventFD(t *testing.T) {
|
||||
defer eventfd.DecRef(ctx)
|
||||
|
||||
// Register a callback for a write event.
|
||||
w, ch := waiter.NewChannelEntry(nil)
|
||||
eventfd.EventRegister(&w, waiter.ReadableEvents)
|
||||
w, ch := waiter.NewChannelEntry(waiter.ReadableEvents)
|
||||
eventfd.EventRegister(&w)
|
||||
defer eventfd.EventUnregister(&w)
|
||||
|
||||
data := []byte("00000124")
|
||||
|
||||
@@ -378,8 +378,8 @@ func (fd *DeviceFD) readinessLocked(mask waiter.EventMask) waiter.EventMask {
|
||||
}
|
||||
|
||||
// EventRegister implements waiter.Waitable.EventRegister.
|
||||
func (fd *DeviceFD) EventRegister(e *waiter.Entry, mask waiter.EventMask) {
|
||||
fd.waitQueue.EventRegister(e, mask)
|
||||
func (fd *DeviceFD) EventRegister(e *waiter.Entry) {
|
||||
fd.waitQueue.EventRegister(e)
|
||||
}
|
||||
|
||||
// EventUnregister implements waiter.Waitable.EventUnregister.
|
||||
|
||||
@@ -180,8 +180,8 @@ func ReadTest(serverTask *kernel.Task, fd *vfs.FileDescription, inIOseq usermem.
|
||||
dev := fd.Impl().(*DeviceFD)
|
||||
|
||||
// Register for notifications.
|
||||
w, ch := waiter.NewChannelEntry(nil)
|
||||
dev.EventRegister(&w, waiter.ReadableEvents)
|
||||
w, ch := waiter.NewChannelEntry(waiter.ReadableEvents)
|
||||
dev.EventRegister(&w)
|
||||
for {
|
||||
// Issue the request and break out if it completes with anything other than
|
||||
// "would block".
|
||||
|
||||
@@ -165,13 +165,13 @@ func (fd *specialFileFD) Readiness(mask waiter.EventMask) waiter.EventMask {
|
||||
}
|
||||
|
||||
// EventRegister implements waiter.Waitable.EventRegister.
|
||||
func (fd *specialFileFD) EventRegister(e *waiter.Entry, mask waiter.EventMask) {
|
||||
func (fd *specialFileFD) EventRegister(e *waiter.Entry) {
|
||||
if fd.haveQueue {
|
||||
fd.queue.EventRegister(e, mask)
|
||||
fd.queue.EventRegister(e)
|
||||
fdnotifier.UpdateFD(fd.handle.fd)
|
||||
return
|
||||
}
|
||||
fd.fileDescription.EventRegister(e, mask)
|
||||
fd.fileDescription.EventRegister(e)
|
||||
}
|
||||
|
||||
// EventUnregister implements waiter.Waitable.EventUnregister.
|
||||
|
||||
@@ -892,8 +892,8 @@ func (f *fileDescription) ConfigureMMap(_ context.Context, opts *memmap.MMapOpts
|
||||
}
|
||||
|
||||
// EventRegister implements waiter.Waitable.EventRegister.
|
||||
func (f *fileDescription) EventRegister(e *waiter.Entry, mask waiter.EventMask) {
|
||||
f.inode.queue.EventRegister(e, mask)
|
||||
func (f *fileDescription) EventRegister(e *waiter.Entry) {
|
||||
f.inode.queue.EventRegister(e)
|
||||
if f.inode.mayBlock {
|
||||
fdnotifier.UpdateFD(int32(f.inode.hostFD))
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user