util: add fallback for qemu_memfd_alloc()
Add an open/unlink/mmap fallback for system that do not support memfd (only available since 3.17, ~1y ago). This patch may require additional SELinux policies to work for enforced systems, but should fail gracefully in this case. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Tested-by: Thibaut Collet <thibaut.collet@6wind.com>
This commit is contained in:
		
							parent
							
								
									d3592199ba
								
							
						
					
					
						commit
						35f9b6ef3a
					
				
							
								
								
									
										18
									
								
								util/memfd.c
								
								
								
								
							
							
						
						
									
										18
									
								
								util/memfd.c
								
								
								
								
							| 
						 | 
					@ -97,10 +97,26 @@ void *qemu_memfd_alloc(const char *name, size_t size, unsigned int seals,
 | 
				
			||||||
            return NULL;
 | 
					            return NULL;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        perror("memfd");
 | 
					        const char *tmpdir = g_get_tmp_dir();
 | 
				
			||||||
 | 
					        gchar *fname;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fname = g_strdup_printf("%s/memfd-XXXXXX", tmpdir);
 | 
				
			||||||
 | 
					        mfd = mkstemp(fname);
 | 
				
			||||||
 | 
					        unlink(fname);
 | 
				
			||||||
 | 
					        g_free(fname);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (mfd == -1) {
 | 
				
			||||||
 | 
					            perror("mkstemp");
 | 
				
			||||||
            return NULL;
 | 
					            return NULL;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (ftruncate(mfd, size) == -1) {
 | 
				
			||||||
 | 
					            perror("ftruncate");
 | 
				
			||||||
 | 
					            close(mfd);
 | 
				
			||||||
 | 
					            return NULL;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ptr = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, mfd, 0);
 | 
					    ptr = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, mfd, 0);
 | 
				
			||||||
    if (ptr == MAP_FAILED) {
 | 
					    if (ptr == MAP_FAILED) {
 | 
				
			||||||
        perror("mmap");
 | 
					        perror("mmap");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue