@ -1942,8 +1942,10 @@ out_free:
}
# ifdef CONFIG_POSIX
RAMBlock * qemu_ram_alloc_from_fd ( ram_addr_t size , MemoryRegion * mr ,
RAMBlock * qemu_ram_alloc_from_fd ( ram_addr_t size , ram_addr_t max_size ,
qemu_ram_resize_cb resized , MemoryRegion * mr ,
uint32_t ram_flags , int fd , off_t offset ,
bool grow ,
Error * * errp )
{
RAMBlock * new_block ;
@ -1953,7 +1955,9 @@ RAMBlock *qemu_ram_alloc_from_fd(ram_addr_t size, MemoryRegion *mr,
/* Just support these ram flags by now. */
assert ( ( ram_flags & ~ ( RAM_SHARED | RAM_PMEM | RAM_NORESERVE |
RAM_PROTECTED | RAM_NAMED_FILE | RAM_READONLY |
RAM_READONLY_FD | RAM_GUEST_MEMFD ) ) = = 0 ) ;
RAM_READONLY_FD | RAM_GUEST_MEMFD |
RAM_RESIZEABLE ) ) = = 0 ) ;
assert ( max_size > = size ) ;
if ( xen_enabled ( ) ) {
error_setg ( errp , " -mem-path not supported with Xen " ) ;
@ -1968,13 +1972,15 @@ RAMBlock *qemu_ram_alloc_from_fd(ram_addr_t size, MemoryRegion *mr,
size = TARGET_PAGE_ALIGN ( size ) ;
size = REAL_HOST_PAGE_ALIGN ( size ) ;
max_size = TARGET_PAGE_ALIGN ( max_size ) ;
max_size = REAL_HOST_PAGE_ALIGN ( max_size ) ;
file_size = get_file_size ( fd ) ;
if ( file_size & & file_size < offset + size ) {
if ( file_size & & file_size < offset + max_ size & & ! grow ) {
error_setg ( errp , " %s backing store size 0x% " PRIx64
" is too small for 'size' option 0x " RAM_ADDR_FMT
" plus 'offset' option 0x% " PRIx64 ,
memory_region_name ( mr ) , file_size , size ,
memory_region_name ( mr ) , file_size , max_ size,
( uint64_t ) offset ) ;
return NULL ;
}
@ -1990,11 +1996,13 @@ RAMBlock *qemu_ram_alloc_from_fd(ram_addr_t size, MemoryRegion *mr,
new_block = g_malloc0 ( sizeof ( * new_block ) ) ;
new_block - > mr = mr ;
new_block - > used_length = size ;
new_block - > max_length = size ;
new_block - > max_length = max_size ;
new_block - > resized = resized ;
new_block - > flags = ram_flags ;
new_block - > guest_memfd = - 1 ;
new_block - > host = file_ram_alloc ( new_block , size , fd , ! file_size , offset ,
errp ) ;
new_block - > host = file_ram_alloc ( new_block , max_size , fd ,
file_size < offset + max_size ,
offset , errp ) ;
if ( ! new_block - > host ) {
g_free ( new_block ) ;
return NULL ;
@ -2046,7 +2054,8 @@ RAMBlock *qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr,
return NULL ;
}
block = qemu_ram_alloc_from_fd ( size , mr , ram_flags , fd , offset , errp ) ;
block = qemu_ram_alloc_from_fd ( size , size , NULL , mr , ram_flags , fd , offset ,
false , errp ) ;
if ( ! block ) {
if ( created ) {
unlink ( mem_path ) ;
@ -2061,9 +2070,7 @@ RAMBlock *qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr,
static
RAMBlock * qemu_ram_alloc_internal ( ram_addr_t size , ram_addr_t max_size ,
void ( * resized ) ( const char * ,
uint64_t length ,
void * host ) ,
qemu_ram_resize_cb resized ,
void * host , uint32_t ram_flags ,
MemoryRegion * mr , Error * * errp )
{
@ -2115,10 +2122,8 @@ RAMBlock *qemu_ram_alloc(ram_addr_t size, uint32_t ram_flags,
}
RAMBlock * qemu_ram_alloc_resizeable ( ram_addr_t size , ram_addr_t maxsz ,
void ( * resized ) ( const char * ,
uint64_t length ,
void * host ) ,
MemoryRegion * mr , Error * * errp )
qemu_ram_resize_cb resized ,
MemoryRegion * mr , Error * * errp )
{
return qemu_ram_alloc_internal ( size , maxsz , resized , NULL ,
RAM_RESIZEABLE , mr , errp ) ;