From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.2 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 42C5BC433B4 for ; Sat, 15 May 2021 09:26:06 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id ECFD861152 for ; Sat, 15 May 2021 09:26:05 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org ECFD861152 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=xen.org Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from list by lists.xenproject.org with outflank-mailman.127712.240039 (Exim 4.92) (envelope-from ) id 1lhqYY-0005hQ-HY; Sat, 15 May 2021 09:25:58 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 127712.240039; Sat, 15 May 2021 09:25:58 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1lhqYY-0005hJ-EP; Sat, 15 May 2021 09:25:58 +0000 Received: by outflank-mailman (input) for mailman id 127712; Sat, 15 May 2021 09:25:56 +0000 Received: from mail.xenproject.org ([104.130.215.37]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1lhqYW-0005hD-SK for xen-devel@lists.xenproject.org; Sat, 15 May 2021 09:25:56 +0000 Received: from xenbits.xenproject.org ([104.239.192.120]) by mail.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1lhqYV-0003vk-86; Sat, 15 May 2021 09:25:55 +0000 Received: from [54.239.6.185] (helo=a483e7b01a66.ant.amazon.com) by xenbits.xenproject.org with esmtpsa (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1lhqYV-0007XR-1x; Sat, 15 May 2021 09:25:55 +0000 X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=xen.org; s=20200302mail; h=Content-Transfer-Encoding:Content-Type:In-Reply-To: MIME-Version:Date:Message-ID:From:References:Cc:To:Subject; bh=XHtW0I3Psmjv7cxq+rSSr3L70g0qHUVT7vSAfNDsmHU=; b=5QLwqQ7TQs3urAFnAoIqzSfLlH Ql06Hsq/YFp0CtnIHRoayP0wLJbNKzu2i08/ZmpvcL13RX/3spqXSd8owDtSdD13n2UK2ZhWh0Y4Y 6Fv9Ke0GXZXctV5edHoCxlPnI4d9Z5XGjXpUDWwjuPkZNy/+CcdaQY7eQoeZTykMuYT8=; Subject: Re: [PATCH RFCv2 15/15] xen/arm: mm: Re-implement setup_frame_table_mappings() with map_pages_to_xen() To: Stefano Stabellini Cc: xen-devel@lists.xenproject.org, Wei.Chen@arm.com, Henry.Wang@arm.com, Penny.Zheng@arm.com, Bertrand.Marquis@arm.com, Julien Grall , Volodymyr Babchuk , Julien Grall References: <20210425201318.15447-1-julien@xen.org> <20210425201318.15447-16-julien@xen.org> From: Julien Grall Message-ID: <2308478e-527b-a54a-206a-785f80515835@xen.org> Date: Sat, 15 May 2021 10:25:52 +0100 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Thunderbird/78.10.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-GB Content-Transfer-Encoding: 7bit Hi Stefano, On 15/05/2021 01:02, Stefano Stabellini wrote: > On Sun, 25 Apr 2021, Julien Grall wrote: >> From: Julien Grall >> >> Now that map_pages_to_xen() has been extended to support 2MB mappings, >> we can replace the create_mappings() call by map_pages_to_xen() call. >> >> This has the advantage to remove the different between 32-bit and 64-bit >> code. >> >> Lastly remove create_mappings() as there is no more callers. >> >> Signed-off-by: Julien Grall >> Signed-off-by: Julien Grall >> >> --- >> Changes in v2: >> - New patch >> >> TODO: >> - Add support for setting the contiguous bit >> --- >> xen/arch/arm/mm.c | 64 +++++------------------------------------------ >> 1 file changed, 6 insertions(+), 58 deletions(-) >> >> diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c >> index c49403b687f5..5f8ae029dd6d 100644 >> --- a/xen/arch/arm/mm.c >> +++ b/xen/arch/arm/mm.c >> @@ -359,40 +359,6 @@ void clear_fixmap(unsigned map) >> BUG_ON(res != 0); >> } >> >> -/* Create Xen's mappings of memory. >> - * Mapping_size must be either 2MB or 32MB. >> - * Base and virt must be mapping_size aligned. >> - * Size must be a multiple of mapping_size. >> - * second must be a contiguous set of second level page tables >> - * covering the region starting at virt_offset. */ >> -static void __init create_mappings(lpae_t *second, >> - unsigned long virt_offset, >> - unsigned long base_mfn, >> - unsigned long nr_mfns, >> - unsigned int mapping_size) >> -{ >> - unsigned long i, count; >> - const unsigned long granularity = mapping_size >> PAGE_SHIFT; >> - lpae_t pte, *p; >> - >> - ASSERT((mapping_size == MB(2)) || (mapping_size == MB(32))); >> - ASSERT(!((virt_offset >> PAGE_SHIFT) % granularity)); >> - ASSERT(!(base_mfn % granularity)); >> - ASSERT(!(nr_mfns % granularity)); >> - >> - count = nr_mfns / LPAE_ENTRIES; >> - p = second + second_linear_offset(virt_offset); >> - pte = mfn_to_xen_entry(_mfn(base_mfn), MT_NORMAL); >> - if ( granularity == 16 * LPAE_ENTRIES ) >> - pte.pt.contig = 1; /* These maps are in 16-entry contiguous chunks. */ >> - for ( i = 0; i < count; i++ ) >> - { >> - write_pte(p + i, pte); >> - pte.pt.base += 1 << LPAE_SHIFT; >> - } >> - flush_xen_tlb_local(); >> -} >> - >> #ifdef CONFIG_DOMAIN_PAGE >> void *map_domain_page_global(mfn_t mfn) >> { >> @@ -850,36 +816,18 @@ void __init setup_frametable_mappings(paddr_t ps, paddr_t pe) >> unsigned long frametable_size = nr_pdxs * sizeof(struct page_info); >> mfn_t base_mfn; >> const unsigned long mapping_size = frametable_size < MB(32) ? MB(2) : MB(32); >> -#ifdef CONFIG_ARM_64 >> - lpae_t *second, pte; >> - unsigned long nr_second; >> - mfn_t second_base; >> - int i; >> -#endif >> + int rc; >> >> frametable_base_pdx = mfn_to_pdx(maddr_to_mfn(ps)); >> /* Round up to 2M or 32M boundary, as appropriate. */ >> frametable_size = ROUNDUP(frametable_size, mapping_size); >> base_mfn = alloc_boot_pages(frametable_size >> PAGE_SHIFT, 32<<(20-12)); >> >> -#ifdef CONFIG_ARM_64 >> - /* Compute the number of second level pages. */ >> - nr_second = ROUNDUP(frametable_size, FIRST_SIZE) >> FIRST_SHIFT; >> - second_base = alloc_boot_pages(nr_second, 1); >> - second = mfn_to_virt(second_base); >> - for ( i = 0; i < nr_second; i++ ) >> - { >> - clear_page(mfn_to_virt(mfn_add(second_base, i))); >> - pte = mfn_to_xen_entry(mfn_add(second_base, i), MT_NORMAL); >> - pte.pt.table = 1; >> - write_pte(&xen_first[first_table_offset(FRAMETABLE_VIRT_START)+i], pte); >> - } >> - create_mappings(second, 0, mfn_x(base_mfn), frametable_size >> PAGE_SHIFT, >> - mapping_size); >> -#else >> - create_mappings(xen_second, FRAMETABLE_VIRT_START, mfn_x(base_mfn), >> - frametable_size >> PAGE_SHIFT, mapping_size); >> -#endif >> + /* XXX: Handle contiguous bit */ >> + rc = map_pages_to_xen(FRAMETABLE_VIRT_START, base_mfn, >> + frametable_size >> PAGE_SHIFT, PAGE_HYPERVISOR_RW); >> + if ( rc ) >> + panic("Unable to setup the frametable mappings.\n"); > > This is a lot better. > > I take that "XXX: Handle contiguous bit" refers to the lack of > _PAGE_BLOCK. Why can't we just | _PAGE_BLOCK like in other places? I forgot to add _PAGE_BLOCK, however this is unrelated to my comment. Currently, the frametable is mapped using 2MB mapping and setting the contiguous bit for each entry if the mapping is 32MB aligned. _PAGE_BLOCK will only create 2MB mapping but will not set the contiguous bit. This will increase the pressure on the TLBs (we would get 16 entry rather than 1) if on system where the TLBs can take advantange of it. So map_pages_to_xen() needs to gain support for contiguous bit. I haven't yet looked at it (hence the RFC state). Cheers, -- Julien Grall