[RFC][PATCH 5/7] tracing/mm: accept echo-able input format for pfn range

From: Wu Fengguang
Date: Sun Aug 28 2011 - 23:57:51 EST


The seek+write style input for specifying pfn range is not scriptable.
Change it to more user friendly echo-able format.

Before patch:

fd = open("/debug/tracing/object/mm/page/dump-pfn");
seek(fd, start);
write(fd, "size");

After patch:

echo start +size > /debug/tracing/object/mm/page/dump-pfn
or
echo start end > /debug/tracing/object/mm/page/dump-pfn

Signed-off-by: Wu Fengguang <fengguang.wu@xxxxxxxxx>
---
kernel/trace/trace_mm.c | 39 +++++++++++++++++++++++---------------
1 file changed, 24 insertions(+), 15 deletions(-)

--- mmotm.orig/kernel/trace/trace_mm.c 2010-12-26 20:05:26.000000000 +0800
+++ mmotm/kernel/trace/trace_mm.c 2010-12-26 20:20:13.000000000 +0800
@@ -9,6 +9,7 @@
#include <linux/bootmem.h>
#include <linux/debugfs.h>
#include <linux/uaccess.h>
+#include <linux/ctype.h>

#include "trace_output.h"

@@ -24,8 +25,8 @@ void trace_mm_page_frames(unsigned long
if (start > max_pfn - 1)
return;

- if (end > max_pfn - 1)
- end = max_pfn - 1;
+ if (end > max_pfn)
+ end = max_pfn;

while (pfn < end) {
page = NULL;
@@ -50,13 +51,20 @@ trace_mm_pfn_range_read(struct file *fil
}


+/*
+ * recognized formats:
+ * "M N" start=M, end=N
+ * "M" start=M, end=M+1
+ * "M +N" start=M, end=M+N-1
+ */
static ssize_t
trace_mm_pfn_range_write(struct file *filp, const char __user *ubuf, size_t cnt,
loff_t *ppos)
{
- unsigned long val, start, end;
+ unsigned long start;
+ unsigned long end = 0;
char buf[64];
- int ret;
+ char *ptr;

if (cnt >= sizeof(buf))
return -EINVAL;
@@ -72,19 +80,20 @@ trace_mm_pfn_range_write(struct file *fi

buf[cnt] = 0;

- ret = strict_strtol(buf, 10, &val);
- if (ret < 0)
- return ret;
-
- start = *ppos;
- if (val < 0)
- end = max_pfn - 1;
- else
- end = start + val;
+ start = simple_strtoul(buf, &ptr, 0);

- trace_mm_page_frames(start, end, trace_mm_page_frame);
+ for (; *ptr; ptr++) {
+ if (isdigit(*ptr)) {
+ if (*(ptr - 1) == '+')
+ end = start;
+ end += simple_strtoul(ptr, NULL, 0);
+ break;
+ }
+ }
+ if (!*ptr)
+ end = start + 1;

- *ppos += cnt;
+ trace_mm_page_frames(start, end, trace_mm_page_frame);

return cnt;
}


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/