diff mbox series

[v2] drm/amdgpu: Initialise drm_gem_object_funcs for imported BOs

Message ID 1607458575-15197-1-git-send-email-andrey.grodzovsky@amd.com (mailing list archive)
State New, archived
Headers show
Series [v2] drm/amdgpu: Initialise drm_gem_object_funcs for imported BOs | expand

Commit Message

Andrey Grodzovsky Dec. 8, 2020, 8:16 p.m. UTC
For BOs imported from outside of amdgpu, setting of amdgpu_gem_object_funcs
was missing in amdgpu_dma_buf_create_obj. Fix by refactoring BO creation
and amdgpu_gem_object_funcs setting into single function called
from both code paths.

Fixes: d693def4fd1c ("drm: Remove obsolete GEM and PRIME callbacks
from struct drm_driver")

v2: Use use amdgpu_gem_object_create() directly

Signed-off-by: Andrey Grodzovsky <andrey.grodzovsky@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c |  8 ++++--
 drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c     | 41 ++++++++++++++++-------------
 2 files changed, 29 insertions(+), 20 deletions(-)

Comments

Alex Deucher Dec. 8, 2020, 9:22 p.m. UTC | #1
On Tue, Dec 8, 2020 at 3:16 PM Andrey Grodzovsky
<andrey.grodzovsky@amd.com> wrote:
>
> For BOs imported from outside of amdgpu, setting of amdgpu_gem_object_funcs
> was missing in amdgpu_dma_buf_create_obj. Fix by refactoring BO creation
> and amdgpu_gem_object_funcs setting into single function called
> from both code paths.
>
> Fixes: d693def4fd1c ("drm: Remove obsolete GEM and PRIME callbacks
> from struct drm_driver")
>
> v2: Use use amdgpu_gem_object_create() directly
>
> Signed-off-by: Andrey Grodzovsky <andrey.grodzovsky@amd.com>

Reviewed-by: Alex Deucher <alexander.deucher@amd.com>

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c |  8 ++++--
>  drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c     | 41 ++++++++++++++++-------------
>  2 files changed, 29 insertions(+), 20 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
> index e5919ef..e42175e 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
> @@ -424,6 +424,7 @@ amdgpu_dma_buf_create_obj(struct drm_device *dev, struct dma_buf *dma_buf)
>         struct amdgpu_device *adev = drm_to_adev(dev);
>         struct amdgpu_bo *bo;
>         struct amdgpu_bo_param bp;
> +       struct drm_gem_object *gobj;
>         int ret;
>
>         memset(&bp, 0, sizeof(bp));
> @@ -434,17 +435,20 @@ amdgpu_dma_buf_create_obj(struct drm_device *dev, struct dma_buf *dma_buf)
>         bp.type = ttm_bo_type_sg;
>         bp.resv = resv;
>         dma_resv_lock(resv, NULL);
> -       ret = amdgpu_bo_create(adev, &bp, &bo);
> +       ret = amdgpu_gem_object_create(adev, dma_buf->size, PAGE_SIZE,
> +                       AMDGPU_GEM_DOMAIN_CPU,
> +                       0, ttm_bo_type_sg, resv, &gobj);
>         if (ret)
>                 goto error;
>
> +       bo = gem_to_amdgpu_bo(gobj);
>         bo->allowed_domains = AMDGPU_GEM_DOMAIN_GTT;
>         bo->preferred_domains = AMDGPU_GEM_DOMAIN_GTT;
>         if (dma_buf->ops != &amdgpu_dmabuf_ops)
>                 bo->prime_shared_count = 1;
>
>         dma_resv_unlock(resv);
> -       return &bo->tbo.base;
> +       return gobj;
>
>  error:
>         dma_resv_unlock(resv);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> index c9f94fb..ccf4d80 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> @@ -70,26 +70,12 @@ int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
>         bp.type = type;
>         bp.resv = resv;
>         bp.preferred_domain = initial_domain;
> -retry:
>         bp.flags = flags;
>         bp.domain = initial_domain;
>         r = amdgpu_bo_create(adev, &bp, &bo);
> -       if (r) {
> -               if (r != -ERESTARTSYS) {
> -                       if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) {
> -                               flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
> -                               goto retry;
> -                       }
> -
> -                       if (initial_domain == AMDGPU_GEM_DOMAIN_VRAM) {
> -                               initial_domain |= AMDGPU_GEM_DOMAIN_GTT;
> -                               goto retry;
> -                       }
> -                       DRM_DEBUG("Failed to allocate GEM object (%ld, %d, %u, %d)\n",
> -                                 size, initial_domain, alignment, r);
> -               }
> +       if (r)
>                 return r;
> -       }
> +
>         *obj = &bo->tbo.base;
>         (*obj)->funcs = &amdgpu_gem_object_funcs;
>
> @@ -239,7 +225,7 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
>         uint64_t size = args->in.bo_size;
>         struct dma_resv *resv = NULL;
>         struct drm_gem_object *gobj;
> -       uint32_t handle;
> +       uint32_t handle, initial_domain;
>         int r;
>
>         /* reject invalid gem flags */
> @@ -283,9 +269,28 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
>                 resv = vm->root.base.bo->tbo.base.resv;
>         }
>
> +retry:
> +       initial_domain = (u32)(0xffffffff & args->in.domains);
>         r = amdgpu_gem_object_create(adev, size, args->in.alignment,
> -                                    (u32)(0xffffffff & args->in.domains),
> +                                    initial_domain,
>                                      flags, ttm_bo_type_device, resv, &gobj);
> +       if (r) {
> +               if (r != -ERESTARTSYS) {
> +                       if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) {
> +                               flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
> +                               goto retry;
> +                       }
> +
> +                       if (initial_domain == AMDGPU_GEM_DOMAIN_VRAM) {
> +                               initial_domain |= AMDGPU_GEM_DOMAIN_GTT;
> +                               goto retry;
> +                       }
> +                       DRM_DEBUG("Failed to allocate GEM object (%ld, %d, %u, %d)\n",
> +                                 size, initial_domain, args->in.alignment, r);
> +               }
> +               return r;
> +       }
> +
>         if (flags & AMDGPU_GEM_CREATE_VM_ALWAYS_VALID) {
>                 if (!r) {
>                         struct amdgpu_bo *abo = gem_to_amdgpu_bo(gobj);
> --
> 2.7.4
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
Alex Deucher Dec. 9, 2020, 4:38 a.m. UTC | #2
On Tue, Dec 8, 2020 at 3:16 PM Andrey Grodzovsky
<andrey.grodzovsky@amd.com> wrote:
>
> For BOs imported from outside of amdgpu, setting of amdgpu_gem_object_funcs
> was missing in amdgpu_dma_buf_create_obj. Fix by refactoring BO creation
> and amdgpu_gem_object_funcs setting into single function called
> from both code paths.
>
> Fixes: d693def4fd1c ("drm: Remove obsolete GEM and PRIME callbacks
> from struct drm_driver")
>
> v2: Use use amdgpu_gem_object_create() directly
>
> Signed-off-by: Andrey Grodzovsky <andrey.grodzovsky@amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c |  8 ++++--
>  drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c     | 41 ++++++++++++++++-------------
>  2 files changed, 29 insertions(+), 20 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
> index e5919ef..e42175e 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
> @@ -424,6 +424,7 @@ amdgpu_dma_buf_create_obj(struct drm_device *dev, struct dma_buf *dma_buf)
>         struct amdgpu_device *adev = drm_to_adev(dev);
>         struct amdgpu_bo *bo;
>         struct amdgpu_bo_param bp;
> +       struct drm_gem_object *gobj;
>         int ret;
>
>         memset(&bp, 0, sizeof(bp));
> @@ -434,17 +435,20 @@ amdgpu_dma_buf_create_obj(struct drm_device *dev, struct dma_buf *dma_buf)
>         bp.type = ttm_bo_type_sg;
>         bp.resv = resv;
>         dma_resv_lock(resv, NULL);
> -       ret = amdgpu_bo_create(adev, &bp, &bo);
> +       ret = amdgpu_gem_object_create(adev, dma_buf->size, PAGE_SIZE,
> +                       AMDGPU_GEM_DOMAIN_CPU,
> +                       0, ttm_bo_type_sg, resv, &gobj);
>         if (ret)
>                 goto error;
>
> +       bo = gem_to_amdgpu_bo(gobj);
>         bo->allowed_domains = AMDGPU_GEM_DOMAIN_GTT;
>         bo->preferred_domains = AMDGPU_GEM_DOMAIN_GTT;
>         if (dma_buf->ops != &amdgpu_dmabuf_ops)
>                 bo->prime_shared_count = 1;
>
>         dma_resv_unlock(resv);
> -       return &bo->tbo.base;
> +       return gobj;
>
>  error:
>         dma_resv_unlock(resv);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> index c9f94fb..ccf4d80 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> @@ -70,26 +70,12 @@ int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
>         bp.type = type;
>         bp.resv = resv;
>         bp.preferred_domain = initial_domain;
> -retry:
>         bp.flags = flags;
>         bp.domain = initial_domain;
>         r = amdgpu_bo_create(adev, &bp, &bo);
> -       if (r) {
> -               if (r != -ERESTARTSYS) {
> -                       if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) {
> -                               flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
> -                               goto retry;
> -                       }
> -
> -                       if (initial_domain == AMDGPU_GEM_DOMAIN_VRAM) {
> -                               initial_domain |= AMDGPU_GEM_DOMAIN_GTT;
> -                               goto retry;
> -                       }
> -                       DRM_DEBUG("Failed to allocate GEM object (%ld, %d, %u, %d)\n",
> -                                 size, initial_domain, alignment, r);
> -               }
> +       if (r)
>                 return r;
> -       }
> +
>         *obj = &bo->tbo.base;
>         (*obj)->funcs = &amdgpu_gem_object_funcs;
>
> @@ -239,7 +225,7 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
>         uint64_t size = args->in.bo_size;
>         struct dma_resv *resv = NULL;
>         struct drm_gem_object *gobj;
> -       uint32_t handle;
> +       uint32_t handle, initial_domain;
>         int r;
>
>         /* reject invalid gem flags */
> @@ -283,9 +269,28 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
>                 resv = vm->root.base.bo->tbo.base.resv;
>         }
>
> +retry:
> +       initial_domain = (u32)(0xffffffff & args->in.domains);
>         r = amdgpu_gem_object_create(adev, size, args->in.alignment,
> -                                    (u32)(0xffffffff & args->in.domains),
> +                                    initial_domain,
>                                      flags, ttm_bo_type_device, resv, &gobj);
> +       if (r) {
> +               if (r != -ERESTARTSYS) {
> +                       if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) {
> +                               flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
> +                               goto retry;
> +                       }
> +
> +                       if (initial_domain == AMDGPU_GEM_DOMAIN_VRAM) {
> +                               initial_domain |= AMDGPU_GEM_DOMAIN_GTT;
> +                               goto retry;
> +                       }
> +                       DRM_DEBUG("Failed to allocate GEM object (%ld, %d, %u, %d)\n",
> +                                 size, initial_domain, args->in.alignment, r);

Just noticed this, size and args->in.alignment are u64, so these
should be %llu.  With that fixed, my RB still stands.

Alex

> +               }
> +               return r;
> +       }
> +
>         if (flags & AMDGPU_GEM_CREATE_VM_ALWAYS_VALID) {
>                 if (!r) {
>                         struct amdgpu_bo *abo = gem_to_amdgpu_bo(gobj);
> --
> 2.7.4
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
kernel test robot Dec. 9, 2020, 5:17 a.m. UTC | #3
Hi Andrey,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on drm-exynos/exynos-drm-next]
[also build test WARNING on drm-intel/for-linux-next tegra-drm/drm/tegra/for-next drm-tip/drm-tip linus/master v5.10-rc7 next-20201208]
[cannot apply to drm/drm-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Andrey-Grodzovsky/drm-amdgpu-Initialise-drm_gem_object_funcs-for-imported-BOs/20201209-041733
base:   https://git.kernel.org/pub/scm/linux/kernel/git/daeinki/drm-exynos.git exynos-drm-next
config: xtensa-randconfig-r004-20201208 (attached as .config)
compiler: xtensa-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/a7b4d98b3660452b6787b39dc59980606b462ff3
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Andrey-Grodzovsky/drm-amdgpu-Initialise-drm_gem_object_funcs-for-imported-BOs/20201209-041733
        git checkout a7b4d98b3660452b6787b39dc59980606b462ff3
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=xtensa 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

   In file included from include/drm/drm_mm.h:49,
                    from include/drm/drm_vma_manager.h:26,
                    from include/drm/drm_gem.h:40,
                    from include/drm/drm_gem_ttm_helper.h:8,
                    from drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c:36:
   drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c: In function 'amdgpu_gem_create_ioctl':
>> drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c:288:14: warning: format '%ld' expects argument of type 'long int', but argument 3 has type 'uint64_t' {aka 'long long unsigned int'} [-Wformat=]
     288 |    DRM_DEBUG("Failed to allocate GEM object (%ld, %d, %u, %d)\n",
         |              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     289 |       size, initial_domain, args->in.alignment, r);
         |       ~~~~    
         |       |
         |       uint64_t {aka long long unsigned int}
   include/drm/drm_print.h:504:25: note: in definition of macro 'DRM_DEBUG'
     504 |  __drm_dbg(DRM_UT_CORE, fmt, ##__VA_ARGS__)
         |                         ^~~
   drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c:288:48: note: format string is defined here
     288 |    DRM_DEBUG("Failed to allocate GEM object (%ld, %d, %u, %d)\n",
         |                                              ~~^
         |                                                |
         |                                                long int
         |                                              %lld
   In file included from include/drm/drm_mm.h:49,
                    from include/drm/drm_vma_manager.h:26,
                    from include/drm/drm_gem.h:40,
                    from include/drm/drm_gem_ttm_helper.h:8,
                    from drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c:36:
>> drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c:288:14: warning: format '%u' expects argument of type 'unsigned int', but argument 5 has type '__u64' {aka 'long long unsigned int'} [-Wformat=]
     288 |    DRM_DEBUG("Failed to allocate GEM object (%ld, %d, %u, %d)\n",
         |              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     289 |       size, initial_domain, args->in.alignment, r);
         |                             ~~~~~~~~~~~~~~~~~~
         |                                     |
         |                                     __u64 {aka long long unsigned int}
   include/drm/drm_print.h:504:25: note: in definition of macro 'DRM_DEBUG'
     504 |  __drm_dbg(DRM_UT_CORE, fmt, ##__VA_ARGS__)
         |                         ^~~
   drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c:288:56: note: format string is defined here
     288 |    DRM_DEBUG("Failed to allocate GEM object (%ld, %d, %u, %d)\n",
         |                                                       ~^
         |                                                        |
         |                                                        unsigned int
         |                                                       %llu
   In file included from drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c:38:
   At top level:
   drivers/gpu/drm/amd/amdgpu/amdgpu.h:198:19: warning: 'no_system_mem_limit' defined but not used [-Wunused-const-variable=]
     198 | static const bool no_system_mem_limit;
         |                   ^~~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/amd/amdgpu/amdgpu.h:197:19: warning: 'debug_evictions' defined but not used [-Wunused-const-variable=]
     197 | static const bool debug_evictions; /* = false */
         |                   ^~~~~~~~~~~~~~~
   drivers/gpu/drm/amd/amdgpu/amdgpu.h:196:18: warning: 'sched_policy' defined but not used [-Wunused-const-variable=]
     196 | static const int sched_policy = KFD_SCHED_POLICY_HWS;
         |                  ^~~~~~~~~~~~
   In file included from drivers/gpu/drm/amd/amdgpu/../display/dc/dc_types.h:33,
                    from drivers/gpu/drm/amd/amdgpu/../display/dc/dm_services_types.h:30,
                    from drivers/gpu/drm/amd/amdgpu/../include/dm_pp_interface.h:26,
                    from drivers/gpu/drm/amd/amdgpu/amdgpu.h:67,
                    from drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c:38:
   drivers/gpu/drm/amd/amdgpu/../display/include/fixed31_32.h:76:32: warning: 'dc_fixpt_ln2_div_2' defined but not used [-Wunused-const-variable=]
      76 | static const struct fixed31_32 dc_fixpt_ln2_div_2 = { 1488522236LL };
         |                                ^~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/amd/amdgpu/../display/include/fixed31_32.h:75:32: warning: 'dc_fixpt_ln2' defined but not used [-Wunused-const-variable=]
      75 | static const struct fixed31_32 dc_fixpt_ln2 = { 2977044471LL };
         |                                ^~~~~~~~~~~~
   drivers/gpu/drm/amd/amdgpu/../display/include/fixed31_32.h:74:32: warning: 'dc_fixpt_e' defined but not used [-Wunused-const-variable=]
      74 | static const struct fixed31_32 dc_fixpt_e = { 11674931555LL };
         |                                ^~~~~~~~~~
   drivers/gpu/drm/amd/amdgpu/../display/include/fixed31_32.h:73:32: warning: 'dc_fixpt_two_pi' defined but not used [-Wunused-const-variable=]
      73 | static const struct fixed31_32 dc_fixpt_two_pi = { 26986075409LL };
         |                                ^~~~~~~~~~~~~~~
   drivers/gpu/drm/amd/amdgpu/../display/include/fixed31_32.h:72:32: warning: 'dc_fixpt_pi' defined but not used [-Wunused-const-variable=]
      72 | static const struct fixed31_32 dc_fixpt_pi = { 13493037705LL };
         |                                ^~~~~~~~~~~

vim +288 drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c

   213	
   214	/*
   215	 * GEM ioctls.
   216	 */
   217	int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
   218				    struct drm_file *filp)
   219	{
   220		struct amdgpu_device *adev = drm_to_adev(dev);
   221		struct amdgpu_fpriv *fpriv = filp->driver_priv;
   222		struct amdgpu_vm *vm = &fpriv->vm;
   223		union drm_amdgpu_gem_create *args = data;
   224		uint64_t flags = args->in.domain_flags;
   225		uint64_t size = args->in.bo_size;
   226		struct dma_resv *resv = NULL;
   227		struct drm_gem_object *gobj;
   228		uint32_t handle, initial_domain;
   229		int r;
   230	
   231		/* reject invalid gem flags */
   232		if (flags & ~(AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED |
   233			      AMDGPU_GEM_CREATE_NO_CPU_ACCESS |
   234			      AMDGPU_GEM_CREATE_CPU_GTT_USWC |
   235			      AMDGPU_GEM_CREATE_VRAM_CLEARED |
   236			      AMDGPU_GEM_CREATE_VM_ALWAYS_VALID |
   237			      AMDGPU_GEM_CREATE_EXPLICIT_SYNC |
   238			      AMDGPU_GEM_CREATE_ENCRYPTED))
   239	
   240			return -EINVAL;
   241	
   242		/* reject invalid gem domains */
   243		if (args->in.domains & ~AMDGPU_GEM_DOMAIN_MASK)
   244			return -EINVAL;
   245	
   246		if (!amdgpu_is_tmz(adev) && (flags & AMDGPU_GEM_CREATE_ENCRYPTED)) {
   247			DRM_NOTE_ONCE("Cannot allocate secure buffer since TMZ is disabled\n");
   248			return -EINVAL;
   249		}
   250	
   251		/* create a gem object to contain this object in */
   252		if (args->in.domains & (AMDGPU_GEM_DOMAIN_GDS |
   253		    AMDGPU_GEM_DOMAIN_GWS | AMDGPU_GEM_DOMAIN_OA)) {
   254			if (flags & AMDGPU_GEM_CREATE_VM_ALWAYS_VALID) {
   255				/* if gds bo is created from user space, it must be
   256				 * passed to bo list
   257				 */
   258				DRM_ERROR("GDS bo cannot be per-vm-bo\n");
   259				return -EINVAL;
   260			}
   261			flags |= AMDGPU_GEM_CREATE_NO_CPU_ACCESS;
   262		}
   263	
   264		if (flags & AMDGPU_GEM_CREATE_VM_ALWAYS_VALID) {
   265			r = amdgpu_bo_reserve(vm->root.base.bo, false);
   266			if (r)
   267				return r;
   268	
   269			resv = vm->root.base.bo->tbo.base.resv;
   270		}
   271	
   272	retry:
   273		initial_domain = (u32)(0xffffffff & args->in.domains);
   274		r = amdgpu_gem_object_create(adev, size, args->in.alignment,
   275					     initial_domain,
   276					     flags, ttm_bo_type_device, resv, &gobj);
   277		if (r) {
   278			if (r != -ERESTARTSYS) {
   279				if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) {
   280					flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
   281					goto retry;
   282				}
   283	
   284				if (initial_domain == AMDGPU_GEM_DOMAIN_VRAM) {
   285					initial_domain |= AMDGPU_GEM_DOMAIN_GTT;
   286					goto retry;
   287				}
 > 288				DRM_DEBUG("Failed to allocate GEM object (%ld, %d, %u, %d)\n",
   289					  size, initial_domain, args->in.alignment, r);
   290			}
   291			return r;
   292		}
   293	
   294		if (flags & AMDGPU_GEM_CREATE_VM_ALWAYS_VALID) {
   295			if (!r) {
   296				struct amdgpu_bo *abo = gem_to_amdgpu_bo(gobj);
   297	
   298				abo->parent = amdgpu_bo_ref(vm->root.base.bo);
   299			}
   300			amdgpu_bo_unreserve(vm->root.base.bo);
   301		}
   302		if (r)
   303			return r;
   304	
   305		r = drm_gem_handle_create(filp, gobj, &handle);
   306		/* drop reference from allocate - handle holds it now */
   307		drm_gem_object_put(gobj);
   308		if (r)
   309			return r;
   310	
   311		memset(args, 0, sizeof(*args));
   312		args->out.handle = handle;
   313		return 0;
   314	}
   315	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Christian König Dec. 9, 2020, 10:12 a.m. UTC | #4
Am 08.12.20 um 21:16 schrieb Andrey Grodzovsky:
> For BOs imported from outside of amdgpu, setting of amdgpu_gem_object_funcs
> was missing in amdgpu_dma_buf_create_obj. Fix by refactoring BO creation
> and amdgpu_gem_object_funcs setting into single function called
> from both code paths.
>
> Fixes: d693def4fd1c ("drm: Remove obsolete GEM and PRIME callbacks
> from struct drm_driver")
>
> v2: Use use amdgpu_gem_object_create() directly
>
> Signed-off-by: Andrey Grodzovsky <andrey.grodzovsky@amd.com>

Reviewed-by: Christian König <christian.koenig@amd.com>

> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c |  8 ++++--
>   drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c     | 41 ++++++++++++++++-------------
>   2 files changed, 29 insertions(+), 20 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
> index e5919ef..e42175e 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
> @@ -424,6 +424,7 @@ amdgpu_dma_buf_create_obj(struct drm_device *dev, struct dma_buf *dma_buf)
>   	struct amdgpu_device *adev = drm_to_adev(dev);
>   	struct amdgpu_bo *bo;
>   	struct amdgpu_bo_param bp;
> +	struct drm_gem_object *gobj;
>   	int ret;
>   
>   	memset(&bp, 0, sizeof(bp));
> @@ -434,17 +435,20 @@ amdgpu_dma_buf_create_obj(struct drm_device *dev, struct dma_buf *dma_buf)
>   	bp.type = ttm_bo_type_sg;
>   	bp.resv = resv;
>   	dma_resv_lock(resv, NULL);
> -	ret = amdgpu_bo_create(adev, &bp, &bo);
> +	ret = amdgpu_gem_object_create(adev, dma_buf->size, PAGE_SIZE,
> +			AMDGPU_GEM_DOMAIN_CPU,
> +			0, ttm_bo_type_sg, resv, &gobj);
>   	if (ret)
>   		goto error;
>   
> +	bo = gem_to_amdgpu_bo(gobj);
>   	bo->allowed_domains = AMDGPU_GEM_DOMAIN_GTT;
>   	bo->preferred_domains = AMDGPU_GEM_DOMAIN_GTT;
>   	if (dma_buf->ops != &amdgpu_dmabuf_ops)
>   		bo->prime_shared_count = 1;
>   
>   	dma_resv_unlock(resv);
> -	return &bo->tbo.base;
> +	return gobj;
>   
>   error:
>   	dma_resv_unlock(resv);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> index c9f94fb..ccf4d80 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> @@ -70,26 +70,12 @@ int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
>   	bp.type = type;
>   	bp.resv = resv;
>   	bp.preferred_domain = initial_domain;
> -retry:
>   	bp.flags = flags;
>   	bp.domain = initial_domain;
>   	r = amdgpu_bo_create(adev, &bp, &bo);
> -	if (r) {
> -		if (r != -ERESTARTSYS) {
> -			if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) {
> -				flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
> -				goto retry;
> -			}
> -
> -			if (initial_domain == AMDGPU_GEM_DOMAIN_VRAM) {
> -				initial_domain |= AMDGPU_GEM_DOMAIN_GTT;
> -				goto retry;
> -			}
> -			DRM_DEBUG("Failed to allocate GEM object (%ld, %d, %u, %d)\n",
> -				  size, initial_domain, alignment, r);
> -		}
> +	if (r)
>   		return r;
> -	}
> +
>   	*obj = &bo->tbo.base;
>   	(*obj)->funcs = &amdgpu_gem_object_funcs;
>   
> @@ -239,7 +225,7 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
>   	uint64_t size = args->in.bo_size;
>   	struct dma_resv *resv = NULL;
>   	struct drm_gem_object *gobj;
> -	uint32_t handle;
> +	uint32_t handle, initial_domain;
>   	int r;
>   
>   	/* reject invalid gem flags */
> @@ -283,9 +269,28 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
>   		resv = vm->root.base.bo->tbo.base.resv;
>   	}
>   
> +retry:
> +	initial_domain = (u32)(0xffffffff & args->in.domains);
>   	r = amdgpu_gem_object_create(adev, size, args->in.alignment,
> -				     (u32)(0xffffffff & args->in.domains),
> +				     initial_domain,
>   				     flags, ttm_bo_type_device, resv, &gobj);
> +	if (r) {
> +		if (r != -ERESTARTSYS) {
> +			if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) {
> +				flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
> +				goto retry;
> +			}
> +
> +			if (initial_domain == AMDGPU_GEM_DOMAIN_VRAM) {
> +				initial_domain |= AMDGPU_GEM_DOMAIN_GTT;
> +				goto retry;
> +			}
> +			DRM_DEBUG("Failed to allocate GEM object (%ld, %d, %u, %d)\n",
> +				  size, initial_domain, args->in.alignment, r);
> +		}
> +		return r;
> +	}
> +
>   	if (flags & AMDGPU_GEM_CREATE_VM_ALWAYS_VALID) {
>   		if (!r) {
>   			struct amdgpu_bo *abo = gem_to_amdgpu_bo(gobj);
diff mbox series

Patch

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
index e5919ef..e42175e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
@@ -424,6 +424,7 @@  amdgpu_dma_buf_create_obj(struct drm_device *dev, struct dma_buf *dma_buf)
 	struct amdgpu_device *adev = drm_to_adev(dev);
 	struct amdgpu_bo *bo;
 	struct amdgpu_bo_param bp;
+	struct drm_gem_object *gobj;
 	int ret;
 
 	memset(&bp, 0, sizeof(bp));
@@ -434,17 +435,20 @@  amdgpu_dma_buf_create_obj(struct drm_device *dev, struct dma_buf *dma_buf)
 	bp.type = ttm_bo_type_sg;
 	bp.resv = resv;
 	dma_resv_lock(resv, NULL);
-	ret = amdgpu_bo_create(adev, &bp, &bo);
+	ret = amdgpu_gem_object_create(adev, dma_buf->size, PAGE_SIZE,
+			AMDGPU_GEM_DOMAIN_CPU,
+			0, ttm_bo_type_sg, resv, &gobj);
 	if (ret)
 		goto error;
 
+	bo = gem_to_amdgpu_bo(gobj);
 	bo->allowed_domains = AMDGPU_GEM_DOMAIN_GTT;
 	bo->preferred_domains = AMDGPU_GEM_DOMAIN_GTT;
 	if (dma_buf->ops != &amdgpu_dmabuf_ops)
 		bo->prime_shared_count = 1;
 
 	dma_resv_unlock(resv);
-	return &bo->tbo.base;
+	return gobj;
 
 error:
 	dma_resv_unlock(resv);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
index c9f94fb..ccf4d80 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
@@ -70,26 +70,12 @@  int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
 	bp.type = type;
 	bp.resv = resv;
 	bp.preferred_domain = initial_domain;
-retry:
 	bp.flags = flags;
 	bp.domain = initial_domain;
 	r = amdgpu_bo_create(adev, &bp, &bo);
-	if (r) {
-		if (r != -ERESTARTSYS) {
-			if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) {
-				flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
-				goto retry;
-			}
-
-			if (initial_domain == AMDGPU_GEM_DOMAIN_VRAM) {
-				initial_domain |= AMDGPU_GEM_DOMAIN_GTT;
-				goto retry;
-			}
-			DRM_DEBUG("Failed to allocate GEM object (%ld, %d, %u, %d)\n",
-				  size, initial_domain, alignment, r);
-		}
+	if (r)
 		return r;
-	}
+
 	*obj = &bo->tbo.base;
 	(*obj)->funcs = &amdgpu_gem_object_funcs;
 
@@ -239,7 +225,7 @@  int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
 	uint64_t size = args->in.bo_size;
 	struct dma_resv *resv = NULL;
 	struct drm_gem_object *gobj;
-	uint32_t handle;
+	uint32_t handle, initial_domain;
 	int r;
 
 	/* reject invalid gem flags */
@@ -283,9 +269,28 @@  int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
 		resv = vm->root.base.bo->tbo.base.resv;
 	}
 
+retry:
+	initial_domain = (u32)(0xffffffff & args->in.domains);
 	r = amdgpu_gem_object_create(adev, size, args->in.alignment,
-				     (u32)(0xffffffff & args->in.domains),
+				     initial_domain,
 				     flags, ttm_bo_type_device, resv, &gobj);
+	if (r) {
+		if (r != -ERESTARTSYS) {
+			if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) {
+				flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
+				goto retry;
+			}
+
+			if (initial_domain == AMDGPU_GEM_DOMAIN_VRAM) {
+				initial_domain |= AMDGPU_GEM_DOMAIN_GTT;
+				goto retry;
+			}
+			DRM_DEBUG("Failed to allocate GEM object (%ld, %d, %u, %d)\n",
+				  size, initial_domain, args->in.alignment, r);
+		}
+		return r;
+	}
+
 	if (flags & AMDGPU_GEM_CREATE_VM_ALWAYS_VALID) {
 		if (!r) {
 			struct amdgpu_bo *abo = gem_to_amdgpu_bo(gobj);