Message ID | 20220126152155.3070602-16-matthew.auld@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Initial support for small BAR recovery | expand |
On 1/26/22 16:21, Matthew Auld wrote: > If we have to contend with non-mappable LMEM, then we need to ensure the > object fits within the mappable portion, like in the selftests, where we > later try to CPU access the pages. However if it can't then we need to > gracefully handle this, without throwing an error. > > Also it looks like TTM will return -ENOMEM if the object can't be > placed. We should probably have a look at why that happens. I thought ttm would return -ENOSPC, which we then converted to -ENXIO in i915_ttm_err_to_gem(). /Thomas > Signed-off-by: Matthew Auld <matthew.auld@intel.com> > Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com> > --- > drivers/gpu/drm/i915/gem/selftests/huge_pages.c | 2 +- > drivers/gpu/drm/i915/selftests/intel_memory_region.c | 8 +++++++- > 2 files changed, 8 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c b/drivers/gpu/drm/i915/gem/selftests/huge_pages.c > index 42db9cd30978..3caa178bbd07 100644 > --- a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c > +++ b/drivers/gpu/drm/i915/gem/selftests/huge_pages.c > @@ -1344,7 +1344,7 @@ static int igt_ppgtt_smoke_huge(void *arg) > > err = i915_gem_object_pin_pages_unlocked(obj); > if (err) { > - if (err == -ENXIO || err == -E2BIG) { > + if (err == -ENXIO || err == -E2BIG || err == -ENOMEM) { > i915_gem_object_put(obj); > size >>= 1; > goto try_again; > diff --git a/drivers/gpu/drm/i915/selftests/intel_memory_region.c b/drivers/gpu/drm/i915/selftests/intel_memory_region.c > index 04ae29779206..87bff7f83554 100644 > --- a/drivers/gpu/drm/i915/selftests/intel_memory_region.c > +++ b/drivers/gpu/drm/i915/selftests/intel_memory_region.c > @@ -822,8 +822,14 @@ static int igt_lmem_create_with_ps(void *arg) > > i915_gem_object_lock(obj, NULL); > err = i915_gem_object_pin_pages(obj); > - if (err) > + if (err) { > + if (err == -ENXIO || err == -E2BIG || err == -ENOMEM) { > + pr_info("%s not enough lmem for ps(%u) err=%d\n", > + __func__, ps, err); > + err = 0; > + } > goto out_put; > + } > > daddr = i915_gem_object_get_dma_address(obj, 0); > if (!IS_ALIGNED(daddr, ps)) {
On 03/02/2022 09:05, Thomas Hellström wrote: > > On 1/26/22 16:21, Matthew Auld wrote: >> If we have to contend with non-mappable LMEM, then we need to ensure the >> object fits within the mappable portion, like in the selftests, where we >> later try to CPU access the pages. However if it can't then we need to >> gracefully handle this, without throwing an error. >> >> Also it looks like TTM will return -ENOMEM if the object can't be >> placed. > > We should probably have a look at why that happens. I thought ttm would > return -ENOSPC, which we then converted to -ENXIO in i915_ttm_err_to_gem(). IIRC it was in ttm_bo_mem_space(), where right at the end it does ret = -ENOMEM, after failing to evict buffers. > > /Thomas > > > >> Signed-off-by: Matthew Auld <matthew.auld@intel.com> >> Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com> >> --- >> drivers/gpu/drm/i915/gem/selftests/huge_pages.c | 2 +- >> drivers/gpu/drm/i915/selftests/intel_memory_region.c | 8 +++++++- >> 2 files changed, 8 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c >> b/drivers/gpu/drm/i915/gem/selftests/huge_pages.c >> index 42db9cd30978..3caa178bbd07 100644 >> --- a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c >> +++ b/drivers/gpu/drm/i915/gem/selftests/huge_pages.c >> @@ -1344,7 +1344,7 @@ static int igt_ppgtt_smoke_huge(void *arg) >> err = i915_gem_object_pin_pages_unlocked(obj); >> if (err) { >> - if (err == -ENXIO || err == -E2BIG) { >> + if (err == -ENXIO || err == -E2BIG || err == -ENOMEM) { >> i915_gem_object_put(obj); >> size >>= 1; >> goto try_again; >> diff --git a/drivers/gpu/drm/i915/selftests/intel_memory_region.c >> b/drivers/gpu/drm/i915/selftests/intel_memory_region.c >> index 04ae29779206..87bff7f83554 100644 >> --- a/drivers/gpu/drm/i915/selftests/intel_memory_region.c >> +++ b/drivers/gpu/drm/i915/selftests/intel_memory_region.c >> @@ -822,8 +822,14 @@ static int igt_lmem_create_with_ps(void *arg) >> i915_gem_object_lock(obj, NULL); >> err = i915_gem_object_pin_pages(obj); >> - if (err) >> + if (err) { >> + if (err == -ENXIO || err == -E2BIG || err == -ENOMEM) { >> + pr_info("%s not enough lmem for ps(%u) err=%d\n", >> + __func__, ps, err); >> + err = 0; >> + } >> goto out_put; >> + } >> daddr = i915_gem_object_get_dma_address(obj, 0); >> if (!IS_ALIGNED(daddr, ps)) {
diff --git a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c b/drivers/gpu/drm/i915/gem/selftests/huge_pages.c index 42db9cd30978..3caa178bbd07 100644 --- a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c +++ b/drivers/gpu/drm/i915/gem/selftests/huge_pages.c @@ -1344,7 +1344,7 @@ static int igt_ppgtt_smoke_huge(void *arg) err = i915_gem_object_pin_pages_unlocked(obj); if (err) { - if (err == -ENXIO || err == -E2BIG) { + if (err == -ENXIO || err == -E2BIG || err == -ENOMEM) { i915_gem_object_put(obj); size >>= 1; goto try_again; diff --git a/drivers/gpu/drm/i915/selftests/intel_memory_region.c b/drivers/gpu/drm/i915/selftests/intel_memory_region.c index 04ae29779206..87bff7f83554 100644 --- a/drivers/gpu/drm/i915/selftests/intel_memory_region.c +++ b/drivers/gpu/drm/i915/selftests/intel_memory_region.c @@ -822,8 +822,14 @@ static int igt_lmem_create_with_ps(void *arg) i915_gem_object_lock(obj, NULL); err = i915_gem_object_pin_pages(obj); - if (err) + if (err) { + if (err == -ENXIO || err == -E2BIG || err == -ENOMEM) { + pr_info("%s not enough lmem for ps(%u) err=%d\n", + __func__, ps, err); + err = 0; + } goto out_put; + } daddr = i915_gem_object_get_dma_address(obj, 0); if (!IS_ALIGNED(daddr, ps)) {
If we have to contend with non-mappable LMEM, then we need to ensure the object fits within the mappable portion, like in the selftests, where we later try to CPU access the pages. However if it can't then we need to gracefully handle this, without throwing an error. Also it looks like TTM will return -ENOMEM if the object can't be placed. Signed-off-by: Matthew Auld <matthew.auld@intel.com> Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com> --- drivers/gpu/drm/i915/gem/selftests/huge_pages.c | 2 +- drivers/gpu/drm/i915/selftests/intel_memory_region.c | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-)