@@ -57,6 +57,7 @@ import (
5757 "yunion.io/x/onecloud/pkg/hostman/hostinfo"
5858 "yunion.io/x/onecloud/pkg/hostman/hostutils"
5959 "yunion.io/x/onecloud/pkg/hostman/isolated_device"
60+ "yunion.io/x/onecloud/pkg/hostman/isolated_device/container_device"
6061 _ "yunion.io/x/onecloud/pkg/hostman/isolated_device/container_device/cdi"
6162 "yunion.io/x/onecloud/pkg/hostman/options"
6263 "yunion.io/x/onecloud/pkg/hostman/storageman"
@@ -2253,7 +2254,11 @@ func (s *sPodGuestInstance) createContainer(ctx context.Context, userCred mcclie
22532254 }
22542255 ctrCfg .Devices = append (ctrCfg .Devices , ctrDevs ... )
22552256 }
2256- if err := s .getIsolatedDeviceExtraConfig (spec , ctrCfg ); err != nil {
2257+ if err := func () error {
2258+ container_device .SetHygonContainerContext (s .GetId (), input .Name )
2259+ defer container_device .ClearHygonContainerContext ()
2260+ return s .getIsolatedDeviceExtraConfig (spec , ctrCfg )
2261+ }(); err != nil {
22572262 return "" , err
22582263 }
22592264 } else {
@@ -2447,6 +2452,38 @@ func (s *sPodGuestInstance) getIsolatedDeviceExtraConfig(spec *hostapi.Container
24472452 return nil
24482453}
24492454
2455+ func (s * sPodGuestInstance ) releaseIsolatedContainerDevices (devs []* hostapi.ContainerDevice ) {
2456+ devsByMan := map [isolated_device.IContainerDeviceManager ][]* hostapi.ContainerDevice {}
2457+ manOrder := []isolated_device.IContainerDeviceManager {}
2458+ for i := range devs {
2459+ dev := devs [i ]
2460+ if dev .IsolatedDevice == nil {
2461+ continue
2462+ }
2463+ devType := dev .IsolatedDevice .DeviceType
2464+ if devType != computeapi .GPU_TYPE && devType != computeapi .NPU_TYPE {
2465+ continue
2466+ }
2467+ if dev .IsolatedDevice .IsCDIUsed () || len (dev .IsolatedDevice .OnlyEnv ) > 0 {
2468+ continue
2469+ }
2470+ iDev := hostinfo .Instance ().IsolatedDeviceMan .GetDeviceByCloudId (dev .IsolatedDevice .Id )
2471+ if iDev == nil {
2472+ continue
2473+ }
2474+ devMan := iDev .GetContainerDeviceManager ()
2475+ if _ , ok := devsByMan [devMan ]; ! ok {
2476+ manOrder = append (manOrder , devMan )
2477+ }
2478+ devsByMan [devMan ] = append (devsByMan [devMan ], dev )
2479+ }
2480+ for _ , devMan := range manOrder {
2481+ if rel , ok := devMan .(isolated_device.IContainerDeviceReleaseManager ); ok {
2482+ rel .ReleaseContainerDevices (devsByMan [devMan ])
2483+ }
2484+ }
2485+ }
2486+
24502487func (s * sPodGuestInstance ) getContainerSystemCpusDir (ctrId string ) string {
24512488 rootFsPath , _ := s .GetRootFsMountPath (ctrId )
24522489 if rootFsPath != "" {
@@ -2607,6 +2644,9 @@ func (s *sPodGuestInstance) ensureContainerSystemCpufreqHostDir(cpuDir, hostCpuP
26072644}
26082645
26092646func (s * sPodGuestInstance ) DeleteContainer (ctx context.Context , userCred mcclient.TokenCredential , ctrId string ) (jsonutils.JSONObject , error ) {
2647+ if ctr := s .GetContainerById (ctrId ); ctr != nil {
2648+ s .releaseIsolatedContainerDevices (ctr .Spec .Devices )
2649+ }
26102650 criId , err := s .getContainerCRIId (ctrId )
26112651 if err != nil && errors .Cause (err ) != errors .ErrNotFound {
26122652 return nil , errors .Wrap (err , "getContainerCRIId" )
0 commit comments