[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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.