summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDominique Martinet <dominique.martinet@cea.fr>2017-09-07 09:48:11 +0200
committerDominique Martinet <dominique.martinet@cea.fr>2017-09-07 09:48:11 +0200
commit9bf399b5bd11cc9d03123e3e831ea6f13dc529b3 (patch)
treefa49a47849e0b0503203316f36349286039be3b4
parentc6ecafb710966d0b9caaef6980660cd55be02dfa (diff)
vfio: lock when dealing with drivers
vfio doesn't like binding/unbinding multiple devices in parallel
-rwxr-xr-xkvm-wrapper.sh9
1 files changed, 7 insertions, 2 deletions
diff --git a/kvm-wrapper.sh b/kvm-wrapper.sh
index dbc4b22..23bc5a7 100755
--- a/kvm-wrapper.sh
+++ b/kvm-wrapper.sh
@@ -181,7 +181,7 @@ function random_mac ()
# but calling unlock lets us unlink lock file safely
function lock ()
{
- local VARIANT="$1"
+ local VARIANT="${1//-/_}"
local LOCKFILE="/tmp/kvm-wrapper-$VARIANT.lock"
local LOCKFD
@@ -204,7 +204,7 @@ function lock ()
function unlock ()
{
- local VARIANT="$1"
+ local VARIANT="${1//-/_}"
local LOCKFILE="/tmp/kvm-wrapper-$VARIANT.lock"
local LOCKFD
@@ -391,6 +391,9 @@ function pci_bind_driver ()
local PCI_BIND_DRIVER="/sys/bus/pci/drivers/$BIND_DRIVER_NAME"
+ # drivers don't like parallel bind/unbind, lock through.
+ lock "$BIND_DRIVER_NAME"
+
# In case driver is not loaded
test_file_rw "$PCI_BIND_DRIVER/new_id" || modprobe "$BIND_DRIVER_NAME"
test_file_rw "$PCI_BIND_DRIVER/new_id" || fail_exit "$BIND_DRIVER_NAME driver not available"
@@ -406,6 +409,8 @@ function pci_bind_driver ()
[[ -w "/sys/bus/pci/devices/$PCIDOMAIN/driver/unbind" ]] && \
{ echo "$PCIDOMAIN" > "/sys/bus/pci/devices/$PCIDOMAIN/driver/unbind" || fail_exit "couldn't unbind"; }
echo "$PCIDOMAIN" > "$PCI_BIND_DRIVER/bind" || fail_exit "couldn't bind"
+
+ unlock "$BIND_DRIVER_NAME"
}
function pci_unbind_driver()