===================================================================
@@ -34,6 +34,7 @@ module_param(fb_defio, int, S_IWUSR | S_
struct udl_fbdev {
struct drm_fb_helper helper;
struct udl_framebuffer ufb;
+ struct fb_ops fb_ops;
int fb_count;
};
@@ -405,7 +406,8 @@ static int udlfb_create(struct drm_fb_he
info->fix.smem_len = size;
info->fix.smem_start = (unsigned long)ufbdev->ufb.obj->vmapping;
- info->fbops = &udlfb_ops;
+ ufbdev->fb_ops = udlfb_ops;
+ info->fbops = &ufbdev->fb_ops;
drm_fb_helper_fill_fix(info, fb->pitches[0], fb->format->depth);
drm_fb_helper_fill_var(info, &ufbdev->helper, sizes->fb_width, sizes->fb_height);
The defio subsystem overwrites the method fb_osp->mmap. That method is stored in module's static data - and that means that if we have multiple diplaylink adapters, they will over write each other's method. In order to avoid interference between multiple adapters, we copy the fb_ops structure to a device-local memory. Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> Cc: stable@vger.kernel.org --- drivers/gpu/drm/udl/udl_fb.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)