@ -223,7 +223,6 @@ static void host_memory_backend_set_prealloc(Object *obj, bool value,
{
Error * local_err = NULL ;
HostMemoryBackend * backend = MEMORY_BACKEND ( obj ) ;
MachineState * ms = MACHINE ( qdev_get_machine ( ) ) ;
if ( backend - > force_prealloc ) {
if ( value ) {
@ -243,7 +242,7 @@ static void host_memory_backend_set_prealloc(Object *obj, bool value,
void * ptr = memory_region_get_ram_ptr ( & backend - > mr ) ;
uint64_t sz = memory_region_size ( & backend - > mr ) ;
os_mem_prealloc ( fd , ptr , sz , ms - > smp . cpu s, & local_err ) ;
os_mem_prealloc ( fd , ptr , sz , backend - > prealloc_thread s, & local_err ) ;
if ( local_err ) {
error_propagate ( errp , local_err ) ;
return ;
@ -252,14 +251,45 @@ static void host_memory_backend_set_prealloc(Object *obj, bool value,
}
}
static void host_memory_backend_get_prealloc_threads ( Object * obj , Visitor * v ,
const char * name , void * opaque , Error * * errp )
{
HostMemoryBackend * backend = MEMORY_BACKEND ( obj ) ;
visit_type_uint32 ( v , name , & backend - > prealloc_threads , errp ) ;
}
static void host_memory_backend_set_prealloc_threads ( Object * obj , Visitor * v ,
const char * name , void * opaque , Error * * errp )
{
HostMemoryBackend * backend = MEMORY_BACKEND ( obj ) ;
Error * local_err = NULL ;
uint32_t value ;
visit_type_uint32 ( v , name , & value , & local_err ) ;
if ( local_err ) {
goto out ;
}
if ( value < = 0 ) {
error_setg ( & local_err ,
" property '%s' of %s doesn't take value '%d' " ,
name , object_get_typename ( obj ) , value ) ;
goto out ;
}
backend - > prealloc_threads = value ;
out :
error_propagate ( errp , local_err ) ;
}
static void host_memory_backend_init ( Object * obj )
{
HostMemoryBackend * backend = MEMORY_BACKEND ( obj ) ;
MachineState * machine = MACHINE ( qdev_get_machine ( ) ) ;
/* TODO: convert access to globals to compat properties */
backend - > merge = machine_mem_merge ( machine ) ;
backend - > dump = machine_dump_guest_core ( machine ) ;
backend - > prealloc = mem_prealloc ;
backend - > prealloc_threads = 1 ;
}
static void host_memory_backend_post_init ( Object * obj )
@ -313,7 +343,6 @@ host_memory_backend_memory_complete(UserCreatable *uc, Error **errp)
{
HostMemoryBackend * backend = MEMORY_BACKEND ( uc ) ;
HostMemoryBackendClass * bc = MEMORY_BACKEND_GET_CLASS ( uc ) ;
MachineState * ms = MACHINE ( qdev_get_machine ( ) ) ;
Error * local_err = NULL ;
void * ptr ;
uint64_t sz ;
@ -378,7 +407,7 @@ host_memory_backend_memory_complete(UserCreatable *uc, Error **errp)
*/
if ( backend - > prealloc ) {
os_mem_prealloc ( memory_region_get_fd ( & backend - > mr ) , ptr , sz ,
ms - > smp . cpu s, & local_err ) ;
backend - > prealloc_thread s, & local_err ) ;
if ( local_err ) {
goto out ;
}
@ -456,6 +485,12 @@ host_memory_backend_class_init(ObjectClass *oc, void *data)
host_memory_backend_set_prealloc , & error_abort ) ;
object_class_property_set_description ( oc , " prealloc " ,
" Preallocate memory " , & error_abort ) ;
object_class_property_add ( oc , " prealloc-threads " , " int " ,
host_memory_backend_get_prealloc_threads ,
host_memory_backend_set_prealloc_threads ,
NULL , NULL , & error_abort ) ;
object_class_property_set_description ( oc , " prealloc-threads " ,
" Number of CPU threads to use for prealloc " , & error_abort ) ;
object_class_property_add ( oc , " size " , " int " ,
host_memory_backend_get_size ,
host_memory_backend_set_size ,