Commit 59055851 authored by Thomas Zimmermann's avatar Thomas Zimmermann
Browse files

fbdev: Put mmap for deferred I/O into drivers



The fbdev mmap function fb_mmap() unconditionally overrides the
driver's implementation if deferred I/O has been activated. This
makes it hard to implement mmap with anything but a vmalloc()'ed
software buffer. That is specifically a problem for DRM, where
video memory is maintained by a memory manager.

Leave the mmap handling to drivers and expect them to call the
helper for deferred I/O by thmeselves.

v4:
	* unlock mm_lock in fb_mmap() error path (Dan)
v3:
	* fix warning if fb_mmap is missing (kernel test robot)
v2:
	* print a helpful error message if the defio setup is
	  incorrect (Javier)

Signed-off-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: default avatarJavier Martinez Canillas <javierm@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220429100834.18898-2-tzimmermann@suse.de
parent 594e9c04
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -2118,7 +2118,9 @@ static int drm_fbdev_fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
{
	struct drm_fb_helper *fb_helper = info->par;

	if (fb_helper->dev->driver->gem_prime_mmap)
	if (drm_fbdev_use_shadow_fb(fb_helper))
		return fb_deferred_io_mmap(info, vma);
	else if (fb_helper->dev->driver->gem_prime_mmap)
		return fb_helper->dev->driver->gem_prime_mmap(fb_helper->buffer->gem, vma);
	else
		return -ENODEV;
+1 −0
Original line number Diff line number Diff line
@@ -619,6 +619,7 @@ static const struct fb_ops vmw_fb_ops = {
	.fb_imageblit = vmw_fb_imageblit,
	.fb_pan_display = vmw_fb_pan_display,
	.fb_blank = vmw_fb_blank,
	.fb_mmap = fb_deferred_io_mmap,
};

int vmw_fb_init(struct vmw_private *vmw_priv)
+1 −0
Original line number Diff line number Diff line
@@ -428,6 +428,7 @@ static const struct fb_ops picolcdfb_ops = {
	.fb_imageblit = picolcd_fb_imageblit,
	.fb_check_var = picolcd_fb_check_var,
	.fb_set_par   = picolcd_set_par,
	.fb_mmap      = fb_deferred_io_mmap,
};


+1 −0
Original line number Diff line number Diff line
@@ -652,6 +652,7 @@ struct fb_info *fbtft_framebuffer_alloc(struct fbtft_display *display,
	fbops->fb_imageblit =      fbtft_fb_imageblit;
	fbops->fb_setcolreg =      fbtft_fb_setcolreg;
	fbops->fb_blank     =      fbtft_fb_blank;
	fbops->fb_mmap      =      fb_deferred_io_mmap;

	fbdefio->delay =           HZ / fps;
	fbdefio->sort_pagelist =   true;
+1 −0
Original line number Diff line number Diff line
@@ -1055,6 +1055,7 @@ static const struct fb_ops broadsheetfb_ops = {
	.fb_fillrect	= broadsheetfb_fillrect,
	.fb_copyarea	= broadsheetfb_copyarea,
	.fb_imageblit	= broadsheetfb_imageblit,
	.fb_mmap	= fb_deferred_io_mmap,
};

static struct fb_deferred_io broadsheetfb_defio = {
Loading