On Tue, Jun 20, 2017 at 06:50:13PM +0200, Dhananjay Balan wrote: > The locking and unlocking code used by copy routines is common, so > moved it to a macro. > > Signed-off-by: Dhananjay Balan <mail@xxxxxxxxx> > --- > drivers/staging/sm750fb/sm750.c | 81 ++++++++++++++++------------------------- > 1 file changed, 31 insertions(+), 50 deletions(-) > > diff --git a/drivers/staging/sm750fb/sm750.c b/drivers/staging/sm750fb/sm750.c > index 386d4adcd91d..d8ab83aea46d 100644 > --- a/drivers/staging/sm750fb/sm750.c > +++ b/drivers/staging/sm750fb/sm750.c > @@ -156,12 +156,25 @@ static int lynxfb_ops_cursor(struct fb_info *info, struct fb_cursor *fbcursor) > return 0; > } > > +/* > + * If not using spin_lock, system will die if user frequently loads and > + * immediately unloads driver (dual) > + */ > +#define dual_safe_call(func, ...) \ > + do { \ > + if (sm750_dev->fb_count > 1) \ > + spin_lock(&sm750_dev->slock); \ > + func(__VA_ARGS__); \ > + if (sm750_dev->fb_count > 1) \ > + spin_unlock(&sm750_dev->slock); \ > + } while (0) > + I feel like this is the wrong approach. You could just make a small lock function and a small unlock function. Except that if statement seems kind of bogus. What happens if ->fb_count is 0 when we lock and 1 when we unlock? Why not lock unconditionally? It is not likely to be contested if there are no other users. > static void lynxfb_ops_fillrect(struct fb_info *info, > const struct fb_fillrect *region) > { > struct lynxfb_par *par; > struct sm750_dev *sm750_dev; > - unsigned int base, pitch, Bpp, rop; > + unsigned int base, pitch, bit_pp, rop; This part has nothing to do with locking... *frowny face* regards, dan carpenter _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel