|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [for-4.11][PATCH v7 13/16] xen/grant: Switch {create, replace}_grant_p2m_mapping to typesafe MFN
On Tue, 3 Apr 2018, Julien Grall wrote:
> The current prototype is slightly confusing because it takes a guest
> physical address and a machine physical frame (not address!). Switching to
> MFN will improve safety and reduce the chance to mistakenly invert the
> 2 parameters.
>
> Signed-off-by: Julien grall <julien.grall@xxxxxxx>
> Reviewed-by: Wei Liu <wei.liu2@xxxxxxxxxx>
> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
Acked-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> ---
> Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> Cc: Julien Grall <julien.grall@xxxxxxx>
> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> Cc: George Dunlap <George.Dunlap@xxxxxxxxxxxxx>
> Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
> Cc: Jan Beulich <jbeulich@xxxxxxxx>
> Cc: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
> Cc: Tim Deegan <tim@xxxxxxx>
> Cc: Wei Liu <wei.liu2@xxxxxxxxxx>
>
> Changes in v5:
> - Add Wei's and Jan's reviewed-by
>
> Changes in v4:
> - Patch added
> ---
> xen/arch/arm/mm.c | 10 +++++-----
> xen/arch/x86/hvm/grant_table.c | 14 +++++++-------
> xen/arch/x86/pv/grant_table.c | 10 +++++-----
> xen/common/grant_table.c | 8 ++++----
> xen/include/asm-arm/grant_table.h | 9 ++++-----
> xen/include/asm-x86/grant_table.h | 4 ++--
> xen/include/asm-x86/hvm/grant_table.h | 8 ++++----
> xen/include/asm-x86/pv/grant_table.h | 8 ++++----
> 8 files changed, 35 insertions(+), 36 deletions(-)
>
> diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c
> index 7af6baa3d6..49080ca0ac 100644
> --- a/xen/arch/arm/mm.c
> +++ b/xen/arch/arm/mm.c
> @@ -1418,7 +1418,7 @@ void gnttab_mark_dirty(struct domain *d, unsigned long
> l)
> }
> }
>
> -int create_grant_host_mapping(unsigned long addr, unsigned long frame,
> +int create_grant_host_mapping(unsigned long addr, mfn_t frame,
> unsigned int flags, unsigned int cache_flags)
> {
> int rc;
> @@ -1431,7 +1431,7 @@ int create_grant_host_mapping(unsigned long addr,
> unsigned long frame,
> t = p2m_grant_map_ro;
>
> rc = guest_physmap_add_entry(current->domain, gaddr_to_gfn(addr),
> - _mfn(frame), 0, t);
> + frame, 0, t);
>
> if ( rc )
> return GNTST_general_error;
> @@ -1439,8 +1439,8 @@ int create_grant_host_mapping(unsigned long addr,
> unsigned long frame,
> return GNTST_okay;
> }
>
> -int replace_grant_host_mapping(unsigned long addr, unsigned long mfn,
> - unsigned long new_addr, unsigned int flags)
> +int replace_grant_host_mapping(unsigned long addr, mfn_t mfn,
> + unsigned long new_addr, unsigned int flags)
> {
> gfn_t gfn = gaddr_to_gfn(addr);
> struct domain *d = current->domain;
> @@ -1449,7 +1449,7 @@ int replace_grant_host_mapping(unsigned long addr,
> unsigned long mfn,
> if ( new_addr != 0 || (flags & GNTMAP_contains_pte) )
> return GNTST_general_error;
>
> - rc = guest_physmap_remove_page(d, gfn, _mfn(mfn), 0);
> + rc = guest_physmap_remove_page(d, gfn, mfn, 0);
>
> return rc ? GNTST_general_error : GNTST_okay;
> }
> diff --git a/xen/arch/x86/hvm/grant_table.c b/xen/arch/x86/hvm/grant_table.c
> index 9ca9fe0425..ecd7d078ab 100644
> --- a/xen/arch/x86/hvm/grant_table.c
> +++ b/xen/arch/x86/hvm/grant_table.c
> @@ -25,7 +25,7 @@
>
> #include <asm/p2m.h>
>
> -int create_grant_p2m_mapping(uint64_t addr, unsigned long frame,
> +int create_grant_p2m_mapping(uint64_t addr, mfn_t frame,
> unsigned int flags,
> unsigned int cache_flags)
> {
> @@ -41,14 +41,14 @@ int create_grant_p2m_mapping(uint64_t addr, unsigned long
> frame,
> p2mt = p2m_grant_map_rw;
> rc = guest_physmap_add_entry(current->domain,
> _gfn(addr >> PAGE_SHIFT),
> - _mfn(frame), PAGE_ORDER_4K, p2mt);
> + frame, PAGE_ORDER_4K, p2mt);
> if ( rc )
> return GNTST_general_error;
> else
> return GNTST_okay;
> }
>
> -int replace_grant_p2m_mapping(uint64_t addr, unsigned long frame,
> +int replace_grant_p2m_mapping(uint64_t addr, mfn_t frame,
> uint64_t new_addr, unsigned int flags)
> {
> unsigned long gfn = (unsigned long)(addr >> PAGE_SHIFT);
> @@ -60,15 +60,15 @@ int replace_grant_p2m_mapping(uint64_t addr, unsigned
> long frame,
> return GNTST_general_error;
>
> old_mfn = get_gfn(d, gfn, &type);
> - if ( !p2m_is_grant(type) || mfn_x(old_mfn) != frame )
> + if ( !p2m_is_grant(type) || !mfn_eq(old_mfn, frame) )
> {
> put_gfn(d, gfn);
> gdprintk(XENLOG_WARNING,
> - "old mapping invalid (type %d, mfn %" PRI_mfn ", frame
> %lx)\n",
> - type, mfn_x(old_mfn), frame);
> + "old mapping invalid (type %d, mfn %" PRI_mfn ", frame
> %"PRI_mfn")\n",
> + type, mfn_x(old_mfn), mfn_x(frame));
> return GNTST_general_error;
> }
> - if ( guest_physmap_remove_page(d, _gfn(gfn), _mfn(frame), PAGE_ORDER_4K)
> )
> + if ( guest_physmap_remove_page(d, _gfn(gfn), frame, PAGE_ORDER_4K) )
> {
> put_gfn(d, gfn);
> return GNTST_general_error;
> diff --git a/xen/arch/x86/pv/grant_table.c b/xen/arch/x86/pv/grant_table.c
> index 4dbc550366..458085e1b6 100644
> --- a/xen/arch/x86/pv/grant_table.c
> +++ b/xen/arch/x86/pv/grant_table.c
> @@ -50,7 +50,7 @@ static unsigned int grant_to_pte_flags(unsigned int
> grant_flags,
> return pte_flags;
> }
>
> -int create_grant_pv_mapping(uint64_t addr, unsigned long frame,
> +int create_grant_pv_mapping(uint64_t addr, mfn_t frame,
> unsigned int flags, unsigned int cache_flags)
> {
> struct vcpu *curr = current;
> @@ -60,7 +60,7 @@ int create_grant_pv_mapping(uint64_t addr, unsigned long
> frame,
> mfn_t gl1mfn;
> int rc = GNTST_general_error;
>
> - nl1e = l1e_from_pfn(frame, grant_to_pte_flags(flags, cache_flags));
> + nl1e = l1e_from_mfn(frame, grant_to_pte_flags(flags, cache_flags));
> nl1e = adjust_guest_l1e(nl1e, currd);
>
> /*
> @@ -192,7 +192,7 @@ static bool steal_linear_address(unsigned long linear,
> l1_pgentry_t *out)
> * new_addr has only ever been available via GNTABOP_unmap_and_replace, and
> * only when !(flags & GNTMAP_contains_pte).
> */
> -int replace_grant_pv_mapping(uint64_t addr, unsigned long frame,
> +int replace_grant_pv_mapping(uint64_t addr, mfn_t frame,
> uint64_t new_addr, unsigned int flags)
> {
> struct vcpu *curr = current;
> @@ -282,14 +282,14 @@ int replace_grant_pv_mapping(uint64_t addr, unsigned
> long frame,
> * Check that the address supplied is actually mapped to frame (with
> * appropriate permissions).
> */
> - if ( unlikely(l1e_get_pfn(ol1e) != frame) ||
> + if ( unlikely(!mfn_eq(l1e_get_mfn(ol1e), frame)) ||
> unlikely((l1e_get_flags(ol1e) ^ grant_pte_flags) &
> (_PAGE_PRESENT | _PAGE_RW)) )
> {
> gdprintk(XENLOG_ERR,
> "PTE %"PRIpte" for %"PRIx64" doesn't match grant
> (%"PRIpte")\n",
> l1e_get_intpte(ol1e), addr,
> - l1e_get_intpte(l1e_from_pfn(frame, grant_pte_flags)));
> + l1e_get_intpte(l1e_from_mfn(frame, grant_pte_flags)));
> goto out_unlock;
> }
>
> diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c
> index 18201912e4..f9e3d1bb95 100644
> --- a/xen/common/grant_table.c
> +++ b/xen/common/grant_table.c
> @@ -1071,7 +1071,7 @@ map_grant_ref(
>
> if ( op->flags & GNTMAP_host_map )
> {
> - rc = create_grant_host_mapping(op->host_addr, frame, op->flags,
> + rc = create_grant_host_mapping(op->host_addr, _mfn(frame),
> op->flags,
> cache_flags);
> if ( rc != GNTST_okay )
> goto undo_out;
> @@ -1111,7 +1111,7 @@ map_grant_ref(
> typecnt++;
> }
>
> - rc = create_grant_host_mapping(op->host_addr, frame, op->flags,
> 0);
> + rc = create_grant_host_mapping(op->host_addr, _mfn(frame),
> op->flags, 0);
> if ( rc != GNTST_okay )
> goto undo_out;
>
> @@ -1188,7 +1188,7 @@ map_grant_ref(
> undo_out:
> if ( host_map_created )
> {
> - replace_grant_host_mapping(op->host_addr, frame, 0, op->flags);
> + replace_grant_host_mapping(op->host_addr, _mfn(frame), 0, op->flags);
> gnttab_flush_tlb(ld);
> }
>
> @@ -1374,7 +1374,7 @@ unmap_common(
> if ( op->host_addr && (flags & GNTMAP_host_map) )
> {
> if ( (rc = replace_grant_host_mapping(op->host_addr,
> - op->frame, op->new_addr,
> + _mfn(op->frame), op->new_addr,
> flags)) < 0 )
> goto act_release_out;
>
> diff --git a/xen/include/asm-arm/grant_table.h
> b/xen/include/asm-arm/grant_table.h
> index d2027d26b2..24644084a1 100644
> --- a/xen/include/asm-arm/grant_table.h
> +++ b/xen/include/asm-arm/grant_table.h
> @@ -14,12 +14,11 @@ struct grant_table_arch {
> };
>
> void gnttab_clear_flag(unsigned long nr, uint16_t *addr);
> -int create_grant_host_mapping(unsigned long gpaddr,
> - unsigned long mfn, unsigned int flags, unsigned int
> - cache_flags);
> +int create_grant_host_mapping(unsigned long gpaddr, mfn_t mfn,
> + unsigned int flags, unsigned int cache_flags);
> #define gnttab_host_mapping_get_page_type(ro, ld, rd) (0)
> -int replace_grant_host_mapping(unsigned long gpaddr, unsigned long mfn,
> - unsigned long new_gpaddr, unsigned int flags);
> +int replace_grant_host_mapping(unsigned long gpaddr, mfn_t mfn,
> + unsigned long new_gpaddr, unsigned int flags);
> void gnttab_mark_dirty(struct domain *d, unsigned long l);
> #define gnttab_create_status_page(d, t, i) do {} while (0)
> #define gnttab_release_host_mappings(domain) 1
> diff --git a/xen/include/asm-x86/grant_table.h
> b/xen/include/asm-x86/grant_table.h
> index 4ac0b9b4c7..fc07291ff2 100644
> --- a/xen/include/asm-x86/grant_table.h
> +++ b/xen/include/asm-x86/grant_table.h
> @@ -21,7 +21,7 @@ struct grant_table_arch {
> * Caller must own caller's BIGLOCK, is responsible for flushing the TLB, and
> * must hold a reference to the page.
> */
> -static inline int create_grant_host_mapping(uint64_t addr, unsigned long
> frame,
> +static inline int create_grant_host_mapping(uint64_t addr, mfn_t frame,
> unsigned int flags,
> unsigned int cache_flags)
> {
> @@ -30,7 +30,7 @@ static inline int create_grant_host_mapping(uint64_t addr,
> unsigned long frame,
> return create_grant_pv_mapping(addr, frame, flags, cache_flags);
> }
>
> -static inline int replace_grant_host_mapping(uint64_t addr, unsigned long
> frame,
> +static inline int replace_grant_host_mapping(uint64_t addr, mfn_t frame,
> uint64_t new_addr,
> unsigned int flags)
> {
> diff --git a/xen/include/asm-x86/hvm/grant_table.h
> b/xen/include/asm-x86/hvm/grant_table.h
> index 711ce9b560..a5612585b3 100644
> --- a/xen/include/asm-x86/hvm/grant_table.h
> +++ b/xen/include/asm-x86/hvm/grant_table.h
> @@ -23,24 +23,24 @@
>
> #ifdef CONFIG_HVM
>
> -int create_grant_p2m_mapping(uint64_t addr, unsigned long frame,
> +int create_grant_p2m_mapping(uint64_t addr, mfn_t frame,
> unsigned int flags,
> unsigned int cache_flags);
> -int replace_grant_p2m_mapping(uint64_t addr, unsigned long frame,
> +int replace_grant_p2m_mapping(uint64_t addr, mfn_t frame,
> uint64_t new_addr, unsigned int flags);
>
> #else
>
> #include <public/grant_table.h>
>
> -static inline int create_grant_p2m_mapping(uint64_t addr, unsigned long
> frame,
> +static inline int create_grant_p2m_mapping(uint64_t addr, mfn_t frame,
> unsigned int flags,
> unsigned int cache_flags)
> {
> return GNTST_general_error;
> }
>
> -static inline int replace_grant_p2m_mapping(uint64_t addr, unsigned long
> frame,
> +static inline int replace_grant_p2m_mapping(uint64_t addr, mfn_t frame,
> uint64_t new_addr, unsigned int
> flags)
> {
> return GNTST_general_error;
> diff --git a/xen/include/asm-x86/pv/grant_table.h
> b/xen/include/asm-x86/pv/grant_table.h
> index 556e68f0eb..85442b6074 100644
> --- a/xen/include/asm-x86/pv/grant_table.h
> +++ b/xen/include/asm-x86/pv/grant_table.h
> @@ -23,23 +23,23 @@
>
> #ifdef CONFIG_PV
>
> -int create_grant_pv_mapping(uint64_t addr, unsigned long frame,
> +int create_grant_pv_mapping(uint64_t addr, mfn_t frame,
> unsigned int flags, unsigned int cache_flags);
> -int replace_grant_pv_mapping(uint64_t addr, unsigned long frame,
> +int replace_grant_pv_mapping(uint64_t addr, mfn_t frame,
> uint64_t new_addr, unsigned int flags);
>
> #else
>
> #include <public/grant_table.h>
>
> -static inline int create_grant_pv_mapping(uint64_t addr, unsigned long frame,
> +static inline int create_grant_pv_mapping(uint64_t addr, mfn_t frame,
> unsigned int flags,
> unsigned int cache_flags)
> {
> return GNTST_general_error;
> }
>
> -static inline int replace_grant_pv_mapping(uint64_t addr, unsigned long
> frame,
> +static inline int replace_grant_pv_mapping(uint64_t addr, mfn_t frame,
> uint64_t new_addr, unsigned int
> flags)
> {
> return GNTST_general_error;
> --
> 2.11.0
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |