ihk_mc_map_virtual: Release virtual address range on error
It was telling the vmap allocator to release a wrong address range (physical address range). Change-Id: I82236ac0086b5da24ac49219166abf363672d838 Refs: #985 Fujitsu: #11
This commit is contained in:
23
kernel/mem.c
23
kernel/mem.c
@@ -1687,31 +1687,34 @@ static void virtual_allocator_init(void)
|
|||||||
void *ihk_mc_map_virtual(unsigned long phys, int npages,
|
void *ihk_mc_map_virtual(unsigned long phys, int npages,
|
||||||
enum ihk_mc_pt_attribute attr)
|
enum ihk_mc_pt_attribute attr)
|
||||||
{
|
{
|
||||||
void *p;
|
void *va;
|
||||||
unsigned long i, offset;
|
unsigned long i, offset;
|
||||||
|
|
||||||
offset = (phys & (PAGE_SIZE - 1));
|
offset = (phys & (PAGE_SIZE - 1));
|
||||||
phys = phys & PAGE_MASK;
|
phys = phys & PAGE_MASK;
|
||||||
|
|
||||||
p = (void *)ihk_pagealloc_alloc(vmap_allocator, npages, PAGE_P2ALIGN);
|
va = (void *)ihk_pagealloc_alloc(vmap_allocator, npages, PAGE_P2ALIGN);
|
||||||
if (!p) {
|
if (!va) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
for (i = 0; i < npages; i++) {
|
for (i = 0; i < npages; i++) {
|
||||||
if(ihk_mc_pt_set_page(NULL, (char *)p + (i << PAGE_SHIFT),
|
if (ihk_mc_pt_set_page(NULL, (char *)va + (i << PAGE_SHIFT),
|
||||||
phys + (i << PAGE_SHIFT), attr) != 0){
|
phys + (i << PAGE_SHIFT), attr) != 0) {
|
||||||
int j;
|
int j;
|
||||||
for(j = 0; j < i; j++){
|
|
||||||
ihk_mc_pt_clear_page(NULL, (char *)p + (j << PAGE_SHIFT));
|
for (j = 0; j < i; j++) {
|
||||||
|
ihk_mc_pt_clear_page(NULL, (char *)va +
|
||||||
|
(j << PAGE_SHIFT));
|
||||||
}
|
}
|
||||||
ihk_pagealloc_free(vmap_allocator, virt_to_phys(p), npages);
|
ihk_pagealloc_free(vmap_allocator, (unsigned long)va,
|
||||||
|
npages);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
flush_tlb_single((unsigned long)(p + (i << PAGE_SHIFT)));
|
flush_tlb_single((unsigned long)(va + (i << PAGE_SHIFT)));
|
||||||
}
|
}
|
||||||
barrier(); /* Temporary fix for Thunder-X */
|
barrier(); /* Temporary fix for Thunder-X */
|
||||||
return (char *)p + offset;
|
return (char *)va + offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ihk_mc_unmap_virtual(void *va, int npages)
|
void ihk_mc_unmap_virtual(void *va, int npages)
|
||||||
|
|||||||
Reference in New Issue
Block a user