On Mon, Nov 28, 2016 at 05:04:23PM -0600, Grygorii Strashko wrote: > @@ -678,6 +744,9 @@ struct gbe_priv { > int num_et_stats; > /* Lock for updating the hwstats */ > spinlock_t hw_stats_lock; > + > + int cpts_registered; The usage of this counter is racy. > + struct cpts *cpts; > }; This ++ and -- business ... > +static void gbe_register_cpts(struct gbe_priv *gbe_dev) > +{ > + if (!gbe_dev->cpts) > + return; > + > + if (gbe_dev->cpts_registered > 0) > + goto done; > + > + if (cpts_register(gbe_dev->cpts)) { > + dev_err(gbe_dev->dev, "error registering cpts device\n"); > + return; > + } > + > +done: > + ++gbe_dev->cpts_registered; > +} > + > +static void gbe_unregister_cpts(struct gbe_priv *gbe_dev) > +{ > + if (!gbe_dev->cpts || (gbe_dev->cpts_registered <= 0)) > + return; > + > + if (--gbe_dev->cpts_registered) > + return; > + > + cpts_unregister(gbe_dev->cpts); > +} is invoked from your open() and close() methods, but those methods are not serialized among multiple ports. Thanks, Richard -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html