Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=4dbf7af6442a9a882855bed0d999659ac413e3ac
Commit:     4dbf7af6442a9a882855bed0d999659ac413e3ac
Parent:     c0400030b28e95fd477fdfe8ba8acb0af21e5c15
Author:     Jan Beulich <[EMAIL PROTECTED]>
AuthorDate: Wed Jan 30 13:33:14 2008 +0100
Committer:  Ingo Molnar <[EMAIL PROTECTED]>
CommitDate: Wed Jan 30 13:33:14 2008 +0100

    x86: adjust/fix LDT handling for Xen
    
    Based on patch from Jan Beulich <[EMAIL PROTECTED]>.
    
    Don't rely on kmalloc(PAGE_SIZE) returning PAGE_SIZE aligned memory
    (Xen requires GDT *and* LDT to be page-aligned). Using the page
    allocator interface also removes the (albeit small) slab allocator
    overhead. The same change being done for 64-bits for consistency.
    
    Further, the Xen hypercall interface expects the LDT address to be
    virtual, not machine.
    
    [ Adjusted to unified ldt.c - Jeremy ]
    
    Signed-off-by: Jan Beulich <[EMAIL PROTECTED]>
    Acked-by: Jeremy Fitzhardinge <[EMAIL PROTECTED]>
    Signed-off-by: Ingo Molnar <[EMAIL PROTECTED]>
    Signed-off-by: Thomas Gleixner <[EMAIL PROTECTED]>
---
 arch/x86/kernel/ldt.c    |    7 +++----
 arch/x86/xen/enlighten.c |    9 +--------
 2 files changed, 4 insertions(+), 12 deletions(-)

diff --git a/arch/x86/kernel/ldt.c b/arch/x86/kernel/ldt.c
index b8ef462..8a7660c 100644
--- a/arch/x86/kernel/ldt.c
+++ b/arch/x86/kernel/ldt.c
@@ -12,7 +12,6 @@
 #include <linux/mm.h>
 #include <linux/smp.h>
 #include <linux/vmalloc.h>
-#include <linux/slab.h>
 
 #include <asm/uaccess.h>
 #include <asm/system.h>
@@ -40,7 +39,7 @@ static int alloc_ldt(mm_context_t *pc, int mincount, int 
reload)
        if (mincount * LDT_ENTRY_SIZE > PAGE_SIZE)
                newldt = vmalloc(mincount * LDT_ENTRY_SIZE);
        else
-               newldt = kmalloc(mincount * LDT_ENTRY_SIZE, GFP_KERNEL);
+               newldt = (void *)__get_free_page(GFP_KERNEL);
 
        if (!newldt)
                return -ENOMEM;
@@ -78,7 +77,7 @@ static int alloc_ldt(mm_context_t *pc, int mincount, int 
reload)
                if (oldsize * LDT_ENTRY_SIZE > PAGE_SIZE)
                        vfree(oldldt);
                else
-                       kfree(oldldt);
+                       put_page(virt_to_page(oldldt));
        }
        return 0;
 }
@@ -129,7 +128,7 @@ void destroy_context(struct mm_struct *mm)
                if (mm->context.size * LDT_ENTRY_SIZE > PAGE_SIZE)
                        vfree(mm->context.ldt);
                else
-                       kfree(mm->context.ldt);
+                       put_page(virt_to_page(mm->context.ldt));
                mm->context.size = 0;
        }
 }
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
index 72dd14d..845b4fd 100644
--- a/arch/x86/xen/enlighten.c
+++ b/arch/x86/xen/enlighten.c
@@ -275,19 +275,12 @@ static unsigned long xen_store_tr(void)
 
 static void xen_set_ldt(const void *addr, unsigned entries)
 {
-       unsigned long linear_addr = (unsigned long)addr;
        struct mmuext_op *op;
        struct multicall_space mcs = xen_mc_entry(sizeof(*op));
 
        op = mcs.args;
        op->cmd = MMUEXT_SET_LDT;
-       if (linear_addr) {
-               /* ldt my be vmalloced, use arbitrary_virt_to_machine */
-               xmaddr_t maddr;
-               maddr = arbitrary_virt_to_machine((unsigned long)addr);
-               linear_addr = (unsigned long)maddr.maddr;
-       }
-       op->arg1.linear_addr = linear_addr;
+       op->arg1.linear_addr = (unsigned long)addr;
        op->arg2.nr_ents = entries;
 
        MULTI_mmuext_op(mcs.mc, op, 1, NULL, DOMID_SELF);
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to