Merge tag 'for-linus-4.18-rc1-tag' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 8 Jun 2018 16:24:54 +0000 (09:24 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 8 Jun 2018 16:24:54 +0000 (09:24 -0700)
Pull xen updates from Juergen Gross:
 "This contains some minor code cleanups (fixing return types of
  functions), some fixes for Linux running as Xen PVH guest, and adding
  of a new guest resource mapping feature for Xen tools"

* tag 'for-linus-4.18-rc1-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip:
  xen/PVH: Make GDT selectors PVH-specific
  xen/PVH: Set up GS segment for stack canary
  xen/store: do not store local values in xen_start_info
  xen-netfront: fix xennet_start_xmit()'s return type
  xen/privcmd: add IOCTL_PRIVCMD_MMAP_RESOURCE
  xen: Change return type to vm_fault_t

1  2 
arch/x86/xen/mmu.c

diff --combined arch/x86/xen/mmu.c
@@@ -42,11 -42,13 +42,11 @@@ xmaddr_t arbitrary_virt_to_machine(voi
  }
  EXPORT_SYMBOL_GPL(arbitrary_virt_to_machine);
  
 -static void xen_flush_tlb_all(void)
 +static noinline void xen_flush_tlb_all(void)
  {
        struct mmuext_op *op;
        struct multicall_space mcs;
  
 -      trace_xen_mmu_flush_tlb_all(0);
 -
        preempt_disable();
  
        mcs = xen_mc_entry(sizeof(*op));
  #define REMAP_BATCH_SIZE 16
  
  struct remap_data {
-       xen_pfn_t *mfn;
+       xen_pfn_t *pfn;
        bool contiguous;
+       bool no_translate;
        pgprot_t prot;
        struct mmu_update *mmu_update;
  };
  
- static int remap_area_mfn_pte_fn(pte_t *ptep, pgtable_t token,
+ static int remap_area_pfn_pte_fn(pte_t *ptep, pgtable_t token,
                                 unsigned long addr, void *data)
  {
        struct remap_data *rmd = data;
-       pte_t pte = pte_mkspecial(mfn_pte(*rmd->mfn, rmd->prot));
+       pte_t pte = pte_mkspecial(mfn_pte(*rmd->pfn, rmd->prot));
  
-       /* If we have a contiguous range, just update the mfn itself,
-          else update pointer to be "next mfn". */
+       /*
+        * If we have a contiguous range, just update the pfn itself,
+        * else update pointer to be "next pfn".
+        */
        if (rmd->contiguous)
-               (*rmd->mfn)++;
+               (*rmd->pfn)++;
        else
-               rmd->mfn++;
+               rmd->pfn++;
  
-       rmd->mmu_update->ptr = virt_to_machine(ptep).maddr | MMU_NORMAL_PT_UPDATE;
+       rmd->mmu_update->ptr = virt_to_machine(ptep).maddr;
+       rmd->mmu_update->ptr |= rmd->no_translate ?
+               MMU_PT_UPDATE_NO_TRANSLATE :
+               MMU_NORMAL_PT_UPDATE;
        rmd->mmu_update->val = pte_val_ma(pte);
        rmd->mmu_update++;
  
        return 0;
  }
  
- static int do_remap_gfn(struct vm_area_struct *vma,
+ static int do_remap_pfn(struct vm_area_struct *vma,
                        unsigned long addr,
-                       xen_pfn_t *gfn, int nr,
+                       xen_pfn_t *pfn, int nr,
                        int *err_ptr, pgprot_t prot,
-                       unsigned domid,
+                       unsigned int domid,
+                       bool no_translate,
                        struct page **pages)
  {
        int err = 0;
  
        BUG_ON(!((vma->vm_flags & (VM_PFNMAP | VM_IO)) == (VM_PFNMAP | VM_IO)));
  
-       rmd.mfn = gfn;
+       rmd.pfn = pfn;
        rmd.prot = prot;
-       /* We use the err_ptr to indicate if there we are doing a contiguous
-        * mapping or a discontigious mapping. */
+       /*
+        * We use the err_ptr to indicate if there we are doing a contiguous
+        * mapping or a discontigious mapping.
+        */
        rmd.contiguous = !err_ptr;
+       rmd.no_translate = no_translate;
  
        while (nr) {
                int index = 0;
  
                rmd.mmu_update = mmu_update;
                err = apply_to_page_range(vma->vm_mm, addr, range,
-                                         remap_area_mfn_pte_fn, &rmd);
+                                         remap_area_pfn_pte_fn, &rmd);
                if (err)
                        goto out;
  
@@@ -173,7 -185,8 +183,8 @@@ int xen_remap_domain_gfn_range(struct v
        if (xen_feature(XENFEAT_auto_translated_physmap))
                return -EOPNOTSUPP;
  
-       return do_remap_gfn(vma, addr, &gfn, nr, NULL, prot, domid, pages);
+       return do_remap_pfn(vma, addr, &gfn, nr, NULL, prot, domid, false,
+                           pages);
  }
  EXPORT_SYMBOL_GPL(xen_remap_domain_gfn_range);
  
@@@ -192,10 -205,25 +203,25 @@@ int xen_remap_domain_gfn_array(struct v
         * cause of "wrong memory was mapped in".
         */
        BUG_ON(err_ptr == NULL);
-       return do_remap_gfn(vma, addr, gfn, nr, err_ptr, prot, domid, pages);
+       return do_remap_pfn(vma, addr, gfn, nr, err_ptr, prot, domid,
+                           false, pages);
  }
  EXPORT_SYMBOL_GPL(xen_remap_domain_gfn_array);
  
+ int xen_remap_domain_mfn_array(struct vm_area_struct *vma,
+                              unsigned long addr,
+                              xen_pfn_t *mfn, int nr,
+                              int *err_ptr, pgprot_t prot,
+                              unsigned int domid, struct page **pages)
+ {
+       if (xen_feature(XENFEAT_auto_translated_physmap))
+               return -EOPNOTSUPP;
+       return do_remap_pfn(vma, addr, mfn, nr, err_ptr, prot, domid,
+                           true, pages);
+ }
+ EXPORT_SYMBOL_GPL(xen_remap_domain_mfn_array);
  /* Returns: 0 success */
  int xen_unmap_domain_gfn_range(struct vm_area_struct *vma,
                               int nr, struct page **pages)