Dave Airlie wrote:
> Now that the drm core can do this, lets just use it, split the code out
> so TTM doesn't have to drag all of drmP.h in.
>
>   
Acked-by: Thomas Hellstrom <thellst...@vmware.com>

It's funny, though. The original code used code similar to 
"is_vmalloc_addr()" now in linux/mm.h to distinguish between kmalloc / 
vmalloc pointers. That code was deemed 'too ugly to live' by Arjan. Oh 
well, I guess things change over time....

/Thomas

> Signed-off-by: Dave Airlie <airl...@redhat.com>
> ---
>  drivers/gpu/drm/ttm/ttm_tt.c    |   23 ++------------
>  include/drm/drmP.h              |   34 +--------------------
>  include/drm/drm_mem_util.h      |   65 
> +++++++++++++++++++++++++++++++++++++++
>  include/drm/ttm/ttm_bo_driver.h |    1 -
>  4 files changed, 69 insertions(+), 54 deletions(-)
>  create mode 100644 include/drm/drm_mem_util.h
>
> diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
> index a759170..bab6cd8 100644
> --- a/drivers/gpu/drm/ttm/ttm_tt.c
> +++ b/drivers/gpu/drm/ttm/ttm_tt.c
> @@ -28,13 +28,13 @@
>   * Authors: Thomas Hellstrom <thellstrom-at-vmware-dot-com>
>   */
>  
> -#include <linux/vmalloc.h>
>  #include <linux/sched.h>
>  #include <linux/highmem.h>
>  #include <linux/pagemap.h>
>  #include <linux/file.h>
>  #include <linux/swap.h>
>  #include "drm_cache.h"
> +#include "drm_mem_util.h"
>  #include "ttm/ttm_module.h"
>  #include "ttm/ttm_bo_driver.h"
>  #include "ttm/ttm_placement.h"
> @@ -43,32 +43,15 @@ static int ttm_tt_swapin(struct ttm_tt *ttm);
>  
>  /**
>   * Allocates storage for pointers to the pages that back the ttm.
> - *
> - * Uses kmalloc if possible. Otherwise falls back to vmalloc.
>   */
>  static void ttm_tt_alloc_page_directory(struct ttm_tt *ttm)
>  {
> -     unsigned long size = ttm->num_pages * sizeof(*ttm->pages);
> -     ttm->pages = NULL;
> -
> -     if (size <= PAGE_SIZE)
> -             ttm->pages = kzalloc(size, GFP_KERNEL);
> -
> -     if (!ttm->pages) {
> -             ttm->pages = vmalloc_user(size);
> -             if (ttm->pages)
> -                     ttm->page_flags |= TTM_PAGE_FLAG_VMALLOC;
> -     }
> +     ttm->pages = drm_calloc_large(ttm->num_pages, sizeof(*ttm->pages));
>  }
>  
>  static void ttm_tt_free_page_directory(struct ttm_tt *ttm)
>  {
> -     if (ttm->page_flags & TTM_PAGE_FLAG_VMALLOC) {
> -             vfree(ttm->pages);
> -             ttm->page_flags &= ~TTM_PAGE_FLAG_VMALLOC;
> -     } else {
> -             kfree(ttm->pages);
> -     }
> +     drm_free_large(ttm->pages);
>       ttm->pages = NULL;
>  }
>  
> diff --git a/include/drm/drmP.h b/include/drm/drmP.h
> index 829e524..22e60af 100644
> --- a/include/drm/drmP.h
> +++ b/include/drm/drmP.h
> @@ -1595,39 +1595,7 @@ static __inline__ void drm_core_dropmap(struct 
> drm_local_map *map)
>  {
>  }
>  
> -
> -static __inline__ void *drm_calloc_large(size_t nmemb, size_t size)
> -{
> -     if (size != 0 && nmemb > ULONG_MAX / size)
> -             return NULL;
> -
> -     if (size * nmemb <= PAGE_SIZE)
> -         return kcalloc(nmemb, size, GFP_KERNEL);
> -
> -     return __vmalloc(size * nmemb,
> -                      GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO, PAGE_KERNEL);
> -}
> -
> -/* Modeled after cairo's malloc_ab, it's like calloc but without the 
> zeroing. */
> -static __inline__ void *drm_malloc_ab(size_t nmemb, size_t size)
> -{
> -     if (size != 0 && nmemb > ULONG_MAX / size)
> -             return NULL;
> -
> -     if (size * nmemb <= PAGE_SIZE)
> -         return kmalloc(nmemb * size, GFP_KERNEL);
> -
> -     return __vmalloc(size * nmemb,
> -                      GFP_KERNEL | __GFP_HIGHMEM, PAGE_KERNEL);
> -}
> -
> -static __inline void drm_free_large(void *ptr)
> -{
> -     if (!is_vmalloc_addr(ptr))
> -             return kfree(ptr);
> -
> -     vfree(ptr);
> -}
> +#include "drm_mem_util.h"
>  /*...@}*/
>  
>  #endif                               /* __KERNEL__ */
> diff --git a/include/drm/drm_mem_util.h b/include/drm/drm_mem_util.h
> new file mode 100644
> index 0000000..6bd325f
> --- /dev/null
> +++ b/include/drm/drm_mem_util.h
> @@ -0,0 +1,65 @@
> +/*
> + * Copyright © 2008 Intel Corporation
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
> DEALINGS
> + * IN THE SOFTWARE.
> + *
> + * Authors:
> + *     Jesse Barnes <jbar...@virtuousgeek.org>
> + *
> + */
> +#ifndef _DRM_MEM_UTIL_H_
> +#define _DRM_MEM_UTIL_H_
> +
> +#include <linux/vmalloc.h>
> +
> +static __inline__ void *drm_calloc_large(size_t nmemb, size_t size)
> +{
> +     if (size != 0 && nmemb > ULONG_MAX / size)
> +             return NULL;
> +
> +     if (size * nmemb <= PAGE_SIZE)
> +         return kcalloc(nmemb, size, GFP_KERNEL);
> +
> +     return __vmalloc(size * nmemb,
> +                      GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO, PAGE_KERNEL);
> +}
> +
> +/* Modeled after cairo's malloc_ab, it's like calloc but without the 
> zeroing. */
> +static __inline__ void *drm_malloc_ab(size_t nmemb, size_t size)
> +{
> +     if (size != 0 && nmemb > ULONG_MAX / size)
> +             return NULL;
> +
> +     if (size * nmemb <= PAGE_SIZE)
> +         return kmalloc(nmemb * size, GFP_KERNEL);
> +
> +     return __vmalloc(size * nmemb,
> +                      GFP_KERNEL | __GFP_HIGHMEM, PAGE_KERNEL);
> +}
> +
> +static __inline void drm_free_large(void *ptr)
> +{
> +     if (!is_vmalloc_addr(ptr))
> +             return kfree(ptr);
> +
> +     vfree(ptr);
> +}
> +
> +#endif
> diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
> index 7fdac3d..cc02b57 100644
> --- a/include/drm/ttm/ttm_bo_driver.h
> +++ b/include/drm/ttm/ttm_bo_driver.h
> @@ -116,7 +116,6 @@ struct ttm_backend {
>       struct ttm_backend_func *func;
>  };
>  
> -#define TTM_PAGE_FLAG_VMALLOC         (1 << 0)
>  #define TTM_PAGE_FLAG_USER            (1 << 1)
>  #define TTM_PAGE_FLAG_USER_DIRTY      (1 << 2)
>  #define TTM_PAGE_FLAG_WRITE           (1 << 3)
>   
> ------------------------------------------------------------------------
>
> ------------------------------------------------------------------------------
> Download Intel&#174; Parallel Studio Eval
> Try the new software tools for yourself. Speed compiling, find bugs
> proactively, and fine-tune applications for parallel performance.
> See why Intel Parallel Studio got high marks during beta.
> http://p.sf.net/sfu/intel-sw-dev
> ------------------------------------------------------------------------
>
> --
> _______________________________________________
> Dri-devel mailing list
> Dri-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/dri-devel
>   


------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to