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>
This commit is contained in:
Ian Ray 2016-05-25 10:41:53 +03:00 committed by Adam Jackson
parent 512e75a23b
commit 4cfee39872

View File

@ -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);