[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Xen-devel] XEN_DOMCTL_setvcpucontext and domain_pause()
On 04/08/16 09:21, Razvan Cojocaru wrote:
Hello,
Hello Razvan,
Looking at xen/common/domctl.c, it appears that during handling of
XEN_DOMCTL_setvcpucontext, a domain_pause() happens unconditionally:
465 if ( ret == 0 )
466 {
467 domain_pause(d);
468 ret = arch_set_info_guest(v, c);
469 domain_unpause(d);
470
471 if ( ret == -ERESTART )
472 ret = hypercall_create_continuation(
473 __HYPERVISOR_domctl, "h", u_domctl);
474 }
I assume that this is because in xen/arch/x86/domain.c,
arch_set_info_guest() uses v->domain here:
1101 if ( v->vcpu_id == 0 )
1102 {
1103 /*
1104 * In the restore case we need to deal with L4 pages which got
1105 * initialized with m2p_strict still clear (and which hence
lack the
1106 * correct initial RO_MPT_VIRT_{START,END} L4 entry).
1107 */
1108 if ( d != current->domain && !VM_ASSIST(d, m2p_strict) &&
1109 is_pv_domain(d) && !is_pv_32bit_domain(d) &&
1110 test_bit(VMASST_TYPE_m2p_strict, &c.nat->vm_assist) &&
1111 atomic_read(&d->arch.pv_domain.nr_l4_pages) )
1112 {
1113 bool_t done = 0;
1114
1115 spin_lock_recursive(&d->page_alloc_lock);
1116
1117 for ( i = 0; ; )
1118 {
1119 struct page_info *page =
page_list_remove_head(&d->page_list);
1120
1121 if ( page_lock(page) )
1122 {
1123 if ( (page->u.inuse.type_info & PGT_type_mask) ==
1124 PGT_l4_page_table )
1125 done = !fill_ro_mpt(page_to_mfn(page));
1126
1127 page_unlock(page);
1128 }
1129
1130 page_list_add_tail(page, &d->page_list);
1131
1132 if ( done || (!(++i & 0xff) &&
hypercall_preempt_check()) )
1133 break;
1134 }
1135
1136 spin_unlock_recursive(&d->page_alloc_lock);
1137
1138 if ( !done )
1139 return -ERESTART;
1140 }
1141
1142 d->vm_assist = c(vm_assist);
1143 }
However, this is not optimal for HVM guests. Since only PV guests would
seem to require a domain pause (see the is_pv_domain(d) test at line
1109, I propose to either check that the domain is PV and only then
pause / unpause it in domctl.c, or only pause it if necessary in
arch_set_info_guest(). If I haven't missed anything here, I'm happy to
post a patch.
This code is common, so you should reason if it is fine for all the
architectures and not only x86.
In any case, we should really avoid to use is_pv_domain in the common
code because this has no meaning on ARM (the guests are nor HVM nor PV).
I actually would like to get a rid of them in the common code in favor
of feature available for a domain.
Regards,
--
Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|