|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] switch internal hypercall restart indication from -EAGAIN to -ERESTART
commit f5118cae0a7f7748c6f08f557e2cfbbae686434a
Author: Jan Beulich <jbeulich@xxxxxxxx>
AuthorDate: Thu May 15 15:26:12 2014 +0200
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Thu May 15 15:26:12 2014 +0200
switch internal hypercall restart indication from -EAGAIN to -ERESTART
-EAGAIN being a return value we want to return to the actual caller in
a couple of cases makes this unsuitable for restart indication, and x86
already developed two cases where -EAGAIN could not be returned as
intended due to this (which is being fixed here at once).
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx
Acked-by: Aravind Gopalakrishnan<Aravind.Gopalakrishnan@xxxxxxx>
Reviewed-by: Tim Deegan <tim@xxxxxxx>
---
xen/arch/arm/domain.c | 2 +-
xen/arch/arm/p2m.c | 2 +-
xen/arch/x86/domain.c | 18 +++++-----
xen/arch/x86/hvm/hvm.c | 14 ++++----
xen/arch/x86/hvm/svm/svm.c | 2 +-
xen/arch/x86/hvm/vmx/vmx.c | 2 +-
xen/arch/x86/mm.c | 74 ++++++++++++++++++++--------------------
xen/arch/x86/mm/mem_sharing.c | 2 +-
xen/arch/x86/mm/p2m-pod.c | 4 +-
xen/arch/x86/traps.c | 4 +-
xen/common/compat/domain.c | 2 +-
xen/common/domain.c | 4 ++-
xen/common/domctl.c | 4 +-
xen/include/asm-x86/mm.h | 2 +-
14 files changed, 69 insertions(+), 67 deletions(-)
diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c
index 0b77c59..2ae6941 100644
--- a/xen/arch/arm/domain.c
+++ b/xen/arch/arm/domain.c
@@ -682,7 +682,7 @@ static int relinquish_memory(struct domain *d, struct
page_list_head *list)
if ( hypercall_preempt_check() )
{
- ret = -EAGAIN;
+ ret = -ERESTART;
goto out;
}
}
diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c
index 816da21..b85143b 100644
--- a/xen/arch/arm/p2m.c
+++ b/xen/arch/arm/p2m.c
@@ -454,7 +454,7 @@ static int apply_p2m_changes(struct domain *d,
if ( hypercall_preempt_check() )
{
p2m->lowest_mapped_gfn = addr >> PAGE_SHIFT;
- rc = -EAGAIN;
+ rc = -ERESTART;
goto out;
}
count = 0;
diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
index 1436aee..e896210 100644
--- a/xen/arch/x86/domain.c
+++ b/xen/arch/x86/domain.c
@@ -929,8 +929,8 @@ int arch_set_info_guest(
switch ( rc )
{
case -EINTR:
- rc = -EAGAIN;
- case -EAGAIN:
+ rc = -ERESTART;
+ case -ERESTART:
case 0:
break;
default:
@@ -957,8 +957,8 @@ int arch_set_info_guest(
switch ( rc )
{
case -EINTR:
- rc = -EAGAIN;
- case -EAGAIN:
+ rc = -ERESTART;
+ case -ERESTART:
v->arch.old_guest_table =
pagetable_get_page(v->arch.guest_table);
v->arch.guest_table = pagetable_null();
@@ -1808,9 +1808,9 @@ static int relinquish_memory(
{
case 0:
break;
- case -EAGAIN:
+ case -ERESTART:
case -EINTR:
- ret = -EAGAIN;
+ ret = -ERESTART;
page_list_add(page, list);
set_bit(_PGT_pinned, &page->u.inuse.type_info);
put_page(page);
@@ -1855,9 +1855,9 @@ static int relinquish_memory(
if ( x & PGT_partial )
put_page(page);
put_page(page);
- ret = -EAGAIN;
+ ret = -ERESTART;
goto out;
- case -EAGAIN:
+ case -ERESTART:
page_list_add(page, list);
page->u.inuse.type_info |= PGT_partial;
if ( x & PGT_partial )
@@ -1881,7 +1881,7 @@ static int relinquish_memory(
if ( hypercall_preempt_check() )
{
- ret = -EAGAIN;
+ ret = -ERESTART;
goto out;
}
}
diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index b69f164..d2190be 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -4449,7 +4449,7 @@ static int hvmop_flush_tlb_all(void)
/* Avoid deadlock if more than one vcpu tries this at the same time. */
if ( !spin_trylock(&d->hypercall_deadlock_mutex) )
- return -EAGAIN;
+ return -ERESTART;
/* Pause all other vcpus. */
for_each_vcpu ( d, v )
@@ -4557,7 +4557,7 @@ long do_hvm_op(unsigned long op,
XEN_GUEST_HANDLE_PARAM(void) arg)
* All foreign updates to guest state must synchronise on
* the domctl_lock.
*/
- rc = -EAGAIN;
+ rc = -ERESTART;
if ( !domctl_lock_acquire() )
break;
@@ -4819,7 +4819,7 @@ long do_hvm_op(unsigned long op,
XEN_GUEST_HANDLE_PARAM(void) arg)
if ( a.nr > ++start_iter && !(start_iter & HVMOP_op_mask) &&
hypercall_preempt_check() )
{
- rc = -EAGAIN;
+ rc = -ERESTART;
break;
}
}
@@ -4919,13 +4919,13 @@ long do_hvm_op(unsigned long op,
XEN_GUEST_HANDLE_PARAM(void) arg)
{
put_gfn(d, pfn);
p2m_mem_paging_populate(d, pfn);
- rc = -EINVAL; /* XXX EAGAIN */
+ rc = -EAGAIN;
goto param_fail4;
}
if ( p2m_is_shared(t) )
{
put_gfn(d, pfn);
- rc = -EINVAL; /* XXX EAGAIN */
+ rc = -EAGAIN;
goto param_fail4;
}
if ( !p2m_is_ram(t) &&
@@ -4944,7 +4944,7 @@ long do_hvm_op(unsigned long op,
XEN_GUEST_HANDLE_PARAM(void) arg)
if ( a.nr > ++start_iter && !(start_iter & HVMOP_op_mask) &&
hypercall_preempt_check() )
{
- rc = -EAGAIN;
+ rc = -ERESTART;
goto param_fail4;
}
}
@@ -5059,7 +5059,7 @@ long do_hvm_op(unsigned long op,
XEN_GUEST_HANDLE_PARAM(void) arg)
}
}
- if ( rc == -EAGAIN )
+ if ( rc == -ERESTART )
{
ASSERT(!(start_iter & HVMOP_op_mask));
rc = hypercall_create_continuation(__HYPERVISOR_hvm_op, "lh",
diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c
index d392058..870e4ee 100644
--- a/xen/arch/x86/hvm/svm/svm.c
+++ b/xen/arch/x86/hvm/svm/svm.c
@@ -1827,7 +1827,7 @@ static int svm_msr_write_intercept(unsigned int msr,
uint64_t msr_content)
switch ( wrmsr_hypervisor_regs(msr, msr_content) )
{
- case -EAGAIN:
+ case -ERESTART:
result = X86EMUL_RETRY;
break;
case 0:
diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c
index b6c022b..d45fb7f 100644
--- a/xen/arch/x86/hvm/vmx/vmx.c
+++ b/xen/arch/x86/hvm/vmx/vmx.c
@@ -2289,7 +2289,7 @@ static int vmx_msr_write_intercept(unsigned int msr,
uint64_t msr_content)
!is_last_branch_msr(msr) )
switch ( wrmsr_hypervisor_regs(msr, msr_content) )
{
- case -EAGAIN:
+ case -ERESTART:
return X86EMUL_RETRY;
case 0:
case 1:
diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index 1a8a5e0..d3459f4 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -1285,7 +1285,7 @@ static int alloc_l2_table(struct page_info *page,
unsigned long type,
&& hypercall_preempt_check() )
{
page->nr_validated_ptes = i;
- rc = -EAGAIN;
+ rc = -ERESTART;
break;
}
@@ -1356,7 +1356,7 @@ static int alloc_l3_table(struct page_info *page)
(rc = get_page_from_l3e(pl3e[i], pfn, d, partial)) > 0 )
continue;
- if ( rc == -EAGAIN )
+ if ( rc == -ERESTART )
{
page->nr_validated_ptes = i;
page->partial_pte = partial ?: 1;
@@ -1365,7 +1365,7 @@ static int alloc_l3_table(struct page_info *page)
{
page->nr_validated_ptes = i;
page->partial_pte = 0;
- rc = -EAGAIN;
+ rc = -ERESTART;
}
if ( rc < 0 )
break;
@@ -1375,7 +1375,7 @@ static int alloc_l3_table(struct page_info *page)
if ( rc >= 0 && !create_pae_xen_mappings(d, pl3e) )
rc = -EINVAL;
- if ( rc < 0 && rc != -EAGAIN && rc != -EINTR )
+ if ( rc < 0 && rc != -ERESTART && rc != -EINTR )
{
MEM_LOG("Failure in alloc_l3_table: entry %d", i);
if ( i )
@@ -1428,7 +1428,7 @@ static int alloc_l4_table(struct page_info *page)
(rc = get_page_from_l4e(pl4e[i], pfn, d, partial)) > 0 )
continue;
- if ( rc == -EAGAIN )
+ if ( rc == -ERESTART )
{
page->nr_validated_ptes = i;
page->partial_pte = partial ?: 1;
@@ -1442,7 +1442,7 @@ static int alloc_l4_table(struct page_info *page)
page->nr_validated_ptes = i;
page->partial_pte = 0;
if ( rc == -EINTR )
- rc = -EAGAIN;
+ rc = -ERESTART;
else
{
if ( current->arch.old_guest_table )
@@ -1500,7 +1500,7 @@ static int free_l2_table(struct page_info *page, int
preemptible)
preemptible && i && hypercall_preempt_check() )
{
page->nr_validated_ptes = i;
- err = -EAGAIN;
+ err = -ERESTART;
}
} while ( !err && i-- );
@@ -1537,7 +1537,7 @@ static int free_l3_table(struct page_info *page)
unmap_domain_page(pl3e);
- if ( rc == -EAGAIN )
+ if ( rc == -ERESTART )
{
page->nr_validated_ptes = i;
page->partial_pte = partial ?: -1;
@@ -1546,7 +1546,7 @@ static int free_l3_table(struct page_info *page)
{
page->nr_validated_ptes = i + 1;
page->partial_pte = 0;
- rc = -EAGAIN;
+ rc = -ERESTART;
}
return rc > 0 ? 0 : rc;
}
@@ -1567,7 +1567,7 @@ static int free_l4_table(struct page_info *page)
partial = 0;
} while ( i-- );
- if ( rc == -EAGAIN )
+ if ( rc == -ERESTART )
{
page->nr_validated_ptes = i;
page->partial_pte = partial ?: -1;
@@ -1576,7 +1576,7 @@ static int free_l4_table(struct page_info *page)
{
page->nr_validated_ptes = i + 1;
page->partial_pte = 0;
- rc = -EAGAIN;
+ rc = -ERESTART;
}
unmap_domain_page(pl4e);
@@ -2104,7 +2104,7 @@ static int alloc_page_type(struct page_info *page,
unsigned long type,
{
ASSERT((page->u.inuse.type_info &
(PGT_count_mask | PGT_validated)) == 1);
- case -EAGAIN:
+ case -ERESTART:
get_page_light(page);
page->u.inuse.type_info |= PGT_partial;
}
@@ -2203,7 +2203,7 @@ static int __put_final_page_type(
}
else
{
- BUG_ON(rc != -EAGAIN);
+ BUG_ON(rc != -ERESTART);
wmb();
get_page_light(page);
page->u.inuse.type_info |= PGT_partial;
@@ -2421,7 +2421,7 @@ int get_page_type(struct page_info *page, unsigned long
type)
int rc = __get_page_type(page, type, 0);
if ( likely(rc == 0) )
return 1;
- ASSERT(rc != -EINTR && rc != -EAGAIN);
+ ASSERT(rc != -EINTR && rc != -ERESTART);
return 0;
}
@@ -2633,8 +2633,8 @@ int put_old_guest_table(struct vcpu *v)
switch ( rc = put_page_and_type_preemptible(v->arch.old_guest_table) )
{
case -EINTR:
- case -EAGAIN:
- return -EAGAIN;
+ case -ERESTART:
+ return -ERESTART;
}
v->arch.old_guest_table = NULL;
@@ -2722,8 +2722,8 @@ int new_guest_cr3(unsigned long mfn)
case 0:
break;
case -EINTR:
- case -EAGAIN:
- return -EAGAIN;
+ case -ERESTART:
+ return -ERESTART;
default:
MEM_LOG("Error while installing new compat baseptr %lx", mfn);
return rc;
@@ -2758,8 +2758,8 @@ int new_guest_cr3(unsigned long mfn)
case 0:
break;
case -EINTR:
- case -EAGAIN:
- return -EAGAIN;
+ case -ERESTART:
+ return -ERESTART;
default:
MEM_LOG("Error while installing new baseptr %lx", mfn);
return rc;
@@ -2782,8 +2782,8 @@ int new_guest_cr3(unsigned long mfn)
switch ( rc = put_page_and_type_preemptible(page) )
{
case -EINTR:
- rc = -EAGAIN;
- case -EAGAIN:
+ rc = -ERESTART;
+ case -ERESTART:
curr->arch.old_guest_table = page;
break;
default:
@@ -2896,7 +2896,7 @@ long do_mmuext_op(
if ( unlikely(rc) )
{
- if ( likely(rc == -EAGAIN) )
+ if ( likely(rc == -ERESTART) )
rc = hypercall_create_continuation(
__HYPERVISOR_mmuext_op, "hihi", uops, count, pdone,
foreigndom);
@@ -2937,7 +2937,7 @@ long do_mmuext_op(
{
if ( curr->arch.old_guest_table || (i && hypercall_preempt_check()) )
{
- rc = -EAGAIN;
+ rc = -ERESTART;
break;
}
@@ -2991,8 +2991,8 @@ long do_mmuext_op(
if ( unlikely(!okay) )
{
if ( rc == -EINTR )
- rc = -EAGAIN;
- else if ( rc != -EAGAIN )
+ rc = -ERESTART;
+ else if ( rc != -ERESTART )
MEM_LOG("Error while pinning mfn %lx", page_to_mfn(page));
if ( page != curr->arch.old_guest_table )
put_page(page);
@@ -3061,7 +3061,7 @@ long do_mmuext_op(
switch ( rc = put_page_and_type_preemptible(page) )
{
case -EINTR:
- case -EAGAIN:
+ case -ERESTART:
curr->arch.old_guest_table = page;
rc = 0;
break;
@@ -3117,8 +3117,8 @@ long do_mmuext_op(
if ( unlikely(!okay) )
{
if ( rc == -EINTR )
- rc = -EAGAIN;
- else if ( rc != -EAGAIN )
+ rc = -ERESTART;
+ else if ( rc != -ERESTART )
MEM_LOG("Error while installing new mfn %lx",
op.arg1.mfn);
break;
@@ -3137,8 +3137,8 @@ long do_mmuext_op(
switch ( rc = put_page_and_type_preemptible(page) )
{
case -EINTR:
- rc = -EAGAIN;
- case -EAGAIN:
+ rc = -ERESTART;
+ case -ERESTART:
curr->arch.old_guest_table = page;
okay = 0;
break;
@@ -3373,7 +3373,7 @@ long do_mmuext_op(
guest_handle_add_offset(uops, 1);
}
- if ( rc == -EAGAIN )
+ if ( rc == -ERESTART )
{
ASSERT(i < count);
rc = hypercall_create_continuation(
@@ -3430,7 +3430,7 @@ long do_mmu_update(
if ( unlikely(rc) )
{
- if ( likely(rc == -EAGAIN) )
+ if ( likely(rc == -ERESTART) )
rc = hypercall_create_continuation(
__HYPERVISOR_mmu_update, "hihi", ureqs, count, pdone,
foreigndom);
@@ -3484,7 +3484,7 @@ long do_mmu_update(
{
if ( curr->arch.old_guest_table || (i && hypercall_preempt_check()) )
{
- rc = -EAGAIN;
+ rc = -ERESTART;
break;
}
@@ -3614,7 +3614,7 @@ long do_mmu_update(
}
page_unlock(page);
if ( rc == -EINTR )
- rc = -EAGAIN;
+ rc = -ERESTART;
}
else if ( get_page_type(page, PGT_writable_page) )
{
@@ -3676,7 +3676,7 @@ long do_mmu_update(
guest_handle_add_offset(ureqs, 1);
}
- if ( rc == -EAGAIN )
+ if ( rc == -ERESTART )
{
ASSERT(i < count);
rc = hypercall_create_continuation(
@@ -4830,7 +4830,7 @@ long arch_memory_op(unsigned long cmd,
XEN_GUEST_HANDLE_PARAM(void) arg)
rc = p2m_pod_set_mem_target(d, target.target_pages);
}
- if ( rc == -EAGAIN )
+ if ( rc == -ERESTART )
{
rc = hypercall_create_continuation(
__HYPERVISOR_memory_op, "lh", op, arg);
diff --git a/xen/arch/x86/mm/mem_sharing.c b/xen/arch/x86/mm/mem_sharing.c
index 3e627f0..178fe68 100644
--- a/xen/arch/x86/mm/mem_sharing.c
+++ b/xen/arch/x86/mm/mem_sharing.c
@@ -1297,7 +1297,7 @@ int relinquish_shared_pages(struct domain *d)
if ( hypercall_preempt_check() )
{
p2m->next_shared_gfn_to_relinquish = gfn + 1;
- rc = -EAGAIN;
+ rc = -ERESTART;
break;
}
count = 0;
diff --git a/xen/arch/x86/mm/p2m-pod.c b/xen/arch/x86/mm/p2m-pod.c
index 68db937..bd4c7c8 100644
--- a/xen/arch/x86/mm/p2m-pod.c
+++ b/xen/arch/x86/mm/p2m-pod.c
@@ -245,7 +245,7 @@ p2m_pod_set_cache_target(struct p2m_domain *p2m, unsigned
long pod_target, int p
if ( preemptible && pod_target != p2m->pod.count &&
hypercall_preempt_check() )
{
- ret = -EAGAIN;
+ ret = -ERESTART;
goto out;
}
}
@@ -290,7 +290,7 @@ p2m_pod_set_cache_target(struct p2m_domain *p2m, unsigned
long pod_target, int p
if ( preemptible && pod_target != p2m->pod.count &&
hypercall_preempt_check() )
{
- ret = -EAGAIN;
+ ret = -ERESTART;
goto out;
}
}
diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c
index 40366f1..2cb3174 100644
--- a/xen/arch/x86/traps.c
+++ b/xen/arch/x86/traps.c
@@ -653,7 +653,7 @@ int wrmsr_hypervisor_regs(uint32_t idx, uint64_t val)
if ( p2m_is_paging(t) )
{
p2m_mem_paging_populate(d, gmfn);
- return -EAGAIN;
+ return -ERESTART;
}
gdprintk(XENLOG_WARNING,
@@ -2385,7 +2385,7 @@ static int emulate_privileged_op(struct cpu_user_regs
*regs)
{
case 0:
break;
- case -EAGAIN: /* retry after preemption */
+ case -ERESTART: /* retry after preemption */
goto skip;
default: /* not okay */
goto fail;
diff --git a/xen/common/compat/domain.c b/xen/common/compat/domain.c
index e756f54..b4be3b3 100644
--- a/xen/common/compat/domain.c
+++ b/xen/common/compat/domain.c
@@ -58,7 +58,7 @@ int compat_vcpu_op(int cmd, int vcpuid,
XEN_GUEST_HANDLE_PARAM(void) arg)
rc = v->is_initialised ? -EEXIST : arch_set_info_guest(v, cmp_ctxt);
domain_unlock(d);
- if ( rc == -EAGAIN )
+ if ( rc == -ERESTART )
rc = hypercall_create_continuation(__HYPERVISOR_vcpu_op, "iih",
cmd, vcpuid, arg);
diff --git a/xen/common/domain.c b/xen/common/domain.c
index 4291e29..bd46a98 100644
--- a/xen/common/domain.c
+++ b/xen/common/domain.c
@@ -590,6 +590,8 @@ int domain_kill(struct domain *d)
rc = domain_relinquish_resources(d);
if ( rc != 0 )
{
+ if ( rc == -ERESTART )
+ rc = -EAGAIN;
BUG_ON(rc != -EAGAIN);
break;
}
@@ -1067,7 +1069,7 @@ long do_vcpu_op(int cmd, int vcpuid,
XEN_GUEST_HANDLE_PARAM(void) arg)
free_vcpu_guest_context(ctxt);
- if ( rc == -EAGAIN )
+ if ( rc == -ERESTART )
rc = hypercall_create_continuation(__HYPERVISOR_vcpu_op, "iih",
cmd, vcpuid, arg);
diff --git a/xen/common/domctl.c b/xen/common/domctl.c
index 2ba5daa..4774277 100644
--- a/xen/common/domctl.c
+++ b/xen/common/domctl.c
@@ -342,7 +342,7 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t)
u_domctl)
if ( guest_handle_is_null(op->u.vcpucontext.ctxt) )
{
ret = vcpu_reset(v);
- if ( ret == -EAGAIN )
+ if ( ret == -ERESTART )
ret = hypercall_create_continuation(
__HYPERVISOR_domctl, "h", u_domctl);
break;
@@ -374,7 +374,7 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t)
u_domctl)
ret = arch_set_info_guest(v, c);
domain_unpause(d);
- if ( ret == -EAGAIN )
+ if ( ret == -ERESTART )
ret = hypercall_create_continuation(
__HYPERVISOR_domctl, "h", u_domctl);
}
diff --git a/xen/include/asm-x86/mm.h b/xen/include/asm-x86/mm.h
index 7059adc..d253117 100644
--- a/xen/include/asm-x86/mm.h
+++ b/xen/include/asm-x86/mm.h
@@ -125,7 +125,7 @@ struct page_info
* PGT_partial gets set, and it must be dropped when the flag gets
* cleared. This is so that a get() leaving a page in partially
* validated state (where the caller would drop the reference acquired
- * due to the getting of the type [apparently] failing [-EAGAIN])
+ * due to the getting of the type [apparently] failing [-ERESTART])
* would not accidentally result in a page left with zero general
* reference count, but non-zero type reference count (possible when
* the partial get() is followed immediately by domain destruction).
--
generated by git-patchbot for /home/xen/git/xen.git#master
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |