* [PATCH v2 2/3] mm/vmap: Add a notifier for when we run out of vmap address space [not found] <1459777603-23618-1-git-send-email-chris@chris-wilson.co.uk> @ 2016-04-04 13:46 ` Chris Wilson 2016-04-05 8:01 ` Joonas Lahtinen 2016-04-04 13:46 ` [PATCH v2 3/3] drm/i915/shrinker: Hook up vmap allocation failure notifier Chris Wilson 1 sibling, 1 reply; 5+ messages in thread From: Chris Wilson @ 2016-04-04 13:46 UTC (permalink / raw) To: intel-gfx Cc: Chris Wilson, Andrew Morton, David Rientjes, Roman Peniaev, Mel Gorman, linux-mm, linux-kernel, Joonas Lahtinen, Tvrtko Ursulin vmaps are temporary kernel mappings that may be of long duration. Reusing a vmap on an object is preferrable for a driver as the cost of setting up the vmap can otherwise dominate the operation on the object. However, the vmap address space is rather limited on 32bit systems and so we add a notification for vmap pressure in order for the driver to release any cached vmappings. The interface is styled after the oom-notifier where the callees are passed a pointer to an unsigned long counter for them to indicate if they have freed any space. v2: Guard the blocking notifier call with gfpflags_allow_blocking() v3: Correct typo in forward declaration and move to head of file Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: David Rientjes <rientjes@google.com> Cc: Roman Peniaev <r.peniaev@gmail.com> Cc: Mel Gorman <mgorman@techsingularity.net> Cc: linux-mm@kvack.org Cc: linux-kernel@vger.kernel.org Acked-by: Andrew Morton <akpm@linux-foundation.org> # for inclusion via DRM Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com> --- include/linux/vmalloc.h | 4 ++++ mm/vmalloc.c | 27 +++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index d1f1d338af20..8b51df3ab334 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h @@ -8,6 +8,7 @@ #include <linux/rbtree.h> struct vm_area_struct; /* vma defining user mapping in mm_types.h */ +struct notifier_block; /* in notifier.h */ /* bits in flags of vmalloc's vm_struct below */ #define VM_IOREMAP 0x00000001 /* ioremap() and friends */ @@ -187,4 +188,7 @@ pcpu_free_vm_areas(struct vm_struct **vms, int nr_vms) #define VMALLOC_TOTAL 0UL #endif +int register_vmap_purge_notifier(struct notifier_block *nb); +int unregister_vmap_purge_notifier(struct notifier_block *nb); + #endif /* _LINUX_VMALLOC_H */ diff --git a/mm/vmalloc.c b/mm/vmalloc.c index ae7d20b447ff..293889d7f482 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -21,6 +21,7 @@ #include <linux/debugobjects.h> #include <linux/kallsyms.h> #include <linux/list.h> +#include <linux/notifier.h> #include <linux/rbtree.h> #include <linux/radix-tree.h> #include <linux/rcupdate.h> @@ -344,6 +345,8 @@ static void __insert_vmap_area(struct vmap_area *va) static void purge_vmap_area_lazy(void); +static BLOCKING_NOTIFIER_HEAD(vmap_notify_list); + /* * Allocate a region of KVA of the specified size and alignment, within the * vstart and vend. @@ -363,6 +366,8 @@ static struct vmap_area *alloc_vmap_area(unsigned long size, BUG_ON(offset_in_page(size)); BUG_ON(!is_power_of_2(align)); + might_sleep_if(gfpflags_allow_blocking(gfp_mask)); + va = kmalloc_node(sizeof(struct vmap_area), gfp_mask & GFP_RECLAIM_MASK, node); if (unlikely(!va)) @@ -468,6 +473,16 @@ overflow: purged = 1; goto retry; } + + if (gfpflags_allow_blocking(gfp_mask)) { + unsigned long freed = 0; + blocking_notifier_call_chain(&vmap_notify_list, 0, &freed); + if (freed > 0) { + purged = 0; + goto retry; + } + } + if (printk_ratelimit()) pr_warn("vmap allocation for size %lu failed: use vmalloc=<size> to increase size\n", size); @@ -475,6 +490,18 @@ overflow: return ERR_PTR(-EBUSY); } +int register_vmap_purge_notifier(struct notifier_block *nb) +{ + return blocking_notifier_chain_register(&vmap_notify_list, nb); +} +EXPORT_SYMBOL_GPL(register_vmap_purge_notifier); + +int unregister_vmap_purge_notifier(struct notifier_block *nb) +{ + return blocking_notifier_chain_unregister(&vmap_notify_list, nb); +} +EXPORT_SYMBOL_GPL(unregister_vmap_purge_notifier); + static void __free_vmap_area(struct vmap_area *va) { BUG_ON(RB_EMPTY_NODE(&va->rb_node)); -- 2.8.0.rc3 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v2 2/3] mm/vmap: Add a notifier for when we run out of vmap address space 2016-04-04 13:46 ` [PATCH v2 2/3] mm/vmap: Add a notifier for when we run out of vmap address space Chris Wilson @ 2016-04-05 8:01 ` Joonas Lahtinen 0 siblings, 0 replies; 5+ messages in thread From: Joonas Lahtinen @ 2016-04-05 8:01 UTC (permalink / raw) To: Chris Wilson, intel-gfx Cc: Andrew Morton, David Rientjes, Roman Peniaev, Mel Gorman, linux-mm, linux-kernel, Tvrtko Ursulin On ma, 2016-04-04 at 14:46 +0100, Chris Wilson wrote: > vmaps are temporary kernel mappings that may be of long duration. > Reusing a vmap on an object is preferrable for a driver as the cost of > setting up the vmap can otherwise dominate the operation on the object. > However, the vmap address space is rather limited on 32bit systems and > so we add a notification for vmap pressure in order for the driver to > release any cached vmappings. > > The interface is styled after the oom-notifier where the callees are > passed a pointer to an unsigned long counter for them to indicate if they > have freed any space. > > v2: Guard the blocking notifier call with gfpflags_allow_blocking() > v3: Correct typo in forward declaration and move to head of file > > Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> > Cc: Andrew Morton <akpm@linux-foundation.org> > Cc: David Rientjes <rientjes@google.com> > Cc: Roman Peniaev <r.peniaev@gmail.com> > Cc: Mel Gorman <mgorman@techsingularity.net> > Cc: linux-mm@kvack.org > Cc: linux-kernel@vger.kernel.org > Acked-by: Andrew Morton <akpm@linux-foundation.org> # for inclusion via DRM > Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> > Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com> > --- > A include/linux/vmalloc.h |A A 4 ++++ > A mm/vmalloc.cA A A A A A A A A A A A | 27 +++++++++++++++++++++++++++ > A 2 files changed, 31 insertions(+) > > diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h > index d1f1d338af20..8b51df3ab334 100644 > --- a/include/linux/vmalloc.h > +++ b/include/linux/vmalloc.h > @@ -8,6 +8,7 @@ > A #include > A > A struct vm_area_struct; /* vma defining user mapping in mm_types.h */ > +struct notifier_block; /* in notifier.h */ > A > A /* bits in flags of vmalloc's vm_struct below */ > A #define VM_IOREMAP 0x00000001 /* ioremap() and friends */ > @@ -187,4 +188,7 @@ pcpu_free_vm_areas(struct vm_struct **vms, int nr_vms) > A #define VMALLOC_TOTAL 0UL > A #endif > A > +int register_vmap_purge_notifier(struct notifier_block *nb); > +int unregister_vmap_purge_notifier(struct notifier_block *nb); > + > A #endif /* _LINUX_VMALLOC_H */ > diff --git a/mm/vmalloc.c b/mm/vmalloc.c > index ae7d20b447ff..293889d7f482 100644 > --- a/mm/vmalloc.c > +++ b/mm/vmalloc.c > @@ -21,6 +21,7 @@ > A #include > A #include > A #include > +#include > A #include > A #include > A #include > @@ -344,6 +345,8 @@ static void __insert_vmap_area(struct vmap_area *va) > A > A static void purge_vmap_area_lazy(void); > A > +static BLOCKING_NOTIFIER_HEAD(vmap_notify_list); > + > A /* > A * Allocate a region of KVA of the specified size and alignment, within the > A * vstart and vend. > @@ -363,6 +366,8 @@ static struct vmap_area *alloc_vmap_area(unsigned long size, > A BUG_ON(offset_in_page(size)); > A BUG_ON(!is_power_of_2(align)); > A > + might_sleep_if(gfpflags_allow_blocking(gfp_mask)); > + > A va = kmalloc_node(sizeof(struct vmap_area), > A gfp_mask & GFP_RECLAIM_MASK, node); > A if (unlikely(!va)) > @@ -468,6 +473,16 @@ overflow: > A purged = 1; > A goto retry; > A } > + > + if (gfpflags_allow_blocking(gfp_mask)) { > + unsigned long freed = 0; > + blocking_notifier_call_chain(&vmap_notify_list, 0, &freed); > + if (freed > 0) { > + purged = 0; > + goto retry; > + } > + } > + > A if (printk_ratelimit()) > A pr_warn("vmap allocation for size %lu failed: use vmalloc= to increase size\n", > A size); > @@ -475,6 +490,18 @@ overflow: > A return ERR_PTR(-EBUSY); > A } > A > +int register_vmap_purge_notifier(struct notifier_block *nb) > +{ > + return blocking_notifier_chain_register(&vmap_notify_list, nb); > +} > +EXPORT_SYMBOL_GPL(register_vmap_purge_notifier); > + > +int unregister_vmap_purge_notifier(struct notifier_block *nb) > +{ > + return blocking_notifier_chain_unregister(&vmap_notify_list, nb); > +} > +EXPORT_SYMBOL_GPL(unregister_vmap_purge_notifier); > + > A static void __free_vmap_area(struct vmap_area *va) > A { > A BUG_ON(RB_EMPTY_NODE(&va->rb_node)); -- Joonas Lahtinen Open Source Technology Center Intel Corporation -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2 3/3] drm/i915/shrinker: Hook up vmap allocation failure notifier [not found] <1459777603-23618-1-git-send-email-chris@chris-wilson.co.uk> 2016-04-04 13:46 ` [PATCH v2 2/3] mm/vmap: Add a notifier for when we run out of vmap address space Chris Wilson @ 2016-04-04 13:46 ` Chris Wilson 2016-04-05 8:19 ` Joonas Lahtinen 1 sibling, 1 reply; 5+ messages in thread From: Chris Wilson @ 2016-04-04 13:46 UTC (permalink / raw) To: intel-gfx Cc: Chris Wilson, Andrew Morton, David Rientjes, Roman Pen, Mel Gorman, linux-mm, linux-kernel, Joonas Lahtinen, Tvrtko Ursulin, Mika Kahola If the core runs out of vmap address space, it will call a notifier in case any driver can reap some of its vmaps. As i915.ko is possibily holding onto vmap address space that could be recovered, hook into the notifier chain and try and reap objects holding onto vmaps. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: David Rientjes <rientjes@google.com> Cc: Roman Pen <r.peniaev@gmail.com> Cc: Mel Gorman <mgorman@techsingularity.net> Cc: linux-mm@kvack.org Cc: linux-kernel@vger.kernel.org Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Cc: Mika Kahola <mika.kahola@intel.com> --- drivers/gpu/drm/i915/i915_drv.h | 1 + drivers/gpu/drm/i915/i915_gem_shrinker.c | 39 ++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index dd187727c813..6443745d4182 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -1257,6 +1257,7 @@ struct i915_gem_mm { struct i915_hw_ppgtt *aliasing_ppgtt; struct notifier_block oom_notifier; + struct notifier_block vmap_notifier; struct shrinker shrinker; bool shrinker_no_lock_stealing; diff --git a/drivers/gpu/drm/i915/i915_gem_shrinker.c b/drivers/gpu/drm/i915/i915_gem_shrinker.c index e391ee3ec486..be7501afb59e 100644 --- a/drivers/gpu/drm/i915/i915_gem_shrinker.c +++ b/drivers/gpu/drm/i915/i915_gem_shrinker.c @@ -28,6 +28,7 @@ #include <linux/swap.h> #include <linux/pci.h> #include <linux/dma-buf.h> +#include <linux/vmalloc.h> #include <drm/drmP.h> #include <drm/i915_drm.h> @@ -356,6 +357,40 @@ i915_gem_shrinker_oom(struct notifier_block *nb, unsigned long event, void *ptr) return NOTIFY_DONE; } +static int +i915_gem_shrinker_vmap(struct notifier_block *nb, unsigned long event, void *ptr) +{ + struct drm_i915_private *dev_priv = + container_of(nb, struct drm_i915_private, mm.vmap_notifier); + struct drm_device *dev = dev_priv->dev; + unsigned long timeout = msecs_to_jiffies(5000) + 1; + unsigned long freed_pages; + bool was_interruptible; + bool unlock; + + while (!i915_gem_shrinker_lock(dev, &unlock) && --timeout) { + schedule_timeout_killable(1); + if (fatal_signal_pending(current)) + return NOTIFY_DONE; + } + if (timeout == 0) { + pr_err("Unable to purge GPU vmaps due to lock contention.\n"); + return NOTIFY_DONE; + } + + was_interruptible = dev_priv->mm.interruptible; + dev_priv->mm.interruptible = false; + + freed_pages = i915_gem_shrink_all(dev_priv); + + dev_priv->mm.interruptible = was_interruptible; + if (unlock) + mutex_unlock(&dev->struct_mutex); + + *(unsigned long *)ptr += freed_pages; + return NOTIFY_DONE; +} + /** * i915_gem_shrinker_init - Initialize i915 shrinker * @dev_priv: i915 device @@ -371,6 +406,9 @@ void i915_gem_shrinker_init(struct drm_i915_private *dev_priv) dev_priv->mm.oom_notifier.notifier_call = i915_gem_shrinker_oom; WARN_ON(register_oom_notifier(&dev_priv->mm.oom_notifier)); + + dev_priv->mm.vmap_notifier.notifier_call = i915_gem_shrinker_vmap; + WARN_ON(register_vmap_purge_notifier(&dev_priv->mm.vmap_notifier)); } /** @@ -381,6 +419,7 @@ void i915_gem_shrinker_init(struct drm_i915_private *dev_priv) */ void i915_gem_shrinker_cleanup(struct drm_i915_private *dev_priv) { + WARN_ON(unregister_vmap_purge_notifier(&dev_priv->mm.vmap_notifier)); WARN_ON(unregister_oom_notifier(&dev_priv->mm.oom_notifier)); unregister_shrinker(&dev_priv->mm.shrinker); } -- 2.8.0.rc3 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v2 3/3] drm/i915/shrinker: Hook up vmap allocation failure notifier 2016-04-04 13:46 ` [PATCH v2 3/3] drm/i915/shrinker: Hook up vmap allocation failure notifier Chris Wilson @ 2016-04-05 8:19 ` Joonas Lahtinen 2016-04-05 9:03 ` Chris Wilson 0 siblings, 1 reply; 5+ messages in thread From: Joonas Lahtinen @ 2016-04-05 8:19 UTC (permalink / raw) To: Chris Wilson, intel-gfx Cc: Andrew Morton, David Rientjes, Roman Pen, Mel Gorman, linux-mm, linux-kernel, Tvrtko Ursulin, Mika Kahola On ma, 2016-04-04 at 14:46 +0100, Chris Wilson wrote: > If the core runs out of vmap address space, it will call a notifier in > case any driver can reap some of its vmaps. As i915.ko is possibily > holding onto vmap address space that could be recovered, hook into the > notifier chain and try and reap objects holding onto vmaps. > > Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> > Cc: Andrew Morton <akpm@linux-foundation.org> > Cc: David Rientjes <rientjes@google.com> > Cc: Roman Pen <r.peniaev@gmail.com> > Cc: Mel Gorman <mgorman@techsingularity.net> > Cc: linux-mm@kvack.org > Cc: linux-kernel@vger.kernel.org > Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> A comment below. But regardless; Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> > Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com> > Cc: Mika Kahola <mika.kahola@intel.com> > --- > A drivers/gpu/drm/i915/i915_drv.hA A A A A A A A A A |A A 1 + > A drivers/gpu/drm/i915/i915_gem_shrinker.c | 39 ++++++++++++++++++++++++++++++++ > A 2 files changed, 40 insertions(+) > > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h > index dd187727c813..6443745d4182 100644 > --- a/drivers/gpu/drm/i915/i915_drv.h > +++ b/drivers/gpu/drm/i915/i915_drv.h > @@ -1257,6 +1257,7 @@ struct i915_gem_mm { > A struct i915_hw_ppgtt *aliasing_ppgtt; > A > A struct notifier_block oom_notifier; > + struct notifier_block vmap_notifier; > A struct shrinker shrinker; > A bool shrinker_no_lock_stealing; > A > diff --git a/drivers/gpu/drm/i915/i915_gem_shrinker.c b/drivers/gpu/drm/i915/i915_gem_shrinker.c > index e391ee3ec486..be7501afb59e 100644 > --- a/drivers/gpu/drm/i915/i915_gem_shrinker.c > +++ b/drivers/gpu/drm/i915/i915_gem_shrinker.c > @@ -28,6 +28,7 @@ > A #include > A #include > A #include > +#include > A #include > A #include > A > @@ -356,6 +357,40 @@ i915_gem_shrinker_oom(struct notifier_block *nb, unsigned long event, void *ptr) > A return NOTIFY_DONE; > A } > A > +static int > +i915_gem_shrinker_vmap(struct notifier_block *nb, unsigned long event, void *ptr) > +{ > + struct drm_i915_private *dev_priv = > + container_of(nb, struct drm_i915_private, mm.vmap_notifier); > + struct drm_device *dev = dev_priv->dev; > + unsigned long timeout = msecs_to_jiffies(5000) + 1; > + unsigned long freed_pages; > + bool was_interruptible; > + bool unlock; > + > + while (!i915_gem_shrinker_lock(dev, &unlock) && --timeout) { > + schedule_timeout_killable(1); > + if (fatal_signal_pending(current)) > + return NOTIFY_DONE; > + } > + if (timeout == 0) { > + pr_err("Unable to purge GPU vmaps due to lock contention.\n"); > + return NOTIFY_DONE; > + } > + > + was_interruptible = dev_priv->mm.interruptible; > + dev_priv->mm.interruptible = false; > + > + freed_pages = i915_gem_shrink_all(dev_priv); > + > + dev_priv->mm.interruptible = was_interruptible; Up until here this is same function as the oom shrinker, so I would combine these two and here do "if (vmap) goto out;" sort of thing. Would just need a way to distinct between two calling sites. I did not come up with a quick solution as both are passing 0 as event. Regards, Joonas > + if (unlock) > + mutex_unlock(&dev->struct_mutex); > + > + *(unsigned long *)ptr += freed_pages; > + return NOTIFY_DONE; > +} > + > A /** > A * i915_gem_shrinker_init - Initialize i915 shrinker > A * @dev_priv: i915 device > @@ -371,6 +406,9 @@ void i915_gem_shrinker_init(struct drm_i915_private *dev_priv) > A > A dev_priv->mm.oom_notifier.notifier_call = i915_gem_shrinker_oom; > A WARN_ON(register_oom_notifier(&dev_priv->mm.oom_notifier)); > + > + dev_priv->mm.vmap_notifier.notifier_call = i915_gem_shrinker_vmap; > + WARN_ON(register_vmap_purge_notifier(&dev_priv->mm.vmap_notifier)); > A } > A > A /** > @@ -381,6 +419,7 @@ void i915_gem_shrinker_init(struct drm_i915_private *dev_priv) > A */ > A void i915_gem_shrinker_cleanup(struct drm_i915_private *dev_priv) > A { > + WARN_ON(unregister_vmap_purge_notifier(&dev_priv->mm.vmap_notifier)); > A WARN_ON(unregister_oom_notifier(&dev_priv->mm.oom_notifier)); > A unregister_shrinker(&dev_priv->mm.shrinker); > A } -- Joonas Lahtinen Open Source Technology Center Intel Corporation -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2 3/3] drm/i915/shrinker: Hook up vmap allocation failure notifier 2016-04-05 8:19 ` Joonas Lahtinen @ 2016-04-05 9:03 ` Chris Wilson 0 siblings, 0 replies; 5+ messages in thread From: Chris Wilson @ 2016-04-05 9:03 UTC (permalink / raw) To: Joonas Lahtinen Cc: intel-gfx, Andrew Morton, David Rientjes, Roman Pen, Mel Gorman, linux-mm, linux-kernel, Tvrtko Ursulin, Mika Kahola On Tue, Apr 05, 2016 at 11:19:38AM +0300, Joonas Lahtinen wrote: > On ma, 2016-04-04 at 14:46 +0100, Chris Wilson wrote: > > If the core runs out of vmap address space, it will call a notifier in > > case any driver can reap some of its vmaps. As i915.ko is possibily > > holding onto vmap address space that could be recovered, hook into the > > notifier chain and try and reap objects holding onto vmaps. > > > > Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> > > Cc: Andrew Morton <akpm@linux-foundation.org> > > Cc: David Rientjes <rientjes@google.com> > > Cc: Roman Pen <r.peniaev@gmail.com> > > Cc: Mel Gorman <mgorman@techsingularity.net> > > Cc: linux-mm@kvack.org > > Cc: linux-kernel@vger.kernel.org > > Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> > > A comment below. But regardless; > > Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> > > > Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com> > > Cc: Mika Kahola <mika.kahola@intel.com> > > --- > > drivers/gpu/drm/i915/i915_drv.h | 1 + > > drivers/gpu/drm/i915/i915_gem_shrinker.c | 39 ++++++++++++++++++++++++++++++++ > > 2 files changed, 40 insertions(+) > > > > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h > > index dd187727c813..6443745d4182 100644 > > --- a/drivers/gpu/drm/i915/i915_drv.h > > +++ b/drivers/gpu/drm/i915/i915_drv.h > > @@ -1257,6 +1257,7 @@ struct i915_gem_mm { > > struct i915_hw_ppgtt *aliasing_ppgtt; > > > > struct notifier_block oom_notifier; > > + struct notifier_block vmap_notifier; > > struct shrinker shrinker; > > bool shrinker_no_lock_stealing; > > > > diff --git a/drivers/gpu/drm/i915/i915_gem_shrinker.c b/drivers/gpu/drm/i915/i915_gem_shrinker.c > > index e391ee3ec486..be7501afb59e 100644 > > --- a/drivers/gpu/drm/i915/i915_gem_shrinker.c > > +++ b/drivers/gpu/drm/i915/i915_gem_shrinker.c > > @@ -28,6 +28,7 @@ > > #include > > #include > > #include > > +#include > > #include > > #include > > > > @@ -356,6 +357,40 @@ i915_gem_shrinker_oom(struct notifier_block *nb, unsigned long event, void *ptr) > > return NOTIFY_DONE; > > } > > > > +static int > > +i915_gem_shrinker_vmap(struct notifier_block *nb, unsigned long event, void *ptr) > > +{ > > + struct drm_i915_private *dev_priv = > > + container_of(nb, struct drm_i915_private, mm.vmap_notifier); > > + struct drm_device *dev = dev_priv->dev; > > + unsigned long timeout = msecs_to_jiffies(5000) + 1; > > + unsigned long freed_pages; > > + bool was_interruptible; > > + bool unlock; > > + > > + while (!i915_gem_shrinker_lock(dev, &unlock) && --timeout) { > > + schedule_timeout_killable(1); > > + if (fatal_signal_pending(current)) > > + return NOTIFY_DONE; > > + } > > + if (timeout == 0) { > > + pr_err("Unable to purge GPU vmaps due to lock contention.\n"); > > + return NOTIFY_DONE; > > + } > > + > > + was_interruptible = dev_priv->mm.interruptible; > > + dev_priv->mm.interruptible = false; > > + > > + freed_pages = i915_gem_shrink_all(dev_priv); > > + > > + dev_priv->mm.interruptible = was_interruptible; > > Up until here this is same function as the oom shrinker, so I would > combine these two and here do "if (vmap) goto out;" sort of thing. > > Would just need a way to distinct between two calling sites. I did not > come up with a quick solution as both are passing 0 as event. Less thrilled about merging the two notifier callbacks, but we could wrap i915_gem_shrinker_lock_killable(). -Chris -- Chris Wilson, Intel Open Source Technology Centre -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2016-04-05 9:03 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <1459777603-23618-1-git-send-email-chris@chris-wilson.co.uk> 2016-04-04 13:46 ` [PATCH v2 2/3] mm/vmap: Add a notifier for when we run out of vmap address space Chris Wilson 2016-04-05 8:01 ` Joonas Lahtinen 2016-04-04 13:46 ` [PATCH v2 3/3] drm/i915/shrinker: Hook up vmap allocation failure notifier Chris Wilson 2016-04-05 8:19 ` Joonas Lahtinen 2016-04-05 9:03 ` Chris Wilson
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).