Skip to content

Commit

Permalink
drm/exynos: use alloc_page() to allocate pages.
Browse files Browse the repository at this point in the history
shmem_read_mapping_page_gfp() first tries to allocate pages from page cache
so if pages are allocated from page cache then these pages could have
valid cache line. after that cpu may read garbage data from cache
once gpu operation is completed with allocated pages. so with this patch,
Non-contiguous memory allocation request allocates pages from highmem
through alloc_page() with GFP_HIGHUSER_MOVABLE.

Signed-off-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
  • Loading branch information
Inki Dae committed Jul 27, 2012
1 parent f91f2f3 commit c62bc75
Showing 1 changed file with 3 additions and 11 deletions.
14 changes: 3 additions & 11 deletions drivers/gpu/drm/exynos/exynos_drm_gem.c
Original file line number Diff line number Diff line change
Expand Up @@ -99,25 +99,17 @@ static unsigned long roundup_gem_size(unsigned long size, unsigned int flags)
struct page **exynos_gem_get_pages(struct drm_gem_object *obj,
gfp_t gfpmask)
{
struct inode *inode;
struct address_space *mapping;
struct page *p, **pages;
int i, npages;

/* This is the shared memory object that backs the GEM resource */
inode = obj->filp->f_path.dentry->d_inode;
mapping = inode->i_mapping;

npages = obj->size >> PAGE_SHIFT;

pages = drm_malloc_ab(npages, sizeof(struct page *));
if (pages == NULL)
return ERR_PTR(-ENOMEM);

gfpmask |= mapping_gfp_mask(mapping);

for (i = 0; i < npages; i++) {
p = shmem_read_mapping_page_gfp(mapping, i, gfpmask);
p = alloc_page(gfpmask);
if (IS_ERR(p))
goto fail;
pages[i] = p;
Expand All @@ -127,7 +119,7 @@ struct page **exynos_gem_get_pages(struct drm_gem_object *obj,

fail:
while (i--)
page_cache_release(pages[i]);
__free_page(pages[i]);

drm_free_large(pages);
return ERR_PTR(PTR_ERR(p));
Expand Down Expand Up @@ -189,7 +181,7 @@ static int exynos_drm_gem_get_pages(struct drm_gem_object *obj)
return -EINVAL;
}

pages = exynos_gem_get_pages(obj, GFP_KERNEL);
pages = exynos_gem_get_pages(obj, GFP_HIGHUSER_MOVABLE);
if (IS_ERR(pages)) {
DRM_ERROR("failed to get pages.\n");
return PTR_ERR(pages);
Expand Down

0 comments on commit c62bc75

Please sign in to comment.