Message ID | 20170202094711.939-1-jgross@suse.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Thu, Feb 02, 2017 at 10:47:11AM +0100, Juergen Gross wrote: > Commit 920cf4194954ec ("drm/i915: Introduce an internal allocator for > disposable private objects") introduced a regression for the kernel > running as Xen dom0: when switching to graphics mode a GPU HANG > occurred. > > Reason seems to be a missing adaption similar to that done in > commit 7453c549f5f648 ("swiotlb: Export swiotlb_max_segment to users") > to i915_gem_object_get_pages_internal(). > > So limit the maximum page order to be used according to the maximum > swiotlb segment size instead to the complete swiotlb size. > > Signed-off-by: Juergen Gross <jgross@suse.com> Fixes: 920cf4194954 ("drm/i915: Introduce an internal allocator for disposable private objects") Cc: Chris Wilson <chris@chris-wilson.co.uk> Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com> Cc: Daniel Vetter <daniel.vetter@intel.com> Cc: Jani Nikula <jani.nikula@linux.intel.com> Cc: intel-gfx@lists.freedesktop.org Cc: <drm-intel-fixes@lists.freedesktop.org> # v4.10-rc1+ We have a nice script for these :-) -Daniel > --- > Please consider for 4.10 as otherwise 4.10 will be unusable as Xen dom0 > with i915 graphics. > --- > drivers/gpu/drm/i915/i915_gem_internal.c | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_gem_internal.c b/drivers/gpu/drm/i915/i915_gem_internal.c > index 4b3ff3e..d09c749 100644 > --- a/drivers/gpu/drm/i915/i915_gem_internal.c > +++ b/drivers/gpu/drm/i915/i915_gem_internal.c > @@ -66,8 +66,16 @@ i915_gem_object_get_pages_internal(struct drm_i915_gem_object *obj) > > max_order = MAX_ORDER; > #ifdef CONFIG_SWIOTLB > - if (swiotlb_nr_tbl()) /* minimum max swiotlb size is IO_TLB_SEGSIZE */ > - max_order = min(max_order, ilog2(IO_TLB_SEGPAGES)); > + if (swiotlb_nr_tbl()) { > + unsigned int max_segment; > + > + max_segment = swiotlb_max_segment(); > + if (max_segment) { > + max_segment = max_t(unsigned int, max_segment, > + PAGE_SIZE) >> PAGE_SHIFT; > + max_order = min(max_order, ilog2(max_segment)); > + } > + } > #endif > > gfp = GFP_KERNEL | __GFP_HIGHMEM | __GFP_RECLAIMABLE; > -- > 2.10.2 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx
On Thu, Feb 02, 2017 at 11:48:21AM +0100, Daniel Vetter wrote: > On Thu, Feb 02, 2017 at 10:47:11AM +0100, Juergen Gross wrote: > > Commit 920cf4194954ec ("drm/i915: Introduce an internal allocator for > > disposable private objects") introduced a regression for the kernel > > running as Xen dom0: when switching to graphics mode a GPU HANG > > occurred. > > > > Reason seems to be a missing adaption similar to that done in > > commit 7453c549f5f648 ("swiotlb: Export swiotlb_max_segment to users") > > to i915_gem_object_get_pages_internal(). > > > > So limit the maximum page order to be used according to the maximum > > swiotlb segment size instead to the complete swiotlb size. > > > > Signed-off-by: Juergen Gross <jgross@suse.com> > Fixes: 920cf4194954 ("drm/i915: Introduce an internal allocator for disposable private objects") > Cc: Chris Wilson <chris@chris-wilson.co.uk> > Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com> > Cc: Daniel Vetter <daniel.vetter@intel.com> > Cc: Jani Nikula <jani.nikula@linux.intel.com> > Cc: intel-gfx@lists.freedesktop.org > Cc: <drm-intel-fixes@lists.freedesktop.org> # v4.10-rc1+ > > We have a nice script for these :-) Pffifle. 7453c549f5f648 allowed Xen to change it and silently conflicted with those that already used the previous limits, which didn't land in our tree until v4.10-rc3. -Chris
On 02/02/2017 09:47, Juergen Gross wrote: > Commit 920cf4194954ec ("drm/i915: Introduce an internal allocator for > disposable private objects") introduced a regression for the kernel > running as Xen dom0: when switching to graphics mode a GPU HANG > occurred. > > Reason seems to be a missing adaption similar to that done in > commit 7453c549f5f648 ("swiotlb: Export swiotlb_max_segment to users") > to i915_gem_object_get_pages_internal(). > > So limit the maximum page order to be used according to the maximum > swiotlb segment size instead to the complete swiotlb size. > > Signed-off-by: Juergen Gross <jgross@suse.com> > --- > Please consider for 4.10 as otherwise 4.10 will be unusable as Xen dom0 > with i915 graphics. > --- > drivers/gpu/drm/i915/i915_gem_internal.c | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_gem_internal.c b/drivers/gpu/drm/i915/i915_gem_internal.c > index 4b3ff3e..d09c749 100644 > --- a/drivers/gpu/drm/i915/i915_gem_internal.c > +++ b/drivers/gpu/drm/i915/i915_gem_internal.c > @@ -66,8 +66,16 @@ i915_gem_object_get_pages_internal(struct drm_i915_gem_object *obj) > > max_order = MAX_ORDER; > #ifdef CONFIG_SWIOTLB > - if (swiotlb_nr_tbl()) /* minimum max swiotlb size is IO_TLB_SEGSIZE */ > - max_order = min(max_order, ilog2(IO_TLB_SEGPAGES)); > + if (swiotlb_nr_tbl()) { > + unsigned int max_segment; > + > + max_segment = swiotlb_max_segment(); > + if (max_segment) { > + max_segment = max_t(unsigned int, max_segment, > + PAGE_SIZE) >> PAGE_SHIFT; > + max_order = min(max_order, ilog2(max_segment)); > + } > + } > #endif > > gfp = GFP_KERNEL | __GFP_HIGHMEM | __GFP_RECLAIMABLE; > Looks OK to me. We could bikeshed it to only use swiotlb_max_segment() which I think was the intention when that API was added but can leave that for the future. Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Regards, Tvrtko
On Thu, Feb 02, 2017 at 12:11:29PM +0000, Tvrtko Ursulin wrote: > > On 02/02/2017 09:47, Juergen Gross wrote: > >Commit 920cf4194954ec ("drm/i915: Introduce an internal allocator for > >disposable private objects") introduced a regression for the kernel > >running as Xen dom0: when switching to graphics mode a GPU HANG > >occurred. > > > >Reason seems to be a missing adaption similar to that done in > >commit 7453c549f5f648 ("swiotlb: Export swiotlb_max_segment to users") > >to i915_gem_object_get_pages_internal(). > > > >So limit the maximum page order to be used according to the maximum > >swiotlb segment size instead to the complete swiotlb size. > > > >Signed-off-by: Juergen Gross <jgross@suse.com> > >--- > >Please consider for 4.10 as otherwise 4.10 will be unusable as Xen dom0 > >with i915 graphics. > >--- > > drivers/gpu/drm/i915/i915_gem_internal.c | 12 ++++++++++-- > > 1 file changed, 10 insertions(+), 2 deletions(-) > > > >diff --git a/drivers/gpu/drm/i915/i915_gem_internal.c b/drivers/gpu/drm/i915/i915_gem_internal.c > >index 4b3ff3e..d09c749 100644 > >--- a/drivers/gpu/drm/i915/i915_gem_internal.c > >+++ b/drivers/gpu/drm/i915/i915_gem_internal.c > >@@ -66,8 +66,16 @@ i915_gem_object_get_pages_internal(struct drm_i915_gem_object *obj) > > > > max_order = MAX_ORDER; > > #ifdef CONFIG_SWIOTLB > >- if (swiotlb_nr_tbl()) /* minimum max swiotlb size is IO_TLB_SEGSIZE */ > >- max_order = min(max_order, ilog2(IO_TLB_SEGPAGES)); > >+ if (swiotlb_nr_tbl()) { > >+ unsigned int max_segment; > >+ > >+ max_segment = swiotlb_max_segment(); > >+ if (max_segment) { > >+ max_segment = max_t(unsigned int, max_segment, > >+ PAGE_SIZE) >> PAGE_SHIFT; > >+ max_order = min(max_order, ilog2(max_segment)); > >+ } > >+ } > > #endif > > > > gfp = GFP_KERNEL | __GFP_HIGHMEM | __GFP_RECLAIMABLE; > > > > Looks OK to me. We could bikeshed it to only use > swiotlb_max_segment() which I think was the intention when that API > was added but can leave that for the future. > > Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Pushed, I imagine this has been added to the list of sg cleanups you have :) -Chris
diff --git a/drivers/gpu/drm/i915/i915_gem_internal.c b/drivers/gpu/drm/i915/i915_gem_internal.c index 4b3ff3e..d09c749 100644 --- a/drivers/gpu/drm/i915/i915_gem_internal.c +++ b/drivers/gpu/drm/i915/i915_gem_internal.c @@ -66,8 +66,16 @@ i915_gem_object_get_pages_internal(struct drm_i915_gem_object *obj) max_order = MAX_ORDER; #ifdef CONFIG_SWIOTLB - if (swiotlb_nr_tbl()) /* minimum max swiotlb size is IO_TLB_SEGSIZE */ - max_order = min(max_order, ilog2(IO_TLB_SEGPAGES)); + if (swiotlb_nr_tbl()) { + unsigned int max_segment; + + max_segment = swiotlb_max_segment(); + if (max_segment) { + max_segment = max_t(unsigned int, max_segment, + PAGE_SIZE) >> PAGE_SHIFT; + max_order = min(max_order, ilog2(max_segment)); + } + } #endif gfp = GFP_KERNEL | __GFP_HIGHMEM | __GFP_RECLAIMABLE;
Commit 920cf4194954ec ("drm/i915: Introduce an internal allocator for disposable private objects") introduced a regression for the kernel running as Xen dom0: when switching to graphics mode a GPU HANG occurred. Reason seems to be a missing adaption similar to that done in commit 7453c549f5f648 ("swiotlb: Export swiotlb_max_segment to users") to i915_gem_object_get_pages_internal(). So limit the maximum page order to be used according to the maximum swiotlb segment size instead to the complete swiotlb size. Signed-off-by: Juergen Gross <jgross@suse.com> --- Please consider for 4.10 as otherwise 4.10 will be unusable as Xen dom0 with i915 graphics. --- drivers/gpu/drm/i915/i915_gem_internal.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)