Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 329467
b: refs/heads/master
c: f60d7f0
h: refs/heads/master
i:
  329465: 46c5b6d
  329463: c1ff4f2
v: v3
  • Loading branch information
Chris Wilson authored and Daniel Vetter committed Sep 20, 2012
1 parent a95f10f commit 9c4552b
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 24 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 755d22184f1e5015b040acee794542d9cf8a16c5
refs/heads/master: f60d7f0c1d55a935475ab394955cafddefaa6533
36 changes: 13 additions & 23 deletions trunk/drivers/gpu/drm/i915/i915_gem.c
Original file line number Diff line number Diff line change
Expand Up @@ -343,7 +343,7 @@ shmem_pread_fast(struct page *page, int shmem_page_offset, int page_length,
page_length);
kunmap_atomic(vaddr);

return ret;
return ret ? -EFAULT : 0;
}

static void
Expand Down Expand Up @@ -394,7 +394,7 @@ shmem_pread_slow(struct page *page, int shmem_page_offset, int page_length,
page_length);
kunmap(page);

return ret;
return ret ? - EFAULT : 0;
}

static int
Expand All @@ -403,7 +403,6 @@ i915_gem_shmem_pread(struct drm_device *dev,
struct drm_i915_gem_pread *args,
struct drm_file *file)
{
struct address_space *mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping;
char __user *user_data;
ssize_t remain;
loff_t offset;
Expand All @@ -412,7 +411,6 @@ i915_gem_shmem_pread(struct drm_device *dev,
int hit_slowpath = 0;
int prefaulted = 0;
int needs_clflush = 0;
int release_page;

user_data = (char __user *) (uintptr_t) args->data_ptr;
remain = args->size;
Expand All @@ -433,6 +431,12 @@ i915_gem_shmem_pread(struct drm_device *dev,
}
}

ret = i915_gem_object_get_pages(obj);
if (ret)
return ret;

i915_gem_object_pin_pages(obj);

offset = args->offset;

while (remain > 0) {
Expand All @@ -448,18 +452,7 @@ i915_gem_shmem_pread(struct drm_device *dev,
if ((shmem_page_offset + page_length) > PAGE_SIZE)
page_length = PAGE_SIZE - shmem_page_offset;

if (obj->pages) {
page = obj->pages[offset >> PAGE_SHIFT];
release_page = 0;
} else {
page = shmem_read_mapping_page(mapping, offset >> PAGE_SHIFT);
if (IS_ERR(page)) {
ret = PTR_ERR(page);
goto out;
}
release_page = 1;
}

page = obj->pages[offset >> PAGE_SHIFT];
page_do_bit17_swizzling = obj_do_bit17_swizzling &&
(page_to_phys(page) & (1 << 17)) != 0;

Expand All @@ -470,7 +463,6 @@ i915_gem_shmem_pread(struct drm_device *dev,
goto next_page;

hit_slowpath = 1;
page_cache_get(page);
mutex_unlock(&dev->struct_mutex);

if (!prefaulted) {
Expand All @@ -488,23 +480,21 @@ i915_gem_shmem_pread(struct drm_device *dev,
needs_clflush);

mutex_lock(&dev->struct_mutex);
page_cache_release(page);

next_page:
mark_page_accessed(page);
if (release_page)
page_cache_release(page);

if (ret) {
ret = -EFAULT;
if (ret)
goto out;
}

remain -= page_length;
user_data += page_length;
offset += page_length;
}

out:
i915_gem_object_unpin_pages(obj);

if (hit_slowpath) {
/* Fixup: Kill any reinstated backing storage pages */
if (obj->madv == __I915_MADV_PURGED)
Expand Down

0 comments on commit 9c4552b

Please sign in to comment.