|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RFC 4/4] xen: arch-specific hooks for domain_soft_reset()
>>> On 03.06.15 at 15:35, <vkuznets@xxxxxxxxxx> wrote:
> +int arch_domain_soft_reset(struct domain *d)
> +{
> + struct page_info *page = virt_to_page(d->shared_info), *new_page;
> + int ret = 0;
> + struct domain *owner;
> + unsigned long mfn, mfn_new, gfn;
> + p2m_type_t __p2mt;
No need for leading underscores here.
> + if ( is_hvm_domain(d) )
> + {
Isn't the shared_info manipulation also HVM specific? Or at least
paging_mode_translate()-specific? xenmem_add_to_physmap_one()
bails on !paging_mode_translate()... But then I'm not really
understanding the issue you try to address there anyway, and
hence I may be overlooking something: Why does allocating a new
page help with a subsequent XENMAPSPACE_shared_info add-to-
physmap request?
> + int i;
unsigned int
> +
> + spin_lock(&d->event_lock);
> + for ( i = 1; i < d->nr_pirqs ; i ++ )
> + if ( domain_pirq_to_emuirq(d, i) != IRQ_UNBOUND )
> + {
> + ret = unmap_domain_pirq_emuirq(d, i);
> + if (ret)
Coding style.
> + break;
> + }
> + spin_unlock(&d->event_lock);
> + }
> +
> + if ( ret || !d->shared_info || !page )
Again - how would page end up being NULL here?
> + return ret;
> +
> + /*
> + * shared_info page needs to be replaced with a new page, otherwise we
> + * will get a hole if the domain does XENMAPSPACE_shared_info
> + */
> +
> + owner = page_get_owner_and_reference(page);
> + if ( owner != d )
> + {
> + put_page(page);
> + return 0;
Isn't this an error?
> + }
> +
> + mfn = page_to_mfn(page);
> + if ( !mfn_valid(mfn) )
> + {
> + printk(XENLOG_G_ERR "Dom%d's shared_info page points to invalid
> MFN\n",
> + d->domain_id);
> + ret = -EINVAL;
> + goto fail_put_page;
> + }
> +
> + gfn = mfn_to_gmfn(d, mfn);
> + get_gfn_query(d, gfn, &__p2mt);
Ignoring the return value? I think you should do any consistency
check you can in code like this.
> --- a/xen/common/domain.c
> +++ b/xen/common/domain.c
> @@ -1467,6 +1467,8 @@ int domain_soft_reset(struct domain *d)
> for_each_vcpu ( d, v )
> unmap_vcpu_info(v);
>
> + ret = arch_domain_soft_reset(d);
> +
> vcpu_unpause:
> for_each_vcpu ( d, v )
> if ( v != current )
Similar question as on an earlier patch - is it really correct to unpause
the vCPU-s again after a possible failure from arch_domain_soft_reset()?
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |