All of lore.kernel.org
 help / color / mirror / Atom feed
From: Julien Grall <julien@xen.org>
To: Stefano Stabellini <sstabellini@kernel.org>
Cc: xen-devel@lists.xenproject.org, Julien Grall <jgrall@amazon.com>,
	Bertrand Marquis <bertrand.marquis@arm.com>,
	Volodymyr Babchuk <Volodymyr_Babchuk@epam.com>
Subject: Re: [PATCH v3 06/19] xen/arm: mm: Avoid flushing the TLBs when mapping are inserted
Date: Sat, 2 Apr 2022 17:38:27 +0100	[thread overview]
Message-ID: <f0d3ed02-450f-9bd1-e8ab-5594234a835d@xen.org> (raw)
In-Reply-To: <alpine.DEB.2.22.394.2204011657080.2910984@ubuntu-linux-20-04-desktop>

Hi Stefano,

On 02/04/2022 01:00, Stefano Stabellini wrote:
> On Mon, 21 Feb 2022, Julien Grall wrote:
>> From: Julien Grall <jgrall@amazon.com>
>>
>> Currently, the function xen_pt_update() will flush the TLBs even when
>> the mappings are inserted. This is a bit wasteful because we don't
>> allow mapping replacement. Even if we were, the flush would need to
>> happen earlier because mapping replacement should use Break-Before-Make
>> when updating the entry.
>>
>> A single call to xen_pt_update() can perform a single action. IOW, it
>> is not possible to, for instance, mix inserting and removing mappings.
>> Therefore, we can use `flags` to determine what action is performed.
>>
>> This change will be particularly help to limit the impact of switching
>> boot time mapping to use xen_pt_update().
>>
>> Signed-off-by: Julien Grall <jgrall@amazon.com>
>>
>> ---
>>      Changes in v2:
>>          - New patch
>> ---
>>   xen/arch/arm/mm.c | 17 ++++++++++++++---
>>   1 file changed, 14 insertions(+), 3 deletions(-)
>>
>> diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c
>> index fd16c1541ce2..7b4b9de8693e 100644
>> --- a/xen/arch/arm/mm.c
>> +++ b/xen/arch/arm/mm.c
>> @@ -1104,7 +1104,13 @@ static bool xen_pt_check_entry(lpae_t entry, mfn_t mfn, unsigned int level,
>>           /* We should be here with a valid MFN. */
>>           ASSERT(!mfn_eq(mfn, INVALID_MFN));
>>   
>> -        /* We don't allow replacing any valid entry. */
>> +        /*
>> +         * We don't allow replacing any valid entry.
>> +         *
>> +         * Note that the function xen_pt_update() relies on this
>> +         * assumption and will skip the TLB flush. The function will need
>> +         * to be updated if the check is relaxed.
>> +         */
>>           if ( lpae_is_valid(entry) )
>>           {
>>               if ( lpae_is_mapping(entry, level) )
>> @@ -1417,11 +1423,16 @@ static int xen_pt_update(unsigned long virt,
>>       }
>>   
>>       /*
>> -     * Flush the TLBs even in case of failure because we may have
>> +     * The TLBs flush can be safely skipped when a mapping is inserted
>> +     * as we don't allow mapping replacement (see xen_pt_check_entry()).
>> +     *
>> +     * For all the other cases, the TLBs will be flushed unconditionally
>> +     * even if the mapping has failed. This is because we may have
>>        * partially modified the PT. This will prevent any unexpected
>>        * behavior afterwards.
>>        */
>> -    flush_xen_tlb_range_va(virt, PAGE_SIZE * nr_mfns);
>> +    if ( !(flags & _PAGE_PRESENT) || mfn_eq(mfn, INVALID_MFN) )
>> +        flush_xen_tlb_range_va(virt, PAGE_SIZE * nr_mfns);
> 
> I am trying to think of a care where the following wouldn't be enough
> but I cannot come up with one:
> 
>     if ( mfn_eq(mfn, INVALID_MFN) )
>         flush_xen_tlb_range_va(virt, PAGE_SIZE * nr_mfns);

_PAGE_PRESENT is not set for two cases: when removing a page or 
populating page-tables for a region. Both of them will expect an 
INVALID_MFN (see the two asserts in xen_pt_check_entry()).

Therefore your solution should work. However, technically the 'mfn' is 
ignored in both situation (hence why this is an ASSERT() rather than a 
prod check).

Also, I feel it is better to flush more than less (missing a flush could 
have catastrophic result). So I chose to be explicit in which case the 
flush can be skipped.

Maybe it would be clearer if I write:

  !((flags & _PAGE_PRESENT) && !mfn_eq(mfn, INVALID_MFN))

Cheers,

-- 
Julien Grall


  reply	other threads:[~2022-04-02 16:38 UTC|newest]

Thread overview: 79+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-02-21 10:21 [PATCH v3 00/19] xen/arm: mm: Remove open-coding mappings Julien Grall
2022-02-21 10:22 ` [PATCH v3 01/19] xen/arm: lpae: Rename LPAE_ENTRIES_MASK_GS to LPAE_ENTRY_MASK_GS Julien Grall
2022-02-22 13:30   ` Michal Orzel
2022-02-24 22:19     ` Julien Grall
2022-02-22 15:21   ` Bertrand Marquis
2022-02-21 10:22 ` [PATCH v3 02/19] xen/arm: lpae: Use the generic helpers to defined the Xen PT helpers Julien Grall
2022-02-22 14:26   ` Michal Orzel
2022-02-22 15:38   ` Bertrand Marquis
2022-02-24 22:24     ` Julien Grall
2022-02-21 10:22 ` [PATCH v3 03/19] xen/arm: p2m: Replace level_{orders, masks} arrays with XEN_PT_LEVEL_{ORDER, MASK} Julien Grall
2022-02-22 15:55   ` Bertrand Marquis
2022-02-24 22:41     ` Julien Grall
2022-02-25  8:27       ` Bertrand Marquis
2022-02-25 16:41         ` Julien Grall
2022-02-21 10:22 ` [PATCH v3 04/19] xen/arm: mm: Allow other mapping size in xen_pt_update_entry() Julien Grall
2022-04-01 23:35   ` Stefano Stabellini
2022-04-02 15:59     ` Julien Grall
2022-04-05 20:46       ` Stefano Stabellini
2022-04-10 12:17         ` Julien Grall
2022-02-21 10:22 ` [PATCH v3 05/19] xen/arm: mm: Add support for the contiguous bit Julien Grall
2022-02-26 19:30   ` Julien Grall
2022-03-21  5:46     ` Hongda Deng
2022-04-01 23:53   ` Stefano Stabellini
2022-04-02 16:18     ` Julien Grall
2022-04-05 20:47       ` Stefano Stabellini
2022-02-21 10:22 ` [PATCH v3 06/19] xen/arm: mm: Avoid flushing the TLBs when mapping are inserted Julien Grall
2022-04-02  0:00   ` Stefano Stabellini
2022-04-02 16:38     ` Julien Grall [this message]
2022-04-05 20:49       ` Stefano Stabellini
2022-04-10 12:30         ` Julien Grall
2022-02-21 10:22 ` [PATCH v3 07/19] xen/arm: mm: Don't open-code Xen PT update in remove_early_mappings() Julien Grall
2022-04-02  0:04   ` Stefano Stabellini
2022-04-02 16:47     ` Julien Grall
2022-04-05 20:51       ` Stefano Stabellini
2022-02-21 10:22 ` [PATCH v3 08/19] xen/arm: mm: Re-implement early_fdt_map() using map_pages_to_xen() Julien Grall
2022-03-18  7:36   ` Hongda Deng
2022-03-18 19:44     ` Julien Grall
2022-04-02  0:10   ` Stefano Stabellini
2022-04-02 17:02     ` Julien Grall
2022-02-21 10:22 ` [PATCH v3 09/19] xen/arm32: mm: Check if the virtual address is shared before updating it Julien Grall
2022-03-18 10:44   ` Hongda Deng
2022-03-18 22:15     ` Julien Grall
2022-03-19 15:59   ` Julien Grall
2022-02-21 10:22 ` [PATCH v3 10/19] xen/arm32: mm: Re-implement setup_xenheap_mappings() using map_pages_to_xen() Julien Grall
2022-04-02  0:11   ` Stefano Stabellini
2022-05-14  9:42   ` Julien Grall
2022-02-21 10:22 ` [PATCH v3 11/19] xen/arm: mm: Allocate xen page tables in domheap rather than xenheap Julien Grall
2022-02-21 10:22 ` [PATCH v3 12/19] xen/arm: mm: Allow page-table allocation from the boot allocator Julien Grall
2022-04-05 20:58   ` Stefano Stabellini
2022-02-21 10:22 ` [PATCH v3 13/19] xen/arm: Move fixmap definitions in a separate header Julien Grall
2022-02-22 15:10   ` Jan Beulich
2022-04-05 21:12   ` Stefano Stabellini
2022-04-05 21:47     ` Julien Grall
2022-04-06  0:10       ` Stefano Stabellini
2022-04-06  8:24         ` Julien Grall
2022-02-21 10:22 ` [PATCH v3 14/19] xen/arm: add Persistent Map (PMAP) infrastructure Julien Grall
2022-02-22 15:22   ` Jan Beulich
2022-02-28  9:55     ` Julien Grall
2022-02-28 10:10       ` Jan Beulich
2022-02-28 10:20         ` Julien Grall
2022-02-28 10:30           ` Jan Beulich
2022-02-28 10:52             ` Julien Grall
2022-04-05 21:27   ` Stefano Stabellini
2022-05-14 10:17     ` Julien Grall
2022-02-21 10:22 ` [PATCH v3 15/19] xen/arm: mm: Clean-up the includes and order them Julien Grall
2022-04-05 21:29   ` Stefano Stabellini
2022-02-21 10:22 ` [PATCH v3 16/19] xen/arm: mm: Use the PMAP helpers in xen_{,un}map_table() Julien Grall
2022-04-05 21:36   ` Stefano Stabellini
2022-02-21 10:22 ` [PATCH v3 17/19] xen/arm64: mm: Add memory to the boot allocator first Julien Grall
2022-04-05 21:50   ` Stefano Stabellini
2022-04-05 22:12     ` Julien Grall
2022-04-06  0:02       ` Stefano Stabellini
2022-02-21 10:22 ` [PATCH v3 18/19] xen/arm: mm: Rework setup_xenheap_mappings() Julien Grall
2022-04-05 23:57   ` Stefano Stabellini
2022-02-21 10:22 ` [PATCH v3 19/19] xen/arm: mm: Re-implement setup_frame_table_mappings() with map_pages_to_xen() Julien Grall
2022-03-16  6:10   ` Hongda Deng
2022-04-06  0:01   ` Stefano Stabellini
2022-05-14 10:02     ` Julien Grall
2022-02-27 19:25 ` [PATCH v3 00/19] xen/arm: mm: Remove open-coding mappings Julien Grall

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=f0d3ed02-450f-9bd1-e8ab-5594234a835d@xen.org \
    --to=julien@xen.org \
    --cc=Volodymyr_Babchuk@epam.com \
    --cc=bertrand.marquis@arm.com \
    --cc=jgrall@amazon.com \
    --cc=sstabellini@kernel.org \
    --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 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.