On Mon, 12 Apr 2010 10:05:00 +1000 Dave Airlie <airlied at gmail.com> wrote: > On Sat, Apr 10, 2010 at 8:11 AM, Jesse Barnes <jbarnes at virtuousgeek.org> wrote: > > Needed for panic and kdb, since we need to avoid taking the mode_config > > mutex. > > One comment below. > > > > > Signed-off-by: Jesse Barnes <jbarnes at virtuousgeek.org> > > --- > > ?drivers/gpu/drm/drm_fb_helper.c | ? 42 +++++++++++++++++++++++++++++++++----- > > ?1 files changed, 36 insertions(+), 6 deletions(-) > > > > diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c > > index 6929f5b..962eadb 100644 > > --- a/drivers/gpu/drm/drm_fb_helper.c > > +++ b/drivers/gpu/drm/drm_fb_helper.c > > @@ -242,18 +242,22 @@ static int drm_fb_helper_parse_command_line(struct drm_fb_helper *fb_helper) > > ? ? ? ?return 0; > > ?} > > > > -bool drm_fb_helper_force_kernel_mode(void) > > +bool drm_fb_helper_force_kernel_mode_locked(void) > > ?{ > > ? ? ? ?int i = 0; > > ? ? ? ?bool ret, error = false; > > ? ? ? ?struct drm_fb_helper *helper; > > - > > - ? ? ? if (list_empty(&kernel_fb_helper_list)) > > - ? ? ? ? ? ? ? return false; > > + ? ? ? struct drm_mode_set *mode_set; > > + ? ? ? struct drm_crtc *crtc; > > > > ? ? ? ?list_for_each_entry(helper, &kernel_fb_helper_list, kernel_fb_list) { > > ? ? ? ? ? ? ? ?for (i = 0; i < helper->crtc_count; i++) { > > - ? ? ? ? ? ? ? ? ? ? ? struct drm_mode_set *mode_set = &helper->crtc_info[i].mode_set; > > + ? ? ? ? ? ? ? ? ? ? ? mode_set = &helper->crtc_info[i].mode_set; > > + ? ? ? ? ? ? ? ? ? ? ? crtc = helper->crtc_info[i].mode_set.crtc; > > + > > + ? ? ? ? ? ? ? ? ? ? ? if (!crtc->enabled) > > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? continue; > > + > > ? ? ? ? ? ? ? ? ? ? ? ?ret = drm_crtc_helper_set_config(mode_set); > > ? ? ? ? ? ? ? ? ? ? ? ?if (ret) > > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?error = true; > > @@ -262,11 +266,37 @@ bool drm_fb_helper_force_kernel_mode(void) > > ? ? ? ?return error; > > ?} > > > > +bool drm_fb_helper_force_kernel_mode(void) > > +{ > > + ? ? ? bool ret; > > + ? ? ? struct drm_device *dev; > > + ? ? ? struct drm_fb_helper *helper; > > + ? ? ? struct drm_mode_set *mode_set; > > + > > + ? ? ? if (list_empty(&kernel_fb_helper_list)) { > > + ? ? ? ? ? ? ? DRM_DEBUG_KMS("no fb helper list??\n"); > > + ? ? ? ? ? ? ? return false; > > + ? ? ? } > > + > > + ? ? ? /* Get the DRM device */ > > + ? ? ? helper = list_first_entry(&kernel_fb_helper_list, > > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? struct drm_fb_helper, > > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? kernel_fb_list); > > + ? ? ? mode_set = &helper->crtc_info[0].mode_set; > > + ? ? ? dev = mode_set->crtc->dev; > > + > > + ? ? ? mutex_lock(&dev->mode_config.mutex); > > + ? ? ? ret = drm_fb_helper_force_kernel_mode_locked(); > > + ? ? ? mutex_unlock(&dev->mode_config.mutex); > > + > > + ? ? ? return ret; > > +} > > + > > ?int drm_fb_helper_panic(struct notifier_block *n, unsigned long ununsed, > > ? ? ? ? ? ? ? ? ? ? ? ?void *panic_str) > > ?{ > > ? ? ? ?DRM_ERROR("panic occurred, switching back to text console\n"); > > - ? ? ? return drm_fb_helper_force_kernel_mode(); > > + ? ? ? drm_fb_helper_force_kernel_mode_locked(); > > Any reason to drop the return here? > > not just remove the return 0? Oh no; I don't think the return value is checked anywhere but we may as well return it anyway. -- Jesse Barnes, Intel Open Source Technology Center