Hi Julien,

On Mon, Jul 22, 2024 at 7:27 PM Julien Grall <jul...@xen.org> wrote:

> Hi,
>
> >> On 22/07/2024 15:44, Oleksii Kurochko wrote:
> >>> On Mon, 2024-07-22 at 14:54 +0200, Jan Beulich wrote:
> >>>> On 12.07.2024 18:22, Oleksii Kurochko wrote:
> >>>>> --- /dev/null
> >>>>> +++ b/xen/arch/riscv/include/asm/pmap.h
> >>>>> @@ -0,0 +1,28 @@
> >>>>> +#ifndef __ASM_PMAP_H__
> >>>>> +#define __ASM_PMAP_H__
> >>>>> +
> >>>>> +#include <xen/bug.h>
> >>>>> +#include <xen/mm.h>
> >>>>> +
> >>>>> +#include <asm/fixmap.h>
> >>>>> +
> >>>>> +static inline void arch_pmap_map(unsigned int slot, mfn_t mfn)
> >>>>> +{
> >>>>> +    pte_t *entry = &xen_fixmap[slot];
> >>>>> +    pte_t pte;
> >>>>> +
> >>>>> +    ASSERT(!pte_is_valid(*entry));
> >>>>> +
> >>>>> +    pte = mfn_to_xen_entry(mfn, PAGE_HYPERVISOR_RW);
> >>>>> +    pte.pte |= PTE_LEAF_DEFAULT;
> >>>>> +    write_pte(entry, pte);
> >>>>> +}
> >>>>> +
> >>>>> +static inline void arch_pmap_unmap(unsigned int slot)
> >>>>> +{
> >>>>> +    pte_t pte = {};
> >>>>> +
> >>>>> +    write_pte(&xen_fixmap[slot], pte);
> >>>>> +}
> >>>>
> >>>> Why are these not using set_fixmap() / clear_fixmap()
> >>>> respectively?
> >>> They haven't been introduced yet. And I thought that these fucntion
> >>> are
> >>> used only in pmap_{un}map() and that is the reason why I decided to
> >>> not
> >>> introduce them. But while writing the answer on another comment, I
> >>> found other places where set_fixmap() / clear_fixmap() are used, so
> >>> I
> >>> will introduce them and reuse here.
> >>
> >> I am guessing you are going to implement set_fixmap()/clear_fixmap()
> >> using map_pages_to_xen(). If so, for early boot you are going to end
> >> up
> >> in a circular loop because map_pages_to_xen() will likely use pmap()
> >> which will call set_fixmap().
> > I am going to implement that in the following way as I faced the
> > described by you issue when I first time tried to implement it using
> > map_pages_to_xen():
> What's wrong with keeping the arch_pmap_*() as-is and call
> map_pages_to_xen() in the fixmap?
>
> At least this would be consistent with what other architectures does and
> less risky (see below).
>
Then I misunderstood you, if not to use {set/clear}_fixmap() in arch_pmap()
then everything should be fine.
Then I think it is needed to add the comment also above arch_pmap_*()
function why it isn't used {set/clear}_fixmap()
inside. ( or update the commit message )


>
> >     /* 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".

But probably it would be better to add flush_xen_tlb_range_va_local() or
something similar here in case if someone will decide to update write_pte().

~ Oleksii

Reply via email to