domain: update GADDR based runstate guest area

Before adding a new vCPU operation to register the runstate area by
guest-physical address, add code to actually keep such areas up-to-date.

Note that updating of the area will be done exclusively following the
model enabled by VMASST_TYPE_runstate_update_flag for virtual-address
based registered areas.

Note further that pages aren't marked dirty when written to (matching
the handling of space mapped by map_vcpu_info()), on the basis that the
registrations are lost anyway across migration (or would need re-
populating at the target for transparent migration). Plus the contents
of the areas in question have to be deemed volatile in the first place
(so saving a "most recent" value is pretty meaningless even for e.g.
snapshotting).

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
Reviewed-by: Julien Grall <jgrall@amazon.com>
Release-acked-by: Henry Wang <Henry.Wang@arm.com>
This commit is contained in:
Jan Beulich authored and Julien Grall committed 2023-10-05 14:08:50 +01:00
1 parent c4630e3162
commit e1ddb822ca
2 files changed
+42 -3

No files matched your search

+40 -3
View File
@@ -1644,15 +1644,52 @@ bool update_runstate_area(struct vcpu *v)
bool rc;
struct guest_memory_policy policy = { };
void __user *guest_handle = NULL;
struct vcpu_runstate_info runstate;
struct vcpu_runstate_info runstate = v->runstate;
struct vcpu_runstate_info *map = v->runstate_guest_area.map;
if ( map )
{
uint64_t *pset;
#ifdef CONFIG_COMPAT
struct compat_vcpu_runstate_info *cmap = NULL;
if ( v->runstate_guest_area_compat )
cmap = (void *)map;
#endif
/*
* NB: No VM_ASSIST(v->domain, runstate_update_flag) check here.
* Always using that updating model.
*/
#ifdef CONFIG_COMPAT
if ( cmap )
pset = &cmap->state_entry_time;
else
#endif
pset = &map->state_entry_time;
runstate.state_entry_time |= XEN_RUNSTATE_UPDATE;
write_atomic(pset, runstate.state_entry_time);
smp_wmb();
#ifdef CONFIG_COMPAT
if ( cmap )
XLAT_vcpu_runstate_info(cmap, &runstate);
else
#endif
*map = runstate;
smp_wmb();
runstate.state_entry_time &= ~XEN_RUNSTATE_UPDATE;
write_atomic(pset, runstate.state_entry_time);
return true;
}
if ( guest_handle_is_null(runstate_guest(v)) )
return true;
update_guest_memory_policy(v, &policy);
memcpy(&runstate, &v->runstate, sizeof(runstate));
if ( VM_ASSIST(v->domain, runstate_update_flag) )
{
#ifdef CONFIG_COMPAT
+2
View File
@@ -232,6 +232,8 @@ struct vcpu
#ifdef CONFIG_COMPAT
/* A hypercall is using the compat ABI? */
bool hcall_compat;
/* Physical runstate area registered via compat ABI? */
bool runstate_guest_area_compat;
#endif
#ifdef CONFIG_IOREQ_SERVER
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.