lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Fri, 24 Feb 2017 09:55:47 +0800 From: liuxinliang <z.liuxinliang@...ilicon.com> To: John Stultz <john.stultz@...aro.org>, lkml <linux-kernel@...r.kernel.org> CC: Rongrong Zou <zourongrong@...il.com>, Xinwei Kong <kong.kongxinwei@...ilicon.com>, Chen Feng <puck.chen@...ilicon.com>, "David Airlie" <airlied@...ux.ie>, Daniel Vetter <daniel.vetter@...ll.ch>, Sean Paul <seanpaul@...omium.org>, <dri-devel@...ts.freedesktop.org> Subject: Re: [RFC][PATCH] drm: kirin: Add a mutex to avoid fb initialization race Hi John, On 2017/2/23 8:56, John Stultz wrote: > In some cases I've been seeing a race where two framebuffers > would be initialized, as kirin_fbdev_output_poll_changed() > might get called quickly in succession, resulting in the fb > initialization happening twice. This could cause the system I might understand this race. This because two places call drm_helper_hpd_irq_event might cause the race: One place is here static int kirin_drm_kms_init(struct drm_device *dev) { ... /* force detection after connectors init */ (void)drm_helper_hpd_irq_event(dev); ... } another is the adv7533 interrupt thread handler static int adv7511_irq_process(struct adv7511 *adv7511, bool process_hpd) { ... if (process_hpd && irq0 & ADV7511_INT0_HPD && adv7511->bridge.encoder) drm_helper_hpd_irq_event(adv7511->connector.dev); ... } right? I don't get a better way to fix this yet , I like to put fb_lock into kirin_drm_private. And it seems hard to fix this in the core drm_helper_hpd_irq_event. -xinliang > to boot up with a blank screen. > > This patch adds a simple mutex to serialize it and seems to > avoid the race. > > Obviously I suspect this patch isn't the best solution, but > I wanted to send it out as something concrete to discuss the > bug. > > Suggestions or feedback for a better solution would be greatly > appreciated. > > Cc: Xinliang Liu <z.liuxinliang@...ilicon.com> > Cc: Rongrong Zou <zourongrong@...il.com> > Cc: Xinwei Kong <kong.kongxinwei@...ilicon.com> > Cc: Chen Feng <puck.chen@...ilicon.com> > Cc: David Airlie <airlied@...ux.ie> > Cc: Daniel Vetter <daniel.vetter@...ll.ch> > Cc: Sean Paul <seanpaul@...omium.org> > Cc: dri-devel@...ts.freedesktop.org > Signed-off-by: John Stultz <john.stultz@...aro.org> > --- > drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c > index ebd5f4f..80c607f 100644 > --- a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c > +++ b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c > @@ -50,11 +50,13 @@ static int kirin_drm_kms_cleanup(struct drm_device *dev) > return 0; > } > > +static DEFINE_MUTEX(fb_lock); > #ifdef CONFIG_DRM_FBDEV_EMULATION > static void kirin_fbdev_output_poll_changed(struct drm_device *dev) > { > struct kirin_drm_private *priv = dev->dev_private; > > + mutex_lock(&fb_lock); > if (priv->fbdev) { > drm_fbdev_cma_hotplug_event(priv->fbdev); > } else { > @@ -64,6 +66,7 @@ static void kirin_fbdev_output_poll_changed(struct drm_device *dev) > if (IS_ERR(priv->fbdev)) > priv->fbdev = NULL; > } > + mutex_unlock(&fb_lock); > } > #endif >
Powered by blists - more mailing lists