#include #include #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; };