|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3 5/9] xen/riscv: introduce asm/pmap.h header
On 24.07.2024 17:31, Oleksii Kurochko wrote:
> Introduces arch_pmap_{un}map functions and select HAS_PMAP
> for CONFIG_RISCV.
>
> Additionaly it was necessary to introduce functions:
> - mfn_from_xen_entry
> - mfn_to_pte
>
> Also flush_xen_tlb_range_va_local() and flush_xen_tlb_one_local()
> are introduced and use in arch_pmap_unmap().
Just flush_xen_tlb_one_local() would suffice for the purposes here.
flush_xen_tlb_range_va_local() will need some kind of cutoff, to
avoid looping for an excessivly long time.
> --- /dev/null
> +++ b/xen/arch/riscv/include/asm/pmap.h
> @@ -0,0 +1,33 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +#ifndef ASM_PMAP_H
> +#define ASM_PMAP_H
> +
> +#include <xen/bug.h>
> +#include <xen/mm.h>
> +#include <xen/page-size.h>
> +
> +#include <asm/fixmap.h>
> +#include <asm/flushtlb.h>
> +#include <asm/system.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);
> + write_pte(entry, pte);
> +}
Perhaps add a comment to clarify why it's safe to omit a TLB flush here.
Note that arch_pmap_unmap() having one is a necessary but not sufficient
condition to that. In principle hardware may also cache "negative" TLB
entries; I have no idea how RISC-V behaves in this regard, or whether
that aspect is actually left to implementations.
> +static inline void arch_pmap_unmap(unsigned int slot)
> +{
> + pte_t pte = {};
> +
> + write_pte(&xen_fixmap[slot], pte);
> +
> + flush_xen_tlb_range_va_local(FIXMAP_ADDR(slot), PAGE_SIZE);
> +}
For both functions, even if mainly for documentation purposes, it may
be desirable to mark them __init. It's again a necessary (but not
sufficient) condition here, to validly use local TLB flushes only.
> --- a/xen/arch/riscv/mm.c
> +++ b/xen/arch/riscv/mm.c
> @@ -382,3 +382,18 @@ int map_pages_to_xen(unsigned long virt,
> BUG_ON("unimplemented");
> return -1;
> }
> +
> +static inline pte_t mfn_from_pte(mfn_t mfn)
> +{
> + unsigned long pte = mfn_x(mfn) << PTE_PPN_SHIFT;
> + return (pte_t){ .pte = pte };
> +}
My earlier naming related comment may not have been here, but it
was certainly meant to apply to any similar functions: A function
of this name should imo take a pte_t and produce an mfn_t. IOW I'd
expect this function to be pte_from_mfn(). However, I question it being
a good idea to do it this way. The resulting pte_t isn't valid yet, aiui,
as it still needs at least the access controls filled in. Such a partial
pte_t would better not be floating around at any time, imo. IOW the
function likely wants to take a 2nd parameter.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |