Skip to content

Commit

Permalink
config pnet on smc-tool & smc module installed
Browse files Browse the repository at this point in the history
Signed-off-by: bingshen.wbs <[email protected]>
  • Loading branch information
BSWANG committed Jul 19, 2024
1 parent 2aa9259 commit 2f9b697
Show file tree
Hide file tree
Showing 2 changed files with 92 additions and 0 deletions.
83 changes: 83 additions & 0 deletions pkg/smc/pnet.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package smc

import (
"bytes"
"fmt"
"os"
"os/exec"
"strings"

"github.com/containernetworking/plugins/pkg/ns"
"github.com/vishvananda/netlink"
)

const (
smcPnet = "smc_pnet"
)

func supportSMCR() bool {
// smc module is load
_, err := os.Stat("/proc/sys/net/smc/tcp2smc")
if err != nil {
return false
}
// rdma device attached
rdmaLink, err := netlink.RdmaLinkList()
if err != nil || len(rdmaLink) == 0 {
return false
}
// smc-tools installed
_, err = exec.LookPath(smcPnet)
return err == nil
}

func pnetID(name string) string {
nameSlice := strings.Split(name, "_")
return nameSlice[len(nameSlice)-1]
}

// fixme: reflect to netlink
func ensureForERDMADev(name string) error {
output, err := exec.Command(smcPnet, "-s").CombinedOutput()
if err != nil {
return fmt.Errorf("failed to get smc-pnet stat: %v, output: %v", err, string(output))
}
if bytes.Contains(output, []byte(name)) {
return nil
}
output, err = exec.Command(smcPnet, "-a", pnetID(name), "-D", name).CombinedOutput()
if err != nil {
return fmt.Errorf("failed to config smc-pnet rdma device: %v, output: %v", err, string(output))
}
return nil
}

func ensureForNetDevice(erdmaDev string, netDevice string) error {
output, err := exec.Command(smcPnet, "-s").CombinedOutput()
if err != nil {
return fmt.Errorf("failed to get smc-pnet stat for net device: %v, output: %v", err, string(output))
}
if bytes.Contains(output, []byte(netDevice)) {
return nil
}
output, err = exec.Command(smcPnet, "-a", pnetID(erdmaDev), "-I", netDevice).CombinedOutput()
if err != nil {
return fmt.Errorf("failed to config smc-pnet net device: %v, output: %v", err, string(output))
}
return nil
}

func ConfigSMCForDevice(erdmaDev string, netDevice string, netns ns.NetNS) error {
if !supportSMCR() {
return nil
}
if err := ensureForERDMADev(erdmaDev); err != nil {
return err
}
if netns != nil {
return netns.Do(func(ns ns.NetNS) error {
return ensureForNetDevice(erdmaDev, netDevice)
})
}
return ensureForNetDevice(erdmaDev, netDevice)
}
9 changes: 9 additions & 0 deletions plugin/datapath/policy_router_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import (
"fmt"
"net"

"github.com/AliyunContainerService/terway/pkg/smc"

"github.com/AliyunContainerService/terway/plugin/driver/nic"
"github.com/AliyunContainerService/terway/plugin/driver/types"
"github.com/AliyunContainerService/terway/plugin/driver/utils"
Expand Down Expand Up @@ -348,6 +350,13 @@ func (d *PolicyRoute) Setup(cfg *types.SetupConfig, netNS ns.NetNS) error {
return fmt.Errorf("setup container, %w", err)
}

if cfg.ERDMA {
err = smc.ConfigSMCForDevice("erdma_0", cfg.ContainerIfName, netNS)
if err != nil {
return fmt.Errorf("error setup pnet config for pod: %w", err)

Check warning on line 356 in plugin/datapath/policy_router_linux.go

View check run for this annotation

Codecov / codecov/patch

plugin/datapath/policy_router_linux.go#L354-L356

Added lines #L354 - L356 were not covered by tests
}
}

if cfg.EnableNetworkPriority {
err = utils.SetEgressPriority(eni, cfg.NetworkPriority, cfg.ContainerIPNet)
if err != nil {
Expand Down

0 comments on commit 2f9b697

Please sign in to comment.