diff mbox series

[Xen-devel,for-4.11,v7,14/16] xen/grant: Switch common/grant_table.c to use typesafe MFN

Message ID 20180403153251.19595-15-julien.grall@arm.com
State Accepted
Commit cd1ea43b5059eae52232b2795fc6b2755a7f5be4
Headers show
Series xen: Convert page_to_mfn and mfn_to_page to use typesafe MFN | expand

Commit Message

Julien Grall April 3, 2018, 3:32 p.m. UTC
At the same time replace MFN 0 by INVALID_MFN or drop the initializer
when it is not necessary. This will make clearer that the MFN
initialized is not valid.

Other than MFN 0 -> INVALID_MFN, no functional change intended.

Signed-off-by: Julien Grall <julien.grall@arm.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Wei Liu <wei.liu2@citrix.com>

---

Cc: Stefano Stabellini <sstabellini@kernel.org>
Cc: Julien Grall <julien.grall@arm.com>
Cc: Andrew Cooper <andrew.cooper3@citrix.com>
Cc: George Dunlap <George.Dunlap@eu.citrix.com>
Cc: Ian Jackson <ian.jackson@eu.citrix.com>
Cc: Jan Beulich <jbeulich@suse.com>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: Tim Deegan <tim@xen.org>
Cc: Wei Liu <wei.liu2@citrix.com>

    Changes in v6:
        - s/_mfn(0)/MFN 0/
        - Add Jan's and Wei's reviewed-by

    Changes in v5:
        - Remove _mfn(0) when not needed or replace by INVALID_MFN.

    Changes in v4:
        - Patch added
---
 xen/arch/arm/mm.c                 |   2 +-
 xen/common/grant_table.c          | 147 ++++++++++++++++++++------------------
 xen/include/asm-arm/grant_table.h |   2 +-
 xen/include/asm-x86/grant_table.h |   2 +-
 4 files changed, 82 insertions(+), 71 deletions(-)

Comments

Stefano Stabellini April 5, 2018, 8:11 p.m. UTC | #1
On Tue, 3 Apr 2018, Julien Grall wrote:
> At the same time replace MFN 0 by INVALID_MFN or drop the initializer
> when it is not necessary. This will make clearer that the MFN
> initialized is not valid.
> 
> Other than MFN 0 -> INVALID_MFN, no functional change intended.
> 
> Signed-off-by: Julien Grall <julien.grall@arm.com>
> Reviewed-by: Jan Beulich <jbeulich@suse.com>
> Reviewed-by: Wei Liu <wei.liu2@citrix.com>

Acked-by: Stefano Stabellini <sstabellini@kernel.org>

> ---
> 
> Cc: Stefano Stabellini <sstabellini@kernel.org>
> Cc: Julien Grall <julien.grall@arm.com>
> Cc: Andrew Cooper <andrew.cooper3@citrix.com>
> Cc: George Dunlap <George.Dunlap@eu.citrix.com>
> Cc: Ian Jackson <ian.jackson@eu.citrix.com>
> Cc: Jan Beulich <jbeulich@suse.com>
> Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> Cc: Tim Deegan <tim@xen.org>
> Cc: Wei Liu <wei.liu2@citrix.com>
> 
>     Changes in v6:
>         - s/_mfn(0)/MFN 0/
>         - Add Jan's and Wei's reviewed-by
> 
>     Changes in v5:
>         - Remove _mfn(0) when not needed or replace by INVALID_MFN.
> 
>     Changes in v4:
>         - Patch added
> ---
>  xen/arch/arm/mm.c                 |   2 +-
>  xen/common/grant_table.c          | 147 ++++++++++++++++++++------------------
>  xen/include/asm-arm/grant_table.h |   2 +-
>  xen/include/asm-x86/grant_table.h |   2 +-
>  4 files changed, 82 insertions(+), 71 deletions(-)
> 
> diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c
> index 49080ca0ac..eb3659f913 100644
> --- a/xen/arch/arm/mm.c
> +++ b/xen/arch/arm/mm.c
> @@ -1408,7 +1408,7 @@ void gnttab_clear_flag(unsigned long nr, uint16_t *addr)
>      } while (cmpxchg(addr, old, old & mask) != old);
>  }
>  
> -void gnttab_mark_dirty(struct domain *d, unsigned long l)
> +void gnttab_mark_dirty(struct domain *d, mfn_t mfn)
>  {
>      /* XXX: mark dirty */
>      static int warning;
> diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c
> index f9e3d1bb95..4bedf5984a 100644
> --- a/xen/common/grant_table.c
> +++ b/xen/common/grant_table.c
> @@ -40,6 +40,12 @@
>  #include <xsm/xsm.h>
>  #include <asm/flushtlb.h>
>  
> +/* Override macros from asm/page.h to make them work with mfn_t */
> +#undef page_to_mfn
> +#define page_to_mfn(pg) _mfn(__page_to_mfn(pg))
> +#undef mfn_to_page
> +#define mfn_to_page(mfn) __mfn_to_page(mfn_x(mfn))
> +
>  /* Per-domain grant information. */
>  struct grant_table {
>      /*
> @@ -167,7 +173,7 @@ struct gnttab_unmap_common {
>  
>      /* Shared state beteen *_unmap and *_unmap_complete */
>      uint16_t done;
> -    unsigned long frame;
> +    mfn_t frame;
>      struct domain *rd;
>      grant_ref_t ref;
>  };
> @@ -266,7 +272,7 @@ struct active_grant_entry {
>                                  grant.                                */
>      grant_ref_t   trans_gref;
>      struct domain *trans_domain;
> -    unsigned long frame;  /* Frame being granted.                     */
> +    mfn_t         frame;  /* Frame being granted.                     */
>  #ifndef NDEBUG
>      gfn_t         gfn;    /* Guest's idea of the frame being granted. */
>  #endif
> @@ -371,14 +377,14 @@ static inline unsigned int grant_to_status_frames(unsigned int grant_frames)
>     If rc == GNTST_okay, *page contains the page struct with a ref taken.
>     Caller must do put_page(*page).
>     If any error, *page = NULL, *frame = INVALID_MFN, no ref taken. */
> -static int get_paged_frame(unsigned long gfn, unsigned long *frame,
> +static int get_paged_frame(unsigned long gfn, mfn_t *frame,
>                             struct page_info **page, bool readonly,
>                             struct domain *rd)
>  {
>      int rc = GNTST_okay;
>      p2m_type_t p2mt;
>  
> -    *frame = mfn_x(INVALID_MFN);
> +    *frame = INVALID_MFN;
>      *page = get_page_from_gfn(rd, gfn, &p2mt,
>                                readonly ? P2M_ALLOC : P2M_UNSHARE);
>      if ( !*page )
> @@ -823,7 +829,7 @@ static int _set_status(unsigned gt_version,
>  
>  static struct active_grant_entry *grant_map_exists(const struct domain *ld,
>                                                     struct grant_table *rgt,
> -                                                   unsigned long mfn,
> +                                                   mfn_t mfn,
>                                                     grant_ref_t *cur_ref)
>  {
>      grant_ref_t ref, max_iter;
> @@ -842,7 +848,8 @@ static struct active_grant_entry *grant_map_exists(const struct domain *ld,
>      {
>          struct active_grant_entry *act = active_entry_acquire(rgt, ref);
>  
> -        if ( act->pin && act->domid == ld->domain_id && act->frame == mfn )
> +        if ( act->pin && act->domid == ld->domain_id &&
> +             mfn_eq(act->frame, mfn) )
>              return act;
>          active_entry_release(act);
>      }
> @@ -859,7 +866,7 @@ static struct active_grant_entry *grant_map_exists(const struct domain *ld,
>  #define MAPKIND_READ 1
>  #define MAPKIND_WRITE 2
>  static unsigned int mapkind(
> -    struct grant_table *lgt, const struct domain *rd, unsigned long mfn)
> +    struct grant_table *lgt, const struct domain *rd, mfn_t mfn)
>  {
>      struct grant_mapping *map;
>      grant_handle_t handle, limit = lgt->maptrack_limit;
> @@ -884,7 +891,7 @@ static unsigned int mapkind(
>          if ( !(map->flags & (GNTMAP_device_map|GNTMAP_host_map)) ||
>               map->domid != rd->domain_id )
>              continue;
> -        if ( _active_entry(rd->grant_table, map->ref).frame == mfn )
> +        if ( mfn_eq(_active_entry(rd->grant_table, map->ref).frame, mfn) )
>              kind |= map->flags & GNTMAP_readonly ?
>                      MAPKIND_READ : MAPKIND_WRITE;
>      }
> @@ -907,7 +914,7 @@ map_grant_ref(
>      struct grant_table *lgt, *rgt;
>      struct vcpu   *led;
>      grant_handle_t handle;
> -    unsigned long  frame = 0;
> +    mfn_t frame;
>      struct page_info *pg = NULL;
>      int            rc = GNTST_okay;
>      u32            old_pin;
> @@ -1034,7 +1041,7 @@ map_grant_ref(
>      /* pg may be set, with a refcount included, from get_paged_frame(). */
>      if ( !pg )
>      {
> -        pg = mfn_valid(_mfn(frame)) ? mfn_to_page(frame) : NULL;
> +        pg = mfn_valid(frame) ? mfn_to_page(frame) : NULL;
>          if ( pg )
>              owner = page_get_owner_and_reference(pg);
>      }
> @@ -1060,18 +1067,18 @@ map_grant_ref(
>              goto undo_out;
>          }
>  
> -        if ( !iomem_access_permitted(rd, frame, frame) )
> +        if ( !iomem_access_permitted(rd, mfn_x(frame), mfn_x(frame)) )
>          {
>              gdprintk(XENLOG_WARNING,
> -                     "Iomem mapping not permitted %lx (domain %d)\n",
> -                     frame, rd->domain_id);
> +                     "Iomem mapping not permitted %#"PRI_mfn" (domain %d)\n",
> +                     mfn_x(frame), rd->domain_id);
>              rc = GNTST_general_error;
>              goto undo_out;
>          }
>  
>          if ( op->flags & GNTMAP_host_map )
>          {
> -            rc = create_grant_host_mapping(op->host_addr, _mfn(frame), op->flags,
> +            rc = create_grant_host_mapping(op->host_addr, frame, op->flags,
>                                             cache_flags);
>              if ( rc != GNTST_okay )
>                  goto undo_out;
> @@ -1111,7 +1118,7 @@ map_grant_ref(
>                  typecnt++;
>              }
>  
> -            rc = create_grant_host_mapping(op->host_addr, _mfn(frame), op->flags, 0);
> +            rc = create_grant_host_mapping(op->host_addr, frame, op->flags, 0);
>              if ( rc != GNTST_okay )
>                  goto undo_out;
>  
> @@ -1122,8 +1129,8 @@ map_grant_ref(
>      {
>      could_not_pin:
>          if ( !rd->is_dying )
> -            gdprintk(XENLOG_WARNING, "Could not pin grant frame %lx\n",
> -                     frame);
> +            gdprintk(XENLOG_WARNING, "Could not pin grant frame %#"PRI_mfn"\n",
> +                     mfn_x(frame));
>          rc = GNTST_general_error;
>          goto undo_out;
>      }
> @@ -1143,13 +1150,14 @@ map_grant_ref(
>               !(old_pin & (GNTPIN_hstw_mask|GNTPIN_devw_mask)) )
>          {
>              if ( !(kind & MAPKIND_WRITE) )
> -                err = iommu_map_page(ld, frame, frame,
> +                err = iommu_map_page(ld, mfn_x(frame), mfn_x(frame),
>                                       IOMMUF_readable|IOMMUF_writable);
>          }
>          else if ( act_pin && !old_pin )
>          {
>              if ( !kind )
> -                err = iommu_map_page(ld, frame, frame, IOMMUF_readable);
> +                err = iommu_map_page(ld, mfn_x(frame), mfn_x(frame),
> +                                     IOMMUF_readable);
>          }
>          if ( err )
>          {
> @@ -1178,7 +1186,7 @@ map_grant_ref(
>      if ( need_iommu )
>          double_gt_unlock(lgt, rgt);
>  
> -    op->dev_bus_addr = (u64)frame << PAGE_SHIFT;
> +    op->dev_bus_addr = mfn_to_maddr(frame);
>      op->handle       = handle;
>      op->status       = GNTST_okay;
>  
> @@ -1188,7 +1196,7 @@ map_grant_ref(
>   undo_out:
>      if ( host_map_created )
>      {
> -        replace_grant_host_mapping(op->host_addr, _mfn(frame), 0, op->flags);
> +        replace_grant_host_mapping(op->host_addr, frame, 0, op->flags);
>          gnttab_flush_tlb(ld);
>      }
>  
> @@ -1366,15 +1374,15 @@ unmap_common(
>      op->frame = act->frame;
>  
>      if ( op->dev_bus_addr &&
> -         unlikely(op->dev_bus_addr != pfn_to_paddr(act->frame)) )
> +         unlikely(op->dev_bus_addr != mfn_to_maddr(act->frame)) )
>          PIN_FAIL(act_release_out, GNTST_general_error,
>                   "Bus address doesn't match gntref (%"PRIx64" != %"PRIpaddr")\n",
> -                 op->dev_bus_addr, pfn_to_paddr(act->frame));
> +                 op->dev_bus_addr, mfn_to_maddr(act->frame));
>  
>      if ( op->host_addr && (flags & GNTMAP_host_map) )
>      {
>          if ( (rc = replace_grant_host_mapping(op->host_addr,
> -                                              _mfn(op->frame), op->new_addr,
> +                                              op->frame, op->new_addr,
>                                                flags)) < 0 )
>              goto act_release_out;
>  
> @@ -1411,9 +1419,10 @@ unmap_common(
>  
>          kind = mapkind(lgt, rd, op->frame);
>          if ( !kind )
> -            err = iommu_unmap_page(ld, op->frame);
> +            err = iommu_unmap_page(ld, mfn_x(op->frame));
>          else if ( !(kind & MAPKIND_WRITE) )
> -            err = iommu_map_page(ld, op->frame, op->frame, IOMMUF_readable);
> +            err = iommu_map_page(ld, mfn_x(op->frame),
> +                                 mfn_x(op->frame), IOMMUF_readable);
>  
>          double_gt_unlock(lgt, rgt);
>  
> @@ -1464,7 +1473,7 @@ unmap_common_complete(struct gnttab_unmap_common *op)
>  
>      if ( op->done & GNTMAP_device_map )
>      {
> -        if ( !is_iomem_page(_mfn(act->frame)) )
> +        if ( !is_iomem_page(act->frame) )
>          {
>              if ( op->done & GNTMAP_readonly )
>                  put_page(pg);
> @@ -1481,7 +1490,7 @@ unmap_common_complete(struct gnttab_unmap_common *op)
>  
>      if ( op->done & GNTMAP_host_map )
>      {
> -        if ( !is_iomem_page(_mfn(op->frame)) )
> +        if ( !is_iomem_page(op->frame) )
>          {
>              if ( gnttab_host_mapping_get_page_type(op->done & GNTMAP_readonly,
>                                                     ld, rd) )
> @@ -1522,7 +1531,7 @@ unmap_grant_ref(
>      common->done = 0;
>      common->new_addr = 0;
>      common->rd = NULL;
> -    common->frame = 0;
> +    common->frame = INVALID_MFN;
>  
>      unmap_common(common);
>      op->status = common->status;
> @@ -1588,7 +1597,7 @@ unmap_and_replace(
>      common->done = 0;
>      common->dev_bus_addr = 0;
>      common->rd = NULL;
> -    common->frame = 0;
> +    common->frame = INVALID_MFN;
>  
>      unmap_common(common);
>      op->status = common->status;
> @@ -1692,7 +1701,7 @@ gnttab_unpopulate_status_frames(struct domain *d, struct grant_table *gt)
>              int rc = gfn_eq(gfn, INVALID_GFN)
>                       ? 0
>                       : guest_physmap_remove_page(d, gfn,
> -                                                 _mfn(page_to_mfn(pg)), 0);
> +                                                 page_to_mfn(pg), 0);
>  
>              if ( rc )
>              {
> @@ -2097,7 +2106,7 @@ gnttab_transfer(
>      struct page_info *page;
>      int i;
>      struct gnttab_transfer gop;
> -    unsigned long mfn;
> +    mfn_t mfn;
>      unsigned int max_bitsize;
>      struct active_grant_entry *act;
>  
> @@ -2121,16 +2130,16 @@ gnttab_transfer(
>          {
>              p2m_type_t p2mt;
>  
> -            mfn = mfn_x(get_gfn_unshare(d, gop.mfn, &p2mt));
> +            mfn = get_gfn_unshare(d, gop.mfn, &p2mt);
>              if ( p2m_is_shared(p2mt) || !p2m_is_valid(p2mt) )
> -                mfn = mfn_x(INVALID_MFN);
> +                mfn = INVALID_MFN;
>          }
>  #else
> -        mfn = mfn_x(gfn_to_mfn(d, _gfn(gop.mfn)));
> +        mfn = gfn_to_mfn(d, _gfn(gop.mfn));
>  #endif
>  
>          /* Check the passed page frame for basic validity. */
> -        if ( unlikely(!mfn_valid(_mfn(mfn))) )
> +        if ( unlikely(!mfn_valid(mfn)) )
>          {
>              put_gfn(d, gop.mfn);
>              gdprintk(XENLOG_INFO, "out-of-range %lx\n", (unsigned long)gop.mfn);
> @@ -2146,12 +2155,13 @@ gnttab_transfer(
>              goto copyback;
>          }
>  
> -        rc = guest_physmap_remove_page(d, _gfn(gop.mfn), _mfn(mfn), 0);
> +        rc = guest_physmap_remove_page(d, _gfn(gop.mfn), mfn, 0);
>          gnttab_flush_tlb(d);
>          if ( rc )
>          {
> -            gdprintk(XENLOG_INFO, "can't remove GFN %"PRI_xen_pfn" (MFN %lx)\n",
> -                     gop.mfn, mfn);
> +            gdprintk(XENLOG_INFO,
> +                     "can't remove GFN %"PRI_xen_pfn" (MFN %#"PRI_mfn")\n",
> +                     gop.mfn, mfn_x(mfn));
>              gop.status = GNTST_general_error;
>              goto put_gfn_and_copyback;
>          }
> @@ -2180,7 +2190,7 @@ gnttab_transfer(
>              e, e->grant_table->gt_version > 1 || paging_mode_translate(e)
>                 ? BITS_PER_LONG + PAGE_SHIFT : 32 + PAGE_SHIFT);
>          if ( max_bitsize < BITS_PER_LONG + PAGE_SHIFT &&
> -             (mfn >> (max_bitsize - PAGE_SHIFT)) )
> +             (mfn_x(mfn) >> (max_bitsize - PAGE_SHIFT)) )
>          {
>              struct page_info *new_page;
>  
> @@ -2192,7 +2202,7 @@ gnttab_transfer(
>                  goto unlock_and_copyback;
>              }
>  
> -            copy_domain_page(_mfn(page_to_mfn(new_page)), _mfn(mfn));
> +            copy_domain_page(page_to_mfn(new_page), mfn);
>  
>              page->count_info &= ~(PGC_count_mask|PGC_allocated);
>              free_domheap_page(page);
> @@ -2269,18 +2279,17 @@ gnttab_transfer(
>          {
>              grant_entry_v1_t *sha = &shared_entry_v1(e->grant_table, gop.ref);
>  
> -            guest_physmap_add_page(e, _gfn(sha->frame), _mfn(mfn), 0);
> +            guest_physmap_add_page(e, _gfn(sha->frame), mfn, 0);
>              if ( !paging_mode_translate(e) )
> -                sha->frame = mfn;
> +                sha->frame = mfn_x(mfn);
>          }
>          else
>          {
>              grant_entry_v2_t *sha = &shared_entry_v2(e->grant_table, gop.ref);
>  
> -            guest_physmap_add_page(e, _gfn(sha->full_page.frame),
> -                                   _mfn(mfn), 0);
> +            guest_physmap_add_page(e, _gfn(sha->full_page.frame), mfn, 0);
>              if ( !paging_mode_translate(e) )
> -                sha->full_page.frame = mfn;
> +                sha->full_page.frame = mfn_x(mfn);
>          }
>          smp_wmb();
>          shared_entry_header(e->grant_table, gop.ref)->flags |=
> @@ -2316,7 +2325,7 @@ release_grant_for_copy(
>      struct grant_table *rgt = rd->grant_table;
>      grant_entry_header_t *sha;
>      struct active_grant_entry *act;
> -    unsigned long r_frame;
> +    mfn_t r_frame;
>      uint16_t *status;
>      grant_ref_t trans_gref;
>      struct domain *td;
> @@ -2393,7 +2402,7 @@ static void fixup_status_for_copy_pin(const struct active_grant_entry *act,
>  static int
>  acquire_grant_for_copy(
>      struct domain *rd, grant_ref_t gref, domid_t ldom, bool readonly,
> -    unsigned long *frame, struct page_info **page,
> +    mfn_t *frame, struct page_info **page,
>      uint16_t *page_off, uint16_t *length, bool allow_transitive)
>  {
>      struct grant_table *rgt = rd->grant_table;
> @@ -2405,7 +2414,7 @@ acquire_grant_for_copy(
>      domid_t trans_domid;
>      grant_ref_t trans_gref;
>      struct domain *td;
> -    unsigned long grant_frame;
> +    mfn_t grant_frame;
>      uint16_t trans_page_off;
>      uint16_t trans_length;
>      bool is_sub_page;
> @@ -2506,7 +2515,8 @@ acquire_grant_for_copy(
>           */
>          if ( rgt->gt_version != 2 ||
>               act->pin != old_pin ||
> -             (old_pin && (act->domid != ldom || act->frame != grant_frame ||
> +             (old_pin && (act->domid != ldom ||
> +                          !mfn_eq(act->frame, grant_frame) ||
>                            act->start != trans_page_off ||
>                            act->length != trans_length ||
>                            act->trans_domain != td ||
> @@ -2598,7 +2608,7 @@ acquire_grant_for_copy(
>      }
>      else
>      {
> -        ASSERT(mfn_valid(_mfn(act->frame)));
> +        ASSERT(mfn_valid(act->frame));
>          *page = mfn_to_page(act->frame);
>          td = page_get_owner_and_reference(*page);
>          /*
> @@ -2653,7 +2663,7 @@ struct gnttab_copy_buf {
>  
>      /* Mapped etc. */
>      struct domain *domain;
> -    unsigned long frame;
> +    mfn_t frame;
>      struct page_info *page;
>      void *virt;
>      bool_t read_only;
> @@ -2785,15 +2795,16 @@ static int gnttab_copy_claim_buf(const struct gnttab_copy *op,
>          if ( !get_page_type(buf->page, PGT_writable_page) )
>          {
>              if ( !buf->domain->is_dying )
> -                gdprintk(XENLOG_WARNING, "Could not get writable frame %lx\n",
> -                         buf->frame);
> +                gdprintk(XENLOG_WARNING,
> +                         "Could not get writable frame %#"PRI_mfn"\n",
> +                         mfn_x(buf->frame));
>              rc = GNTST_general_error;
>              goto out;
>          }
>          buf->have_type = 1;
>      }
>  
> -    buf->virt = map_domain_page(_mfn(buf->frame));
> +    buf->virt = map_domain_page(buf->frame);
>      rc = GNTST_okay;
>  
>   out:
> @@ -3296,7 +3307,7 @@ static int cache_flush(const gnttab_cache_flush_t *cflush, grant_ref_t *cur_ref)
>  {
>      struct domain *d, *owner;
>      struct page_info *page;
> -    unsigned long mfn;
> +    mfn_t mfn;
>      struct active_grant_entry *act = NULL;
>      void *v;
>      int ret;
> @@ -3315,9 +3326,9 @@ static int cache_flush(const gnttab_cache_flush_t *cflush, grant_ref_t *cur_ref)
>          return -EOPNOTSUPP;
>  
>      d = rcu_lock_current_domain();
> -    mfn = cflush->a.dev_bus_addr >> PAGE_SHIFT;
> +    mfn = maddr_to_mfn(cflush->a.dev_bus_addr);
>  
> -    if ( !mfn_valid(_mfn(mfn)) )
> +    if ( !mfn_valid(mfn) )
>      {
>          rcu_unlock_domain(d);
>          return -EINVAL;
> @@ -3345,7 +3356,7 @@ static int cache_flush(const gnttab_cache_flush_t *cflush, grant_ref_t *cur_ref)
>          }
>      }
>  
> -    v = map_domain_page(_mfn(mfn));
> +    v = map_domain_page(mfn);
>      v += cflush->offset;
>  
>      if ( (cflush->op & GNTTAB_CACHE_INVAL) && (cflush->op & GNTTAB_CACHE_CLEAN) )
> @@ -3663,7 +3674,7 @@ gnttab_release_mappings(
>              {
>                  BUG_ON(!(act->pin & GNTPIN_devr_mask));
>                  act->pin -= GNTPIN_devr_inc;
> -                if ( !is_iomem_page(_mfn(act->frame)) )
> +                if ( !is_iomem_page(act->frame) )
>                      put_page(pg);
>              }
>  
> @@ -3672,7 +3683,7 @@ gnttab_release_mappings(
>                  BUG_ON(!(act->pin & GNTPIN_hstr_mask));
>                  act->pin -= GNTPIN_hstr_inc;
>                  if ( gnttab_release_host_mappings(d) &&
> -                     !is_iomem_page(_mfn(act->frame)) )
> +                     !is_iomem_page(act->frame) )
>                      put_page(pg);
>              }
>          }
> @@ -3682,7 +3693,7 @@ gnttab_release_mappings(
>              {
>                  BUG_ON(!(act->pin & GNTPIN_devw_mask));
>                  act->pin -= GNTPIN_devw_inc;
> -                if ( !is_iomem_page(_mfn(act->frame)) )
> +                if ( !is_iomem_page(act->frame) )
>                      put_page_and_type(pg);
>              }
>  
> @@ -3691,7 +3702,7 @@ gnttab_release_mappings(
>                  BUG_ON(!(act->pin & GNTPIN_hstw_mask));
>                  act->pin -= GNTPIN_hstw_inc;
>                  if ( gnttab_release_host_mappings(d) &&
> -                     !is_iomem_page(_mfn(act->frame)) )
> +                     !is_iomem_page(act->frame) )
>                  {
>                      if ( gnttab_host_mapping_get_page_type((map->flags &
>                                                              GNTMAP_readonly),
> @@ -3743,12 +3754,12 @@ void grant_table_warn_active_grants(struct domain *d)
>  #ifndef NDEBUG
>                     "GFN %lx, "
>  #endif
> -                   "MFN: %lx)\n",
> +                   "MFN: %#"PRI_mfn")\n",
>                     d->domain_id, ref,
>  #ifndef NDEBUG
>                     gfn_x(act->gfn),
>  #endif
> -                   act->frame);
> +                   mfn_x(act->frame));
>          active_entry_release(act);
>      }
>  
> @@ -3955,9 +3966,9 @@ static void gnttab_usage_print(struct domain *rd)
>  
>          first = 0;
>  
> -        /*      [0xXXX]  ddddd 0xXXXXXX 0xXXXXXXXX      ddddd 0xXXXXXX 0xXX */
> -        printk("[0x%03x]  %5d 0x%06lx 0x%08x      %5d 0x%06"PRIx64" 0x%02x\n",
> -               ref, act->domid, act->frame, act->pin,
> +        /*      [0xXXX]  ddddd 0xXXXXX 0xXXXXXXXX      ddddd 0xXXXXXX 0xXX */
> +        printk("[0x%03x]  %5d 0x%"PRI_mfn" 0x%08x      %5d 0x%06"PRIx64" 0x%02x\n",
> +               ref, act->domid, mfn_x(act->frame), act->pin,
>                 sha->domid, frame, status);
>          active_entry_release(act);
>      }
> diff --git a/xen/include/asm-arm/grant_table.h b/xen/include/asm-arm/grant_table.h
> index 24644084a1..e52936c79f 100644
> --- a/xen/include/asm-arm/grant_table.h
> +++ b/xen/include/asm-arm/grant_table.h
> @@ -19,7 +19,7 @@ int create_grant_host_mapping(unsigned long gpaddr, mfn_t mfn,
>  #define gnttab_host_mapping_get_page_type(ro, ld, rd) (0)
>  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);
> +void gnttab_mark_dirty(struct domain *d, mfn_t mfn);
>  #define gnttab_create_status_page(d, t, i) do {} while (0)
>  #define gnttab_release_host_mappings(domain) 1
>  static inline int replace_grant_supported(void)
> diff --git a/xen/include/asm-x86/grant_table.h b/xen/include/asm-x86/grant_table.h
> index fc07291ff2..e42030936b 100644
> --- a/xen/include/asm-x86/grant_table.h
> +++ b/xen/include/asm-x86/grant_table.h
> @@ -80,7 +80,7 @@ static inline unsigned int gnttab_dom0_max(void)
>  #define gnttab_status_gmfn(d, t, i)                     \
>      (mfn_to_gmfn(d, gnttab_status_mfn(t, i)))
>  
> -#define gnttab_mark_dirty(d, f) paging_mark_dirty((d), _mfn(f))
> +#define gnttab_mark_dirty(d, f) paging_mark_dirty((d), f)
>  
>  static inline void gnttab_clear_flag(unsigned int nr, uint16_t *st)
>  {
> -- 
> 2.11.0
>
diff mbox series

Patch

diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c
index 49080ca0ac..eb3659f913 100644
--- a/xen/arch/arm/mm.c
+++ b/xen/arch/arm/mm.c
@@ -1408,7 +1408,7 @@  void gnttab_clear_flag(unsigned long nr, uint16_t *addr)
     } while (cmpxchg(addr, old, old & mask) != old);
 }
 
-void gnttab_mark_dirty(struct domain *d, unsigned long l)
+void gnttab_mark_dirty(struct domain *d, mfn_t mfn)
 {
     /* XXX: mark dirty */
     static int warning;
diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c
index f9e3d1bb95..4bedf5984a 100644
--- a/xen/common/grant_table.c
+++ b/xen/common/grant_table.c
@@ -40,6 +40,12 @@ 
 #include <xsm/xsm.h>
 #include <asm/flushtlb.h>
 
+/* Override macros from asm/page.h to make them work with mfn_t */
+#undef page_to_mfn
+#define page_to_mfn(pg) _mfn(__page_to_mfn(pg))
+#undef mfn_to_page
+#define mfn_to_page(mfn) __mfn_to_page(mfn_x(mfn))
+
 /* Per-domain grant information. */
 struct grant_table {
     /*
@@ -167,7 +173,7 @@  struct gnttab_unmap_common {
 
     /* Shared state beteen *_unmap and *_unmap_complete */
     uint16_t done;
-    unsigned long frame;
+    mfn_t frame;
     struct domain *rd;
     grant_ref_t ref;
 };
@@ -266,7 +272,7 @@  struct active_grant_entry {
                                 grant.                                */
     grant_ref_t   trans_gref;
     struct domain *trans_domain;
-    unsigned long frame;  /* Frame being granted.                     */
+    mfn_t         frame;  /* Frame being granted.                     */
 #ifndef NDEBUG
     gfn_t         gfn;    /* Guest's idea of the frame being granted. */
 #endif
@@ -371,14 +377,14 @@  static inline unsigned int grant_to_status_frames(unsigned int grant_frames)
    If rc == GNTST_okay, *page contains the page struct with a ref taken.
    Caller must do put_page(*page).
    If any error, *page = NULL, *frame = INVALID_MFN, no ref taken. */
-static int get_paged_frame(unsigned long gfn, unsigned long *frame,
+static int get_paged_frame(unsigned long gfn, mfn_t *frame,
                            struct page_info **page, bool readonly,
                            struct domain *rd)
 {
     int rc = GNTST_okay;
     p2m_type_t p2mt;
 
-    *frame = mfn_x(INVALID_MFN);
+    *frame = INVALID_MFN;
     *page = get_page_from_gfn(rd, gfn, &p2mt,
                               readonly ? P2M_ALLOC : P2M_UNSHARE);
     if ( !*page )
@@ -823,7 +829,7 @@  static int _set_status(unsigned gt_version,
 
 static struct active_grant_entry *grant_map_exists(const struct domain *ld,
                                                    struct grant_table *rgt,
-                                                   unsigned long mfn,
+                                                   mfn_t mfn,
                                                    grant_ref_t *cur_ref)
 {
     grant_ref_t ref, max_iter;
@@ -842,7 +848,8 @@  static struct active_grant_entry *grant_map_exists(const struct domain *ld,
     {
         struct active_grant_entry *act = active_entry_acquire(rgt, ref);
 
-        if ( act->pin && act->domid == ld->domain_id && act->frame == mfn )
+        if ( act->pin && act->domid == ld->domain_id &&
+             mfn_eq(act->frame, mfn) )
             return act;
         active_entry_release(act);
     }
@@ -859,7 +866,7 @@  static struct active_grant_entry *grant_map_exists(const struct domain *ld,
 #define MAPKIND_READ 1
 #define MAPKIND_WRITE 2
 static unsigned int mapkind(
-    struct grant_table *lgt, const struct domain *rd, unsigned long mfn)
+    struct grant_table *lgt, const struct domain *rd, mfn_t mfn)
 {
     struct grant_mapping *map;
     grant_handle_t handle, limit = lgt->maptrack_limit;
@@ -884,7 +891,7 @@  static unsigned int mapkind(
         if ( !(map->flags & (GNTMAP_device_map|GNTMAP_host_map)) ||
              map->domid != rd->domain_id )
             continue;
-        if ( _active_entry(rd->grant_table, map->ref).frame == mfn )
+        if ( mfn_eq(_active_entry(rd->grant_table, map->ref).frame, mfn) )
             kind |= map->flags & GNTMAP_readonly ?
                     MAPKIND_READ : MAPKIND_WRITE;
     }
@@ -907,7 +914,7 @@  map_grant_ref(
     struct grant_table *lgt, *rgt;
     struct vcpu   *led;
     grant_handle_t handle;
-    unsigned long  frame = 0;
+    mfn_t frame;
     struct page_info *pg = NULL;
     int            rc = GNTST_okay;
     u32            old_pin;
@@ -1034,7 +1041,7 @@  map_grant_ref(
     /* pg may be set, with a refcount included, from get_paged_frame(). */
     if ( !pg )
     {
-        pg = mfn_valid(_mfn(frame)) ? mfn_to_page(frame) : NULL;
+        pg = mfn_valid(frame) ? mfn_to_page(frame) : NULL;
         if ( pg )
             owner = page_get_owner_and_reference(pg);
     }
@@ -1060,18 +1067,18 @@  map_grant_ref(
             goto undo_out;
         }
 
-        if ( !iomem_access_permitted(rd, frame, frame) )
+        if ( !iomem_access_permitted(rd, mfn_x(frame), mfn_x(frame)) )
         {
             gdprintk(XENLOG_WARNING,
-                     "Iomem mapping not permitted %lx (domain %d)\n",
-                     frame, rd->domain_id);
+                     "Iomem mapping not permitted %#"PRI_mfn" (domain %d)\n",
+                     mfn_x(frame), rd->domain_id);
             rc = GNTST_general_error;
             goto undo_out;
         }
 
         if ( op->flags & GNTMAP_host_map )
         {
-            rc = create_grant_host_mapping(op->host_addr, _mfn(frame), op->flags,
+            rc = create_grant_host_mapping(op->host_addr, frame, op->flags,
                                            cache_flags);
             if ( rc != GNTST_okay )
                 goto undo_out;
@@ -1111,7 +1118,7 @@  map_grant_ref(
                 typecnt++;
             }
 
-            rc = create_grant_host_mapping(op->host_addr, _mfn(frame), op->flags, 0);
+            rc = create_grant_host_mapping(op->host_addr, frame, op->flags, 0);
             if ( rc != GNTST_okay )
                 goto undo_out;
 
@@ -1122,8 +1129,8 @@  map_grant_ref(
     {
     could_not_pin:
         if ( !rd->is_dying )
-            gdprintk(XENLOG_WARNING, "Could not pin grant frame %lx\n",
-                     frame);
+            gdprintk(XENLOG_WARNING, "Could not pin grant frame %#"PRI_mfn"\n",
+                     mfn_x(frame));
         rc = GNTST_general_error;
         goto undo_out;
     }
@@ -1143,13 +1150,14 @@  map_grant_ref(
              !(old_pin & (GNTPIN_hstw_mask|GNTPIN_devw_mask)) )
         {
             if ( !(kind & MAPKIND_WRITE) )
-                err = iommu_map_page(ld, frame, frame,
+                err = iommu_map_page(ld, mfn_x(frame), mfn_x(frame),
                                      IOMMUF_readable|IOMMUF_writable);
         }
         else if ( act_pin && !old_pin )
         {
             if ( !kind )
-                err = iommu_map_page(ld, frame, frame, IOMMUF_readable);
+                err = iommu_map_page(ld, mfn_x(frame), mfn_x(frame),
+                                     IOMMUF_readable);
         }
         if ( err )
         {
@@ -1178,7 +1186,7 @@  map_grant_ref(
     if ( need_iommu )
         double_gt_unlock(lgt, rgt);
 
-    op->dev_bus_addr = (u64)frame << PAGE_SHIFT;
+    op->dev_bus_addr = mfn_to_maddr(frame);
     op->handle       = handle;
     op->status       = GNTST_okay;
 
@@ -1188,7 +1196,7 @@  map_grant_ref(
  undo_out:
     if ( host_map_created )
     {
-        replace_grant_host_mapping(op->host_addr, _mfn(frame), 0, op->flags);
+        replace_grant_host_mapping(op->host_addr, frame, 0, op->flags);
         gnttab_flush_tlb(ld);
     }
 
@@ -1366,15 +1374,15 @@  unmap_common(
     op->frame = act->frame;
 
     if ( op->dev_bus_addr &&
-         unlikely(op->dev_bus_addr != pfn_to_paddr(act->frame)) )
+         unlikely(op->dev_bus_addr != mfn_to_maddr(act->frame)) )
         PIN_FAIL(act_release_out, GNTST_general_error,
                  "Bus address doesn't match gntref (%"PRIx64" != %"PRIpaddr")\n",
-                 op->dev_bus_addr, pfn_to_paddr(act->frame));
+                 op->dev_bus_addr, mfn_to_maddr(act->frame));
 
     if ( op->host_addr && (flags & GNTMAP_host_map) )
     {
         if ( (rc = replace_grant_host_mapping(op->host_addr,
-                                              _mfn(op->frame), op->new_addr,
+                                              op->frame, op->new_addr,
                                               flags)) < 0 )
             goto act_release_out;
 
@@ -1411,9 +1419,10 @@  unmap_common(
 
         kind = mapkind(lgt, rd, op->frame);
         if ( !kind )
-            err = iommu_unmap_page(ld, op->frame);
+            err = iommu_unmap_page(ld, mfn_x(op->frame));
         else if ( !(kind & MAPKIND_WRITE) )
-            err = iommu_map_page(ld, op->frame, op->frame, IOMMUF_readable);
+            err = iommu_map_page(ld, mfn_x(op->frame),
+                                 mfn_x(op->frame), IOMMUF_readable);
 
         double_gt_unlock(lgt, rgt);
 
@@ -1464,7 +1473,7 @@  unmap_common_complete(struct gnttab_unmap_common *op)
 
     if ( op->done & GNTMAP_device_map )
     {
-        if ( !is_iomem_page(_mfn(act->frame)) )
+        if ( !is_iomem_page(act->frame) )
         {
             if ( op->done & GNTMAP_readonly )
                 put_page(pg);
@@ -1481,7 +1490,7 @@  unmap_common_complete(struct gnttab_unmap_common *op)
 
     if ( op->done & GNTMAP_host_map )
     {
-        if ( !is_iomem_page(_mfn(op->frame)) )
+        if ( !is_iomem_page(op->frame) )
         {
             if ( gnttab_host_mapping_get_page_type(op->done & GNTMAP_readonly,
                                                    ld, rd) )
@@ -1522,7 +1531,7 @@  unmap_grant_ref(
     common->done = 0;
     common->new_addr = 0;
     common->rd = NULL;
-    common->frame = 0;
+    common->frame = INVALID_MFN;
 
     unmap_common(common);
     op->status = common->status;
@@ -1588,7 +1597,7 @@  unmap_and_replace(
     common->done = 0;
     common->dev_bus_addr = 0;
     common->rd = NULL;
-    common->frame = 0;
+    common->frame = INVALID_MFN;
 
     unmap_common(common);
     op->status = common->status;
@@ -1692,7 +1701,7 @@  gnttab_unpopulate_status_frames(struct domain *d, struct grant_table *gt)
             int rc = gfn_eq(gfn, INVALID_GFN)
                      ? 0
                      : guest_physmap_remove_page(d, gfn,
-                                                 _mfn(page_to_mfn(pg)), 0);
+                                                 page_to_mfn(pg), 0);
 
             if ( rc )
             {
@@ -2097,7 +2106,7 @@  gnttab_transfer(
     struct page_info *page;
     int i;
     struct gnttab_transfer gop;
-    unsigned long mfn;
+    mfn_t mfn;
     unsigned int max_bitsize;
     struct active_grant_entry *act;
 
@@ -2121,16 +2130,16 @@  gnttab_transfer(
         {
             p2m_type_t p2mt;
 
-            mfn = mfn_x(get_gfn_unshare(d, gop.mfn, &p2mt));
+            mfn = get_gfn_unshare(d, gop.mfn, &p2mt);
             if ( p2m_is_shared(p2mt) || !p2m_is_valid(p2mt) )
-                mfn = mfn_x(INVALID_MFN);
+                mfn = INVALID_MFN;
         }
 #else
-        mfn = mfn_x(gfn_to_mfn(d, _gfn(gop.mfn)));
+        mfn = gfn_to_mfn(d, _gfn(gop.mfn));
 #endif
 
         /* Check the passed page frame for basic validity. */
-        if ( unlikely(!mfn_valid(_mfn(mfn))) )
+        if ( unlikely(!mfn_valid(mfn)) )
         {
             put_gfn(d, gop.mfn);
             gdprintk(XENLOG_INFO, "out-of-range %lx\n", (unsigned long)gop.mfn);
@@ -2146,12 +2155,13 @@  gnttab_transfer(
             goto copyback;
         }
 
-        rc = guest_physmap_remove_page(d, _gfn(gop.mfn), _mfn(mfn), 0);
+        rc = guest_physmap_remove_page(d, _gfn(gop.mfn), mfn, 0);
         gnttab_flush_tlb(d);
         if ( rc )
         {
-            gdprintk(XENLOG_INFO, "can't remove GFN %"PRI_xen_pfn" (MFN %lx)\n",
-                     gop.mfn, mfn);
+            gdprintk(XENLOG_INFO,
+                     "can't remove GFN %"PRI_xen_pfn" (MFN %#"PRI_mfn")\n",
+                     gop.mfn, mfn_x(mfn));
             gop.status = GNTST_general_error;
             goto put_gfn_and_copyback;
         }
@@ -2180,7 +2190,7 @@  gnttab_transfer(
             e, e->grant_table->gt_version > 1 || paging_mode_translate(e)
                ? BITS_PER_LONG + PAGE_SHIFT : 32 + PAGE_SHIFT);
         if ( max_bitsize < BITS_PER_LONG + PAGE_SHIFT &&
-             (mfn >> (max_bitsize - PAGE_SHIFT)) )
+             (mfn_x(mfn) >> (max_bitsize - PAGE_SHIFT)) )
         {
             struct page_info *new_page;
 
@@ -2192,7 +2202,7 @@  gnttab_transfer(
                 goto unlock_and_copyback;
             }
 
-            copy_domain_page(_mfn(page_to_mfn(new_page)), _mfn(mfn));
+            copy_domain_page(page_to_mfn(new_page), mfn);
 
             page->count_info &= ~(PGC_count_mask|PGC_allocated);
             free_domheap_page(page);
@@ -2269,18 +2279,17 @@  gnttab_transfer(
         {
             grant_entry_v1_t *sha = &shared_entry_v1(e->grant_table, gop.ref);
 
-            guest_physmap_add_page(e, _gfn(sha->frame), _mfn(mfn), 0);
+            guest_physmap_add_page(e, _gfn(sha->frame), mfn, 0);
             if ( !paging_mode_translate(e) )
-                sha->frame = mfn;
+                sha->frame = mfn_x(mfn);
         }
         else
         {
             grant_entry_v2_t *sha = &shared_entry_v2(e->grant_table, gop.ref);
 
-            guest_physmap_add_page(e, _gfn(sha->full_page.frame),
-                                   _mfn(mfn), 0);
+            guest_physmap_add_page(e, _gfn(sha->full_page.frame), mfn, 0);
             if ( !paging_mode_translate(e) )
-                sha->full_page.frame = mfn;
+                sha->full_page.frame = mfn_x(mfn);
         }
         smp_wmb();
         shared_entry_header(e->grant_table, gop.ref)->flags |=
@@ -2316,7 +2325,7 @@  release_grant_for_copy(
     struct grant_table *rgt = rd->grant_table;
     grant_entry_header_t *sha;
     struct active_grant_entry *act;
-    unsigned long r_frame;
+    mfn_t r_frame;
     uint16_t *status;
     grant_ref_t trans_gref;
     struct domain *td;
@@ -2393,7 +2402,7 @@  static void fixup_status_for_copy_pin(const struct active_grant_entry *act,
 static int
 acquire_grant_for_copy(
     struct domain *rd, grant_ref_t gref, domid_t ldom, bool readonly,
-    unsigned long *frame, struct page_info **page,
+    mfn_t *frame, struct page_info **page,
     uint16_t *page_off, uint16_t *length, bool allow_transitive)
 {
     struct grant_table *rgt = rd->grant_table;
@@ -2405,7 +2414,7 @@  acquire_grant_for_copy(
     domid_t trans_domid;
     grant_ref_t trans_gref;
     struct domain *td;
-    unsigned long grant_frame;
+    mfn_t grant_frame;
     uint16_t trans_page_off;
     uint16_t trans_length;
     bool is_sub_page;
@@ -2506,7 +2515,8 @@  acquire_grant_for_copy(
          */
         if ( rgt->gt_version != 2 ||
              act->pin != old_pin ||
-             (old_pin && (act->domid != ldom || act->frame != grant_frame ||
+             (old_pin && (act->domid != ldom ||
+                          !mfn_eq(act->frame, grant_frame) ||
                           act->start != trans_page_off ||
                           act->length != trans_length ||
                           act->trans_domain != td ||
@@ -2598,7 +2608,7 @@  acquire_grant_for_copy(
     }
     else
     {
-        ASSERT(mfn_valid(_mfn(act->frame)));
+        ASSERT(mfn_valid(act->frame));
         *page = mfn_to_page(act->frame);
         td = page_get_owner_and_reference(*page);
         /*
@@ -2653,7 +2663,7 @@  struct gnttab_copy_buf {
 
     /* Mapped etc. */
     struct domain *domain;
-    unsigned long frame;
+    mfn_t frame;
     struct page_info *page;
     void *virt;
     bool_t read_only;
@@ -2785,15 +2795,16 @@  static int gnttab_copy_claim_buf(const struct gnttab_copy *op,
         if ( !get_page_type(buf->page, PGT_writable_page) )
         {
             if ( !buf->domain->is_dying )
-                gdprintk(XENLOG_WARNING, "Could not get writable frame %lx\n",
-                         buf->frame);
+                gdprintk(XENLOG_WARNING,
+                         "Could not get writable frame %#"PRI_mfn"\n",
+                         mfn_x(buf->frame));
             rc = GNTST_general_error;
             goto out;
         }
         buf->have_type = 1;
     }
 
-    buf->virt = map_domain_page(_mfn(buf->frame));
+    buf->virt = map_domain_page(buf->frame);
     rc = GNTST_okay;
 
  out:
@@ -3296,7 +3307,7 @@  static int cache_flush(const gnttab_cache_flush_t *cflush, grant_ref_t *cur_ref)
 {
     struct domain *d, *owner;
     struct page_info *page;
-    unsigned long mfn;
+    mfn_t mfn;
     struct active_grant_entry *act = NULL;
     void *v;
     int ret;
@@ -3315,9 +3326,9 @@  static int cache_flush(const gnttab_cache_flush_t *cflush, grant_ref_t *cur_ref)
         return -EOPNOTSUPP;
 
     d = rcu_lock_current_domain();
-    mfn = cflush->a.dev_bus_addr >> PAGE_SHIFT;
+    mfn = maddr_to_mfn(cflush->a.dev_bus_addr);
 
-    if ( !mfn_valid(_mfn(mfn)) )
+    if ( !mfn_valid(mfn) )
     {
         rcu_unlock_domain(d);
         return -EINVAL;
@@ -3345,7 +3356,7 @@  static int cache_flush(const gnttab_cache_flush_t *cflush, grant_ref_t *cur_ref)
         }
     }
 
-    v = map_domain_page(_mfn(mfn));
+    v = map_domain_page(mfn);
     v += cflush->offset;
 
     if ( (cflush->op & GNTTAB_CACHE_INVAL) && (cflush->op & GNTTAB_CACHE_CLEAN) )
@@ -3663,7 +3674,7 @@  gnttab_release_mappings(
             {
                 BUG_ON(!(act->pin & GNTPIN_devr_mask));
                 act->pin -= GNTPIN_devr_inc;
-                if ( !is_iomem_page(_mfn(act->frame)) )
+                if ( !is_iomem_page(act->frame) )
                     put_page(pg);
             }
 
@@ -3672,7 +3683,7 @@  gnttab_release_mappings(
                 BUG_ON(!(act->pin & GNTPIN_hstr_mask));
                 act->pin -= GNTPIN_hstr_inc;
                 if ( gnttab_release_host_mappings(d) &&
-                     !is_iomem_page(_mfn(act->frame)) )
+                     !is_iomem_page(act->frame) )
                     put_page(pg);
             }
         }
@@ -3682,7 +3693,7 @@  gnttab_release_mappings(
             {
                 BUG_ON(!(act->pin & GNTPIN_devw_mask));
                 act->pin -= GNTPIN_devw_inc;
-                if ( !is_iomem_page(_mfn(act->frame)) )
+                if ( !is_iomem_page(act->frame) )
                     put_page_and_type(pg);
             }
 
@@ -3691,7 +3702,7 @@  gnttab_release_mappings(
                 BUG_ON(!(act->pin & GNTPIN_hstw_mask));
                 act->pin -= GNTPIN_hstw_inc;
                 if ( gnttab_release_host_mappings(d) &&
-                     !is_iomem_page(_mfn(act->frame)) )
+                     !is_iomem_page(act->frame) )
                 {
                     if ( gnttab_host_mapping_get_page_type((map->flags &
                                                             GNTMAP_readonly),
@@ -3743,12 +3754,12 @@  void grant_table_warn_active_grants(struct domain *d)
 #ifndef NDEBUG
                    "GFN %lx, "
 #endif
-                   "MFN: %lx)\n",
+                   "MFN: %#"PRI_mfn")\n",
                    d->domain_id, ref,
 #ifndef NDEBUG
                    gfn_x(act->gfn),
 #endif
-                   act->frame);
+                   mfn_x(act->frame));
         active_entry_release(act);
     }
 
@@ -3955,9 +3966,9 @@  static void gnttab_usage_print(struct domain *rd)
 
         first = 0;
 
-        /*      [0xXXX]  ddddd 0xXXXXXX 0xXXXXXXXX      ddddd 0xXXXXXX 0xXX */
-        printk("[0x%03x]  %5d 0x%06lx 0x%08x      %5d 0x%06"PRIx64" 0x%02x\n",
-               ref, act->domid, act->frame, act->pin,
+        /*      [0xXXX]  ddddd 0xXXXXX 0xXXXXXXXX      ddddd 0xXXXXXX 0xXX */
+        printk("[0x%03x]  %5d 0x%"PRI_mfn" 0x%08x      %5d 0x%06"PRIx64" 0x%02x\n",
+               ref, act->domid, mfn_x(act->frame), act->pin,
                sha->domid, frame, status);
         active_entry_release(act);
     }
diff --git a/xen/include/asm-arm/grant_table.h b/xen/include/asm-arm/grant_table.h
index 24644084a1..e52936c79f 100644
--- a/xen/include/asm-arm/grant_table.h
+++ b/xen/include/asm-arm/grant_table.h
@@ -19,7 +19,7 @@  int create_grant_host_mapping(unsigned long gpaddr, mfn_t mfn,
 #define gnttab_host_mapping_get_page_type(ro, ld, rd) (0)
 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);
+void gnttab_mark_dirty(struct domain *d, mfn_t mfn);
 #define gnttab_create_status_page(d, t, i) do {} while (0)
 #define gnttab_release_host_mappings(domain) 1
 static inline int replace_grant_supported(void)
diff --git a/xen/include/asm-x86/grant_table.h b/xen/include/asm-x86/grant_table.h
index fc07291ff2..e42030936b 100644
--- a/xen/include/asm-x86/grant_table.h
+++ b/xen/include/asm-x86/grant_table.h
@@ -80,7 +80,7 @@  static inline unsigned int gnttab_dom0_max(void)
 #define gnttab_status_gmfn(d, t, i)                     \
     (mfn_to_gmfn(d, gnttab_status_mfn(t, i)))
 
-#define gnttab_mark_dirty(d, f) paging_mark_dirty((d), _mfn(f))
+#define gnttab_mark_dirty(d, f) paging_mark_dirty((d), f)
 
 static inline void gnttab_clear_flag(unsigned int nr, uint16_t *st)
 {