{
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
 
-       WARN_ON(!msm_gem_is_locked(obj));
+       GEM_WARN_ON(!msm_gem_is_locked(obj));
 
        if (!msm_obj->pages) {
                struct drm_device *dev = obj->dev;
 
        msm_gem_lock(obj);
 
-       if (WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED)) {
+       if (GEM_WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED)) {
                msm_gem_unlock(obj);
                return ERR_PTR(-EBUSY);
        }
                goto out;
        }
 
-       if (WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED)) {
+       if (GEM_WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED)) {
                msm_gem_unlock(obj);
                return VM_FAULT_SIGBUS;
        }
        struct drm_device *dev = obj->dev;
        int ret;
 
-       WARN_ON(!msm_gem_is_locked(obj));
+       GEM_WARN_ON(!msm_gem_is_locked(obj));
 
        /* Make it mmapable */
        ret = drm_gem_create_mmap_offset(obj);
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
        struct msm_gem_vma *vma;
 
-       WARN_ON(!msm_gem_is_locked(obj));
+       GEM_WARN_ON(!msm_gem_is_locked(obj));
 
        vma = kzalloc(sizeof(*vma), GFP_KERNEL);
        if (!vma)
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
        struct msm_gem_vma *vma;
 
-       WARN_ON(!msm_gem_is_locked(obj));
+       GEM_WARN_ON(!msm_gem_is_locked(obj));
 
        list_for_each_entry(vma, &msm_obj->vmas, list) {
                if (vma->aspace == aspace)
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
        struct msm_gem_vma *vma;
 
-       WARN_ON(!msm_gem_is_locked(obj));
+       GEM_WARN_ON(!msm_gem_is_locked(obj));
 
        list_for_each_entry(vma, &msm_obj->vmas, list) {
                if (vma->aspace) {
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
        struct msm_gem_vma *vma, *tmp;
 
-       WARN_ON(!msm_gem_is_locked(obj));
+       GEM_WARN_ON(!msm_gem_is_locked(obj));
 
        list_for_each_entry_safe(vma, tmp, &msm_obj->vmas, list) {
                del_vma(vma);
        struct msm_gem_vma *vma;
        int ret = 0;
 
-       WARN_ON(!msm_gem_is_locked(obj));
+       GEM_WARN_ON(!msm_gem_is_locked(obj));
 
        vma = lookup_vma(obj, aspace);
 
        if (msm_obj->flags & MSM_BO_MAP_PRIV)
                prot |= IOMMU_PRIV;
 
-       WARN_ON(!msm_gem_is_locked(obj));
+       GEM_WARN_ON(!msm_gem_is_locked(obj));
 
-       if (WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED))
+       if (GEM_WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED))
                return -EBUSY;
 
        vma = lookup_vma(obj, aspace);
-       if (WARN_ON(!vma))
+       if (GEM_WARN_ON(!vma))
                return -EINVAL;
 
        pages = get_pages(obj);
        u64 local;
        int ret;
 
-       WARN_ON(!msm_gem_is_locked(obj));
+       GEM_WARN_ON(!msm_gem_is_locked(obj));
 
        ret = get_iova_locked(obj, aspace, &local,
                range_start, range_end);
        msm_gem_lock(obj);
        vma = lookup_vma(obj, aspace);
        msm_gem_unlock(obj);
-       WARN_ON(!vma);
+       GEM_WARN_ON(!vma);
 
        return vma ? vma->iova : 0;
 }
 {
        struct msm_gem_vma *vma;
 
-       WARN_ON(!msm_gem_is_locked(obj));
+       GEM_WARN_ON(!msm_gem_is_locked(obj));
 
        vma = lookup_vma(obj, aspace);
 
-       if (!WARN_ON(!vma))
+       if (!GEM_WARN_ON(!vma))
                msm_gem_unmap_vma(aspace, vma);
 }
 
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
        int ret = 0;
 
-       WARN_ON(!msm_gem_is_locked(obj));
+       GEM_WARN_ON(!msm_gem_is_locked(obj));
 
        if (obj->import_attach)
                return ERR_PTR(-ENODEV);
 
-       if (WARN_ON(msm_obj->madv > madv)) {
+       if (GEM_WARN_ON(msm_obj->madv > madv)) {
                DRM_DEV_ERROR(obj->dev->dev, "Invalid madv state: %u vs %u\n",
                        msm_obj->madv, madv);
                return ERR_PTR(-EBUSY);
 {
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
 
-       WARN_ON(!msm_gem_is_locked(obj));
-       WARN_ON(msm_obj->vmap_count < 1);
+       GEM_WARN_ON(!msm_gem_is_locked(obj));
+       GEM_WARN_ON(msm_obj->vmap_count < 1);
 
        msm_obj->vmap_count--;
 }
        struct drm_device *dev = obj->dev;
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
 
-       WARN_ON(!is_purgeable(msm_obj));
-       WARN_ON(obj->import_attach);
+       GEM_WARN_ON(!is_purgeable(msm_obj));
+       GEM_WARN_ON(obj->import_attach);
 
        put_iova_spaces(obj);
 
 {
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
 
-       WARN_ON(!msm_gem_is_locked(obj));
+       GEM_WARN_ON(!msm_gem_is_locked(obj));
 
-       if (!msm_obj->vaddr || WARN_ON(!is_vunmapable(msm_obj)))
+       if (!msm_obj->vaddr || GEM_WARN_ON(!is_vunmapable(msm_obj)))
                return;
 
        vunmap(msm_obj->vaddr);
        struct msm_drm_private *priv = obj->dev->dev_private;
 
        might_sleep();
-       WARN_ON(!msm_gem_is_locked(obj));
-       WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED);
-       WARN_ON(msm_obj->dontneed);
+       GEM_WARN_ON(!msm_gem_is_locked(obj));
+       GEM_WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED);
+       GEM_WARN_ON(msm_obj->dontneed);
 
        if (msm_obj->active_count++ == 0) {
                mutex_lock(&priv->mm_lock);
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
 
        might_sleep();
-       WARN_ON(!msm_gem_is_locked(obj));
+       GEM_WARN_ON(!msm_gem_is_locked(obj));
 
        if (--msm_obj->active_count == 0) {
                update_inactive(msm_obj);
        struct msm_drm_private *priv = msm_obj->base.dev->dev_private;
 
        mutex_lock(&priv->mm_lock);
-       WARN_ON(msm_obj->active_count != 0);
+       GEM_WARN_ON(msm_obj->active_count != 0);
 
        if (msm_obj->dontneed)
                mark_unpurgeable(msm_obj);
                list_add_tail(&msm_obj->mm_list, &priv->inactive_dontneed);
                mark_purgeable(msm_obj);
        } else {
-               WARN_ON(msm_obj->madv != __MSM_MADV_PURGED);
+               GEM_WARN_ON(msm_obj->madv != __MSM_MADV_PURGED);
                list_add_tail(&msm_obj->mm_list, &priv->inactive_purged);
        }
 
        msm_gem_lock(obj);
 
        /* object should not be on active list: */
-       WARN_ON(is_active(msm_obj));
+       GEM_WARN_ON(is_active(msm_obj));
 
        put_iova_spaces(obj);
 
        if (obj->import_attach) {
-               WARN_ON(msm_obj->vaddr);
+               GEM_WARN_ON(msm_obj->vaddr);
 
                /* Don't drop the pages for imported dmabuf, as they are not
                 * ours, just free the array we allocated:
        else if ((flags & (MSM_BO_STOLEN | MSM_BO_SCANOUT)) && priv->vram.size)
                use_vram = true;
 
-       if (WARN_ON(use_vram && !priv->vram.size))
+       if (GEM_WARN_ON(use_vram && !priv->vram.size))
                return ERR_PTR(-EINVAL);
 
        /* Disallow zero sized objects as they make the underlying
 
 #include <linux/dma-resv.h>
 #include "msm_drv.h"
 
+/* Make all GEM related WARN_ON()s ratelimited.. when things go wrong they
+ * tend to go wrong 1000s of times in a short timespan.
+ */
+#define GEM_WARN_ON(x)  WARN_RATELIMIT(x, "%s", __stringify(x))
+
 /* Additional internal-use only BO flags: */
 #define MSM_BO_STOLEN        0x10000000    /* try to use stolen/splash memory */
 #define MSM_BO_MAP_PRIV      0x20000000    /* use IOMMU_PRIV when mapping */
 
 static inline bool is_active(struct msm_gem_object *msm_obj)
 {
-       WARN_ON(!msm_gem_is_locked(&msm_obj->base));
+       GEM_WARN_ON(!msm_gem_is_locked(&msm_obj->base));
        return msm_obj->active_count;
 }
 
 
 static inline bool is_vunmapable(struct msm_gem_object *msm_obj)
 {
-       WARN_ON(!msm_gem_is_locked(&msm_obj->base));
+       GEM_WARN_ON(!msm_gem_is_locked(&msm_obj->base));
        return (msm_obj->vmap_count == 0) && msm_obj->vaddr;
 }
 
 {
        struct msm_drm_private *priv = msm_obj->base.dev->dev_private;
 
-       WARN_ON(!mutex_is_locked(&priv->mm_lock));
+       GEM_WARN_ON(!mutex_is_locked(&priv->mm_lock));
 
        if (is_unpurgeable(msm_obj))
                return;
 
-       if (WARN_ON(msm_obj->dontneed))
+       if (GEM_WARN_ON(msm_obj->dontneed))
                return;
 
        priv->shrinkable_count += msm_obj->base.size >> PAGE_SHIFT;
 {
        struct msm_drm_private *priv = msm_obj->base.dev->dev_private;
 
-       WARN_ON(!mutex_is_locked(&priv->mm_lock));
+       GEM_WARN_ON(!mutex_is_locked(&priv->mm_lock));
 
        if (is_unpurgeable(msm_obj))
                return;
 
-       if (WARN_ON(!msm_obj->dontneed))
+       if (GEM_WARN_ON(!msm_obj->dontneed))
                return;
 
        priv->shrinkable_count -= msm_obj->base.size >> PAGE_SHIFT;
-       WARN_ON(priv->shrinkable_count < 0);
+       GEM_WARN_ON(priv->shrinkable_count < 0);
        msm_obj->dontneed = false;
 }