return -EAGAIN;
        }
  
 +      return 0;
 +}
 +
 +static int drm_fb_helper_find_sizes(struct drm_fb_helper *fb_helper,
 +                                  struct drm_fb_helper_surface_size *sizes)
 +{
 +      struct drm_client_dev *client = &fb_helper->client;
 +      struct drm_device *dev = fb_helper->dev;
 +      struct drm_mode_config *config = &dev->mode_config;
 +      int ret;
 +
 +      mutex_lock(&client->modeset_mutex);
 +      ret = __drm_fb_helper_find_sizes(fb_helper, sizes);
 +      mutex_unlock(&client->modeset_mutex);
 +
 +      if (ret)
 +              return ret;
 +
        /* Handle our overallocation */
 -      sizes.surface_height *= drm_fbdev_overalloc;
 -      sizes.surface_height /= 100;
 -      if (sizes.surface_height > config->max_height) {
 +      sizes->surface_height *= drm_fbdev_overalloc;
 +      sizes->surface_height /= 100;
 +      if (sizes->surface_height > config->max_height) {
                drm_dbg_kms(dev, "Fbdev over-allocation too large; clamping height to %d\n",
                            config->max_height);
 -              sizes.surface_height = config->max_height;
 +              sizes->surface_height = config->max_height;
 +      }
 +
 +      return 0;
 +}
 +
 +/*
 + * Allocates the backing storage and sets up the fbdev info structure through
 + * the ->fb_probe callback.
 + */
 +static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper)
 +{
 +      struct drm_client_dev *client = &fb_helper->client;
++      struct drm_device *dev = fb_helper->dev;
 +      struct drm_fb_helper_surface_size sizes;
 +      int ret;
 +
 +      ret = drm_fb_helper_find_sizes(fb_helper, &sizes);
 +      if (ret) {
 +              /* First time: disable all crtc's.. */
 +              if (!fb_helper->deferred_setup)
 +                      drm_client_modeset_commit(client);
 +              return ret;
        }
  
  #if IS_ENABLED(CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM)
 
        fb_helper->fb = buffer->fb;
        fb = buffer->fb;
  
 -      fbi = drm_fb_helper_alloc_info(fb_helper);
 -      if (IS_ERR(fbi))
 -              return PTR_ERR(fbi);
 +      info = drm_fb_helper_alloc_info(fb_helper);
 +      if (IS_ERR(info))
 +              return PTR_ERR(info);
  
 -      fbi->fbops = &drm_fbdev_fb_ops;
 -      fbi->screen_size = sizes->surface_height * fb->pitches[0];
 -      fbi->fix.smem_len = fbi->screen_size;
 -      fbi->flags = FBINFO_DEFAULT;
 +      info->fbops = &drm_fbdev_fb_ops;
 +      info->screen_size = sizes->surface_height * fb->pitches[0];
 +      info->fix.smem_len = info->screen_size;
 +      info->flags = FBINFO_DEFAULT;
  
 -      drm_fb_helper_fill_info(fbi, fb_helper, sizes);
 +      drm_fb_helper_fill_info(info, fb_helper, sizes);
  
        if (drm_fbdev_use_shadow_fb(fb_helper)) {
 -              fbi->screen_buffer = vzalloc(fbi->screen_size);
 -              if (!fbi->screen_buffer)
 +              info->screen_buffer = vzalloc(info->screen_size);
 +              if (!info->screen_buffer)
                        return -ENOMEM;
 -              fbi->flags |= FBINFO_VIRTFB | FBINFO_READS_FAST;
 +              info->flags |= FBINFO_VIRTFB | FBINFO_READS_FAST;
  
-               info->fbdefio = &drm_fbdev_defio;
-               fb_deferred_io_init(info);
+               /* Set a default deferred I/O handler */
+               fb_helper->fbdefio.delay = HZ / 20;
+               fb_helper->fbdefio.deferred_io = drm_fb_helper_deferred_io;
+ 
 -              fbi->fbdefio = &fb_helper->fbdefio;
 -              ret = fb_deferred_io_init(fbi);
++              info->fbdefio = &fb_helper->fbdefio;
++              ret = fb_deferred_io_init(info);
+               if (ret)
+                       return ret;
        } else {
                /* buffer is mapped for HW framebuffer */
                ret = drm_client_buffer_vmap(fb_helper->buffer, &map);
 
        drm_format_helper_test.o \
        drm_format_test.o \
        drm_framebuffer_test.o \
 -      drm_kunit_helpers.o \
 +      drm_managed_test.o \
        drm_mm_test.o \
 +      drm_modes_test.o \
        drm_plane_helper_test.o \
 +      drm_probe_helper_test.o \
        drm_rect_test.o
+ 
+ CFLAGS_drm_mm_test.o := $(DISABLE_STRUCTLEAK_PLUGIN)
 
  #define ttm_prime_object_kfree(__obj, __prime)                \
        kfree_rcu(__obj, __prime.base.rhead)
  
- struct ttm_base_object *
- ttm_base_object_noref_lookup(struct ttm_object_file *tfile, uint64_t key);
- 
- /**
-  * ttm_base_object_noref_release - release a base object pointer looked up
-  * without reference
-  *
-  * Releases a base object pointer looked up with ttm_base_object_noref_lookup().
-  */
- static inline void ttm_base_object_noref_release(void)
- {
-       __acquire(RCU);
-       rcu_read_unlock();
- }
- 
 +static inline int ttm_bo_wait(struct ttm_buffer_object *bo, bool intr,
 +                            bool no_wait)
 +{
 +      struct ttm_operation_ctx ctx = { intr, no_wait };
 +
 +      return ttm_bo_wait_ctx(bo, &ctx);
 +}
 +
  #endif