From: marc.zyngier@arm.com (Marc Zyngier)
To: linux-arm-kernel@lists.infradead.org
Subject: [kvmarm] [PATCH v2 06/14] KVM: ARM: Memory virtualization setup
Date: Tue, 09 Oct 2012 14:56:15 +0200 [thread overview]
Message-ID: <6994599196536c9557528c465f8f93b0@localhost> (raw)
In-Reply-To: <CANM98qKAFQgfwRuFP2WOP4Af+1Un-wuQPC8-TiGi4B+s3XB2hQ@mail.gmail.com>
On Sat, 6 Oct 2012 17:33:43 -0400, Christoffer Dall
<c.dall@virtualopensystems.com> wrote:
> On Thu, Oct 4, 2012 at 10:23 PM, Min-gyu Kim <mingyu84.kim@samsung.com>
> wrote:
>>
>>
>>> -----Original Message-----
>>> From: kvm-owner at vger.kernel.org [mailto:kvm-owner at vger.kernel.org] On
>>> Behalf Of Christoffer Dall
>>> Sent: Monday, October 01, 2012 6:11 PM
>>> To: kvm at vger.kernel.org; linux-arm-kernel at lists.infradead.org;
>>> kvmarm at lists.cs.columbia.edu
>>> Cc: Marc Zyngier
>>> Subject: [PATCH v2 06/14] KVM: ARM: Memory virtualization setup
>>>
>>> +static void stage2_set_pte(struct kvm *kvm, struct
kvm_mmu_memory_cache
>>> *cache,
>>> + phys_addr_t addr, const pte_t *new_pte) {
>>> + pgd_t *pgd;
>>> + pud_t *pud;
>>> + pmd_t *pmd;
>>> + pte_t *pte, old_pte;
>>> +
>>> + /* Create 2nd stage page table mapping - Level 1 */
>>> + pgd = kvm->arch.pgd + pgd_index(addr);
>>> + pud = pud_offset(pgd, addr);
>>> + if (pud_none(*pud)) {
>>> + if (!cache)
>>> + return; /* ignore calls from kvm_set_spte_hva */
>>> + pmd = mmu_memory_cache_alloc(cache);
>>> + pud_populate(NULL, pud, pmd);
>>> + pmd += pmd_index(addr);
>>> + get_page(virt_to_page(pud));
>>> + } else
>>> + pmd = pmd_offset(pud, addr);
>>> +
>>> + /* Create 2nd stage page table mapping - Level 2 */
>>> + if (pmd_none(*pmd)) {
>>> + if (!cache)
>>> + return; /* ignore calls from kvm_set_spte_hva */
>>> + pte = mmu_memory_cache_alloc(cache);
>>> + clean_pte_table(pte);
>>> + pmd_populate_kernel(NULL, pmd, pte);
>>> + pte += pte_index(addr);
>>> + get_page(virt_to_page(pmd));
>>> + } else
>>> + pte = pte_offset_kernel(pmd, addr);
>>> +
>>> + /* Create 2nd stage page table mapping - Level 3 */
>>> + old_pte = *pte;
>>> + set_pte_ext(pte, *new_pte, 0);
>>> + if (pte_present(old_pte))
>>> + __kvm_tlb_flush_vmid(kvm);
>>> + else
>>> + get_page(virt_to_page(pte));
>>> +}
>>
>>
>> I'm not sure about the 3-level page table, but isn't it necessary to
>> clean the page table for 2nd level?
>> There are two mmu_memory_cache_alloc calls. One has following
>> clean_pte_table
>> and the other doesn't have.
>
> hmm, it probably is - I couldn't really find the common case where
> this is done in the kernel normally (except for some custom loop in
> ioremap and idmap), but I added this fix:
>
> diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
> index 5394a52..f11ba27f 100644
> --- a/arch/arm/kvm/mmu.c
> +++ b/arch/arm/kvm/mmu.c
> @@ -430,6 +430,7 @@ static void stage2_set_pte(struct kvm *kvm, struct
> kvm_mmu_memory_cache *cache,
> if (!cache)
> return; /* ignore calls from kvm_set_spte_hva */
> pmd = mmu_memory_cache_alloc(cache);
> + clean_dcache_area(pmd, PTRS_PER_PMD * sizeof(pmd_t));
> pud_populate(NULL, pud, pmd);
> pmd += pmd_index(addr);
> get_page(virt_to_page(pud));
There ought to be a test of ID_MMFR3[23:20] to find out whether or not it
is useful to clean the dcache. Not sure if that's a massive gain, but it is
certainly an optimisation to consider for the kernel as a whole.
M.
--
Fast, cheap, reliable. Pick two.
WARNING: multiple messages have this Message-ID (diff)
From: Marc Zyngier <marc.zyngier@arm.com>
To: Christoffer Dall <c.dall@virtualopensystems.com>
Cc: "Min-gyu Kim" <mingyu84.kim@samsung.com>,
김창환 <changhwan.m.kim@samsung.com>,
linux-arm-kernel@lists.infradead.org, kvm@vger.kernel.org,
kvmarm@lists.cs.columbia.edu
Subject: Re: [kvmarm] [PATCH v2 06/14] KVM: ARM: Memory virtualization setup
Date: Tue, 09 Oct 2012 14:56:15 +0200 [thread overview]
Message-ID: <6994599196536c9557528c465f8f93b0@localhost> (raw)
In-Reply-To: <CANM98qKAFQgfwRuFP2WOP4Af+1Un-wuQPC8-TiGi4B+s3XB2hQ@mail.gmail.com>
On Sat, 6 Oct 2012 17:33:43 -0400, Christoffer Dall
<c.dall@virtualopensystems.com> wrote:
> On Thu, Oct 4, 2012 at 10:23 PM, Min-gyu Kim <mingyu84.kim@samsung.com>
> wrote:
>>
>>
>>> -----Original Message-----
>>> From: kvm-owner@vger.kernel.org [mailto:kvm-owner@vger.kernel.org] On
>>> Behalf Of Christoffer Dall
>>> Sent: Monday, October 01, 2012 6:11 PM
>>> To: kvm@vger.kernel.org; linux-arm-kernel@lists.infradead.org;
>>> kvmarm@lists.cs.columbia.edu
>>> Cc: Marc Zyngier
>>> Subject: [PATCH v2 06/14] KVM: ARM: Memory virtualization setup
>>>
>>> +static void stage2_set_pte(struct kvm *kvm, struct
kvm_mmu_memory_cache
>>> *cache,
>>> + phys_addr_t addr, const pte_t *new_pte) {
>>> + pgd_t *pgd;
>>> + pud_t *pud;
>>> + pmd_t *pmd;
>>> + pte_t *pte, old_pte;
>>> +
>>> + /* Create 2nd stage page table mapping - Level 1 */
>>> + pgd = kvm->arch.pgd + pgd_index(addr);
>>> + pud = pud_offset(pgd, addr);
>>> + if (pud_none(*pud)) {
>>> + if (!cache)
>>> + return; /* ignore calls from kvm_set_spte_hva */
>>> + pmd = mmu_memory_cache_alloc(cache);
>>> + pud_populate(NULL, pud, pmd);
>>> + pmd += pmd_index(addr);
>>> + get_page(virt_to_page(pud));
>>> + } else
>>> + pmd = pmd_offset(pud, addr);
>>> +
>>> + /* Create 2nd stage page table mapping - Level 2 */
>>> + if (pmd_none(*pmd)) {
>>> + if (!cache)
>>> + return; /* ignore calls from kvm_set_spte_hva */
>>> + pte = mmu_memory_cache_alloc(cache);
>>> + clean_pte_table(pte);
>>> + pmd_populate_kernel(NULL, pmd, pte);
>>> + pte += pte_index(addr);
>>> + get_page(virt_to_page(pmd));
>>> + } else
>>> + pte = pte_offset_kernel(pmd, addr);
>>> +
>>> + /* Create 2nd stage page table mapping - Level 3 */
>>> + old_pte = *pte;
>>> + set_pte_ext(pte, *new_pte, 0);
>>> + if (pte_present(old_pte))
>>> + __kvm_tlb_flush_vmid(kvm);
>>> + else
>>> + get_page(virt_to_page(pte));
>>> +}
>>
>>
>> I'm not sure about the 3-level page table, but isn't it necessary to
>> clean the page table for 2nd level?
>> There are two mmu_memory_cache_alloc calls. One has following
>> clean_pte_table
>> and the other doesn't have.
>
> hmm, it probably is - I couldn't really find the common case where
> this is done in the kernel normally (except for some custom loop in
> ioremap and idmap), but I added this fix:
>
> diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
> index 5394a52..f11ba27f 100644
> --- a/arch/arm/kvm/mmu.c
> +++ b/arch/arm/kvm/mmu.c
> @@ -430,6 +430,7 @@ static void stage2_set_pte(struct kvm *kvm, struct
> kvm_mmu_memory_cache *cache,
> if (!cache)
> return; /* ignore calls from kvm_set_spte_hva */
> pmd = mmu_memory_cache_alloc(cache);
> + clean_dcache_area(pmd, PTRS_PER_PMD * sizeof(pmd_t));
> pud_populate(NULL, pud, pmd);
> pmd += pmd_index(addr);
> get_page(virt_to_page(pud));
There ought to be a test of ID_MMFR3[23:20] to find out whether or not it
is useful to clean the dcache. Not sure if that's a massive gain, but it is
certainly an optimisation to consider for the kernel as a whole.
M.
--
Fast, cheap, reliable. Pick two.
next prev parent reply other threads:[~2012-10-09 12:56 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-01 9:09 [PATCH v2 00/14] KVM/ARM Implementation Christoffer Dall
2012-10-01 9:09 ` Christoffer Dall
2012-10-01 9:10 ` [PATCH v2 01/14] ARM: Add page table and page defines needed by KVM Christoffer Dall
2012-10-01 9:10 ` Christoffer Dall
2012-10-01 9:10 ` [PATCH v2 02/14] ARM: Section based HYP idmap Christoffer Dall
2012-10-01 9:10 ` Christoffer Dall
2012-10-01 9:10 ` [PATCH v2 03/14] ARM: Factor out cpuid implementor and part number Christoffer Dall
2012-10-01 9:10 ` Christoffer Dall
2012-10-01 9:10 ` [PATCH v2 04/14] KVM: ARM: Initial skeleton to compile KVM support Christoffer Dall
2012-10-01 9:10 ` Christoffer Dall
2012-10-01 9:10 ` [PATCH v2 05/14] KVM: ARM: Hypervisor inititalization Christoffer Dall
2012-10-01 9:10 ` Christoffer Dall
2012-10-01 9:10 ` [PATCH v2 06/14] KVM: ARM: Memory virtualization setup Christoffer Dall
2012-10-01 9:10 ` Christoffer Dall
2012-10-05 2:23 ` Min-gyu Kim
2012-10-05 2:23 ` Min-gyu Kim
2012-10-06 21:33 ` Christoffer Dall
2012-10-06 21:33 ` Christoffer Dall
2012-10-09 12:56 ` Marc Zyngier [this message]
2012-10-09 12:56 ` [kvmarm] " Marc Zyngier
2012-10-10 1:02 ` Min-gyu Kim
2012-10-10 1:02 ` Min-gyu Kim
2012-10-01 9:10 ` [PATCH v2 07/14] KVM: ARM: Inject IRQs and FIQs from userspace Christoffer Dall
2012-10-01 9:10 ` Christoffer Dall
2012-10-01 9:10 ` [PATCH v2 08/14] KVM: ARM: World-switch implementation Christoffer Dall
2012-10-01 9:10 ` Christoffer Dall
2012-10-01 9:11 ` [PATCH v2 09/14] KVM: ARM: Emulation framework and CP15 emulation Christoffer Dall
2012-10-01 9:11 ` Christoffer Dall
2012-10-01 9:11 ` [PATCH v2 10/14] KVM: ARM: User space API for getting/setting co-proc registers Christoffer Dall
2012-10-01 9:11 ` Christoffer Dall
2012-10-01 9:11 ` [PATCH v2 11/14] KVM: ARM: Demux CCSIDR in the userspace API Christoffer Dall
2012-10-01 9:11 ` Christoffer Dall
2012-10-01 9:11 ` [PATCH v2 12/14] KVM: ARM: VFP userspace interface Christoffer Dall
2012-10-01 9:11 ` Christoffer Dall
2012-10-09 18:11 ` [kvmarm] " Peter Maydell
2012-10-09 18:11 ` Peter Maydell
2012-10-09 18:13 ` Christoffer Dall
2012-10-09 18:13 ` Christoffer Dall
2012-10-11 1:42 ` Rusty Russell
2012-10-11 1:42 ` Rusty Russell
2012-10-01 9:11 ` [PATCH v2 13/14] KVM: ARM: Handle guest faults in KVM Christoffer Dall
2012-10-01 9:11 ` Christoffer Dall
2012-10-01 9:11 ` [PATCH v2 14/14] KVM: ARM: Handle I/O aborts Christoffer Dall
2012-10-01 9:11 ` Christoffer Dall
2012-10-10 18:47 ` [PATCH v2 00/14] KVM/ARM Implementation Marcelo Tosatti
2012-10-10 18:47 ` Marcelo Tosatti
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=6994599196536c9557528c465f8f93b0@localhost \
--to=marc.zyngier@arm.com \
--cc=linux-arm-kernel@lists.infradead.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.