On 11/30/2016 03:44 AM, Richard Cochran wrote: > 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. > ok. Seems my assumption that ndo_open/ndo_close serialized by rtnl_lock is incorrect. Right? net_device_ops.ndo_open -> netcp_ndo_open gbe_open gbe_register_cpts -- regards, -grygorii -- 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