summaryrefslogtreecommitdiff
path: root/kdump-udev-throttler
diff options
context:
space:
mode:
Diffstat (limited to 'kdump-udev-throttler')
-rwxr-xr-xkdump-udev-throttler42
1 files changed, 42 insertions, 0 deletions
diff --git a/kdump-udev-throttler b/kdump-udev-throttler
new file mode 100755
index 0000000..cd77a31
--- /dev/null
+++ b/kdump-udev-throttler
@@ -0,0 +1,42 @@
+#!/bin/bash
+# This util helps to reduce the workload of kdump service restarting
+# on udev event. When hotplugging memory / CPU, multiple udev
+# events may be triggered concurrently, and obviously, we don't want
+# to restart kdump service for each event.
+
+# This script will be called by udev, and make sure kdump service is
+# restart after all events we are watching are settled.
+
+# On each call, this script will update try to aquire the $throttle_lock
+# The first instance acquired the file lock will keep waiting for events
+# to settle and then reload kdump. Other instances will just exit
+# In this way, we can make sure kdump service is restarted immediately
+# and for exactly once after udev events are settled.
+
+throttle_lock="/var/lock/kdump-udev-throttle"
+
+exec 9>$throttle_lock
+if [ $? -ne 0 ]; then
+ echo "Failed to create the lock file! Fallback to non-throttled kdump service restart"
+ /bin/kdumpctl reload
+ exit 1
+fi
+
+flock -n 9
+if [ $? -ne 0 ]; then
+ echo "Throttling kdump restart for concurrent udev event"
+ exit 0
+fi
+
+# Wait for at least 1 second, at most 4 seconds for udev to settle
+# Idealy we will have a less than 1 second lag between udev events settle
+# and kdump reload
+sleep 1 && udevadm settle --timeout 3
+
+# Release the lock, /bin/kdumpctl will block and make the process
+# holding two locks at the same time and we might miss some events
+exec 9>&-
+
+/bin/kdumpctl reload
+
+exit 0