summaryrefslogtreecommitdiff
path: root/hw
diff options
context:
space:
mode:
authorIan Ray <ian.ray@ge.com>2016-05-25 10:41:53 +0300
committerAdam Jackson <ajax@redhat.com>2016-11-01 14:00:04 -0400
commit4cfee398726adf89db4b632ade7d6cab8b78282e (patch)
tree63248aa6ca9e0aeb845f9179490b71a6c558d65f /hw
parent512e75a23b7f6339593c3ae6942f0c420a975fd3 (diff)
xwayland-shm: block signals during fallocate
posix_fallocate() does an explicit rollback if it gets EINTR, and this is a problem on slow systems because when the allocation size is sufficiently large posix_fallocate() will always be interrupted by the smart scheduler's SIGALRM. Changes since v1 - big comment in the code to explain what is going on Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Ian Ray <ian.ray@ge.com> Acked-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk> Acked-by: Daniel Stone <daniels@collabora.com>
Diffstat (limited to 'hw')
-rw-r--r--hw/xwayland/xwayland-shm.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/hw/xwayland/xwayland-shm.c b/hw/xwayland/xwayland-shm.c
index daf61480d..452d1f509 100644
--- a/hw/xwayland/xwayland-shm.c
+++ b/hw/xwayland/xwayland-shm.c
@@ -28,6 +28,8 @@
#include <dix-config.h>
#endif
+#include "os.h"
+
#include "xwayland.h"
#include <sys/mman.h>
@@ -139,9 +141,17 @@ os_create_anonymous_file(off_t size)
return -1;
#ifdef HAVE_POSIX_FALLOCATE
+ /*
+ * posix_fallocate does an explicit rollback if it gets EINTR.
+ * Temporarily block signals to allow the call to succeed on
+ * slow systems where the smart scheduler's SIGALRM prevents
+ * large allocation attempts from ever succeeding.
+ */
+ OsBlockSignals();
do {
ret = posix_fallocate(fd, 0, size);
} while (ret == EINTR);
+ OsReleaseSignals();
if (ret != 0) {
close(fd);