On Mon, 16 Dec 2013, Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> wrote: > If we fail to remove a conflicting fb driver, we need to abort the > loading of the second driver to avoid likely kernel panics. > > Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> > Cc: Jean-Christophe Plagniol-Villard <plagnioj@xxxxxxxxxxxx> > Cc: Tomi Valkeinen <tomi.valkeinen@xxxxxx> > Cc: linux-fbdev@xxxxxxxxxxxxxxx > Cc: dri-devel@xxxxxxxxxxxxxxxxxxxxx > --- > drivers/video/fbmem.c | 31 +++++++++++++++++++++---------- > include/linux/fb.h | 4 ++-- > 2 files changed, 23 insertions(+), 12 deletions(-) > > diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c > index 010d19105ebc..e296967a3abb 100644 > --- a/drivers/video/fbmem.c > +++ b/drivers/video/fbmem.c > @@ -1577,10 +1577,10 @@ static bool fb_do_apertures_overlap(struct apertures_struct *gena, > static int do_unregister_framebuffer(struct fb_info *fb_info); > > #define VGA_FB_PHYS 0xA0000 > -static void do_remove_conflicting_framebuffers(struct apertures_struct *a, > - const char *name, bool primary) > +static int do_remove_conflicting_framebuffers(struct apertures_struct *a, > + const char *name, bool primary) > { > - int i; > + int i, ret; > > /* check all firmware fbs and kick off if the base addr overlaps */ > for (i = 0 ; i < FB_MAX; i++) { > @@ -1599,22 +1599,29 @@ static void do_remove_conflicting_framebuffers(struct apertures_struct *a, > printk(KERN_INFO "fb: conflicting fb hw usage " > "%s vs %s - removing generic driver\n", > name, registered_fb[i]->fix.id); > - do_unregister_framebuffer(registered_fb[i]); > + ret = do_unregister_framebuffer(registered_fb[i]); > + if (ret) > + return ret; An observation, this bails out early instead of trying to unregister all the conflicting framebuffers regardless of errors like before. We're probably doomed either way? Reviewed-by: Jani Nikula <jani.nikula@xxxxxxxxx> > } > } > + > + return 0; > } > > static int do_register_framebuffer(struct fb_info *fb_info) > { > - int i; > + int i, ret; > struct fb_event event; > struct fb_videomode mode; > > if (fb_check_foreignness(fb_info)) > return -ENOSYS; > > - do_remove_conflicting_framebuffers(fb_info->apertures, fb_info->fix.id, > - fb_is_primary_device(fb_info)); > + ret = do_remove_conflicting_framebuffers(fb_info->apertures, > + fb_info->fix.id, > + fb_is_primary_device(fb_info)); > + if (ret) > + return ret; > > if (num_registered_fb == FB_MAX) > return -ENXIO; > @@ -1739,12 +1746,16 @@ int unlink_framebuffer(struct fb_info *fb_info) > } > EXPORT_SYMBOL(unlink_framebuffer); > > -void remove_conflicting_framebuffers(struct apertures_struct *a, > - const char *name, bool primary) > +int remove_conflicting_framebuffers(struct apertures_struct *a, > + const char *name, bool primary) > { > + int ret; > + > mutex_lock(®istration_lock); > - do_remove_conflicting_framebuffers(a, name, primary); > + ret = do_remove_conflicting_framebuffers(a, name, primary); > mutex_unlock(®istration_lock); > + > + return ret; > } > EXPORT_SYMBOL(remove_conflicting_framebuffers); > > diff --git a/include/linux/fb.h b/include/linux/fb.h > index 70c4836e4a9f..fe6ac956550e 100644 > --- a/include/linux/fb.h > +++ b/include/linux/fb.h > @@ -613,8 +613,8 @@ extern ssize_t fb_sys_write(struct fb_info *info, const char __user *buf, > extern int register_framebuffer(struct fb_info *fb_info); > extern int unregister_framebuffer(struct fb_info *fb_info); > extern int unlink_framebuffer(struct fb_info *fb_info); > -extern void remove_conflicting_framebuffers(struct apertures_struct *a, > - const char *name, bool primary); > +extern int remove_conflicting_framebuffers(struct apertures_struct *a, > + const char *name, bool primary); > extern int fb_prepare_logo(struct fb_info *fb_info, int rotate); > extern int fb_show_logo(struct fb_info *fb_info, int rotate); > extern char* fb_get_buffer_offset(struct fb_info *info, struct fb_pixmap *buf, u32 size); > -- > 1.8.5.1 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/intel-gfx -- Jani Nikula, Intel Open Source Technology Center _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel