0,0 → 1,59 |
#include <drm/drmP.h> |
#include <drm/i915_drm.h> |
#include "i915_drv.h" |
#include "intel_drv.h" |
|
|
struct file *shmem_file_setup(const char *name, loff_t size, unsigned long flags) |
{ |
struct file *filep; |
int count; |
|
filep = malloc(sizeof(*filep)); |
|
if(unlikely(filep == NULL)) |
return ERR_PTR(-ENOMEM); |
|
count = size / PAGE_SIZE; |
|
filep->pages = kzalloc(sizeof(struct page *) * count, 0); |
if(unlikely(filep->pages == NULL)) |
{ |
kfree(filep); |
return ERR_PTR(-ENOMEM); |
}; |
|
filep->count = count; |
filep->allocated = 0; |
filep->vma = NULL; |
|
// dbgprintf("%s file %p pages %p count %d\n", |
// __FUNCTION__,filep, filep->pages, filep->pages); |
|
return filep; |
} |
|
struct page *shmem_read_mapping_page_gfp(struct file *filep, |
pgoff_t index, gfp_t gfp) |
{ |
struct page *page; |
|
// dbgprintf("%s, file %p index %d\n", __FUNCTION__, filep, index); |
|
if(unlikely(index >= filep->count)) |
return ERR_PTR(-EINVAL); |
|
page = filep->pages[index]; |
|
if(unlikely(page == NULL)) |
{ |
page = (struct page *)AllocPage(); |
|
if(unlikely(page == NULL)) |
return ERR_PTR(-ENOMEM); |
|
filep->pages[index] = page; |
}; |
|
return page; |
}; |