diff options
author | Ian Ray <ian.ray@ge.com> | 2016-05-25 10:41:53 +0300 |
---|---|---|
committer | Adam Jackson <ajax@redhat.com> | 2016-11-01 14:00:04 -0400 |
commit | 4cfee398726adf89db4b632ade7d6cab8b78282e (patch) | |
tree | 63248aa6ca9e0aeb845f9179490b71a6c558d65f /hw | |
parent | 512e75a23b7f6339593c3ae6942f0c420a975fd3 (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.c | 10 |
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); |