All of lore.kernel.org
 help / color / mirror / Atom feed
From: oleksii.kurochko@gmail.com
To: Julien Grall <julien@xen.org>, Jan Beulich <jbeulich@suse.com>
Cc: Alistair Francis <alistair.francis@wdc.com>,
	Bob Eshleman <bobbyeshleman@gmail.com>,
	Connor Davis <connojdavis@gmail.com>,
	Andrew Cooper <andrew.cooper3@citrix.com>,
	Stefano Stabellini <sstabellini@kernel.org>,
	 xen-devel@lists.xenproject.org
Subject: Re: [PATCH v2 5/8] xen/riscv: introduce asm/pmap.h header
Date: Tue, 23 Jul 2024 19:25:26 +0200	[thread overview]
Message-ID: <29c8b24ecd240268caa64ddcc590188ec3e80cd1.camel@gmail.com> (raw)
In-Reply-To: <9baa3203-b8d0-4774-a2a5-7ba61b213f1c@xen.org>

On Tue, 2024-07-23 at 16:49 +0100, Julien Grall wrote:
> Hi Oleksii,
> 
> On 23/07/2024 16:36, oleksii.kurochko@gmail.com wrote:
> > On Tue, 2024-07-23 at 12:02 +0200, Jan Beulich wrote:
> > > On 23.07.2024 10:55, oleksii.kurochko@gmail.com wrote:
> > > > On Tue, 2024-07-23 at 10:36 +0200, Jan Beulich wrote:
> > > > > On 23.07.2024 10:02, Oleksii Kurochko wrote:
> > > > > > On Mon, Jul 22, 2024 at 7:27 PM Julien Grall
> > > > > > <julien@xen.org>
> > > > > > wrote:
> > > > > > > > > On 22/07/2024 15:44, Oleksii Kurochko wrote:
> > > > > > > >      /* Map a 4k page in a fixmap entry */
> > > > > > > >      void set_fixmap(unsigned map, mfn_t mfn, unsigned
> > > > > > > > int
> > > > > > > > flags)
> > > > > > > >      {
> > > > > > > >          pte_t pte;
> > > > > > > > 
> > > > > > > >          pte = mfn_to_xen_entry(mfn, flags);
> > > > > > > >          pte.pte |= PTE_LEAF_DEFAULT;
> > > > > > > >          write_pte(&xen_fixmap[pt_index(0,
> > > > > > > > FIXMAP_ADDR(map))],
> > > > > > > > pte);
> > > > > > > 
> > > > > > > It would be saner to check if you are not overwriting any
> > > > > > > existing
> > > > > > > mapping as otherwise you will probably need a TLB flush.
> > > > > > > 
> > > > > > > >      }
> > > > > > > > 
> > > > > > > >      /* Remove a mapping from a fixmap entry */
> > > > > > > >      void clear_fixmap(unsigned map)
> > > > > > > >      {
> > > > > > > >          pte_t pte = {0};
> > > > > > > >          write_pte(&xen_fixmap[pt_index(0,
> > > > > > > > FIXMAP_ADDR(map))],
> > > > > > > > pte);
> > > > > > > 
> > > > > > > Don't you need a TLB flush?
> > > > > > > 
> > > > > > Inside write_pte() there is "sfence.vma".
> > > > > 
> > > > > That's just a fence though, not a TLB flush.
> > > >  From the privileged doc:
> > > >     ```
> > > >     SFENCE.VMA is also used to invalidate entries in the
> > > >     address-translation cache associated with a hart (see
> > > > Section
> > > > 4.3.2).
> > > >     ...
> > > >     The SFENCE.VMA is used to flush any local hardware caches
> > > > related to
> > > >     address translation.
> > > >     It is specified as a fence rather than a TLB flush to
> > > > provide
> > > > cleaner
> > > >     semantics with respect to
> > > >     which instructions are affected by the flush operation and
> > > > to
> > > > support a
> > > >     wider variety of dynamic
> > > >     caching structures and memory-management schemes.
> > > > SFENCE.VMA is
> > > > also
> > > >     used by higher
> > > >     privilege levels to synchronize page table writes and the
> > > > address
> > > >     translation hardware.
> > > >     ...
> > > >     ```
> > > > I read this as SFENCE.VMA is used not only for ordering of
> > > > load/stores,
> > > > but also to flush TLB ( which is a type of more general term as
> > > > address-translation cache, IIUIC ).
> I have to admit, I am a little because concerned with calling
> sfence.vma 
> in write_pte() (this may only be because I am not very familiar with 
> RISC-V).
> 
> We have cases where multiple entry will be written in a single 
> map_pages_to_xen() call. So wouldn't this means that the local TLBs 
> would be nuked for every write rather than once?
Yes, it will be nuked. It is bad from perfomance point of view.
I just wanted to be sure that I won't miss to put sfence.vma when it is
necessary and then reworked that a little bit after. But it seems it
would be better not to call sfence.vma in write_pte() just from the
start.


> 
> 
> > > 
> > > Oh, I see. Kind of unexpected for an instruction of that name.
> > > Yet
> > > note
> > > how they talk about the local hart only. You need a wider scope
> > > TLB
> > > flush here.
> > Could you please clarify why it is needed wider?
> > 
> > Arm Xen flushed only local TLB.
> 
> Which code are you looking at? set_fixmap() will propagate the TLB
> flush 
> to all innershareable CPUs.
Yes, here I agree that set_fixmap() uses map_pages_to_xen which
somewhere inside uses flush_xen_tlb_range_va() ( not
flush_xen_tlb_range_va() ) so TLB flush will happen for all
innershareable CPUs.
> 
> The PMAP interface will do a local TLB flush because the interface
> can 
> only be used during early boot where there is a single CPU running.

Yes, I am looking at PMAP:
   static inline void arch_pmap_unmap(unsigned int slot)
   {
       lpae_t pte = {};
   
       write_pte(&xen_fixmap[slot], pte);
   
       flush_xen_tlb_range_va(FIXMAP_ADDR(slot), PAGE_SIZE);
   }
IIUC, originaly Jan told about arch_pmap_unmap() case so that is why I
decided to clarify additionaly.

> 
> > RISC-V Linux kernel for fixmap also uses: local_flush_tlb_page().
> 
> I don't know how Linux is using set_fixmap(). But what matters is how
> Xen is using set_fixmap(). We have a couple of places in Xen where
> the 
> fixmap needs to be accessed by all the CPUs.
> 
> Given this is a common interface in Xen, I think it makes sense to 
> follow the same approach to avoid any confusion.
Sure. Thanks for claryfying. I will flush_xen_tlb_range_va() for
set_fixmap().


~ Oleksii


  reply	other threads:[~2024-07-23 17:25 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-07-12 16:22 [PATCH v2 0/8] RISCV device tree mapping Oleksii Kurochko
2024-07-12 16:22 ` [PATCH v6 1/8] xen/device-tree: Move Arm's setup.c bootinfo functions to common Oleksii Kurochko
2024-07-15  8:36   ` Jan Beulich
2024-07-15 10:15   ` Michal Orzel
2024-07-15 13:42     ` Oleksii
2024-07-12 16:22 ` [PATCH v6 2/8] xen/common: Move Arm's bootfdt.c " Oleksii Kurochko
2024-07-12 16:22 ` [PATCH v2 3/8] xen/riscv: enable CONFIG_HAS_DEVICE_TREE Oleksii Kurochko
2024-07-15  8:40   ` Jan Beulich
2024-07-12 16:22 ` [PATCH v2 4/8] xen/riscv: setup fixmap mapping Oleksii Kurochko
2024-07-21  8:46   ` Julien Grall
2024-07-22 14:31     ` Oleksii
2024-07-22 14:44       ` Julien Grall
2024-07-23 12:58     ` oleksii.kurochko
2024-07-23 13:32       ` Julien Grall
2024-07-23 13:27     ` oleksii.kurochko
2024-07-23 13:33       ` Julien Grall
2024-07-23 13:38         ` oleksii.kurochko
2024-07-22 12:42   ` Jan Beulich
2024-07-22 14:36     ` Oleksii
2024-07-22 15:25       ` Jan Beulich
2024-07-22 17:04         ` oleksii.kurochko
2024-07-23 13:34           ` oleksii.kurochko
2024-07-12 16:22 ` [PATCH v2 5/8] xen/riscv: introduce asm/pmap.h header Oleksii Kurochko
2024-07-21  8:51   ` Julien Grall
2024-07-22 12:58     ` Jan Beulich
2024-07-22 14:57       ` Julien Grall
2024-07-22 14:40     ` Oleksii
2024-07-22 12:54   ` Jan Beulich
2024-07-22 14:44     ` Oleksii Kurochko
2024-07-22 14:48       ` Julien Grall
2024-07-22 17:09         ` Oleksii Kurochko
2024-07-22 17:21           ` Julien Grall
2024-07-23  8:02             ` Oleksii Kurochko
2024-07-23  8:36               ` Jan Beulich
2024-07-23  8:55                 ` oleksii.kurochko
2024-07-23 10:02                   ` Jan Beulich
2024-07-23 15:36                     ` oleksii.kurochko
2024-07-23 15:49                       ` Julien Grall
2024-07-23 17:25                         ` oleksii.kurochko [this message]
2024-07-23 17:28                           ` oleksii.kurochko
2024-07-23 18:44                             ` Julien Grall
2024-07-12 16:22 ` [PATCH v2 6/8] xen/riscv: introduce generic Xen page table handling Oleksii Kurochko
2024-07-21  9:02   ` Julien Grall
2024-07-22  6:59     ` Jan Beulich
2024-07-22 14:51     ` Oleksii
2024-07-12 16:22 ` [PATCH v2 7/8] xen/riscv: select CONFIG_GENREIC_PT Oleksii Kurochko
2024-07-12 16:22 ` [PATCH v2 8/8] xen/riscv: introduce early_fdt_map() Oleksii Kurochko
2024-07-15  8:52   ` Jan Beulich
2024-07-15 13:58     ` Oleksii
2024-07-15 14:58       ` Jan Beulich
2024-07-15 15:00         ` Jan Beulich

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=29c8b24ecd240268caa64ddcc590188ec3e80cd1.camel@gmail.com \
    --to=oleksii.kurochko@gmail.com \
    --cc=alistair.francis@wdc.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=bobbyeshleman@gmail.com \
    --cc=connojdavis@gmail.com \
    --cc=jbeulich@suse.com \
    --cc=julien@xen.org \
    --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.