Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 329466
b: refs/heads/master
c: 755d221
h: refs/heads/master
v: v3
  • Loading branch information
Chris Wilson authored and Daniel Vetter committed Sep 20, 2012
1 parent 46c5b6d commit a95f10f
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 25 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: a5570178c059cec59e9835be20bc8546377fa7b5
refs/heads/master: 755d22184f1e5015b040acee794542d9cf8a16c5
37 changes: 13 additions & 24 deletions trunk/drivers/gpu/drm/i915/i915_gem.c
Original file line number Diff line number Diff line change
Expand Up @@ -690,7 +690,7 @@ shmem_pwrite_fast(struct page *page, int shmem_page_offset, int page_length,
page_length);
kunmap_atomic(vaddr);

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

/* Only difference to the fast-path function is that this can handle bit17
Expand Down Expand Up @@ -724,7 +724,7 @@ shmem_pwrite_slow(struct page *page, int shmem_page_offset, int page_length,
page_do_bit17_swizzling);
kunmap(page);

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

static int
Expand All @@ -733,7 +733,6 @@ i915_gem_shmem_pwrite(struct drm_device *dev,
struct drm_i915_gem_pwrite *args,
struct drm_file *file)
{
struct address_space *mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping;
ssize_t remain;
loff_t offset;
char __user *user_data;
Expand All @@ -742,7 +741,6 @@ i915_gem_shmem_pwrite(struct drm_device *dev,
int hit_slowpath = 0;
int needs_clflush_after = 0;
int needs_clflush_before = 0;
int release_page;

user_data = (char __user *) (uintptr_t) args->data_ptr;
remain = args->size;
Expand All @@ -768,6 +766,12 @@ i915_gem_shmem_pwrite(struct drm_device *dev,
&& obj->cache_level == I915_CACHE_NONE)
needs_clflush_before = 1;

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

i915_gem_object_pin_pages(obj);

offset = args->offset;
obj->dirty = 1;

Expand All @@ -793,18 +797,7 @@ i915_gem_shmem_pwrite(struct drm_device *dev,
((shmem_page_offset | page_length)
& (boot_cpu_data.x86_clflush_size - 1));

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 @@ -816,33 +809,29 @@ i915_gem_shmem_pwrite(struct drm_device *dev,
goto next_page;

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

ret = shmem_pwrite_slow(page, shmem_page_offset, page_length,
user_data, page_do_bit17_swizzling,
partial_cacheline_write,
needs_clflush_after);

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

next_page:
set_page_dirty(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 a95f10f

Please sign in to comment.