msm_serial: fix serial on trout
[safe/jmp/linux-2.6] / drivers / xen / grant-table.c
index d4a89b3..f66db3b 100644 (file)
 #include <linux/module.h>
 #include <linux/sched.h>
 #include <linux/mm.h>
+#include <linux/slab.h>
 #include <linux/vmalloc.h>
 #include <linux/uaccess.h>
 
+#include <xen/xen.h>
 #include <xen/interface/xen.h>
 #include <xen/page.h>
 #include <xen/grant_table.h>
+#include <asm/xen/hypercall.h>
 
 #include <asm/pgtable.h>
 #include <asm/sync_bitops.h>
@@ -439,24 +442,6 @@ static inline unsigned int max_nr_grant_frames(void)
        return xen_max;
 }
 
-static int map_pte_fn(pte_t *pte, struct page *pmd_page,
-                     unsigned long addr, void *data)
-{
-       unsigned long **frames = (unsigned long **)data;
-
-       set_pte_at(&init_mm, addr, pte, mfn_pte((*frames)[0], PAGE_KERNEL));
-       (*frames)++;
-       return 0;
-}
-
-static int unmap_pte_fn(pte_t *pte, struct page *pmd_page,
-                       unsigned long addr, void *data)
-{
-
-       set_pte_at(&init_mm, addr, pte, __pte(0));
-       return 0;
-}
-
 static int gnttab_map(unsigned int start_idx, unsigned int end_idx)
 {
        struct gnttab_setup_table setup;
@@ -480,36 +465,25 @@ static int gnttab_map(unsigned int start_idx, unsigned int end_idx)
 
        BUG_ON(rc || setup.status);
 
-       if (shared == NULL) {
-               struct vm_struct *area;
-               area = alloc_vm_area(PAGE_SIZE * max_nr_grant_frames());
-               BUG_ON(area == NULL);
-               shared = area->addr;
-       }
-       rc = apply_to_page_range(&init_mm, (unsigned long)shared,
-                                PAGE_SIZE * nr_gframes,
-                                map_pte_fn, &frames);
+       rc = arch_gnttab_map_shared(frames, nr_gframes, max_nr_grant_frames(),
+                                   &shared);
        BUG_ON(rc);
-       frames -= nr_gframes; /* adjust after map_pte_fn() */
 
        kfree(frames);
 
        return 0;
 }
 
-static int gnttab_resume(void)
+int gnttab_resume(void)
 {
        if (max_nr_grant_frames() < nr_grant_frames)
                return -ENOSYS;
        return gnttab_map(0, nr_grant_frames - 1);
 }
 
-static int gnttab_suspend(void)
+int gnttab_suspend(void)
 {
-       apply_to_page_range(&init_mm, (unsigned long)shared,
-                           PAGE_SIZE * nr_grant_frames,
-                           unmap_pte_fn, NULL);
-
+       arch_gnttab_unmap_shared(shared, nr_grant_frames);
        return 0;
 }
 
@@ -537,7 +511,7 @@ static int __devinit gnttab_init(void)
        unsigned int max_nr_glist_frames, nr_glist_frames;
        unsigned int nr_init_grefs;
 
-       if (!is_running_on_xen())
+       if (!xen_domain())
                return -ENODEV;
 
        nr_grant_frames = 1;