On 11/08/2011 12:40 AM, j.glisse at gmail.com wrote:
> From: Jerome Glisse<jglisse at redhat.com>
>
> 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 at vmware.com>

> Signed-off-by: Jerome Glisse<jglisse at redhat.com>
> Reviewed-by: Konrad Rzeszutek Wilk<konrad.wilk at oracle.com>
> ---
>   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.
>    

Reply via email to