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 |
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
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
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
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 --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);
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(-)