summaryrefslogtreecommitdiff
path: root/suspend_evtchn_lock.patch
diff options
context:
space:
mode:
Diffstat (limited to 'suspend_evtchn_lock.patch')
-rw-r--r--suspend_evtchn_lock.patch78
1 files changed, 78 insertions, 0 deletions
diff --git a/suspend_evtchn_lock.patch b/suspend_evtchn_lock.patch
new file mode 100644
index 0000000..e2ed442
--- /dev/null
+++ b/suspend_evtchn_lock.patch
@@ -0,0 +1,78 @@
+Fix problems that suspend eventchannel lock file might be obselete for some reason
+like segment fault or other abnormal exit, and once obselete lock file exists,
+it might affact latter save process.
+Have discussed with upstream, for some reason not accepted.
+http://xen.1045712.n5.nabble.com/Re-PATCH-improve-suspend-evtchn-lock-processing-td3395229.html
+
+Signed-off-by: Chunyan Liu <cyliu@suse.com>
+
+Index: xen-4.10.0-testing/tools/libxc/xc_suspend.c
+===================================================================
+--- xen-4.10.0-testing.orig/tools/libxc/xc_suspend.c
++++ xen-4.10.0-testing/tools/libxc/xc_suspend.c
+@@ -20,6 +20,10 @@
+
+ #include "xc_private.h"
+ #include "xenguest.h"
++#include <signal.h>
++#ifdef __MINIOS__
++extern int kill (__pid_t __pid, int __sig);
++#endif
+
+ #define SUSPEND_LOCK_FILE XEN_RUN_DIR "/suspend-evtchn-%d.lock"
+
+@@ -35,6 +39,37 @@
+
+ #define SUSPEND_FILE_BUFLEN (sizeof(SUSPEND_LOCK_FILE) + 10)
+
++/* cleanup obsolete suspend lock file which is unlinked for any reason,
++so that current process can get lock */
++static void clean_obsolete_lock(int domid)
++{
++ int fd, pid, n;
++ char buf[128];
++ char suspend_file[256];
++
++ snprintf(suspend_file, sizeof(suspend_file), "%s_%d_lock.d",
++ SUSPEND_LOCK_FILE, domid);
++ fd = open(suspend_file, O_RDWR);
++
++ if (fd < 0)
++ return;
++
++ n = read(fd, buf, 127);
++
++ close(fd);
++
++ if (n > 0)
++ {
++ sscanf(buf, "%d", &pid);
++ /* pid does not exist, this lock file is obsolete, just delete it */
++ if ( kill(pid,0) )
++ {
++ unlink(suspend_file);
++ return;
++ }
++ }
++}
++
+ static void get_suspend_file(char buf[], uint32_t domid)
+ {
+ snprintf(buf, SUSPEND_FILE_BUFLEN, SUSPEND_LOCK_FILE, domid);
+@@ -48,6 +83,7 @@ static int lock_suspend_event(xc_interfa
+ struct flock fl;
+
+ get_suspend_file(suspend_file, domid);
++ clean_obsolete_lock(domid);
+
+ *lockfd = -1;
+
+@@ -97,6 +133,8 @@ static int lock_suspend_event(xc_interfa
+ if (fd >= 0)
+ close(fd);
+
++ unlink(suspend_file);
++
+ return -1;
+ }
+