|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 16/17] xen/mm: Convert {s, g}et_gpfn_from_mfn() to use typesafe MFN
On Sun, 2020-03-22 at 16:14 +0000, julien@xxxxxxx wrote:
> From: Julien Grall <julien.grall@xxxxxxx>
>
> The first parameter of {s,g}et_gpfn_from_mfn() is an MFN, so it can
> be
> switched to use the typesafe.
>
> At the same time, replace gpfn with pfn in the helpers as they all
> deal
> with PFN and also turn the macros to static inline.
>
> Note that the return of the getter and the 2nd parameter of the
> setter
> have not been converted to use typesafe PFN because it was requiring
> more changes than expected.
>
> Signed-off-by: Julien Grall <julien.grall@xxxxxxx>
>
> ---
> This was originally sent as part of "xen/arm: Properly disable
> M2P
> on Arm" [1].
>
> Changes since the original version:
> - mfn_to_gmfn() is still present for now so update it
> - Remove stray +
> - Avoid churn in set_pfn_from_mfn() by inverting mfn and mfn_
> - Remove tags
> - Fix build in mem_sharing
>
> [1] <20190603160350.29806-1-julien.grall@xxxxxxx>
> ---
> xen/arch/x86/cpu/mcheck/mcaction.c | 2 +-
> xen/arch/x86/mm.c | 14 +++----
> xen/arch/x86/mm/mem_sharing.c | 20 ++++-----
> xen/arch/x86/mm/p2m-pod.c | 4 +-
> xen/arch/x86/mm/p2m-pt.c | 35 ++++++++--------
> xen/arch/x86/mm/p2m.c | 66 +++++++++++++++-------------
> --
> xen/arch/x86/mm/paging.c | 4 +-
> xen/arch/x86/pv/dom0_build.c | 6 +--
> xen/arch/x86/x86_64/traps.c | 8 ++--
> xen/common/page_alloc.c | 2 +-
> xen/include/asm-arm/mm.h | 2 +-
> xen/include/asm-x86/grant_table.h | 2 +-
> xen/include/asm-x86/mm.h | 12 ++++--
> xen/include/asm-x86/p2m.h | 2 +-
> 14 files changed, 93 insertions(+), 86 deletions(-)
>
>
[...]
> diff --git a/xen/include/asm-arm/mm.h b/xen/include/asm-arm/mm.h
> index abf4cc23e4..11614f9107 100644
> --- a/xen/include/asm-arm/mm.h
> +++ b/xen/include/asm-arm/mm.h
> @@ -319,7 +319,7 @@ struct page_info *get_page_from_gva(struct vcpu
> *v, vaddr_t va,
> #define SHARED_M2P(_e) ((_e) == SHARED_M2P_ENTRY)
>
> /* Xen always owns P2M on ARM */
> -#define set_gpfn_from_mfn(mfn, pfn) do { (void) (mfn), (void)(pfn);
> } while (0)
> +static inline void set_pfn_from_mfn(mfn_t mfn, unsigned long pfn) {}
> #define mfn_to_gmfn(_d, mfn) (mfn)
I do not have a setup to compile and test code for Arm, but wouldn't
the compiler complain about unused arguments here? The marco version
explicitly silenced compiler complaints.
> diff --git a/xen/include/asm-x86/grant_table.h b/xen/include/asm-
> x86/grant_table.h
> index 5871238f6d..b6a09c4c6c 100644
> --- a/xen/include/asm-x86/grant_table.h
> +++ b/xen/include/asm-x86/grant_table.h
> @@ -41,7 +41,7 @@ static inline int
> replace_grant_host_mapping(uint64_t addr, mfn_t frame,
> #define gnttab_get_frame_gfn(gt, st, idx)
> ({ \
> mfn_t mfn_ = (st) ? gnttab_status_mfn(gt,
> idx) \
> : gnttab_shared_mfn(gt,
> idx); \
> - unsigned long gpfn_ =
> get_gpfn_from_mfn(mfn_x(mfn_)); \
> + unsigned long gpfn_ =
> get_pfn_from_mfn(mfn_); \
> VALID_M2P(gpfn_) ? _gfn(gpfn_) :
> INVALID_GFN; \
> })
>
> diff --git a/xen/include/asm-x86/mm.h b/xen/include/asm-x86/mm.h
> index 53f2ed7c7d..2a4f42e78f 100644
> --- a/xen/include/asm-x86/mm.h
> +++ b/xen/include/asm-x86/mm.h
> @@ -500,9 +500,10 @@ extern paddr_t mem_hotplug;
> */
> extern bool machine_to_phys_mapping_valid;
>
> -static inline void set_gpfn_from_mfn(unsigned long mfn, unsigned
> long pfn)
> +static inline void set_pfn_from_mfn(mfn_t mfn_, unsigned long pfn)
> {
> - const struct domain *d = page_get_owner(mfn_to_page(_mfn(mfn)));
> + const unsigned long mfn = mfn_x(mfn_);
> + const struct domain *d = page_get_owner(mfn_to_page(mfn_));
> unsigned long entry = (d && (d == dom_cow)) ? SHARED_M2P_ENTRY :
> pfn;
>
> if ( !machine_to_phys_mapping_valid )
> @@ -515,11 +516,14 @@ static inline void set_gpfn_from_mfn(unsigned
> long mfn, unsigned long pfn)
>
> extern struct rangeset *mmio_ro_ranges;
>
> -#define get_gpfn_from_mfn(mfn) (machine_to_phys_mapping[(mfn)])
> +static inline unsigned long get_pfn_from_mfn(mfn_t mfn)
> +{
> + return machine_to_phys_mapping[mfn_x(mfn)];
> +}
Any specific reason this (and some other macros) are turned into static
inline? I don't have a problem with them being inline functions but
just wondering if there is a reason to do so.
> #define mfn_to_gmfn(_d, mfn) \
> ( (paging_mode_translate(_d)) \
> - ? get_gpfn_from_mfn(mfn) \
> + ? get_pfn_from_mfn(_mfn(mfn)) \
> : (mfn) )
>
> #define compat_pfn_to_cr3(pfn) (((unsigned)(pfn) << 12) |
> ((unsigned)(pfn) >> 20))
> diff --git a/xen/include/asm-x86/p2m.h b/xen/include/asm-x86/p2m.h
> index a2c6049834..39dae242b0 100644
> --- a/xen/include/asm-x86/p2m.h
> +++ b/xen/include/asm-x86/p2m.h
> @@ -505,7 +505,7 @@ static inline struct page_info
> *get_page_from_gfn(
> static inline gfn_t mfn_to_gfn(const struct domain *d, mfn_t mfn)
> {
> if ( paging_mode_translate(d) )
> - return _gfn(get_gpfn_from_mfn(mfn_x(mfn)));
> + return _gfn(get_pfn_from_mfn(mfn));
> else
> return _gfn(mfn_x(mfn));
> }
Apart from the two comments above, looks good to me.
Reviewed-by: Hongyan Xia <hongyxia@xxxxxxxxxx>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |