Skip to content

Commit

Permalink
xen: make xen_load_gdt simpler
Browse files Browse the repository at this point in the history
Remove use of multicall machinery which is unused (gdt loading
is never performance critical).  This removes the implicit use
of percpu variables, which simplifies understanding how
the percpu code's use of load_gdt interacts with this code.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
  • Loading branch information
Jeremy Fitzhardinge committed Mar 30, 2009
1 parent 6ed6bf4 commit 3ce5fa7
Showing 1 changed file with 6 additions and 8 deletions.
14 changes: 6 additions & 8 deletions arch/x86/xen/enlighten.c
Original file line number Diff line number Diff line change
Expand Up @@ -284,22 +284,18 @@ static void xen_set_ldt(const void *addr, unsigned entries)

static void xen_load_gdt(const struct desc_ptr *dtr)
{
unsigned long *frames;
unsigned long va = dtr->address;
unsigned int size = dtr->size + 1;
unsigned pages = (size + PAGE_SIZE - 1) / PAGE_SIZE;
unsigned long frames[pages];
int f;
struct multicall_space mcs;

/* A GDT can be up to 64k in size, which corresponds to 8192
8-byte entries, or 16 4k pages.. */

BUG_ON(size > 65536);
BUG_ON(va & ~PAGE_MASK);

mcs = xen_mc_entry(sizeof(*frames) * pages);
frames = mcs.args;

for (f = 0; va < dtr->address + size; va += PAGE_SIZE, f++) {
int level;
pte_t *ptep = lookup_address(va, &level);
Expand All @@ -314,13 +310,15 @@ static void xen_load_gdt(const struct desc_ptr *dtr)

frames[f] = mfn;

printk("xen_load_gdt: %d va=%p mfn=%lx pfn=%lx va'=%p\n",
f, (void *)va, mfn, pfn, virt);

make_lowmem_page_readonly((void *)va);
make_lowmem_page_readonly(virt);
}

MULTI_set_gdt(mcs.mc, frames, size / sizeof(struct desc_struct));

xen_mc_issue(PARAVIRT_LAZY_CPU);
if (HYPERVISOR_set_gdt(frames, size / sizeof(struct desc_struct)))
BUG();
}

static void load_TLS_descriptor(struct thread_struct *t,
Expand Down

0 comments on commit 3ce5fa7

Please sign in to comment.