mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Don't call kernel.Task.Block() from netstack.SocketOperations.Write().
kernel.Task.Block() requires that the caller is running on the task goroutine. netstack.SocketOperations.Write() uses kernel.TaskFromContext() to call kernel.Task.Block() even if it's not running on the task goroutine. Stop doing that. PiperOrigin-RevId: 311178335
This commit is contained in:
@@ -18,6 +18,7 @@ go_library(
|
||||
],
|
||||
deps = [
|
||||
"//pkg/abi/linux",
|
||||
"//pkg/amutex",
|
||||
"//pkg/binary",
|
||||
"//pkg/context",
|
||||
"//pkg/log",
|
||||
|
||||
@@ -34,6 +34,7 @@ import (
|
||||
"time"
|
||||
|
||||
"gvisor.dev/gvisor/pkg/abi/linux"
|
||||
"gvisor.dev/gvisor/pkg/amutex"
|
||||
"gvisor.dev/gvisor/pkg/binary"
|
||||
"gvisor.dev/gvisor/pkg/context"
|
||||
"gvisor.dev/gvisor/pkg/log"
|
||||
@@ -553,11 +554,9 @@ func (s *SocketOperations) Write(ctx context.Context, _ *fs.File, src usermem.IO
|
||||
}
|
||||
|
||||
if resCh != nil {
|
||||
t := kernel.TaskFromContext(ctx)
|
||||
if err := t.Block(resCh); err != nil {
|
||||
return 0, syserr.FromError(err).ToError()
|
||||
if err := amutex.Block(ctx, resCh); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
n, _, err = s.Endpoint.Write(f, tcpip.WriteOptions{})
|
||||
}
|
||||
|
||||
@@ -626,11 +625,9 @@ func (s *SocketOperations) ReadFrom(ctx context.Context, _ *fs.File, r io.Reader
|
||||
}
|
||||
|
||||
if resCh != nil {
|
||||
t := kernel.TaskFromContext(ctx)
|
||||
if err := t.Block(resCh); err != nil {
|
||||
return 0, syserr.FromError(err).ToError()
|
||||
if err := amutex.Block(ctx, resCh); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
n, _, err = s.Endpoint.Write(f, tcpip.WriteOptions{
|
||||
Atomic: true, // See above.
|
||||
})
|
||||
|
||||
@@ -16,6 +16,7 @@ package netstack
|
||||
|
||||
import (
|
||||
"gvisor.dev/gvisor/pkg/abi/linux"
|
||||
"gvisor.dev/gvisor/pkg/amutex"
|
||||
"gvisor.dev/gvisor/pkg/context"
|
||||
"gvisor.dev/gvisor/pkg/sentry/arch"
|
||||
"gvisor.dev/gvisor/pkg/sentry/fsimpl/sockfs"
|
||||
@@ -89,11 +90,6 @@ func (s *SocketVFS2) EventUnregister(e *waiter.Entry) {
|
||||
s.socketOpsCommon.EventUnregister(e)
|
||||
}
|
||||
|
||||
// PRead implements vfs.FileDescriptionImpl.
|
||||
func (s *SocketVFS2) PRead(ctx context.Context, dst usermem.IOSequence, offset int64, opts vfs.ReadOptions) (int64, error) {
|
||||
return 0, syserror.ESPIPE
|
||||
}
|
||||
|
||||
// Read implements vfs.FileDescriptionImpl.
|
||||
func (s *SocketVFS2) Read(ctx context.Context, dst usermem.IOSequence, opts vfs.ReadOptions) (int64, error) {
|
||||
// All flags other than RWF_NOWAIT should be ignored.
|
||||
@@ -115,11 +111,6 @@ func (s *SocketVFS2) Read(ctx context.Context, dst usermem.IOSequence, opts vfs.
|
||||
return int64(n), nil
|
||||
}
|
||||
|
||||
// PWrite implements vfs.FileDescriptionImpl.
|
||||
func (s *SocketVFS2) PWrite(ctx context.Context, src usermem.IOSequence, offset int64, opts vfs.WriteOptions) (int64, error) {
|
||||
return 0, syserror.ESPIPE
|
||||
}
|
||||
|
||||
// Write implements vfs.FileDescriptionImpl.
|
||||
func (s *SocketVFS2) Write(ctx context.Context, src usermem.IOSequence, opts vfs.WriteOptions) (int64, error) {
|
||||
// All flags other than RWF_NOWAIT should be ignored.
|
||||
@@ -135,11 +126,9 @@ func (s *SocketVFS2) Write(ctx context.Context, src usermem.IOSequence, opts vfs
|
||||
}
|
||||
|
||||
if resCh != nil {
|
||||
t := kernel.TaskFromContext(ctx)
|
||||
if err := t.Block(resCh); err != nil {
|
||||
return 0, syserr.FromError(err).ToError()
|
||||
if err := amutex.Block(ctx, resCh); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
n, _, err = s.Endpoint.Write(f, tcpip.WriteOptions{})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user