Revert commented out create_pagelist/free_pagelist to the original

version and not the broken FreeBSD version.  Should really be deleted
someday soon.
This commit is contained in:
skrll 2013-03-25 21:55:11 +00:00
parent 1fe4c812c7
commit ba16f82c16
1 changed files with 44 additions and 56 deletions

View File

@ -537,15 +537,15 @@ vchiq_doorbell_irq(int irq, void *dev_id)
#if 0
static int
create_pagelist(char __user *buf, size_t count, unsigned short type,
lwp_t *l, PAGELIST_T ** ppagelist)
struct task_struct *task, PAGELIST_T ** ppagelist)
{
PAGELIST_T *pagelist;
paddr_t *pages;
struct page **pages;
struct page *page;
unsigned long *addrs;
unsigned int num_pages, offset, i;
int pagelist_size;
char *addr, *base_addr, *next_addr;
int run, addridx, err;
int run, addridx, actual_pages;
offset = (unsigned int)buf & (PAGE_SIZE - 1);
num_pages = (count + offset + PAGE_SIZE - 1) / PAGE_SIZE;
@ -555,10 +555,10 @@ create_pagelist(char __user *buf, size_t count, unsigned short type,
/* Allocate enough storage to hold the page pointers and the page
** list
*/
pagelist_size = sizeof(PAGELIST_T) +
pagelist = kmalloc(sizeof(PAGELIST_T) +
(num_pages * sizeof(unsigned long)) +
(num_pages * sizeof(paddr_t));
pagelist = malloc(pagelist_size, M_VCPAGELIST, M_WAITOK | M_ZERO);
(num_pages * sizeof(pages[0])),
GFP_KERNEL);
vchiq_log_trace(vchiq_arm_log_level,
"create_pagelist - %x", (unsigned int)pagelist);
@ -566,28 +566,27 @@ create_pagelist(char __user *buf, size_t count, unsigned short type,
return -ENOMEM;
addrs = pagelist->addrs;
pages = (paddr_t *)(addrs + num_pages);
pages = (struct page **)(addrs + num_pages);
err = uvm_map_pageable(&l->l_proc->p_vmspace->vm_map,
(vaddr_t)buf, (vaddr_t)buf + count, false, 0);
if (err == 0) {
err = uvm_map_protect(&l->l_proc->p_vmspace->vm_map,
(vaddr_t)buf, (vaddr_t)buf + count,
(type == PAGELIST_READ ? VM_PROT_WRITE : 0) | VM_PROT_READ,
false);
}
if (err == 0) {
for (i = 0; i < num_pages; i++) {
pmap_extract(vm_map_pmap(&l->l_proc->p_vmspace->vm_map),
(vaddr_t)buf + (i * PAGE_SIZE), &pages[i]);
}
}
down_read(&task->mm->mmap_sem);
actual_pages = get_user_pages(task, task->mm,
(unsigned long)buf & ~(PAGE_SIZE - 1), num_pages,
(type == PAGELIST_READ) /*Write */ , 0 /*Force */ ,
pages, NULL /*vmas */);
up_read(&task->mm->mmap_sem);
if (err != 0) {
uvm_map_pageable(&l->l_proc->p_vmspace->vm_map,
(vaddr_t)buf, (vaddr_t)buf + count, true, 0);
free(pagelist, M_VCPAGELIST);
return (-ENOMEM);
if (actual_pages != num_pages)
{
/* This is probably due to the process being killed */
while (actual_pages > 0)
{
actual_pages--;
page_cache_release(pages[actual_pages]);
}
kfree(pagelist);
if (actual_pages == 0)
actual_pages = -ENOMEM;
return actual_pages;
}
pagelist->length = count;
@ -596,13 +595,13 @@ create_pagelist(char __user *buf, size_t count, unsigned short type,
/* Group the pages into runs of contiguous pages */
base_addr = (void *)PHYS_TO_VCBUS(pages[0]);
base_addr = VCHIQ_ARM_ADDRESS(page_address(pages[0]));
next_addr = base_addr + PAGE_SIZE;
addridx = 0;
run = 0;
for (i = 1; i < num_pages; i++) {
addr = (void *)PHYS_TO_VCBUS(pages[i]);
addr = VCHIQ_ARM_ADDRESS(page_address(pages[i]));
if ((addr == next_addr) && (run < (PAGE_SIZE - 1))) {
next_addr += PAGE_SIZE;
run++;
@ -626,7 +625,7 @@ create_pagelist(char __user *buf, size_t count, unsigned short type,
FRAGMENTS_T *fragments;
if (down_interruptible(&g_free_fragments_sema) != 0) {
free(pagelist, M_VCPAGELIST);
kfree(pagelist);
return -EINTR;
}
@ -642,7 +641,11 @@ create_pagelist(char __user *buf, size_t count, unsigned short type,
g_fragments_base);
}
cpu_dcache_wbinv_range((vm_offset_t)pagelist, pagelist_size);
for (page = virt_to_page(pagelist);
page <= virt_to_page(addrs + num_pages - 1); page++) {
flush_dcache_page(page);
}
*ppagelist = pagelist;
return 0;
@ -651,9 +654,8 @@ create_pagelist(char __user *buf, size_t count, unsigned short type,
static void
free_pagelist(PAGELIST_T *pagelist, int actual)
{
paddr_t *pages;
unsigned int num_pages;
void *page_address;
struct page **pages;
unsigned int num_pages, i;
vchiq_log_trace(vchiq_arm_log_level,
"free_pagelist - %x, %d", (unsigned int)pagelist, actual);
@ -662,7 +664,7 @@ free_pagelist(PAGELIST_T *pagelist, int actual)
(pagelist->length + pagelist->offset + PAGE_SIZE - 1) /
PAGE_SIZE;
pages = (paddr_t *)(pagelist->addrs + num_pages);
pages = (struct page **)(pagelist->addrs + num_pages);
/* Deal with any partial cache lines (fragments) */
if (pagelist->type >= PAGELIST_READ_WITH_FRAGMENTS) {
@ -674,34 +676,23 @@ free_pagelist(PAGELIST_T *pagelist, int actual)
tail_bytes = (pagelist->offset + actual) &
(CACHE_LINE_SIZE - 1);
if (actual >= 0) {
/* XXXBSD: might be inefficient */
//page_address = pmap_mapdev(pages[0], PAGE_SIZE*num_pages);
panic("free_pagelist: XXX TODO");
}
else
page_address = NULL;
if ((actual >= 0) && (head_bytes != 0)) {
if (head_bytes > actual)
head_bytes = actual;
memcpy((char *)page_address +
memcpy((char *)page_address(pages[0]) +
pagelist->offset,
fragments->headbuf,
head_bytes);
}
if ((actual >= 0) && (head_bytes < actual) &&
(tail_bytes != 0)) {
memcpy((char *)page_address + PAGE_SIZE*(num_pages - 1) +
((pagelist->offset + actual) & (PAGE_SIZE -
1) & ~(CACHE_LINE_SIZE - 1)),
memcpy((char *)page_address(pages[num_pages - 1]) +
((pagelist->offset + actual) &
(PAGE_SIZE - 1) & ~(CACHE_LINE_SIZE - 1)),
fragments->tailbuf, tail_bytes);
}
if (page_address) {
panic("free_pagelist: XXX TODO");
}
down(&g_free_fragments_mutex);
*(FRAGMENTS_T **) fragments = g_free_fragments;
g_free_fragments = fragments;
@ -709,15 +700,12 @@ free_pagelist(PAGELIST_T *pagelist, int actual)
up(&g_free_fragments_sema);
}
#if 0
for (i = 0; i < num_pages; i++) {
if (pagelist->type != PAGELIST_WRITE)
vm_page_dirty(pages[i]);
set_page_dirty(pages[i]);
page_cache_release(pages[i]);
}
vm_page_unhold_pages(pages, num_pages);
#endif
free(pagelist, M_VCPAGELIST);
kfree(pagelist);
}
#endif