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:
		
							parent
							
								
									512e75a23b
								
							
						
					
					
						commit
						4cfee39872
					
				| 
						 | 
					@ -28,6 +28,8 @@
 | 
				
			||||||
#include <dix-config.h>
 | 
					#include <dix-config.h>
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "os.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "xwayland.h"
 | 
					#include "xwayland.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <sys/mman.h>
 | 
					#include <sys/mman.h>
 | 
				
			||||||
| 
						 | 
					@ -139,9 +141,17 @@ os_create_anonymous_file(off_t size)
 | 
				
			||||||
        return -1;
 | 
					        return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef HAVE_POSIX_FALLOCATE
 | 
					#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 {
 | 
					    do {
 | 
				
			||||||
        ret = posix_fallocate(fd, 0, size);
 | 
					        ret = posix_fallocate(fd, 0, size);
 | 
				
			||||||
    } while (ret == EINTR);
 | 
					    } while (ret == EINTR);
 | 
				
			||||||
 | 
					    OsReleaseSignals();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (ret != 0) {
 | 
					    if (ret != 0) {
 | 
				
			||||||
        close(fd);
 | 
					        close(fd);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue