[ltt-dev] [Patch] ltt-relay-alloc mmap support

Masahiro Tamori masahiro.tamori at gmail.com
Tue Mar 17 05:24:35 EDT 2009


Hello Mathieu,

I use the following version.
LTTV 0.12.12
LTTng 0.110
LTT Control 0.67
Kernles 2.6.29-rc7

The target is ARM RealviewEB.

Our customer will use NFS to store trace data not storage device for
embedded devices.
Since newer lttng use splice() even if NFS can not support splice(),
I create a patch to support to mmap of ltt-relay-alloc.

I will send a mail to this mailing list for ltt-control patch.
I do not know which mailing list should be posted for userland tools.

Best Regards,
Masahiro Tamori


ltt-relay-alloc mmap support

Splice syscall does not support NFS. We can not save trace data to
NFS directory. If this feature is enabled, you can use mmap()
instead of splice().

For embeded system, NFS must be used. Target board has not enough memory
to save trace data and some board can not connect ATA, USB and some strage
devices.

Signed-off-by: Masahiro.Tamori at gmail.com
---
 ltt/Kconfig              |   11 	11 +	0 -	0 !
 ltt/ltt-relay-alloc.c    |   88 	88 +	0 -	0 !
 ltt/ltt-relay-lockless.c |   15 	15 +	0 -	0 !
 3 files changed, 114 insertions(+)

Index: b/ltt/Kconfig
===================================================================
--- a/ltt/Kconfig
+++ b/ltt/Kconfig
@@ -66,6 +66,17 @@ choice

 endchoice

+config LTT_RELAY_ALLOC_MMAP
+	bool "Linux Trace Toolkit Relay mmap Support"
+	depends on LTT_RELAY_ALLOC
+	default y
+	help
+	  Support mmap for ltt-relay.
+
+	  Splice syscall does not support NFS. We can not save trace data to
+          NFS directory. If this feature is enabled, you can use mmap()
+          instead of splice().
+
 config LTT_SERIALIZE
 	tristate "Linux Trace Toolkit Serializer"
 	depends on LTT_RELAY_ALLOC
Index: b/ltt/ltt-relay-alloc.c
===================================================================
--- a/ltt/ltt-relay-alloc.c
+++ b/ltt/ltt-relay-alloc.c
@@ -27,6 +27,74 @@
 static DEFINE_MUTEX(relay_channels_mutex);
 static LIST_HEAD(relay_channels);

+#ifdef CONFIG_LTT_RELAY_ALLOC_MMAP
+/*
+ * close() vm_op implementation for relay file mapping.
+ */
+static void relay_file_mmap_close(struct vm_area_struct *vma)
+{
+}
+
+/*
+ * fault() vm_op implementation for relay file mapping.
+ */
+static int relay_buf_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
+{
+	struct page *page = NULL;
+	struct rchan_buf *buf = vma->vm_private_data;
+	pgoff_t pgoff = vmf->pgoff;
+	struct page **pages;
+
+	if (!buf)
+		return VM_FAULT_OOM;
+
+	if (pgoff >= buf->page_count)
+		return VM_FAULT_SIGBUS;
+
+	pages = buf->pages;
+	page = pages[pgoff];
+	get_page(page);
+	vmf->page = page;
+
+	return 0;
+}
+
+/*
+ * vm_ops for relay file mappings.
+ */
+static struct vm_operations_struct relay_file_mmap_ops = {
+	.fault = relay_buf_fault,
+	.close = relay_file_mmap_close,
+};
+
+/**
+ *	relay_mmap_buf: - mmap channel buffer to process address space
+ *	@buf: relay channel buffer
+ *	@vma: vm_area_struct describing memory to be mapped
+ *
+ *	Returns 0 if ok, negative on error
+ *
+ *	Caller should already have grabbed mmap_sem.
+ */
+static int relay_mmap_buf(struct rchan_buf *buf, struct vm_area_struct *vma)
+{
+	unsigned long length = vma->vm_end - vma->vm_start;
+
+	if (!buf)
+		return -EBADF;
+
+	if (length != (unsigned long)buf->chan->alloc_size)
+		return -EINVAL;
+
+	vma->vm_ops = &relay_file_mmap_ops;
+	vma->vm_flags |= VM_DONTEXPAND;
+	vma->vm_private_data = buf;
+
+	return 0;
+}
+
+#endif /* CONFIG_LTT_RELAY_ALLOC_MMAP */
+
 /**
  *	relay_alloc_buf - allocate a channel buffer
  *	@buf: the buffer struct
@@ -601,6 +669,23 @@ static int relay_file_open(struct inode
 	return nonseekable_open(inode, filp);
 }

+#ifdef CONFIG_LTT_RELAY_ALLOC_MMAP
+
+/**
+ *	relay_file_mmap - mmap file op for relay files
+ *	@filp: the file
+ *	@vma: the vma describing what to map
+ *
+ *	Calls upon relay_mmap_buf() to map the file into user space.
+ */
+static int relay_file_mmap(struct file *filp, struct vm_area_struct *vma)
+{
+	struct rchan_buf *buf = filp->private_data;
+	return relay_mmap_buf(buf, vma);
+}
+
+#endif /* CONFIG_LTT_RELAY_ALLOC_MMAP */
+
 /**
  *	relay_file_release - release file op for relay files
  *	@inode: the inode
@@ -619,6 +704,9 @@ static int relay_file_release(struct ino

 const struct file_operations ltt_relay_file_operations = {
 	.open		= relay_file_open,
+#ifdef CONFIG_LTT_RELAY_ALLOC_MMAP
+	.mmap		= relay_file_mmap,
+#endif
 	.release	= relay_file_release,
 };
 EXPORT_SYMBOL_GPL(ltt_relay_file_operations);
Index: b/ltt/ltt-relay-lockless.c
===================================================================
--- a/ltt/ltt-relay-lockless.c
+++ b/ltt/ltt-relay-lockless.c
@@ -427,6 +427,18 @@ static int ltt_release(struct inode *ino
 }

 /**
+ *	ltt_mmap - mmap file op for ltt files
+ *	@inode: opened inode
+ *	@file: opened file
+ *
+ *	Mmap implementation.
+ */
+static int ltt_mmap(struct file *file,  struct vm_area_struct *vma)
+{
+	return ltt_relay_file_operations.mmap(file, vma);
+}
+
+/**
  *	ltt_poll - file op for ltt files
  *	@filp: the file
  *	@wait: poll table
@@ -1590,6 +1602,9 @@ static struct ltt_transport ltt_relay_tr
 static const struct file_operations ltt_file_operations = {
 	.open = ltt_open,
 	.release = ltt_release,
+#ifdef CONFIG_LTT_RELAY_ALLOC_MMAP
+	.mmap		= ltt_mmap,
+#endif
 	.poll = ltt_poll,
 	.splice_read = ltt_relay_file_splice_read,
 	.ioctl = ltt_ioctl,




More information about the lttng-dev mailing list