Message ID | 20230605144812.15241-23-tzimmermann@suse.de |
---|---|
State | New |
Headers | show |
Series | None | expand |
Thomas Zimmermann <tzimmermann@suse.de> writes: > Detect registered instances of fb_info by reading the reference > counter from struct fb_info.read. Avoids looking at the dev field > and prepares fbdev for making struct fb_info.dev optional. > > Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> > Cc: Steve Glendinning <steve.glendinning@shawell.net> > --- > drivers/video/fbdev/smscufx.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/video/fbdev/smscufx.c b/drivers/video/fbdev/smscufx.c > index 17cec62cc65d..adb2b1fe8383 100644 > --- a/drivers/video/fbdev/smscufx.c > +++ b/drivers/video/fbdev/smscufx.c > @@ -1496,7 +1496,7 @@ static int ufx_setup_modes(struct ufx_data *dev, struct fb_info *info, > u8 *edid; > int i, result = 0, tries = 3; > > - if (info->dev) /* only use mutex if info has been registered */ > + if (refcount_read(&info->count)) /* only use mutex if info has been registered */ The struct fb_info .count refcount is protected by the registration_lock mutex in register_framebuffer(). I think this operation isn't thread safe ? But that was also the case for info->dev check, so I guess is OK and this change is for an old fbdev driver anyways. Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Hi Javier Am 08.06.23 um 00:22 schrieb Javier Martinez Canillas: > Thomas Zimmermann <tzimmermann@suse.de> writes: > >> Detect registered instances of fb_info by reading the reference >> counter from struct fb_info.read. Avoids looking at the dev field >> and prepares fbdev for making struct fb_info.dev optional. >> >> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> >> Cc: Steve Glendinning <steve.glendinning@shawell.net> >> --- >> drivers/video/fbdev/smscufx.c | 4 ++-- >> 1 file changed, 2 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/video/fbdev/smscufx.c b/drivers/video/fbdev/smscufx.c >> index 17cec62cc65d..adb2b1fe8383 100644 >> --- a/drivers/video/fbdev/smscufx.c >> +++ b/drivers/video/fbdev/smscufx.c >> @@ -1496,7 +1496,7 @@ static int ufx_setup_modes(struct ufx_data *dev, struct fb_info *info, >> u8 *edid; >> int i, result = 0, tries = 3; >> >> - if (info->dev) /* only use mutex if info has been registered */ >> + if (refcount_read(&info->count)) /* only use mutex if info has been registered */ > > The struct fb_info .count refcount is protected by the registration_lock > mutex in register_framebuffer(). I think this operation isn't thread safe ? It's an atomic read. https://elixir.bootlin.com/linux/latest/source/include/linux/refcount.h#L147 And that function is only being called from the USB probe callback before registering the framebuffer. It's not clear to me how the value could be anything but zero. I'd best leave it as is with the ref counter. https://elixir.bootlin.com/linux/latest/source/drivers/video/fbdev/smscufx.c#L1706 Best regards Thomas. > > But that was also the case for info->dev check, so I guess is OK and this > change is for an old fbdev driver anyways. > > Reviewed-by: Javier Martinez Canillas <javierm@redhat.com> >
Thomas Zimmermann <tzimmermann@suse.de> writes: Hello Thomas, > Hi Javier > > Am 08.06.23 um 00:22 schrieb Javier Martinez Canillas: >> Thomas Zimmermann <tzimmermann@suse.de> writes: >> >>> Detect registered instances of fb_info by reading the reference >>> counter from struct fb_info.read. Avoids looking at the dev field >>> and prepares fbdev for making struct fb_info.dev optional. >>> >>> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> >>> Cc: Steve Glendinning <steve.glendinning@shawell.net> >>> --- >>> drivers/video/fbdev/smscufx.c | 4 ++-- >>> 1 file changed, 2 insertions(+), 2 deletions(-) >>> >>> diff --git a/drivers/video/fbdev/smscufx.c b/drivers/video/fbdev/smscufx.c >>> index 17cec62cc65d..adb2b1fe8383 100644 >>> --- a/drivers/video/fbdev/smscufx.c >>> +++ b/drivers/video/fbdev/smscufx.c >>> @@ -1496,7 +1496,7 @@ static int ufx_setup_modes(struct ufx_data *dev, struct fb_info *info, >>> u8 *edid; >>> int i, result = 0, tries = 3; >>> >>> - if (info->dev) /* only use mutex if info has been registered */ >>> + if (refcount_read(&info->count)) /* only use mutex if info has been registered */ >> >> The struct fb_info .count refcount is protected by the registration_lock >> mutex in register_framebuffer(). I think this operation isn't thread safe ? > > It's an atomic read. > > https://elixir.bootlin.com/linux/latest/source/include/linux/refcount.h#L147 > Yes, is an atomic read but by reading [0] my understanding is that does not provide memory ordering guarantees. Maybe I misunderstood though... [0]: https://www.kernel.org/doc/html/latest/core-api/refcount-vs-atomic.html > And that function is only being called from the USB probe callback > before registering the framebuffer. It's not clear to me how the value > could be anything but zero. I'd best leave it as is with the ref counter. > Yes, I'm OK with that and as mentioned I don't think that's less safe than the previous info->dev check with regard to race conditions.
diff --git a/drivers/video/fbdev/smscufx.c b/drivers/video/fbdev/smscufx.c index 17cec62cc65d..adb2b1fe8383 100644 --- a/drivers/video/fbdev/smscufx.c +++ b/drivers/video/fbdev/smscufx.c @@ -1496,7 +1496,7 @@ static int ufx_setup_modes(struct ufx_data *dev, struct fb_info *info, u8 *edid; int i, result = 0, tries = 3; - if (info->dev) /* only use mutex if info has been registered */ + if (refcount_read(&info->count)) /* only use mutex if info has been registered */ mutex_lock(&info->lock); edid = kmalloc(EDID_LENGTH, GFP_KERNEL); @@ -1610,7 +1610,7 @@ static int ufx_setup_modes(struct ufx_data *dev, struct fb_info *info, if (edid && (dev->edid != edid)) kfree(edid); - if (info->dev) + if (refcount_read(&info->count)) mutex_unlock(&info->lock); return result;
Detect registered instances of fb_info by reading the reference counter from struct fb_info.read. Avoids looking at the dev field and prepares fbdev for making struct fb_info.dev optional. Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Cc: Steve Glendinning <steve.glendinning@shawell.net> --- drivers/video/fbdev/smscufx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)