mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-04-28 02:16:42 +00:00
update gpu-switch-mode-indicator.tsx
This commit is contained in:
@@ -138,6 +138,12 @@ if [[ -f "$vm_conf" ]]; then
|
||||
slot_has_gpu=false
|
||||
for dev in /sys/bus/pci/devices/0000:${slot}.*; do
|
||||
[[ -e "$dev" ]] || continue
|
||||
# SR-IOV: skip Virtual Functions when iterating a whole slot.
|
||||
# VFs share the slot with their PF but carry their own driver
|
||||
# state; their vfio-pci rebind is handled by Proxmox at VM
|
||||
# start. Pre-flighting them would falsely block SR-IOV setups
|
||||
# where the PF legitimately stays on the native driver.
|
||||
[[ -L "${dev}/physfn" ]] && continue
|
||||
class_hex="$(cat "$dev/class" 2>/dev/null | sed 's/^0x//')"
|
||||
[[ "${class_hex:0:2}" != "03" ]] && continue
|
||||
slot_has_gpu=true
|
||||
@@ -159,6 +165,14 @@ if [[ -f "$vm_conf" ]]; then
|
||||
details+=$'\n'"- ${id}: PCI device not found"
|
||||
continue
|
||||
fi
|
||||
# SR-IOV VF: do not pre-flight the driver. Proxmox rebinds the VF
|
||||
# to vfio-pci as part of VM start; at pre-start time the VF may
|
||||
# still be on its native driver (i915, etc.) — that is normal,
|
||||
# not an error. Blocking here would prevent every SR-IOV VF
|
||||
# passthrough from starting.
|
||||
if [[ -L "${dev_path}/physfn" ]]; then
|
||||
continue
|
||||
fi
|
||||
class_hex="$(cat "$dev_path/class" 2>/dev/null | sed 's/^0x//')"
|
||||
# Enforce vfio only for display/3D devices (PCI class 03xx).
|
||||
[[ "${class_hex:0:2}" == "03" ]] || continue
|
||||
|
||||
@@ -50,3 +50,109 @@ function _pci_function_assigned_to_vm() {
|
||||
|
||||
qm config "$vmid" 2>/dev/null | grep -qE "$pattern"
|
||||
}
|
||||
|
||||
# ==========================================================
|
||||
# SR-IOV detection helpers
|
||||
# ==========================================================
|
||||
# A PCI device participates in SR-IOV when either:
|
||||
# - It is a Physical Function (PF) with one or more active VFs
|
||||
# → /sys/bus/pci/devices/<BDF>/sriov_numvfs > 0
|
||||
# - It is a Virtual Function (VF) spawned by a PF
|
||||
# → /sys/bus/pci/devices/<BDF>/physfn is a symlink to the PF
|
||||
#
|
||||
# These helpers accept a BDF in either "0000:00:02.0" or "00:02.0" form.
|
||||
# Return 0 on match, non-zero otherwise (shell convention).
|
||||
|
||||
function _pci_normalize_bdf() {
|
||||
local id="$1"
|
||||
[[ -z "$id" ]] && return 1
|
||||
[[ "$id" =~ ^0000: ]] || id="0000:${id}"
|
||||
printf '%s\n' "$id"
|
||||
}
|
||||
|
||||
function _pci_is_vf() {
|
||||
local id
|
||||
id=$(_pci_normalize_bdf "$1") || return 1
|
||||
[[ -L "/sys/bus/pci/devices/${id}/physfn" ]]
|
||||
}
|
||||
|
||||
function _pci_get_pf_of_vf() {
|
||||
local id
|
||||
id=$(_pci_normalize_bdf "$1") || return 1
|
||||
local link="/sys/bus/pci/devices/${id}/physfn"
|
||||
[[ -L "$link" ]] || return 1
|
||||
basename "$(readlink -f "$link")"
|
||||
}
|
||||
|
||||
function _pci_is_sriov_capable() {
|
||||
local id total
|
||||
id=$(_pci_normalize_bdf "$1") || return 1
|
||||
total=$(cat "/sys/bus/pci/devices/${id}/sriov_totalvfs" 2>/dev/null)
|
||||
[[ -n "$total" && "$total" -gt 0 ]]
|
||||
}
|
||||
|
||||
function _pci_active_vf_count() {
|
||||
local id num
|
||||
id=$(_pci_normalize_bdf "$1") || { echo 0; return 1; }
|
||||
num=$(cat "/sys/bus/pci/devices/${id}/sriov_numvfs" 2>/dev/null)
|
||||
[[ -n "$num" ]] || num=0
|
||||
echo "$num"
|
||||
}
|
||||
|
||||
function _pci_has_active_vfs() {
|
||||
local n
|
||||
n=$(_pci_active_vf_count "$1")
|
||||
[[ "$n" -gt 0 ]]
|
||||
}
|
||||
|
||||
# Filter an array (by name) of PCI BDFs in place, removing entries that
|
||||
# are SR-IOV Virtual Functions or Physical Functions with active VFs —
|
||||
# i.e. the configurations ProxMenux refuses to operate on today.
|
||||
#
|
||||
# Usage: _pci_sriov_filter_array <array_name_by_ref>
|
||||
# Output: one line per removed entry, formatted "BDF|role" where role is
|
||||
# whatever _pci_sriov_role prints (e.g. "vf 0000:00:02.0" or
|
||||
# "pf-active 7"). The caller decides how to surface the removals.
|
||||
# Returns: 0 if the caller should continue (even if some entries were
|
||||
# filtered); the array mutation happens either way.
|
||||
function _pci_sriov_filter_array() {
|
||||
local -n _arr_ref="$1"
|
||||
local -a _kept=()
|
||||
local bdf role first
|
||||
for bdf in "${_arr_ref[@]}"; do
|
||||
role=$(_pci_sriov_role "$bdf" 2>/dev/null)
|
||||
first="${role%% *}"
|
||||
if [[ "$first" == "vf" || "$first" == "pf-active" ]]; then
|
||||
echo "${bdf}|${role}"
|
||||
else
|
||||
_kept+=("$bdf")
|
||||
fi
|
||||
done
|
||||
_arr_ref=("${_kept[@]}")
|
||||
}
|
||||
|
||||
# Emits a one-line SR-IOV role description for diagnostics/messages.
|
||||
# Prints one of:
|
||||
# "pf-active <N>" — PF with N>0 active VFs
|
||||
# "pf-idle" — SR-IOV capable PF with 0 VFs (benign)
|
||||
# "vf <PF-BDF>" — VF (names its parent PF)
|
||||
# "none" — device not involved in SR-IOV
|
||||
function _pci_sriov_role() {
|
||||
local id
|
||||
id=$(_pci_normalize_bdf "$1") || { echo "none"; return 0; }
|
||||
if _pci_is_vf "$id"; then
|
||||
echo "vf $(_pci_get_pf_of_vf "$id")"
|
||||
return 0
|
||||
fi
|
||||
if _pci_is_sriov_capable "$id"; then
|
||||
local n
|
||||
n=$(_pci_active_vf_count "$id")
|
||||
if [[ "$n" -gt 0 ]]; then
|
||||
echo "pf-active ${n}"
|
||||
else
|
||||
echo "pf-idle"
|
||||
fi
|
||||
return 0
|
||||
fi
|
||||
echo "none"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user