From c22f60e6e55f1bf300dd76d2222a93911f3b2bb2 Mon Sep 17 00:00:00 2001 From: CoprDistGit Date: Thu, 12 Oct 2023 04:00:49 +0000 Subject: automatic import of xen --- suspend_evtchn_lock.patch | 78 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 suspend_evtchn_lock.patch (limited to 'suspend_evtchn_lock.patch') 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 + +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 ++#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; + } + -- cgit v1.2.3