From: Juergen Gross <jgross@suse.com>
To: Jan Beulich <JBeulich@suse.com>
Cc: wei.liu2@citrix.com, George.Dunlap@eu.citrix.com,
andrew.cooper3@citrix.com, ian.jackson@eu.citrix.com,
Dario Faggioli <dfaggioli@suse.com>,
xen-devel@lists.xenproject.org
Subject: Re: [PATCH RFC v2 10/12] x86: allocate per-vcpu stacks for interrupt entries
Date: Tue, 30 Jan 2018 18:12:43 +0100 [thread overview]
Message-ID: <e184ecf3-655e-ad67-8c39-647ecd113dfe@suse.com> (raw)
In-Reply-To: <5A70A01402000078001A3C30@suse.com>
On 30/01/18 16:40, Jan Beulich wrote:
>>>> On 22.01.18 at 13:32, <jgross@suse.com> wrote:
>> In case of XPTI being active for a pv-domain allocate and initialize
>> per-vcpu stacks. The stacks are added to the per-domain mappings of
>> the pv-domain.
>
> Considering the intended use of these stacks (as per the overview
> mail) I consider 32k per vCPU a non-negligible amount of extra memory
> use.
Maybe I can shrink this by putting multiple entry stacks into one page.
In the end I only need struct cpu_info and maybe some spare for each
stack.
>
>> +static int pv_vcpu_init_xpti(struct vcpu *v)
>> +{
>> + struct domain *d = v->domain;
>> + struct page_info *pg;
>> + void *ptr;
>> + struct cpu_info *info;
>> + unsigned long stack_bottom;
>> + int rc;
>> +
>> + /* Populate page tables. */
>> + rc = create_perdomain_mapping(d, XPTI_START(v), STACK_PAGES,
>> + NIL(l1_pgentry_t *), NULL);
>> + if ( rc )
>> + goto done;
>> +
>> + /* Map stacks. */
>> + rc = create_perdomain_mapping(d, XPTI_START(v), IST_MAX,
>> + NULL, NIL(struct page_info *));
>> + if ( rc )
>> + goto done;
>> +
>> + ptr = alloc_xenheap_page();
>> + if ( !ptr )
>> + {
>> + rc = -ENOMEM;
>> + goto done;
>> + }
>> + clear_page(ptr);
>> + addmfn_to_perdomain_mapping(d, XPTI_START(v) + STACK_SIZE - PAGE_SIZE,
>> + _mfn(virt_to_mfn(ptr)));
>
> This can't be create_perdomain_mapping() because of ...? If it's
> the Xen heap page you use here - that would be the next question:
> Does it need to be such, rather than a domheap one? I do see ...
I need to reference the user regs in __context_switch() before
switching to the new address space (otherwise I'd had to rework
__context_switch() which I wanted to avoid).
>
>> + info = (struct cpu_info *)((unsigned long)ptr + PAGE_SIZE) - 1;
>> + info->flags = ON_VCPUSTACK;
>> + v->arch.pv_vcpu.stack_regs = &info->guest_cpu_user_regs;
>
> ... this pointer, but without a clear picture on intended use it's
> hard to judge.
See patch 12.
>
>> + /* Map TSS. */
>> + rc = create_perdomain_mapping(d, XPTI_TSS(v), 1, NULL, &pg);
>> + if ( rc )
>> + goto done;
>> + info = (struct cpu_info *)(XPTI_START(v) + STACK_SIZE) - 1;
>
> Iiuc this is a pointer one absolutely must not de-reference. A bit
> dangerous, I would say, the more that further up the same
> variable is being de-referenced.
Okay, I'll add another variable for this purpose.
>
> Also I would assume the TSS can be mapped r/o.
Right.
>
>> + stack_bottom = (unsigned long)&info->guest_cpu_user_regs.es;
>> + ptr = __map_domain_page(pg);
>> + tss_init(ptr, stack_bottom);
>> + unmap_domain_page(ptr);
>> +
>> + /* Map stub trampolines. */
>> + rc = create_perdomain_mapping(d, XPTI_TRAMPOLINE(v), 1, NULL, &pg);
>> + if ( rc )
>> + goto done;
>> + ptr = __map_domain_page(pg);
>> + write_stub_trampoline((unsigned char *)ptr, XPTI_TRAMPOLINE(v),
>
> I would be very surprised if you really needed the cast here.
Oh, this is a leftover from a previous version where ptr was char *.
>
>> @@ -25,6 +25,21 @@
>> */
>>
>> /*
>> + * The vcpu stacks used for XPTI are arranged similar to the physical cpu
>> + * stacks with some modifications. The main difference are the primary stack
>> + * size (only 1 page) and usage of the unused mappings for TSS and IDT.
>> + *
>> + * 7 - Primary stack (with a struct cpu_info at the top)
>> + * 6 - unused
>> + * 5 - TSS
>
> Judging by the comment this might mean "TSS / IDT", or slots 4 or 6
> might be used for the IDT. Otoh I don't see any IDT related logic in
> pv_vcpu_init_xpti(). Please clarify this.
Oh yes. I'll remove the IDT related comments, as I think I can just map
the original IDT.
>
>> @@ -37,10 +52,24 @@ struct vcpu;
>>
>> struct cpu_info {
>> struct cpu_user_regs guest_cpu_user_regs;
>> - unsigned int processor_id;
>> - struct vcpu *current_vcpu;
>> - unsigned long per_cpu_offset;
>> - unsigned long cr4;
>> + union {
>> + /* per physical cpu mapping */
>> + struct {
>> + struct vcpu *current_vcpu;
>> + unsigned long per_cpu_offset;
>> + unsigned long cr4;
>> + };
>> + /* per vcpu mapping (xpti) */
>> + struct {
>> + unsigned long pad1;
>> + unsigned long pad2;
>> + unsigned long stack_bottom_cpu;
>> + };
>
> In order to avoid accidental use in the wrong context as much as
> possible, I think you want to name both structures.
Okay.
Juergen
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
next prev parent reply other threads:[~2018-01-30 17:12 UTC|newest]
Thread overview: 74+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-22 12:32 [PATCH RFC v2 00/12] xen/x86: use per-vcpu stacks for 64 bit pv domains Juergen Gross
2018-01-22 12:32 ` [PATCH RFC v2 01/12] x86: cleanup processor.h Juergen Gross
2018-01-22 12:52 ` Jan Beulich
[not found] ` <5A65ECA502000078001A111C@suse.com>
2018-01-22 14:10 ` Juergen Gross
2018-01-22 14:25 ` Andrew Cooper
2018-01-22 14:32 ` Jan Beulich
2018-01-22 12:32 ` [PATCH RFC v2 02/12] x86: don't use hypervisor stack size for dumping guest stacks Juergen Gross
2018-01-23 9:26 ` Jan Beulich
[not found] ` <5A670DEF02000078001A16AF@suse.com>
2018-01-23 9:58 ` Juergen Gross
2018-01-23 10:11 ` Jan Beulich
[not found] ` <5A67187C02000078001A1742@suse.com>
2018-01-23 10:19 ` Juergen Gross
2018-01-22 12:32 ` [PATCH RFC v2 03/12] x86: do a revert of e871e80c38547d9faefc6604532ba3e985e65873 Juergen Gross
2018-01-22 12:32 ` [PATCH RFC v2 04/12] x86: revert 5784de3e2067ed73efc2fe42e62831e8ae7f46c4 Juergen Gross
2018-01-22 12:32 ` [PATCH RFC v2 05/12] x86: don't access saved user regs via rsp in trap handlers Juergen Gross
2018-01-30 14:49 ` Jan Beulich
[not found] ` <5A70941B02000078001A3BF0@suse.com>
2018-01-30 16:33 ` Juergen Gross
2018-01-22 12:32 ` [PATCH RFC v2 06/12] x86: add a xpti command line parameter Juergen Gross
2018-01-30 15:39 ` Jan Beulich
[not found] ` <5A709FDF02000078001A3C2C@suse.com>
2018-01-30 16:51 ` Juergen Gross
2018-01-22 12:32 ` [PATCH RFC v2 07/12] x86: allow per-domain mappings without NX bit or with specific mfn Juergen Gross
2018-01-29 17:06 ` Jan Beulich
[not found] ` <5A6F62B602000078001A3810@suse.com>
2018-01-30 8:02 ` Juergen Gross
2018-01-30 8:41 ` Jan Beulich
2018-01-31 10:30 ` Jan Beulich
2018-01-22 12:32 ` [PATCH RFC v2 08/12] xen/x86: use dedicated function for tss initialization Juergen Gross
2018-01-22 12:32 ` [PATCH RFC v2 09/12] x86: enhance syscall stub to work in per-domain mapping Juergen Gross
2018-01-30 15:11 ` Jan Beulich
[not found] ` <5A70991902000078001A3C16@suse.com>
2018-01-30 16:50 ` Juergen Gross
2018-01-22 12:32 ` [PATCH RFC v2 10/12] x86: allocate per-vcpu stacks for interrupt entries Juergen Gross
2018-01-30 15:40 ` Jan Beulich
2018-02-09 12:35 ` Juergen Gross
2018-02-13 9:10 ` Jan Beulich
[not found] ` <5A70A01402000078001A3C30@suse.com>
2018-01-30 17:12 ` Juergen Gross [this message]
2018-01-31 10:18 ` Jan Beulich
2018-01-22 12:32 ` [PATCH RFC v2 11/12] x86: modify interrupt handlers to support stack switching Juergen Gross
2018-01-30 16:07 ` Jan Beulich
[not found] ` <5A70A63D02000078001A3C7C@suse.com>
2018-01-30 17:19 ` Juergen Gross
2018-01-31 10:36 ` Jan Beulich
[not found] ` <5A71AA4202000078001A3F56@suse.com>
2018-02-02 15:42 ` Juergen Gross
2018-01-22 12:32 ` [PATCH RFC v2 12/12] x86: activate per-vcpu stacks in case of xpti Juergen Gross
2018-01-30 16:33 ` Jan Beulich
[not found] ` <5A70AC7F02000078001A3CA6@suse.com>
2018-01-30 17:33 ` Juergen Gross
2018-01-31 10:40 ` Jan Beulich
2018-01-22 12:50 ` [PATCH RFC v2 00/12] xen/x86: use per-vcpu stacks for 64 bit pv domains Jan Beulich
[not found] ` <5A65EC0A02000078001A1118@suse.com>
2018-01-22 14:18 ` Juergen Gross
2018-01-22 14:22 ` Jan Beulich
[not found] ` <5A6601D302000078001A1230@suse.com>
2018-01-22 14:38 ` Juergen Gross
2018-01-22 14:48 ` Jan Beulich
[not found] ` <5A6607DB02000078001A127B@suse.com>
2018-01-22 15:00 ` Juergen Gross
2018-01-22 16:51 ` Jan Beulich
2018-01-22 18:39 ` Andrew Cooper
2018-01-22 18:48 ` George Dunlap
2018-01-22 19:02 ` Andrew Cooper
2018-01-23 8:36 ` Jan Beulich
2018-01-23 11:23 ` Andrew Cooper
2018-01-23 11:06 ` George Dunlap
2018-01-23 6:34 ` Juergen Gross
2018-01-23 7:21 ` Juergen Gross
2018-01-23 8:53 ` Jan Beulich
[not found] ` <5A67061F02000078001A1669@suse.com>
2018-01-23 9:24 ` Juergen Gross
2018-01-23 9:31 ` Jan Beulich
[not found] ` <5A670F0E02000078001A16C9@suse.com>
2018-01-23 10:10 ` Juergen Gross
2018-01-23 11:45 ` Andrew Cooper
2018-01-23 13:31 ` Juergen Gross
2018-01-23 13:24 ` Dario Faggioli
2018-01-23 16:45 ` George Dunlap
2018-01-23 16:56 ` Juergen Gross
2018-01-23 17:33 ` George Dunlap
2018-01-24 7:37 ` Jan Beulich
[not found] ` <5A6624A602000078001A1375@suse.com>
2018-01-23 5:50 ` Juergen Gross
2018-01-23 8:40 ` Jan Beulich
[not found] ` <5A67030F02000078001A164B@suse.com>
2018-01-23 9:45 ` Juergen Gross
2018-01-22 21:45 ` Konrad Rzeszutek Wilk
2018-01-23 6:38 ` Juergen Gross
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=e184ecf3-655e-ad67-8c39-647ecd113dfe@suse.com \
--to=jgross@suse.com \
--cc=George.Dunlap@eu.citrix.com \
--cc=JBeulich@suse.com \
--cc=andrew.cooper3@citrix.com \
--cc=dfaggioli@suse.com \
--cc=ian.jackson@eu.citrix.com \
--cc=wei.liu2@citrix.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).