Re: [PATCH 01/12] drm/ttm: remove userspace backed ttm object support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 11/08/2011 12:40 AM, j.glisse@xxxxxxxxx wrote:
From: Jerome Glisse<jglisse@xxxxxxxxxx>

This was never use in none of the driver, properly using userspace
page for bo would need more code (vma interaction mostly). Removing
this dead code in preparation of ttm_tt&  backend merge.


This is not exactly true. It was once used by psb, and we might be implementing it for vmwgfx as well,
if it turns out to give us a performance boost.
There are some usage restrictions, though: The bo can only be accessed through the original VMA, and the backend must support cached pages.

But I'll figure out a way to implement this in the context of the unified backend / tt.

Reviewed-by: Thomas Hellstrom <thellstrom@xxxxxxxxxx>

Signed-off-by: Jerome Glisse<jglisse@xxxxxxxxxx>
Reviewed-by: Konrad Rzeszutek Wilk<konrad.wilk@xxxxxxxxxx>
---
  drivers/gpu/drm/ttm/ttm_bo.c    |   22 --------
  drivers/gpu/drm/ttm/ttm_tt.c    |  105 +--------------------------------------
  include/drm/ttm/ttm_bo_api.h    |    5 --
  include/drm/ttm/ttm_bo_driver.h |   24 ---------
  4 files changed, 1 insertions(+), 155 deletions(-)

diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index 617b646..4bde335 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -342,22 +342,6 @@ static int ttm_bo_add_ttm(struct ttm_buffer_object *bo, bool zero_alloc)
  		if (unlikely(bo->ttm == NULL))
  			ret = -ENOMEM;
  		break;
-	case ttm_bo_type_user:
-		bo->ttm = ttm_tt_create(bdev, bo->num_pages<<  PAGE_SHIFT,
-					page_flags | TTM_PAGE_FLAG_USER,
-					glob->dummy_read_page);
-		if (unlikely(bo->ttm == NULL)) {
-			ret = -ENOMEM;
-			break;
-		}
-
-		ret = ttm_tt_set_user(bo->ttm, current,
-				      bo->buffer_start, bo->num_pages);
-		if (unlikely(ret != 0)) {
-			ttm_tt_destroy(bo->ttm);
-			bo->ttm = NULL;
-		}
-		break;
  	default:
  		printk(KERN_ERR TTM_PFX "Illegal buffer object type\n");
  		ret = -EINVAL;
@@ -907,16 +891,12 @@ static uint32_t ttm_bo_select_caching(struct ttm_mem_type_manager *man,
  }

  static bool ttm_bo_mt_compatible(struct ttm_mem_type_manager *man,
-				 bool disallow_fixed,
  				 uint32_t mem_type,
  				 uint32_t proposed_placement,
  				 uint32_t *masked_placement)
  {
  	uint32_t cur_flags = ttm_bo_type_flags(mem_type);

-	if ((man->flags&  TTM_MEMTYPE_FLAG_FIXED)&&  disallow_fixed)
-		return false;
-
  	if ((cur_flags&  proposed_placement&  TTM_PL_MASK_MEM) == 0)
  		return false;

@@ -961,7 +941,6 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
  		man =&bdev->man[mem_type];

  		type_ok = ttm_bo_mt_compatible(man,
-						bo->type == ttm_bo_type_user,
  						mem_type,
  						placement->placement[i],
  						&cur_flags);
@@ -1009,7 +988,6 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
  		if (!man->has_type)
  			continue;
  		if (!ttm_bo_mt_compatible(man,
-						bo->type == ttm_bo_type_user,
  						mem_type,
  						placement->busy_placement[i],
  						&cur_flags))
diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
index 58c271e..82a1161 100644
--- a/drivers/gpu/drm/ttm/ttm_tt.c
+++ b/drivers/gpu/drm/ttm/ttm_tt.c
@@ -62,43 +62,6 @@ static void ttm_tt_free_page_directory(struct ttm_tt *ttm)
  	ttm->dma_address = NULL;
  }

-static void ttm_tt_free_user_pages(struct ttm_tt *ttm)
-{
-	int write;
-	int dirty;
-	struct page *page;
-	int i;
-	struct ttm_backend *be = ttm->be;
-
-	BUG_ON(!(ttm->page_flags&  TTM_PAGE_FLAG_USER));
-	write = ((ttm->page_flags&  TTM_PAGE_FLAG_WRITE) != 0);
-	dirty = ((ttm->page_flags&  TTM_PAGE_FLAG_USER_DIRTY) != 0);
-
-	if (be)
-		be->func->clear(be);
-
-	for (i = 0; i<  ttm->num_pages; ++i) {
-		page = ttm->pages[i];
-		if (page == NULL)
-			continue;
-
-		if (page == ttm->dummy_read_page) {
-			BUG_ON(write);
-			continue;
-		}
-
-		if (write&&  dirty&&  !PageReserved(page))
-			set_page_dirty_lock(page);
-
-		ttm->pages[i] = NULL;
-		ttm_mem_global_free(ttm->glob->mem_glob, PAGE_SIZE);
-		put_page(page);
-	}
-	ttm->state = tt_unpopulated;
-	ttm->first_himem_page = ttm->num_pages;
-	ttm->last_lomem_page = -1;
-}
-
  static struct page *__ttm_tt_get_page(struct ttm_tt *ttm, int index)
  {
  	struct page *p;
@@ -325,10 +288,7 @@ void ttm_tt_destroy(struct ttm_tt *ttm)
  	}

  	if (likely(ttm->pages != NULL)) {
-		if (ttm->page_flags&  TTM_PAGE_FLAG_USER)
-			ttm_tt_free_user_pages(ttm);
-		else
-			ttm_tt_free_alloced_pages(ttm);
+		ttm_tt_free_alloced_pages(ttm);

  		ttm_tt_free_page_directory(ttm);
  	}
@@ -340,45 +300,6 @@ void ttm_tt_destroy(struct ttm_tt *ttm)
  	kfree(ttm);
  }

-int ttm_tt_set_user(struct ttm_tt *ttm,
-		    struct task_struct *tsk,
-		    unsigned long start, unsigned long num_pages)
-{
-	struct mm_struct *mm = tsk->mm;
-	int ret;
-	int write = (ttm->page_flags&  TTM_PAGE_FLAG_WRITE) != 0;
-	struct ttm_mem_global *mem_glob = ttm->glob->mem_glob;
-
-	BUG_ON(num_pages != ttm->num_pages);
-	BUG_ON((ttm->page_flags&  TTM_PAGE_FLAG_USER) == 0);
-
-	/**
-	 * Account user pages as lowmem pages for now.
-	 */
-
-	ret = ttm_mem_global_alloc(mem_glob, num_pages * PAGE_SIZE,
-				   false, false);
-	if (unlikely(ret != 0))
-		return ret;
-
-	down_read(&mm->mmap_sem);
-	ret = get_user_pages(tsk, mm, start, num_pages,
-			     write, 0, ttm->pages, NULL);
-	up_read(&mm->mmap_sem);
-
-	if (ret != num_pages&&  write) {
-		ttm_tt_free_user_pages(ttm);
-		ttm_mem_global_free(mem_glob, num_pages * PAGE_SIZE);
-		return -ENOMEM;
-	}
-
-	ttm->tsk = tsk;
-	ttm->start = start;
-	ttm->state = tt_unbound;
-
-	return 0;
-}
-
  struct ttm_tt *ttm_tt_create(struct ttm_bo_device *bdev, unsigned long size,
  			     uint32_t page_flags, struct page *dummy_read_page)
  {
@@ -452,8 +373,6 @@ int ttm_tt_bind(struct ttm_tt *ttm, struct ttm_mem_reg *bo_mem)

  	ttm->state = tt_bound;

-	if (ttm->page_flags&  TTM_PAGE_FLAG_USER)
-		ttm->page_flags |= TTM_PAGE_FLAG_USER_DIRTY;
  	return 0;
  }
  EXPORT_SYMBOL(ttm_tt_bind);
@@ -469,16 +388,6 @@ static int ttm_tt_swapin(struct ttm_tt *ttm)
  	int i;
  	int ret = -ENOMEM;

-	if (ttm->page_flags&  TTM_PAGE_FLAG_USER) {
-		ret = ttm_tt_set_user(ttm, ttm->tsk, ttm->start,
-				      ttm->num_pages);
-		if (unlikely(ret != 0))
-			return ret;
-
-		ttm->page_flags&= ~TTM_PAGE_FLAG_SWAPPED;
-		return 0;
-	}
-
  	swap_storage = ttm->swap_storage;
  	BUG_ON(swap_storage == NULL);

@@ -529,18 +438,6 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistent_swap_storage)
  	BUG_ON(ttm->state != tt_unbound&&  ttm->state != tt_unpopulated);
  	BUG_ON(ttm->caching_state != tt_cached);

-	/*
-	 * For user buffers, just unpin the pages, as there should be
-	 * vma references.
-	 */
-
-	if (ttm->page_flags&  TTM_PAGE_FLAG_USER) {
-		ttm_tt_free_user_pages(ttm);
-		ttm->page_flags |= TTM_PAGE_FLAG_SWAPPED;
-		ttm->swap_storage = NULL;
-		return 0;
-	}
-
  	if (!persistent_swap_storage) {
  		swap_storage = shmem_file_setup("ttm swap",
  						ttm->num_pages<<  PAGE_SHIFT,
diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h
index 42e3469..8d95a42 100644
--- a/include/drm/ttm/ttm_bo_api.h
+++ b/include/drm/ttm/ttm_bo_api.h
@@ -122,17 +122,12 @@ struct ttm_mem_reg {
   * be mmapped by user space. Each of these bos occupy a slot in the
   * device address space, that can be used for normal vm operations.
   *
- * @ttm_bo_type_user: These are user-space memory areas that are made
- * available to the GPU by mapping the buffer pages into the GPU aperture
- * space. These buffers cannot be mmaped from the device address space.
- *
   * @ttm_bo_type_kernel: These buffers are like ttm_bo_type_device buffers,
   * but they cannot be accessed from user-space. For kernel-only use.
   */

  enum ttm_bo_type {
  	ttm_bo_type_device,
-	ttm_bo_type_user,
  	ttm_bo_type_kernel
  };

diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
index 94eb143..37527d6 100644
--- a/include/drm/ttm/ttm_bo_driver.h
+++ b/include/drm/ttm/ttm_bo_driver.h
@@ -118,8 +118,6 @@ struct ttm_backend {
  	struct ttm_backend_func *func;
  };

-#define TTM_PAGE_FLAG_USER            (1<<  1)
-#define TTM_PAGE_FLAG_USER_DIRTY      (1<<  2)
  #define TTM_PAGE_FLAG_WRITE           (1<<  3)
  #define TTM_PAGE_FLAG_SWAPPED         (1<<  4)
  #define TTM_PAGE_FLAG_PERSISTENT_SWAP (1<<  5)
@@ -146,8 +144,6 @@ enum ttm_caching_state {
   * @num_pages: Number of pages in the page array.
   * @bdev: Pointer to the current struct ttm_bo_device.
   * @be: Pointer to the ttm backend.
- * @tsk: The task for user ttm.
- * @start: virtual address for user ttm.
   * @swap_storage: Pointer to shmem struct file for swap storage.
   * @caching_state: The current caching state of the pages.
   * @state: The current binding state of the pages.
@@ -167,8 +163,6 @@ struct ttm_tt {
  	unsigned long num_pages;
  	struct ttm_bo_global *glob;
  	struct ttm_backend *be;
-	struct task_struct *tsk;
-	unsigned long start;
  	struct file *swap_storage;
  	enum ttm_caching_state caching_state;
  	enum {
@@ -618,24 +612,6 @@ extern struct ttm_tt *ttm_tt_create(struct ttm_bo_device *bdev,
  				    struct page *dummy_read_page);

  /**
- * ttm_tt_set_user:
- *
- * @ttm: The struct ttm_tt to populate.
- * @tsk: A struct task_struct for which @start is a valid user-space address.
- * @start: A valid user-space address.
- * @num_pages: Size in pages of the user memory area.
- *
- * Populate a struct ttm_tt with a user-space memory area after first pinning
- * the pages backing it.
- * Returns:
- * !0: Error.
- */
-
-extern int ttm_tt_set_user(struct ttm_tt *ttm,
-			   struct task_struct *tsk,
-			   unsigned long start, unsigned long num_pages);
-
-/**
   * ttm_ttm_bind:
   *
   * @ttm: The struct ttm_tt containing backing pages.

_______________________________________________
dri-devel mailing list
dri-devel@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux