On Mon, Aug 17, 2020 at 11:58:59AM -0700, Richard Cochran wrote: > Vladimir, > > On Tue, Aug 04, 2020 at 02:40:11PM +0300, Vladimir Oltean wrote: > > The diff is large, yes, even though I tried to avoid making unnecessary > > changes. I hope it isn't too difficult to review, it isn't as polished > > as I typically like, because the idea itself was uncertain, so I > > preferred not to spend that extra time at this point in the process. > > Anyways, I'm looking forward to your feedback whenever you have the > > time. > > I was going to begin my review, but first I ran my ts2phc smoke test. > Valgrind found a memory leak. > > Thanks, > Richard > > sudo valgrind ./ts2phc -f ts2phc-TC.cfg --free_running=1 > ... > Control-C... > > ==9363== HEAP SUMMARY: > ==9363== in use at exit: 1,022 bytes in 10 blocks > ==9363== total heap usage: 279 allocs, 269 frees, 20,230 bytes allocated > ==9363== > ==9363== LEAK SUMMARY: > ==9363== definitely lost: 568 bytes in 4 blocks > ==9363== indirectly lost: 454 bytes in 6 blocks > ==9363== possibly lost: 0 bytes in 0 blocks > ==9363== still reachable: 0 bytes in 0 blocks > ==9363== suppressed: 0 bytes in 0 blocks > ==9363== Rerun with --leak-check=full to see details of leaked memory > > --- ts2phc-TC.cfg --- > # for use with three i210 cards > [global] > use_syslog 0 > verbose 1 > logging_level 6 > ts2phc.pulsewidth 500000000 > [eth3] > ts2phc.channel 0 > ts2phc.master 1 > ts2phc.pin_index 0 > [eth4] > ts2phc.channel 0 > ts2phc.extts_polarity both > ts2phc.pin_index 0 > [eth6] > ts2phc.channel 0 > ts2phc.extts_polarity both > ts2phc.pin_index 0
My bad. This is the sort of detail I haven't paid enough attention to. FWIW, this fixes up the memory leakage for me: diff --git a/ts2phc.c b/ts2phc.c index 69cac305c791..cac1819d4060 100644 --- a/ts2phc.c +++ b/ts2phc.c @@ -29,6 +29,8 @@ struct interface { static void ts2phc_cleanup(struct ts2phc_private *priv) { + struct port *p, *tmp; + ts2phc_slave_cleanup(priv); if (priv->master) { ts2phc_master_destroy(priv->master); @@ -37,6 +39,15 @@ static void ts2phc_cleanup(struct ts2phc_private *priv) config_destroy(priv->cfg); } close_pmc_node(&priv->node); + + /* + * Clocks are destroyed by the cleanup methods of the individual + * master and slave PHC modules. + */ + LIST_FOREACH_SAFE(p, &priv->ports, list, tmp) + free(p); + + msg_cleanup(); } /* FIXME: Copied from phc2sys */ @@ -210,6 +221,14 @@ struct clock *clock_add(struct ts2phc_private *priv, const char *device) return c; } +void clock_destroy(struct clock *c) +{ + servo_destroy(c->servo); + posix_clock_close(c->clkid); + free(c->name); + free(c); +} + /* FIXME: Copied from phc2sys */ static struct port *port_add(struct ts2phc_private *priv, unsigned int number, char *device) @@ -236,6 +255,7 @@ static struct port *port_add(struct ts2phc_private *priv, unsigned int number, p = malloc(sizeof(*p)); if (!p) { pr_err("failed to allocate memory for a port"); + clock_destroy(c); return NULL; } p->number = number; diff --git a/ts2phc.h b/ts2phc.h index 9b5df9e25e38..45a5a730d722 100644 --- a/ts2phc.h +++ b/ts2phc.h @@ -70,6 +70,7 @@ struct ts2phc_private { struct servo *servo_add(struct ts2phc_private *priv, struct clock *clock); struct clock *clock_add(struct ts2phc_private *priv, const char *device); void clock_add_tstamp(struct clock *clock, tmv_t ts); +void clock_destroy(struct clock *clock); #include "ts2phc_master.h" #include "ts2phc_slave.h" diff --git a/ts2phc_phc_master.c b/ts2phc_phc_master.c index 3feaacfbfb39..43444e879d0a 100644 --- a/ts2phc_phc_master.c +++ b/ts2phc_phc_master.c @@ -87,7 +87,7 @@ static void ts2phc_phc_master_destroy(struct ts2phc_master *master) &perout_request)) { pr_err(PTP_PEROUT_REQUEST_FAILED); } - posix_clock_close(m->clock->clkid); + clock_destroy(m->clock); free(m); } diff --git a/ts2phc_slave.c b/ts2phc_slave.c index 68fe355bdca7..6bb212865626 100644 --- a/ts2phc_slave.c +++ b/ts2phc_slave.c @@ -108,6 +108,7 @@ static void ts2phc_slave_array_destroy(struct ts2phc_private *priv) free(polling_array->slave); free(polling_array->pfd); + free(polling_array->collected_events); free(polling_array); priv->polling_array = NULL; } @@ -191,12 +192,6 @@ static struct ts2phc_slave *ts2phc_slave_create(struct ts2phc_private *priv, pr_debug("PHC slave %s has ptp index %d", device, slave->clock->phc_index); - slave->clock->servo = servo_add(priv, slave->clock); - if (!slave->clock->servo) { - pr_err("failed to create servo"); - goto no_servo; - } - if (phc_number_pins(slave->clock->clkid) > 0) { err = phc_pin_setfunc(slave->clock->clkid, &slave->pin_desc); if (err < 0) { @@ -223,9 +218,7 @@ static struct ts2phc_slave *ts2phc_slave_create(struct ts2phc_private *priv, return slave; no_ext_ts: no_pin_func: - servo_destroy(slave->clock->servo); -no_servo: - posix_clock_close(slave->clock->clkid); + clock_destroy(slave->clock); no_posix_clock: free(slave->name); free(slave); @@ -243,8 +236,7 @@ static void ts2phc_slave_destroy(struct ts2phc_slave *slave) &extts)) { pr_err(PTP_EXTTS_REQUEST_FAILED); } - servo_destroy(slave->clock->servo); - posix_clock_close(slave->clock->clkid); + clock_destroy(slave->clock); free(slave->name); free(slave); } ==2529== ==2529== HEAP SUMMARY: ==2529== in use at exit: 0 bytes in 0 blocks ==2529== total heap usage: 306 allocs, 306 frees, 105,297 bytes allocated ==2529== ==2529== All heap blocks were freed -- no leaks are possible ==2529== ==2529== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) Do I need to fix up the patches now, or are you still going to review them? Thanks, -Vladimir _______________________________________________ Linuxptp-devel mailing list Linuxptp-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxptp-devel