[ltt-dev] Force buffer sizes to be at least page size
Mathieu Desnoyers
compudj at krystal.dyndns.org
Wed Jul 15 13:58:22 EDT 2009
* Mathieu Desnoyers (compudj at krystal.dyndns.org) wrote:
> * Chase Douglas (cndougla at linux.vnet.ibm.com) wrote:
> > During some testing across various architectures we found that our ppc64
> > environment with 64K page sizes was causing lttctl to hang when
> > destroying a trace if the buffer size was less than 64K
> > (channel.all.bufsize). We had been testing with 16K buffer sizes, and
> > every other architecture ran fine. This led us to believe that ltt is
> > not handling buffer sizes less than a page size correctly.
> >
> > We did not determine the root cause of the failure, instead opting for a
> > quick patch to force the buffer sizes to be at least page size. I have
> > attached the patch. Please take this under advisement either to
> > determine the root cause or to force proper buffer sizes as necessary.
> >
>
> Actually, the subbuffer size (not only the buffer size) should be at
> least a page. I'll do a patch for LTTng shortly.
>
> Thanks for the report !
>
Can you give this patch a try to see if it fixes your problem ? (without
your lttctl patch, the problem must be dealt at the kernel-level)
LTTng check min subbuffer size page size
The mininum size of a subbuffer (not just buffer) must be at least a page.
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers at polymtl.ca>
---
include/linux/ltt-relay.h | 3 ---
ltt/ltt-relay-alloc.c | 16 ++++++++++++----
ltt/ltt-tracer.c | 4 ++++
3 files changed, 16 insertions(+), 7 deletions(-)
Index: linux-2.6-lttng/ltt/ltt-relay-alloc.c
===================================================================
--- linux-2.6-lttng.orig/ltt/ltt-relay-alloc.c 2009-07-15 13:10:29.000000000 -0400
+++ linux-2.6-lttng/ltt/ltt-relay-alloc.c 2009-07-15 13:26:15.000000000 -0400
@@ -39,7 +39,6 @@ static int relay_alloc_buf(struct rchan_
struct page **pages;
void **virt;
- *size = PAGE_ALIGN(*size);
n_pages = *size >> PAGE_SHIFT;
n_pages_per_sb = n_pages >> get_count_order(n_subbufs);
if (extra_reader_sb)
@@ -421,8 +420,8 @@ static int __cpuinit relay_hotcpu_callba
* ltt_relay_open - create a new relay channel
* @base_filename: base name of files to create
* @parent: dentry of parent directory, %NULL for root directory
- * @subbuf_size: size of sub-buffers
- * @n_subbufs: number of sub-buffers
+ * @subbuf_size: size of sub-buffers (> PAGE_SIZE, power of 2)
+ * @n_subbufs: number of sub-buffers (power of 2)
* @cb: client callback functions
* @private_data: user-defined data
* @extra_reader_sb: allocate an extra subbuffer for the reader
@@ -454,11 +453,20 @@ struct rchan *ltt_relay_open(const char
if (!chan)
return NULL;
+ /* Check that the subbuffer size is larger than a page. */
+ WARN_ON_ONCE(subbuf_size < PAGE_SIZE);
+
+ /*
+ * Make sure the number of subbuffers and subbuffer size are power of 2.
+ */
+ WARN_ON_ONCE(hweight32(subbuf_size) != 1);
+ WARN_ON(hweight32(n_subbufs) != 1);
+
chan->version = LTT_RELAY_CHANNEL_VERSION;
chan->n_subbufs = n_subbufs;
chan->subbuf_size = subbuf_size;
chan->subbuf_size_order = get_count_order(subbuf_size);
- chan->alloc_size = FIX_SIZE(subbuf_size * n_subbufs);
+ chan->alloc_size = subbuf_size * n_subbufs;
chan->parent = parent;
chan->private_data = private_data;
chan->extra_reader_sb = extra_reader_sb;
Index: linux-2.6-lttng/include/linux/ltt-relay.h
===================================================================
--- linux-2.6-lttng.orig/include/linux/ltt-relay.h 2009-07-15 13:16:51.000000000 -0400
+++ linux-2.6-lttng/include/linux/ltt-relay.h 2009-07-15 13:16:59.000000000 -0400
@@ -22,9 +22,6 @@
#include <linux/mm.h>
#include <linux/ltt-core.h>
-/* Needs a _much_ better name... */
-#define FIX_SIZE(x) ((((x) - 1) & PAGE_MASK) + PAGE_SIZE)
-
/* Use lowest pointer bit to show the sub-buffer has no reference. */
#define RCHAN_NOREF_FLAG 0x1UL
Index: linux-2.6-lttng/ltt/ltt-tracer.c
===================================================================
--- linux-2.6-lttng.orig/ltt/ltt-tracer.c 2009-07-15 13:21:09.000000000 -0400
+++ linux-2.6-lttng/ltt/ltt-tracer.c 2009-07-15 13:25:08.000000000 -0400
@@ -510,6 +510,10 @@ EXPORT_SYMBOL_GPL(ltt_release_trace);
static inline void prepare_chan_size_num(unsigned int *subbuf_size,
unsigned int *n_subbufs)
{
+ /* Make sure the subbuffer size is larger than a page */
+ *subbuf_size = max_t(unsigned int, *subbuf_size, PAGE_SIZE);
+
+ /* round to next power of 2 */
*subbuf_size = 1 << get_count_order(*subbuf_size);
*n_subbufs = 1 << get_count_order(*n_subbufs);
--
Mathieu Desnoyers
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68
More information about the lttng-dev
mailing list