|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 01/18] xen: reinstate previously unused XENMEM_remove_from_physmap hypercall
> Date: Wed, 18 Jan 2012 10:36:07 +0000
> From: Ian Campbell <Ian.Campbell@xxxxxxxxxx>
> To: Daniel De Graaf <dgdegra@xxxxxxxxxxxxx>
> Cc: Alex Zeffertt <alex.zeffertt@xxxxxxxxxxxxx>,
> "xen-devel@xxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxx>
> Subject: Re: [Xen-devel] [PATCH 01/18] xen: reinstate previously
> unused XENMEM_remove_from_physmap hypercall
> Message-ID: <1326882968.14689.176.camel@xxxxxxxxxxxxxxxxxxxxxx>
> Content-Type: text/plain; charset="UTF-8"
>
> On Thu, 2012-01-12 at 23:35 +0000, Daniel De Graaf wrote:
>> From: Alex Zeffertt <alex.zeffertt@xxxxxxxxxxxxx>
>>
>> This patch reinstates the XENMEM_remove_from_physmap hypercall
>> which was removed in 19041:ee62aaafff46 because it was not used.
>>
>> However, is now needed in order to support xenstored stub domains.
>> The xenstored stub domain is not priviliged like dom0 and so cannot
>> unilaterally map the xenbus page of other guests into it's address
>> space. Therefore, before creating a domU the domain builder needs to
>> seed its grant table with a grant ref allowing the xenstored stub
>> domain to access the new domU's xenbus page.
>>
>> At present domU's do not start with their grant table mapped.
>> Instead it gets mapped when the guest requests a grant table from
>> the hypervisor.
>>
>> In order to seed the grant table, the domain builder first needs to
>> map it into dom0 address space. But the hypercall to do this
>> requires a gpfn (guest pfn), which is an mfn for PV guest, but a pfn
>> for HVM guests. Therfore, in order to seed the grant table of an
>> HVM guest, dom0 needs to *temporarily* map it into the guest's
>> "physical" address space.
>>
>> Hence the need to reinstate the XENMEM_remove_from_physmap hypercall.
>>
>> Signed-off-by: Alex Zeffertt <alex.zeffertt@xxxxxxxxxxxxx>
>> Signed-off-by: Daniel De Graaf <dgdegra@xxxxxxxxxxxxx>
>
> Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx> (modulo Jan's comment
> about ordering in xlat.lst)
>
> BTW, since Alex and Diego have subsequently left Citrix you could take
> my Acked-by's in this series as Signed-of-by on behalf of Citrix. I've
> no idea if that's necessary though, I expect not.
>
> Ian.
Nacked-by-me for a couple of reasons, see inline below:
>
>> ---
>> xen/arch/ia64/xen/mm.c | 34
>> ++++++++++++++++++++++++++++++++++
>> xen/arch/x86/mm.c | 35
>> +++++++++++++++++++++++++++++++++++
>> xen/arch/x86/x86_64/compat/mm.c | 14 ++++++++++++++
>> xen/include/public/memory.h | 16 ++++++++++++++++
>> xen/include/xlat.lst | 1 +
>> xen/include/xsm/xsm.h | 6 ++++++
>> xen/xsm/dummy.c | 6 ++++++
>> xen/xsm/flask/hooks.c | 6 ++++++
>> 8 files changed, 118 insertions(+), 0 deletions(-)
>>
>> diff --git a/xen/arch/ia64/xen/mm.c b/xen/arch/ia64/xen/mm.c
>> index 84f6a61..a40f96a 100644
>> --- a/xen/arch/ia64/xen/mm.c
>> +++ b/xen/arch/ia64/xen/mm.c
>> @@ -3448,6 +3448,40 @@ arch_memory_op(int op, XEN_GUEST_HANDLE(void)
>> arg)
>> break;
>> }
>>
>> + case XENMEM_remove_from_physmap:
>> + {
>> + struct xen_remove_from_physmap xrfp;
>> + unsigned long mfn;
>> + struct domain *d;
>> +
>> + if ( copy_from_guest(&xrfp, arg, 1) )
>> + return -EFAULT;
>> +
>> + rc = rcu_lock_target_domain_by_id(xrfp.domid, &d);
>> + if ( rc != 0 )
>> + return rc;
>> +
>> + if ( xsm_remove_from_physmap(current->domain, d) )
>> + {
>> + rcu_unlock_domain(d);
>> + return -EPERM;
>> + }
>> +
>> + domain_lock(d);
>> +
>> + mfn = gmfn_to_mfn(d, xrfp.gpfn);
Compilation will fail. gmfn_to_mfn has been deprecated in x86. You need to
wrap with an ifdef (ia64 still uses gmfn_to_mfn), and in the x86 case use
get_gfn_untyped.
>> +
>> + if ( mfn_valid(mfn) )
>> + guest_physmap_remove_page(d, xrfp.gpfn, mfn, 0);
>> +
And, you need to invoke put_gfn on your way out (no ifdef, ia64 has the stub)
Thanks!
Andres
>> + domain_unlock(d);
>> +
>> + rcu_unlock_domain(d);
>> +
>> + break;
>> + }
>> +
>> +
>> case XENMEM_machine_memory_map:
>> {
>> struct xen_memory_map memmap;
>> diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
>> index 1f996e0..39cc3c0 100644
>> --- a/xen/arch/x86/mm.c
>> +++ b/xen/arch/x86/mm.c
>> @@ -4871,6 +4871,41 @@ long arch_memory_op(int op,
>> XEN_GUEST_HANDLE(void) arg)
>> return rc;
>> }
>>
>> + case XENMEM_remove_from_physmap:
>> + {
>> + struct xen_remove_from_physmap xrfp;
>> + unsigned long mfn;
>> + struct domain *d;
>> +
>> + if ( copy_from_guest(&xrfp, arg, 1) )
>> + return -EFAULT;
>> +
>> + rc = rcu_lock_target_domain_by_id(xrfp.domid, &d);
>> + if ( rc != 0 )
>> + return rc;
>> +
>> + if ( xsm_remove_from_physmap(current->domain, d) )
>> + {
>> + rcu_unlock_domain(d);
>> + return -EPERM;
>> + }
>> +
>> + domain_lock(d);
>> +
>> + mfn = get_gfn_untyped(d, xrfp.gpfn);
>> +
>> + if ( mfn_valid(mfn) )
>> + guest_physmap_remove_page(d, xrfp.gpfn, mfn,
>> PAGE_ORDER_4K);
>> +
>> + put_gfn(d, xrfp.gpfn);
>> +
>> + domain_unlock(d);
>> +
>> + rcu_unlock_domain(d);
>> +
>> + break;
>> + }
>> +
>> case XENMEM_set_memory_map:
>> {
>> struct xen_foreign_memory_map fmap;
>> diff --git a/xen/arch/x86/x86_64/compat/mm.c
>> b/xen/arch/x86/x86_64/compat/mm.c
>> index bea94fe..dde5430 100644
>> --- a/xen/arch/x86/x86_64/compat/mm.c
>> +++ b/xen/arch/x86/x86_64/compat/mm.c
>> @@ -82,6 +82,20 @@ int compat_arch_memory_op(int op,
>> XEN_GUEST_HANDLE(void) arg)
>> break;
>> }
>>
>> + case XENMEM_remove_from_physmap:
>> + {
>> + struct compat_remove_from_physmap cmp;
>> + struct xen_remove_from_physmap *nat = (void
>> *)COMPAT_ARG_XLAT_VIRT_BASE;
>> +
>> + if ( copy_from_guest(&cmp, arg, 1) )
>> + return -EFAULT;
>> +
>> + XLAT_remove_from_physmap(nat, &cmp);
>> + rc = arch_memory_op(op, guest_handle_from_ptr(nat, void));
>> +
>> + break;
>> + }
>> +
>> case XENMEM_set_memory_map:
>> {
>> struct compat_foreign_memory_map cmp;
>> diff --git a/xen/include/public/memory.h b/xen/include/public/memory.h
>> index c5b78a8..308deff 100644
>> --- a/xen/include/public/memory.h
>> +++ b/xen/include/public/memory.h
>> @@ -229,6 +229,22 @@ struct xen_add_to_physmap {
>> typedef struct xen_add_to_physmap xen_add_to_physmap_t;
>> DEFINE_XEN_GUEST_HANDLE(xen_add_to_physmap_t);
>>
>> +/*
>> + * Unmaps the page appearing at a particular GPFN from the specified
>> guest's
>> + * pseudophysical address space.
>> + * arg == addr of xen_remove_from_physmap_t.
>> + */
>> +#define XENMEM_remove_from_physmap 15
>> +struct xen_remove_from_physmap {
>> + /* Which domain to change the mapping for. */
>> + domid_t domid;
>> +
>> + /* GPFN of the current mapping of the page. */
>> + xen_pfn_t gpfn;
>> +};
>> +typedef struct xen_remove_from_physmap xen_remove_from_physmap_t;
>> +DEFINE_XEN_GUEST_HANDLE(xen_remove_from_physmap_t);
>> +
>> /*** REMOVED ***/
>> /*#define XENMEM_translate_gpfn_list 8*/
>>
>> diff --git a/xen/include/xlat.lst b/xen/include/xlat.lst
>> index 3d92175..ee1772c 100644
>> --- a/xen/include/xlat.lst
>> +++ b/xen/include/xlat.lst
>> @@ -81,6 +81,7 @@
>> ! processor_power platform.h
>> ? processor_px platform.h
>> ! psd_package platform.h
>> +! remove_from_physmap memory.h
>> ? xenpf_pcpuinfo platform.h
>> ? xenpf_pcpu_version platform.h
>> ! sched_poll sched.h
>> diff --git a/xen/include/xsm/xsm.h b/xen/include/xsm/xsm.h
>> index df6cec2..566c808 100644
>> --- a/xen/include/xsm/xsm.h
>> +++ b/xen/include/xsm/xsm.h
>> @@ -169,6 +169,7 @@ struct xsm_operations {
>> int (*update_va_mapping) (struct domain *d, struct domain *f,
>> l1_pgentry_t
>> pte);
>> int (*add_to_physmap) (struct domain *d1, struct domain *d2);
>> + int (*remove_from_physmap) (struct domain *d1, struct domain *d2);
>> int (*sendtrigger) (struct domain *d);
>> int (*bind_pt_irq) (struct domain *d, struct xen_domctl_bind_pt_irq
>> *bind);
>> int (*unbind_pt_irq) (struct domain *d);
>> @@ -738,6 +739,11 @@ static inline int xsm_add_to_physmap(struct domain
>> *d1, struct domain *d2)
>> return xsm_call(add_to_physmap(d1, d2));
>> }
>>
>> +static inline int xsm_remove_from_physmap(struct domain *d1, struct
>> domain *d2)
>> +{
>> + return xsm_call(remove_from_physmap(d1, d2));
>> +}
>> +
>> static inline int xsm_sendtrigger(struct domain *d)
>> {
>> return xsm_call(sendtrigger(d));
>> diff --git a/xen/xsm/dummy.c b/xen/xsm/dummy.c
>> index 4bbfbff..65daa4e 100644
>> --- a/xen/xsm/dummy.c
>> +++ b/xen/xsm/dummy.c
>> @@ -529,6 +529,11 @@ static int dummy_add_to_physmap (struct domain *d1,
>> struct domain *d2)
>> return 0;
>> }
>>
>> +static int dummy_remove_from_physmap (struct domain *d1, struct domain
>> *d2)
>> +{
>> + return 0;
>> +}
>> +
>> static int dummy_sendtrigger (struct domain *d)
>> {
>> return 0;
>> @@ -690,6 +695,7 @@ void xsm_fixup_ops (struct xsm_operations *ops)
>> set_to_dummy_if_null(ops, mmu_machphys_update);
>> set_to_dummy_if_null(ops, update_va_mapping);
>> set_to_dummy_if_null(ops, add_to_physmap);
>> + set_to_dummy_if_null(ops, remove_from_physmap);
>> set_to_dummy_if_null(ops, sendtrigger);
>> set_to_dummy_if_null(ops, bind_pt_irq);
>> set_to_dummy_if_null(ops, pin_mem_cacheattr);
>> diff --git a/xen/xsm/flask/hooks.c b/xen/xsm/flask/hooks.c
>> index 0d35767..a2020a9 100644
>> --- a/xen/xsm/flask/hooks.c
>> +++ b/xen/xsm/flask/hooks.c
>> @@ -1283,6 +1283,11 @@ static int flask_add_to_physmap(struct domain
>> *d1, struct domain *d2)
>> return domain_has_perm(d1, d2, SECCLASS_MMU, MMU__PHYSMAP);
>> }
>>
>> +static int flask_remove_from_physmap(struct domain *d1, struct domain
>> *d2)
>> +{
>> + return domain_has_perm(d1, d2, SECCLASS_MMU, MMU__PHYSMAP);
>> +}
>> +
>> static int flask_sendtrigger(struct domain *d)
>> {
>> return domain_has_perm(current->domain, d, SECCLASS_DOMAIN,
>> DOMAIN__TRIGGER);
>> @@ -1550,6 +1555,7 @@ static struct xsm_operations flask_ops = {
>> .mmu_machphys_update = flask_mmu_machphys_update,
>> .update_va_mapping = flask_update_va_mapping,
>> .add_to_physmap = flask_add_to_physmap,
>> + .remove_from_physmap = flask_remove_from_physmap,
>> .sendtrigger = flask_sendtrigger,
>> .get_device_group = flask_get_device_group,
>> .test_assign_device = flask_test_assign_device,
>
>
>
>
>
> ------------------------------
>
> Message: 3
> Date: Wed, 18 Jan 2012 11:40:06 +0100
> From: Wei Wang <wei.wang2@xxxxxxx>
> To: Dario Faggioli <raistlin@xxxxxxxx>
> Cc: Tim Deegan <tim@xxxxxxx>, "allen.m.kay@xxxxxxxxx"
> <allen.m.kay@xxxxxxxxx>, xen-devel@xxxxxxxxxxxxxxxxxxx, Keir
> Fraser
> <keir@xxxxxxx>, Jan Beulich <JBeulich@xxxxxxxx>
> Subject: Re: [Xen-devel] [PATCHv2 2 of 2] Move IOMMU faults handling
> into softirq for AMD-Vi.
> Message-ID: <4F16A186.4080303@xxxxxxx>
> Content-Type: text/plain; charset="UTF-8"; format=flowed
>
> On 01/18/2012 09:53 AM, Dario Faggioli wrote:
>> On Tue, 2012-01-17 at 11:17 +0000, Keir Fraser wrote:
>>>> Dealing with interrupts from AMD-Vi IOMMU(s) is deferred to a
>>>> softirq-tasklet,
>>>> raised by the actual IRQ handler. To avoid more interrupts being
>>>> generated
>>>> (because of further faults), they must be masked in the IOMMU within
>>>> the low
>>>> level IRQ handler and enabled back in the tasklet body. Notice that
>>>> this may
>>>> cause the log to overflow, but none of the existing entry will be
>>>> overwritten.
>>>>
>>>> Signed-off-by: Dario Faggioli<dario.faggioli@xxxxxxxxxx>
>>>
>>> This patch needs fixing to apply to xen-unstable tip. Please do that
>>> and
>>> resubmit.
>>>
>> I see. I can easily rebase the patch but there are functional changes
>> involved, so I'd like to know what you think it's best to do first.
>>
>> In particular, the clash is against Wei's patches introducing PPR. So
>> now the IOMMU interrupt handler checks both event log and ppr log.
>>
>> Question is, should I move _BOTH_ these checks into softirq or just
>> defer event log processing, and leave ppr log handling in hard-irq
>> context? Quickly looking at the new specs, it seems to me that deferring
>> both should be fine, but I'd really appreciate your thoughts...
>
> I think put both event log and ppr log into softirq is fine. If you
> could have a patch like this, I can do a quick test on my machine.
> Thanks,
> Wei
>
>> Wei, Jan, Tim?
>>
>> Thanks and regards,
>> Dario
>>
>
>
>
>
>
> ------------------------------
>
> Message: 4
> Date: Wed, 18 Jan 2012 10:39:01 +0000
> From: Ian Campbell <Ian.Campbell@xxxxxxxxxx>
> To: Daniel De Graaf <dgdegra@xxxxxxxxxxxxx>
> Cc: Alex Zeffertt <alex.zeffertt@xxxxxxxxxxxxx>,
> "xen-devel@xxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxx>,
> Diego
> Ongaro <diego.ongaro@xxxxxxxxxx>
> Subject: Re: [Xen-devel] [PATCH 02/18] xen: allow global VIRQ handlers
> to be delegated to other domains
> Message-ID: <1326883141.14689.177.camel@xxxxxxxxxxxxxxxxxxxxxx>
> Content-Type: text/plain; charset="UTF-8"
>
> On Thu, 2012-01-12 at 23:35 +0000, Daniel De Graaf wrote:
>>
>> +static void clear_global_virq_handlers(struct domain *d)
>> +{
>> + uint32_t virq;
>> + int put_count = 0;
>> +
>> + spin_lock(&global_virq_handlers_lock);
>> +
>> + for (virq = 0; virq < NR_VIRQS; virq++) {
>> + if (global_virq_handlers[virq] == d) {
>> + global_virq_handlers[virq] = NULL;
>
> I don't suppose we should rebind to dom0, should we?
>
> Seems like we are pretty hosed if this ever happens in a non-controlled
> manner anyway...
>
>> + put_count++;
>> + }
>> + }
>> +
>> + spin_unlock(&global_virq_handlers_lock);
>> +
>> + while (put_count) {
>> + put_domain(d);
>> + put_count--;
>> + }
>> +}
>
>
>
>
> ------------------------------
>
> Message: 5
> Date: Wed, 18 Jan 2012 11:39:22 +0100
> From: Juergen Gross <juergen.gross@xxxxxxxxxxxxxx>
> To: Keir Fraser <keir.xen@xxxxxxxxx>
> Cc: xen-devel@xxxxxxxxxxxxxxxxxxx
> Subject: Re: [Xen-devel] [PATCH] Allow wake up of offline vcpu via
> nmi-ipi
> Message-ID: <4F16A15A.3040405@xxxxxxxxxxxxxx>
> Content-Type: text/plain; charset=ISO-8859-1; format=flowed
>
> On 01/18/2012 10:36 AM, Keir Fraser wrote:
>> On 18/01/2012 09:31, "Keir Fraser"<keir.xen@xxxxxxxxx> wrote:
>>
>>> On 18/01/2012 09:07, "Juergen Gross"<juergen.gross@xxxxxxxxxxxxxx>
>>> wrote:
>>>
>>>> On 01/18/2012 09:48 AM, Juergen Gross wrote:
>>>>> On a real machine a cpu disabled via hlt with interrupts disabled can
>>>>> be
>>>>> reactivated via a nmi ipi. Enable the hypervisor to do this for hvm,
>>>>> too.
>>>>>
>>>>> Signed-off-by: juergen.gross@xxxxxxxxxxxxxx
>>>>>
>>>>>
>>>>> 1 file changed, 4 insertions(+), 1 deletion(-)
>>>>> xen/arch/x86/hvm/vlapic.c | 5 ++++-
>>>> BTW: I was not able to reactivate a vcpu via INIT/SIPI/SIPI sequence.
>>>> It
>>>> works
>>>> on initial system boot when the target vcpu is activated the first
>>>> time. If I
>>>> deactivate a vcpu and try to activate it again it will start to run,
>>>> but it
>>>> is
>>>> not starting at the specified entry point (at least it isn't
>>>> performing the
>>>> first instruction there).
>>>> Is there some special initialization needed to make this work? Do I
>>>> have to
>>>> reset
>>>> something on the vcpu before deactivating it?
>>> No it should just work. Hvmloader wakes and then sleeps every AP, in
>>> hvmloader/smp.c. So even the first INIT-SIPI wakeup of an AP in the
>>> guest OS
>>> is not the first, as hvmloader already did it once! So this path should
>>> be
>>> working and indeed tested on every HVM guest boot.
>> Bit more info: INIT-SIPI logic is complicated by needing to avoid
>> deadlocks
>> between two VCPUs attempting to pause and reset each other. But the core
>> dispatch logic is in vlapic_init_sipi_action(). You will see that on
>> INIT,
>> we should call vcpu_reset() which will de-initialise and VCPU_down the
>> vcpu.
>> And then on SIPI we call hvm_vcpu_reset_state(), which should
>> reinitialise
>> and wake the vcpu to start running at the specified CS:IP.
>>
>> So the above will be good places for you to add tracing and work out
>> what's
>> going on. :-)
>
> Yeah, thanks for the confirmation this should work.
> Printing some diagnostics helped me to spot the error in my code.
>
>
> Juergen
>
> --
> Juergen Gross Principal Developer Operating Systems
> PDG ES&S SWE OS6 Telephone: +49 (0) 89 3222 2967
> Fujitsu Technology Solutions e-mail:
> juergen.gross@xxxxxxxxxxxxxx
> Domagkstr. 28 Internet: ts.fujitsu.com
> D-80807 Muenchen Company details:
> ts.fujitsu.com/imprint.html
>
>
>
>
> ------------------------------
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel
>
>
> End of Xen-devel Digest, Vol 83, Issue 277
> ******************************************
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |