diff --git a/build/multi/Dockerfile.multi.asi b/build/multi/Dockerfile.multi.asi index 01581d22d0..8eeae5dba0 100644 --- a/build/multi/Dockerfile.multi.asi +++ b/build/multi/Dockerfile.multi.asi @@ -21,7 +21,7 @@ ARG OSSFS_IMAGE_TAG=v1.91.9.ack.1-b81059f ARG OSSFS2_IMAGE_TAG=v2.0.5.ack.1-663afcf LABEL defaultOssfsImageTag="${OSSFS_IMAGE_TAG}" defaultOssfs2ImageTag="${OSSFS2_IMAGE_TAG}" -RUN yum install -y ca-certificates file tzdata nfs-utils xfsprogs e4fsprogs pciutils iputils strace util-linux nc telnet tar cpio lsof && \ +RUN yum install -y ca-certificates file tzdata nfs-utils xfsprogs e4fsprogs pciutils iputils strace util-linux nc telnet tar cpio && \ yum clean all RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone diff --git a/pkg/disk/bdf.go b/pkg/disk/bdf.go index 4b8bce76ca..740bdef1d0 100644 --- a/pkg/disk/bdf.go +++ b/pkg/disk/bdf.go @@ -658,16 +658,26 @@ func (d *driver) GetPCIDeviceDriverType() string { } func (d *driver) CheckVFIOUsage() error { - actualPath, err := filepath.EvalSymlinks(filepath.Join("/sys/bus", d.machineType.BusName(), "devices", d.deviceNumber, "iommu_group")) + actualPath, err := os.Readlink(filepath.Join("/sys/bus", d.machineType.BusName(), "devices", d.deviceNumber, "iommu_group")) if err != nil { return err } klog.V(5).InfoS("CheckVFIOUsage: eval symlink success", "path", actualPath) groupNumber := filepath.Base(actualPath) - // the command returns -1 if nothing is returned - output, _ := exec.Command("lsof", filepath.Join("/dev/vfio", groupNumber)).CombinedOutput() - if strings.TrimSpace(string(output)) != "" { - return errors.Errorf("CheckVFIOUsage: device: %s is still be in used, output: %s", d.deviceNumber, output) + fd, err := unix.Open("/dev/vfio/"+groupNumber, unix.O_RDWR, 0) + + switch err { + case nil: + err = unix.Close(fd) + if err != nil { + klog.ErrorS(err, "close vfio fd", "fd", fd, "iommu_group", groupNumber) + } + return nil + case unix.ENOENT: + return nil + case unix.EBUSY: + return fmt.Errorf("VFIO group %s is in use", groupNumber) + default: + return fmt.Errorf("cannot verify VFIO group %s is free: %w", groupNumber, err) } - return nil }