Re: [PATCH 7/8] UML - add virt_to_pte

Previous thread: [PATCH 0/8] UML - Stub page updates for 2.6.25 by Jeff Dike on Friday, November 16, 2007 - 5:42 pm. (1 message)

Next thread: [PATCH 1/8] UML - Move um_virt_to_phys by Jeff Dike on Friday, November 16, 2007 - 5:42 pm. (1 message)
To: Andrew Morton <akpm@...>
Cc: LKML <linux-kernel@...>, uml-devel <user-mode-linux-devel@...>
Date: Friday, November 16, 2007 - 5:42 pm

Turn um_virt_to_phys into virt_to_pte, cleaning up a horrid interface.

It's also made non-static and declared in pgtable.h because it'll be
needed when the stubs get a vma.

Signed-off-by: Jeff Dike <jdike@linux.intel.com>
---
arch/um/kernel/skas/uaccess.c | 56 +++++++++++++++++-------------------------
include/asm-um/pgtable.h | 3 ++
2 files changed, 26 insertions(+), 33 deletions(-)

Index: linux-2.6.22/arch/um/kernel/skas/uaccess.c
===================================================================
--- linux-2.6.22.orig/arch/um/kernel/skas/uaccess.c 2007-11-16 15:16:54.000000000 -0500
+++ linux-2.6.22/arch/um/kernel/skas/uaccess.c 2007-11-16 15:40:25.000000000 -0500
@@ -13,70 +13,60 @@
#include "kern_util.h"
#include "os.h"

-static void *um_virt_to_phys(struct task_struct *task, unsigned long addr,
- pte_t *pte_out)
+pte_t *virt_to_pte(struct mm_struct *mm, unsigned long addr)
{
pgd_t *pgd;
pud_t *pud;
pmd_t *pmd;
- pte_t *pte;
- pte_t ptent;

- if (task->mm == NULL)
- return ERR_PTR(-EINVAL);
- pgd = pgd_offset(task->mm, addr);
+ if (mm == NULL)
+ return NULL;
+
+ pgd = pgd_offset(mm, addr);
if (!pgd_present(*pgd))
- return ERR_PTR(-EINVAL);
+ return NULL;

pud = pud_offset(pgd, addr);
if (!pud_present(*pud))
- return ERR_PTR(-EINVAL);
+ return NULL;

pmd = pmd_offset(pud, addr);
if (!pmd_present(*pmd))
- return ERR_PTR(-EINVAL);
-
- pte = pte_offset_kernel(pmd, addr);
- ptent = *pte;
- if (!pte_present(ptent))
- return ERR_PTR(-EINVAL);
+ return NULL;

- if (pte_out != NULL)
- *pte_out = ptent;
- return (void *) (pte_val(ptent) & PAGE_MASK) + (addr & ~PAGE_MASK);
+ return pte_offset_kernel(pmd, addr);
}

-static unsigned long maybe_map(unsigned long virt, int is_write)
+static pte_t *maybe_map(unsigned long virt, int is_write)
{
- pte_t pte;
- int err;
+ pte_t *pte = virt_to_pte(current->mm, virt);
+ int err, dummy_code;

- void *phys = um_virt_to_phys(curren...

To: Jeff Dike <jdike@...>
Cc: Andrew Morton <akpm@...>, LKML <linux-kernel@...>, uml-devel <user-mode-linux-devel@...>
Date: Saturday, November 17, 2007 - 6:50 am

-

To: Roel Kluin <12o3l@...>
Cc: Andrew Morton <akpm@...>, LKML <linux-kernel@...>, uml-devel <user-mode-linux-devel@...>
Date: Saturday, November 17, 2007 - 2:49 pm

No, because if the page isn't mapped, handle_page_fault would have
returned non-zero, and we would have already returned.

This is leaving aside issues of whether the page could have been
unmapped by another CPU (which isn't an issue right now, and for which
I have a patch to fix anyway).

Jeff

--
Work email - jdike at linux dot intel dot com
-

Previous thread: [PATCH 0/8] UML - Stub page updates for 2.6.25 by Jeff Dike on Friday, November 16, 2007 - 5:42 pm. (1 message)

Next thread: [PATCH 1/8] UML - Move um_virt_to_phys by Jeff Dike on Friday, November 16, 2007 - 5:42 pm. (1 message)