diff --git a/src/runtime/virtcontainers/bridgedmacvlan_endpoint.go b/src/runtime/virtcontainers/bridgedmacvlan_endpoint.go index 8c7e78b7b7..b4c3a09ec9 100644 --- a/src/runtime/virtcontainers/bridgedmacvlan_endpoint.go +++ b/src/runtime/virtcontainers/bridgedmacvlan_endpoint.go @@ -86,7 +86,8 @@ func (endpoint *BridgedMacvlanEndpoint) NetworkPair() *NetworkInterfacePair { // Attach for virtual endpoint bridges the network pair and adds the // tap interface of the network pair to the hypervisor. -func (endpoint *BridgedMacvlanEndpoint) Attach(h hypervisor) error { +func (endpoint *BridgedMacvlanEndpoint) Attach(s *Sandbox) error { + h := s.hypervisor if err := xConnectVMNetwork(endpoint, h); err != nil { networkLogger().WithError(err).Error("Error bridging virtual ep") return err diff --git a/src/runtime/virtcontainers/endpoint.go b/src/runtime/virtcontainers/endpoint.go index 7a570085ad..1f422dad69 100644 --- a/src/runtime/virtcontainers/endpoint.go +++ b/src/runtime/virtcontainers/endpoint.go @@ -22,7 +22,7 @@ type Endpoint interface { SetProperties(NetworkInfo) SetPciAddr(string) - Attach(hypervisor) error + Attach(*Sandbox) error Detach(netNsCreated bool, netNsPath string) error HotAttach(h hypervisor) error HotDetach(h hypervisor, netNsCreated bool, netNsPath string) error diff --git a/src/runtime/virtcontainers/ipvlan_endpoint.go b/src/runtime/virtcontainers/ipvlan_endpoint.go index a9c39c505a..38e9121c31 100644 --- a/src/runtime/virtcontainers/ipvlan_endpoint.go +++ b/src/runtime/virtcontainers/ipvlan_endpoint.go @@ -89,7 +89,8 @@ func (endpoint *IPVlanEndpoint) NetworkPair() *NetworkInterfacePair { // Attach for virtual endpoint bridges the network pair and adds the // tap interface of the network pair to the hypervisor. -func (endpoint *IPVlanEndpoint) Attach(h hypervisor) error { +func (endpoint *IPVlanEndpoint) Attach(s *Sandbox) error { + h := s.hypervisor if err := xConnectVMNetwork(endpoint, h); err != nil { networkLogger().WithError(err).Error("Error bridging virtual ep") return err diff --git a/src/runtime/virtcontainers/macvtap_endpoint.go b/src/runtime/virtcontainers/macvtap_endpoint.go index 7a40d814ae..3f82869766 100644 --- a/src/runtime/virtcontainers/macvtap_endpoint.go +++ b/src/runtime/virtcontainers/macvtap_endpoint.go @@ -58,8 +58,9 @@ func (endpoint *MacvtapEndpoint) SetProperties(properties NetworkInfo) { } // Attach for macvtap endpoint passes macvtap device to the hypervisor. -func (endpoint *MacvtapEndpoint) Attach(h hypervisor) error { +func (endpoint *MacvtapEndpoint) Attach(s *Sandbox) error { var err error + h := s.hypervisor endpoint.VMFds, err = createMacvtapFds(endpoint.EndpointProperties.Iface.Index, int(h.hypervisorConfig().NumVCPUs)) if err != nil { diff --git a/src/runtime/virtcontainers/network.go b/src/runtime/virtcontainers/network.go index baeee9bb99..2eb6b300ac 100644 --- a/src/runtime/virtcontainers/network.go +++ b/src/runtime/virtcontainers/network.go @@ -1271,7 +1271,7 @@ func (n *Network) Run(networkNSPath string, cb func() error) error { } // Add adds all needed interfaces inside the network namespace. -func (n *Network) Add(ctx context.Context, config *NetworkConfig, hypervisor hypervisor, hotplug bool) ([]Endpoint, error) { +func (n *Network) Add(ctx context.Context, config *NetworkConfig, s *Sandbox, hotplug bool) ([]Endpoint, error) { span, _ := n.trace(ctx, "add") defer span.Finish() @@ -1284,24 +1284,24 @@ func (n *Network) Add(ctx context.Context, config *NetworkConfig, hypervisor hyp for _, endpoint := range endpoints { networkLogger().WithField("endpoint-type", endpoint.Type()).WithField("hotplug", hotplug).Info("Attaching endpoint") if hotplug { - if err := endpoint.HotAttach(hypervisor); err != nil { + if err := endpoint.HotAttach(s.hypervisor); err != nil { return err } } else { - if err := endpoint.Attach(hypervisor); err != nil { + if err := endpoint.Attach(s); err != nil { return err } } - if !hypervisor.isRateLimiterBuiltin() { - rxRateLimiterMaxRate := hypervisor.hypervisorConfig().RxRateLimiterMaxRate + if !s.hypervisor.isRateLimiterBuiltin() { + rxRateLimiterMaxRate := s.hypervisor.hypervisorConfig().RxRateLimiterMaxRate if rxRateLimiterMaxRate > 0 { networkLogger().Info("Add Rx Rate Limiter") if err := addRxRateLimiter(endpoint, rxRateLimiterMaxRate); err != nil { return err } } - txRateLimiterMaxRate := hypervisor.hypervisorConfig().TxRateLimiterMaxRate + txRateLimiterMaxRate := s.hypervisor.hypervisorConfig().TxRateLimiterMaxRate if txRateLimiterMaxRate > 0 { networkLogger().Info("Add Tx Rate Limiter") if err := addTxRateLimiter(endpoint, txRateLimiterMaxRate); err != nil { diff --git a/src/runtime/virtcontainers/physical_endpoint.go b/src/runtime/virtcontainers/physical_endpoint.go index d309e34bee..e778102a5b 100644 --- a/src/runtime/virtcontainers/physical_endpoint.go +++ b/src/runtime/virtcontainers/physical_endpoint.go @@ -15,6 +15,7 @@ import ( "github.com/kata-containers/kata-containers/src/runtime/virtcontainers/device/config" "github.com/kata-containers/kata-containers/src/runtime/virtcontainers/device/drivers" persistapi "github.com/kata-containers/kata-containers/src/runtime/virtcontainers/persist/api" + "github.com/kata-containers/kata-containers/src/runtime/virtcontainers/pkg/cgroups" "github.com/safchain/ethtool" ) @@ -72,27 +73,29 @@ func (endpoint *PhysicalEndpoint) NetworkPair() *NetworkInterfacePair { // Attach for physical endpoint binds the physical network interface to // vfio-pci and adds device to the hypervisor with vfio-passthrough. -func (endpoint *PhysicalEndpoint) Attach(h hypervisor) error { +func (endpoint *PhysicalEndpoint) Attach(s *Sandbox) error { // Unbind physical interface from host driver and bind to vfio // so that it can be passed to qemu. - if err := bindNICToVFIO(endpoint); err != nil { + vfioPath, err := bindNICToVFIO(endpoint) + if err != nil { return err } - // TODO: use device manager as general device management entrance - var vendorID, deviceID string - if splits := strings.Split(endpoint.VendorDeviceID, " "); len(splits) == 2 { - vendorID = splits[0] - deviceID = splits[1] + c, err := cgroups.DeviceToCgroupDevice(vfioPath) + if err != nil { + return err } - d := config.VFIODev{ - BDF: endpoint.BDF, - VendorID: vendorID, - DeviceID: deviceID, + d := config.DeviceInfo{ + ContainerPath: c.Path, + DevType: string(c.Type), + Major: c.Major, + Minor: c.Minor, + ColdPlug: true, } - return h.addDevice(d, vfioDev) + _, err = s.AddDevice(d) + return err } // Detach for physical endpoint unbinds the physical network interface from vfio-pci diff --git a/src/runtime/virtcontainers/sandbox.go b/src/runtime/virtcontainers/sandbox.go index d5dae8a660..06a06da499 100644 --- a/src/runtime/virtcontainers/sandbox.go +++ b/src/runtime/virtcontainers/sandbox.go @@ -824,7 +824,7 @@ func (s *Sandbox) createNetwork() error { // after vm is started. if s.factory == nil { // Add the network - endpoints, err := s.network.Add(s.ctx, &s.config.NetworkConfig, s.hypervisor, false) + endpoints, err := s.network.Add(s.ctx, &s.config.NetworkConfig, s, false) if err != nil { return err } @@ -991,7 +991,7 @@ func (s *Sandbox) startVM() (err error) { // In case of vm factory, network interfaces are hotplugged // after vm is started. if s.factory != nil { - endpoints, err := s.network.Add(s.ctx, &s.config.NetworkConfig, s.hypervisor, true) + endpoints, err := s.network.Add(s.ctx, &s.config.NetworkConfig, s, true) if err != nil { return err } diff --git a/src/runtime/virtcontainers/tap_endpoint.go b/src/runtime/virtcontainers/tap_endpoint.go index 1741ce12af..583ffe9cc2 100644 --- a/src/runtime/virtcontainers/tap_endpoint.go +++ b/src/runtime/virtcontainers/tap_endpoint.go @@ -66,7 +66,7 @@ func (endpoint *TapEndpoint) SetProperties(properties NetworkInfo) { } // Attach for tap endpoint adds the tap interface to the hypervisor. -func (endpoint *TapEndpoint) Attach(h hypervisor) error { +func (endpoint *TapEndpoint) Attach(s *Sandbox) error { return fmt.Errorf("TapEndpoint does not support Attach, if you're using docker please use --net none") } diff --git a/src/runtime/virtcontainers/tuntap_endpoint.go b/src/runtime/virtcontainers/tuntap_endpoint.go index 631024cad0..7eef86ea87 100644 --- a/src/runtime/virtcontainers/tuntap_endpoint.go +++ b/src/runtime/virtcontainers/tuntap_endpoint.go @@ -68,7 +68,8 @@ func (endpoint *TuntapEndpoint) SetProperties(properties NetworkInfo) { } // Attach for tap endpoint adds the tap interface to the hypervisor. -func (endpoint *TuntapEndpoint) Attach(h hypervisor) error { +func (endpoint *TuntapEndpoint) Attach(s *Sandbox) error { + h := s.hypervisor if err := xConnectVMNetwork(endpoint, h); err != nil { networkLogger().WithError(err).Error("Error bridging virtual endpoint") return err diff --git a/src/runtime/virtcontainers/veth_endpoint.go b/src/runtime/virtcontainers/veth_endpoint.go index e019b701a9..371005798a 100644 --- a/src/runtime/virtcontainers/veth_endpoint.go +++ b/src/runtime/virtcontainers/veth_endpoint.go @@ -89,7 +89,8 @@ func (endpoint *VethEndpoint) SetProperties(properties NetworkInfo) { // Attach for veth endpoint bridges the network pair and adds the // tap interface of the network pair to the hypervisor. -func (endpoint *VethEndpoint) Attach(h hypervisor) error { +func (endpoint *VethEndpoint) Attach(s *Sandbox) error { + h := s.hypervisor if err := xConnectVMNetwork(endpoint, h); err != nil { networkLogger().WithError(err).Error("Error bridging virtual endpoint") return err diff --git a/src/runtime/virtcontainers/vhostuser_endpoint.go b/src/runtime/virtcontainers/vhostuser_endpoint.go index fb234957c7..642f06fb1d 100644 --- a/src/runtime/virtcontainers/vhostuser_endpoint.go +++ b/src/runtime/virtcontainers/vhostuser_endpoint.go @@ -74,7 +74,7 @@ func (endpoint *VhostUserEndpoint) NetworkPair() *NetworkInterfacePair { } // Attach for vhostuser endpoint -func (endpoint *VhostUserEndpoint) Attach(h hypervisor) error { +func (endpoint *VhostUserEndpoint) Attach(s *Sandbox) error { // Generate a unique ID to be used for hypervisor commandline fields randBytes, err := utils.GenerateRandomBytes(8) if err != nil { @@ -89,7 +89,7 @@ func (endpoint *VhostUserEndpoint) Attach(h hypervisor) error { Type: config.VhostUserNet, } - return h.addDevice(d, vhostuserDev) + return s.hypervisor.addDevice(d, vhostuserDev) } // Detach for vhostuser endpoint diff --git a/src/runtime/virtcontainers/vhostuser_endpoint_test.go b/src/runtime/virtcontainers/vhostuser_endpoint_test.go index ad013e1297..ac20b97808 100644 --- a/src/runtime/virtcontainers/vhostuser_endpoint_test.go +++ b/src/runtime/virtcontainers/vhostuser_endpoint_test.go @@ -78,9 +78,11 @@ func TestVhostUserEndpointAttach(t *testing.T) { EndpointType: VhostUserEndpointType, } - h := &mockHypervisor{} + s := &Sandbox{ + hypervisor: &mockHypervisor{}, + } - err := v.Attach(h) + err := v.Attach(s) assert.NoError(err) }