From mboxrd@z Thu Jan 1 00:00:00 1970 From: compudj@krystal.dyndns.org (Mathieu Desnoyers) Date: Thu, 2 Oct 2008 01:34:32 -0400 Subject: [ltt-dev] [Autotest] [PATCH] LTTng trace destroy wait for readers to complete In-Reply-To: <5df78e1d0809221215p203c1805g336fd5075fec6f81@mail.gmail.com> References: <20080915154111.E5BA2312E04@localhost> <33307c790809151144x6c9992e3pba94505e0aab4cf@mail.gmail.com> <20080915190806.GA12100@Krystal> <5df78e1d0809221215p203c1805g336fd5075fec6f81@mail.gmail.com> Message-ID: <20081002053432.GC7676@Krystal> Excellent! :) It will be integrated in the next release. Given I already had my files modified, I merged it by hand. Thanks a lot! Mathieu * Jiaying Zhang (jiayingz at google.com) wrote: > Hi Mathieu, > > Regarding to your comment about we should probably use a waitqueue > to synchronize lttd readers and trace destroy, how about we implement > one now? See the attached patch. > > Jiaying > > On Mon, Sep 15, 2008 at 12:08 PM, Mathieu Desnoyers < > compudj at krystal.dyndns.org> wrote: > > > Hi John, > > > > Please try the following patch instead. It should make lttctl wait until > > all lttd instances release the trace kref. > > > > Mathieu > > > > > > LTTng trace destroy wait for readers to complete > > > > Make lttctl sleep until all the lttd readers complete. > > > > Hopefully this will brighten Martin's day. > > > > Signed-off-by: Mathieu Desnoyers > > CC: Martin J. Bligh > > CC: Jiaying Zhang > > CC: John Admanski > > --- > > ltt/ltt-tracer.c | 9 +++++++++ > > 1 file changed, 9 insertions(+) > > > > Index: linux-2.6-lttng/ltt/ltt-tracer.c > > =================================================================== > > --- linux-2.6-lttng.orig/ltt/ltt-tracer.c 2008-09-15 > > 14:43:00.000000000 -0400 > > +++ linux-2.6-lttng/ltt/ltt-tracer.c 2008-09-15 14:58:03.000000000 -0400 > > @@ -40,6 +40,7 @@ > > #include > > #include > > #include > > +#include > > #include > > > > static void async_wakeup(unsigned long data); > > @@ -635,6 +636,14 @@ static void __ltt_trace_destroy(struct l > > > > module_put(trace->transport->owner); > > > > + /* > > + * Wait for lttd readers to release the files, therefore making > > sure > > + * the last subbuffers have been read. Currently use a sleep, > > should > > + * probably use a waitqueue. > > + */ > > + while (atomic_read(&trace->kref.refcount) > 1) > > + ssleep(1); > > + > > kref_put(&trace->kref, ltt_release_trace); > > } > > > > > > -- > > Mathieu Desnoyers > > OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68 > > _______________________________________________ > > Autotest mailing list > > Autotest at test.kernel.org > > http://test.kernel.org/cgi-bin/mailman/listinfo/autotest > > > --- linux-2.6.26/include/linux/ltt-tracer.h 2008-08-28 16:11:44.000000000 -0700 > +++ linux-2.6.26-old/include/linux/ltt-tracer.h 2008-09-19 17:12:46.000000000 -0700 > @@ -270,6 +270,7 @@ struct ltt_trace_struct { > } channel; > struct rchan_callbacks callbacks; > struct kref kref; /* Each channel has a kref of the trace struct */ > + wait_queue_head_t kref_wq; /* Place for ltt_trace_destroy to sleep */ > } ____cacheline_aligned; > > /* > --- linux-2.6.26/ltt/ltt-tracer.c 2008-08-28 16:11:44.000000000 -0700 > +++ linux-2.6.26-old/ltt/ltt-tracer.c 2008-09-22 11:33:57.000000000 -0700 > @@ -389,6 +389,7 @@ static int ltt_trace_create(char *trace_ > > kref_init(&new_trace->kref); > kref_init(&new_trace->ltt_transport_kref); > + init_waitqueue_head(&new_trace->kref_wq); > new_trace->active = 0; > strncpy(new_trace->trace_name, trace_name, NAME_MAX); > new_trace->paused = 0; > @@ -537,6 +538,7 @@ dirs_error: > module_put(transport->owner); > trace_error: > kref_put(&new_trace->kref, ltt_release_trace); > + wake_up_interruptible(&trace->kref_wq); > ltt_unlock_traces(); > traces_error: > return err; > @@ -612,6 +614,15 @@ static void __ltt_trace_destroy(struct l > > module_put(trace->transport->owner); > > + /* > + * Wait for lttd readers to release the files, therefore making sure > + * the last subbuffers have been read. > + */ > + if (atomic_read(&trace->kref.refcount) > 1) { > + int ret = 0; > + __wait_event_interruptible(trace->kref_wq, (atomic_read(&trace->kref.refcount) == 1), ret); > + } > + > kref_put(&trace->kref, ltt_release_trace); > } > > --- linux-2.6.26/ltt/ltt-relay.c 2008-09-10 13:11:44.000000000 -0700 > +++ linux-2.6.26-old/ltt/ltt-relay.c 2008-09-22 11:20:07.000000000 -0700 > @@ -472,6 +472,7 @@ static void ltt_relay_destroy_buffer(str > ltt_chan->buf[cpu].commit_count = NULL; > kref_put(<t_chan->kref, ltt_relay_release_channel); > kref_put(&trace->kref, ltt_release_trace); > + wake_up_interruptible(&trace->kref_wq); > } > > /* -- Mathieu Desnoyers OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68