eliminate arch_alloc_page() and move ihk_mc_alloc_pages() to arch independent code

This commit is contained in:
Balazs Gerofi
2016-09-21 05:40:16 -04:00
parent 8c0a5a5e61
commit 8f4f68b877
4 changed files with 47 additions and 51 deletions

View File

@@ -31,10 +31,9 @@
static char *last_page; static char *last_page;
extern char _head[], _end[]; extern char _head[], _end[];
static struct ihk_mc_pa_ops *pa_ops;
extern unsigned long x86_kernel_phys_base; extern unsigned long x86_kernel_phys_base;
/* Arch specific early allocation routine */
void *early_alloc_pages(int nr_pages) void *early_alloc_pages(int nr_pages)
{ {
void *p; void *p;
@@ -53,36 +52,9 @@ void *early_alloc_pages(int nr_pages)
return p; return p;
} }
void *arch_alloc_page(enum ihk_mc_ap_flag flag) void early_alloc_invalidate(void)
{ {
if (pa_ops) last_page = (void *)-1;
return pa_ops->alloc_page(1, PAGE_P2ALIGN, flag);
else
return early_alloc_pages(1);
}
void arch_free_page(void *ptr)
{
if (pa_ops)
pa_ops->free_page(ptr, 1);
}
void *ihk_mc_alloc_aligned_pages(int npages, int p2align, enum ihk_mc_ap_flag flag)
{
if (pa_ops)
return pa_ops->alloc_page(npages, p2align, flag);
else
return NULL;
}
void *ihk_mc_alloc_pages(int npages, enum ihk_mc_ap_flag flag)
{
return ihk_mc_alloc_aligned_pages(npages, PAGE_P2ALIGN, flag);
}
void ihk_mc_free_pages(void *p, int npages)
{
if (pa_ops)
pa_ops->free_page(p, npages);
} }
void *ihk_mc_allocate(int size, int flag) void *ihk_mc_allocate(int size, int flag)
@@ -175,7 +147,7 @@ static unsigned long setup_l3(struct page_table *pt,
pt->entry[i] = 0; pt->entry[i] = 0;
continue; continue;
} }
pt_phys = setup_l2(arch_alloc_page(IHK_MC_AP_CRITICAL), phys, start, end); pt_phys = setup_l2(ihk_mc_alloc_pages(1, IHK_MC_AP_CRITICAL), phys, start, end);
pt->entry[i] = pt_phys | PFL3_PDIR_ATTR; pt->entry[i] = pt_phys | PFL3_PDIR_ATTR;
} }
@@ -199,7 +171,7 @@ static void init_normal_area(struct page_table *pt)
for (phys = (map_start & ~(PTL4_SIZE - 1)); phys < map_end; for (phys = (map_start & ~(PTL4_SIZE - 1)); phys < map_end;
phys += PTL4_SIZE) { phys += PTL4_SIZE) {
pt_phys = setup_l3(arch_alloc_page(IHK_MC_AP_CRITICAL), phys, pt_phys = setup_l3(ihk_mc_alloc_pages(1, IHK_MC_AP_CRITICAL), phys,
map_start, map_end); map_start, map_end);
pt->entry[ident_index++] = pt_phys | PFL4_PDIR_ATTR; pt->entry[ident_index++] = pt_phys | PFL4_PDIR_ATTR;
@@ -209,7 +181,7 @@ static void init_normal_area(struct page_table *pt)
static struct page_table *__alloc_new_pt(enum ihk_mc_ap_flag ap_flag) static struct page_table *__alloc_new_pt(enum ihk_mc_ap_flag ap_flag)
{ {
struct page_table *newpt = arch_alloc_page(ap_flag); struct page_table *newpt = ihk_mc_alloc_pages(1, ap_flag);
if(newpt) if(newpt)
memset(newpt, 0, sizeof(struct page_table)); memset(newpt, 0, sizeof(struct page_table));
@@ -718,7 +690,7 @@ static void destroy_page_table(int level, struct page_table *pt)
} }
} }
arch_free_page(pt); ihk_mc_free_pages(pt, 1);
return; return;
} }
@@ -1181,7 +1153,7 @@ static int clear_range_l2(void *args0, pte_t *ptep, uint64_t base,
*ptep = PTE_NULL; *ptep = PTE_NULL;
remote_flush_tlb_cpumask(args->vm, base, remote_flush_tlb_cpumask(args->vm, base,
ihk_mc_get_processor_id()); ihk_mc_get_processor_id());
arch_free_page(pt); ihk_mc_free_pages(pt, 1);
} }
return 0; return 0;
@@ -1245,7 +1217,7 @@ static int clear_range_l3(void *args0, pte_t *ptep, uint64_t base,
*ptep = PTE_NULL; *ptep = PTE_NULL;
remote_flush_tlb_cpumask(args->vm, base, remote_flush_tlb_cpumask(args->vm, base,
ihk_mc_get_processor_id()); ihk_mc_get_processor_id());
arch_free_page(pt); ihk_mc_free_pages(pt, 1);
} }
return 0; return 0;
@@ -1596,7 +1568,7 @@ retry:
error = 0; error = 0;
out: out:
if (newpt) { if (newpt) {
arch_free_page(newpt); ihk_mc_free_pages(newpt, 1);
} }
dkprintf("set_range_l2(%lx,%lx,%lx): %d %lx\n", dkprintf("set_range_l2(%lx,%lx,%lx): %d %lx\n",
base, start, end, error, *ptep); base, start, end, error, *ptep);
@@ -1679,7 +1651,7 @@ retry:
error = 0; error = 0;
out: out:
if (newpt) { if (newpt) {
arch_free_page(newpt); ihk_mc_free_pages(newpt, 1);
} }
dkprintf("set_range_l3(%lx,%lx,%lx): %d\n", dkprintf("set_range_l3(%lx,%lx,%lx): %d\n",
base, start, end, error, *ptep); base, start, end, error, *ptep);
@@ -1737,7 +1709,7 @@ retry:
error = 0; error = 0;
out: out:
if (newpt) { if (newpt) {
arch_free_page(newpt); ihk_mc_free_pages(newpt, 1);
} }
dkprintf("set_range_l4(%lx,%lx,%lx): %d %lx\n", dkprintf("set_range_l4(%lx,%lx,%lx): %d %lx\n",
base, start, end, error, *ptep); base, start, end, error, *ptep);
@@ -2094,7 +2066,7 @@ static void init_vsyscall_area(struct page_table *pt)
void init_page_table(void) void init_page_table(void)
{ {
check_available_page_size(); check_available_page_size();
init_pt = arch_alloc_page(IHK_MC_AP_CRITICAL); init_pt = ihk_mc_alloc_pages(1, IHK_MC_AP_CRITICAL);
ihk_mc_spinlock_init(&init_pt_lock); ihk_mc_spinlock_init(&init_pt_lock);
memset(init_pt, 0, sizeof(PAGE_SIZE)); memset(init_pt, 0, sizeof(PAGE_SIZE));
@@ -2132,12 +2104,6 @@ void ihk_mc_reserve_arch_pages(struct ihk_page_allocator_desc *pa_allocator,
__reserve_arch_pages(start, end, cb); __reserve_arch_pages(start, end, cb);
} }
void ihk_mc_set_page_allocator(struct ihk_mc_pa_ops *ops)
{
last_page = (void *)-1;
pa_ops = ops;
}
unsigned long virt_to_phys(void *v) unsigned long virt_to_phys(void *v)
{ {
unsigned long va = (unsigned long)v; unsigned long va = (unsigned long)v;

View File

@@ -29,8 +29,8 @@ int ihk_mc_ikc_init_first_local(struct ihk_ikc_channel_desc *channel,
memset(channel, 0, sizeof(struct ihk_ikc_channel_desc)); memset(channel, 0, sizeof(struct ihk_ikc_channel_desc));
/* Place both sides in this side */ /* Place both sides in this side */
rq = arch_alloc_page(IHK_MC_AP_CRITICAL); rq = ihk_mc_alloc_pages(1, IHK_MC_AP_CRITICAL);
wq = arch_alloc_page(IHK_MC_AP_CRITICAL); wq = ihk_mc_alloc_pages(1, IHK_MC_AP_CRITICAL);
ihk_ikc_init_queue(rq, 0, 0, PAGE_SIZE, MASTER_IKCQ_PKTSIZE); ihk_ikc_init_queue(rq, 0, 0, PAGE_SIZE, MASTER_IKCQ_PKTSIZE);
ihk_ikc_init_queue(wq, 0, 0, PAGE_SIZE, MASTER_IKCQ_PKTSIZE); ihk_ikc_init_queue(wq, 0, 0, PAGE_SIZE, MASTER_IKCQ_PKTSIZE);

View File

@@ -58,6 +58,38 @@ struct tlb_flush_entry tlb_flush_vector[IHK_TLB_FLUSH_IRQ_VECTOR_SIZE];
int anon_on_demand = 0; int anon_on_demand = 0;
static struct ihk_mc_pa_ops *pa_ops;
extern void *early_alloc_pages(int nr_pages);
extern void early_alloc_invalidate(void);
/* High level allocation routines (used by regular kernel code) */
void *ihk_mc_alloc_aligned_pages(int npages, int p2align, enum ihk_mc_ap_flag flag)
{
if (pa_ops)
return pa_ops->alloc_page(npages, p2align, flag);
else
return early_alloc_pages(npages);
}
void *ihk_mc_alloc_pages(int npages, enum ihk_mc_ap_flag flag)
{
return ihk_mc_alloc_aligned_pages(npages, PAGE_P2ALIGN, flag);
}
void ihk_mc_free_pages(void *p, int npages)
{
if (pa_ops)
pa_ops->free_page(p, npages);
}
void ihk_mc_set_page_allocator(struct ihk_mc_pa_ops *ops)
{
early_alloc_invalidate();
pa_ops = ops;
}
/* Low level allocation routines */
static void reserve_pages(struct ihk_page_allocator_desc *pa_allocator, static void reserve_pages(struct ihk_page_allocator_desc *pa_allocator,
unsigned long start, unsigned long end, int type) unsigned long start, unsigned long end, int type)
{ {

View File

@@ -109,8 +109,6 @@ void ihk_mc_free_pages(void *p, int npages);
void *ihk_mc_allocate(int size, int flag); void *ihk_mc_allocate(int size, int flag);
void ihk_mc_free(void *p); void ihk_mc_free(void *p);
void *arch_alloc_page(enum ihk_mc_ap_flag flag);
void arch_free_page(void *ptr);
int arch_get_smaller_page_size(void *args, size_t origsize, size_t *sizep, int *p2alignp); int arch_get_smaller_page_size(void *args, size_t origsize, size_t *sizep, int *p2alignp);
typedef void *page_table_t; typedef void *page_table_t;