On Tue, Dec 09, 2008 at 10:54:57AM +0000, Jan Beulich wrote:
> >Introduce ptep_to_machine() or something like that?
> Yes, if that name isn't ambiguous in some way.
Like this?
To be honest, I haven't tested the patch with highpte yet.
blktap, gntdev: fix highpte handling.
In case of highpte, virt_to_machine() can't be used.
Introduce ptep_to_machine() and use it.
Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
diff --git a/drivers/xen/blktap/blktap.c b/drivers/xen/blktap/blktap.c
--- a/drivers/xen/blktap/blktap.c
+++ b/drivers/xen/blktap/blktap.c
@@ -54,6 +54,7 @@
#include <linux/poll.h>
#include <linux/delay.h>
#include <asm/tlbflush.h>
+#include <asm/pgtable.h>
#define MAX_TAP_DEV 256 /*the maximum number of tapdisk ring devices */
#define MAX_DEV_NAME 100 /*the max tapdisk ring device name e.g. blktap0 */
@@ -364,7 +365,7 @@ static pte_t blktap_clear_pte(struct vm_
BUG_ON(xen_feature(XENFEAT_auto_translated_physmap));
copy = *ptep;
- gnttab_set_unmap_op(&unmap[count], virt_to_machine(ptep),
+ gnttab_set_unmap_op(&unmap[count], ptep_to_machine(ptep),
GNTMAP_host_map
| GNTMAP_application_map
| GNTMAP_contains_pte,
diff --git a/drivers/xen/gntdev/gntdev.c b/drivers/xen/gntdev/gntdev.c
--- a/drivers/xen/gntdev/gntdev.c
+++ b/drivers/xen/gntdev/gntdev.c
@@ -34,7 +34,7 @@
#include <linux/types.h>
#include <xen/public/gntdev.h>
-
+#include <asm/pgtable.h>
#define DRIVER_AUTHOR "Derek G. Murray <Derek.Murray@xxxxxxxxxxxx>"
#define DRIVER_DESC "User-space granted page access driver"
@@ -769,7 +769,7 @@ static pte_t gntdev_clear_pte(struct vm_
GNTDEV_INVALID_HANDLE &&
!xen_feature(XENFEAT_auto_translated_physmap)) {
/* NOT USING SHADOW PAGE TABLES. */
- gnttab_set_unmap_op(&op, virt_to_machine(ptep),
+ gnttab_set_unmap_op(&op, ptep_to_machine(ptep),
GNTMAP_contains_pte,
private_data->grants[slot_index]
.u.valid.user_handle);
diff --git a/include/asm-i386/mach-xen/asm/pgtable.h
b/include/asm-i386/mach-xen/asm/pgtable.h
--- a/include/asm-i386/mach-xen/asm/pgtable.h
+++ b/include/asm-i386/mach-xen/asm/pgtable.h
@@ -488,6 +488,17 @@ void make_pages_writable(void *va, unsig
(((maddr_t)pte_mfn(*virt_to_ptep(va)) << PAGE_SHIFT) \
| ((unsigned long)(va) & (PAGE_SIZE - 1)))
+#ifdef CONFIG_HIGHPTE
+#define ptep_to_machine(ptep) \
+({ \
+ (unsigned long)(ptep) >= (unsigned long)high_memory? \
+ arbitrary_virt_to_machine(ptep) : \
+ virt_to_machine(ptep); \
+})
+#else
+#define ptep_to_machine(ptep) virt_to_machine(ptep)
+#endif
+
#endif /* !__ASSEMBLY__ */
#ifdef CONFIG_FLATMEM
diff --git a/include/asm-ia64/maddr.h b/include/asm-ia64/maddr.h
--- a/include/asm-ia64/maddr.h
+++ b/include/asm-ia64/maddr.h
@@ -100,6 +100,7 @@ mfn_to_local_pfn(unsigned long mfn)
#define virt_to_mfn(virt) (__pa(virt) >> PAGE_SHIFT)
#define virt_to_machine(virt) __pa(virt) /* for tpmfront.c */
#define arbitrary_virt_to_machine(virt) virt_to_machine(ia64_imva(virt))
+#define ptep_to_machine(virt) virt_to_machine(virt)
#define set_phys_to_machine(pfn, mfn) do { } while (0)
diff --git a/include/asm-x86_64/mach-xen/asm/pgtable.h
b/include/asm-x86_64/mach-xen/asm/pgtable.h
--- a/include/asm-x86_64/mach-xen/asm/pgtable.h
+++ b/include/asm-x86_64/mach-xen/asm/pgtable.h
@@ -30,6 +30,8 @@ extern pte_t *lookup_address(unsigned lo
#define arbitrary_virt_to_machine(va) \
(((maddr_t)pte_mfn(*virt_to_ptep(va)) << PAGE_SHIFT) \
| ((unsigned long)(va) & (PAGE_SIZE - 1)))
+
+#define ptep_to_machine(ptep) virt_to_machine(ptep)
#endif
extern pud_t level3_kernel_pgt[512];
--
yamahata
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|