@@ -23,6 +23,7 @@ import (
2323 "gvisor.dev/gvisor/pkg/errors/linuxerr"
2424 "gvisor.dev/gvisor/pkg/fdnotifier"
2525 "gvisor.dev/gvisor/pkg/hostarch"
26+ "gvisor.dev/gvisor/pkg/log"
2627 "gvisor.dev/gvisor/pkg/marshal/primitive"
2728 "gvisor.dev/gvisor/pkg/sentry/arch"
2829 "gvisor.dev/gvisor/pkg/sentry/devices/tpuproxy/util"
@@ -80,7 +81,9 @@ func (fd *tpuFD) Release(context.Context) {
8081 }
8182 fdnotifier .RemoveFD (fd .hostFD )
8283 fd .queue .Notify (waiter .EventHUp )
83- unix .Close (int (fd .hostFD ))
84+ if err := unix .Close (int (fd .hostFD )); err != nil {
85+ log .Warningf ("close(%d) tpuFD failed: %v" , fd .hostFD , err )
86+ }
8487}
8588
8689// EventRegister implements waiter.Waitable.EventRegister.
@@ -134,6 +137,8 @@ func (fd *tpuFD) Ioctl(ctx context.Context, uio usermem.IO, sysno uintptr, args
134137 switch cmd {
135138 case linux .VFIO_GROUP_SET_CONTAINER :
136139 return fd .setContainer (ctx , t , args [2 ].Pointer ())
140+ case linux .VFIO_GROUP_UNSET_CONTAINER :
141+ return util .IOCTLInvoke [uint32 , uintptr ](fd .hostFD , linux .VFIO_GROUP_UNSET_CONTAINER , 0 )
137142 case linux .VFIO_GROUP_GET_DEVICE_FD :
138143 ret , cleanup , err := fd .getPciDeviceFd (t , args [2 ].Pointer ())
139144 defer cleanup ()
@@ -194,6 +199,7 @@ func (fd *tpuFD) getPciDeviceFd(t *kernel.Task, arg hostarch.Addr) (uintptr, fun
194199 if err := fdnotifier .AddFD (int32 (hostFD ), & fd .queue ); err != nil {
195200 return 0 , cleanup , err
196201 }
202+ defer pciDevFD .vfsfd .DecRef (t )
197203 newFD , err := t .NewFDFrom (0 , & pciDevFD .vfsfd , kernel.FDFlags {})
198204 if err != nil {
199205 return 0 , cleanup , err
0 commit comments