Re: [PATCH 58/59] sysctl: Reimplement the sysctl proc support

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Michal Schmidt
Date: Wednesday, March 14, 2007 - 8:44 am

Ingo Molnar wrote:

How about this? It works for me.

Signed-off-by: Michal Schmidt <mschmidt@redhat.com>

diff --git a/kernel/latency_trace.c b/kernel/latency_trace.c
index e07bb95..a13d001 100644
--- a/kernel/latency_trace.c
+++ b/kernel/latency_trace.c
@@ -19,7 +19,7 @@
 #include <linux/seq_file.h>
 #include <linux/interrupt.h>
 #include <linux/clocksource.h>
-#include <linux/proc_fs.h>
+#include <linux/sysctl.h>
 #include <linux/latency_hist.h>
 #include <linux/utsrelease.h>
 #include <asm/uaccess.h>
@@ -2661,66 +2661,94 @@ void print_traces(struct task_struct *task)
 }
 #endif
 
-static int preempt_read_proc(char *page, char **start, off_t off,
-			     int count, int *eof, void *data)
+#if defined(CONFIG_WAKEUP_TIMING) || defined(CONFIG_EVENT_TRACE)
+
+static int preempt_proc_handler(ctl_table *table, int write, struct file *filp,
+				void __user *buffer, size_t *lenp, loff_t *ppos)
 {
-	cycle_t *max = data;
+#define TMPBUFLEN 21
+	char buf[TMPBUFLEN];
+	size_t left = *lenp;
+	cycle_t *max = table->data;
 
-	return sprintf(page, "%ld\n", cycles_to_usecs(*max));
-}
+	if (!table->data || table->maxlen!=sizeof(cycles_t) || !*lenp ||
+			(*ppos && !write)) {
+		*lenp = 0;
+		return 0;
+	}
 
-static int preempt_write_proc(struct file *file, const char __user *buffer,
-			      unsigned long count, void *data)
-{
-	unsigned int c, done = 0, val, sum = 0;
-	cycle_t *max = data;
+	if (!write) {
+		int len;
 
-	while (count) {
-		if (get_user(c, buffer))
-			return -EFAULT;
-		val = c - '0';
-		buffer++;
-		done++;
-		count--;
-		if (c == 0 || c == '\n')
-			break;
-		if (val > 9)
+		len = snprintf(buf, TMPBUFLEN, "%ld\n", cycles_to_usecs(*max));
+		if (len >= TMPBUFLEN)
 			return -EINVAL;
-		sum *= 10;
-		sum += val;
+		if (len > left)
+			len = left;
+		if (copy_to_user(buffer, buf, len))
+			return -EFAULT;
+		left -= len;
+	} else {
+		unsigned int c, val, sum = 0;
+
+		while (left) {
+			if (get_user(c, (char __user *)buffer))
+				return -EFAULT;
+			val = c - '0';
+			buffer++;
+			left--;
+			if (c == 0 || c == '\n')
+				break;
+			if (val > 9)
+				return -EINVAL;
+			sum *= 10;
+			sum += val;
+		}
+		*max = usecs_to_cycles(sum);
 	}
-	*max = usecs_to_cycles(sum);
-	return done;
+
+	*lenp -= left;
+	*ppos += *lenp;
+	return 0;
 }
 
-#if defined(CONFIG_WAKEUP_TIMING) || defined(CONFIG_EVENT_TRACE)
+static ctl_table preempt_latency_table[] = {
+	{
+		.ctl_name	= CTL_UNNUMBERED,
+		.procname	= "preempt_max_latency",
+		.data		= &preempt_max_latency,
+		.maxlen		= sizeof(cycles_t),
+		.mode		= 0644,
+		.proc_handler	= &preempt_proc_handler,
+	},
+#ifdef CONFIG_EVENT_TRACE
+	{
+		.ctl_name	= CTL_UNNUMBERED,
+		.procname	= "preempt_thresh",
+		.data		= &preempt_thresh,
+		.maxlen		= sizeof(cycles_t),
+		.mode		= 0644,
+		.proc_handler	= &preempt_proc_handler,
+	},
+#endif
+	{ .ctl_name = 0 }
+};
 
-#define	PROCNAME_PML	"sys/kernel/preempt_max_latency"
-#define PROCNAME_PT	"sys/kernel/preempt_thresh"
+static ctl_table kernel_root[] = {
+	{
+		.ctl_name	= CTL_KERN,
+		.procname	= "kernel",
+		.mode		= 0555,
+		.child		= preempt_latency_table,
+	},
+	{ .ctl_name = 0 }
+};
+
+static struct ctl_table_header *sysctl_header;
 
 static __init int latency_fs_init(void)
 {
-	struct proc_dir_entry *entry;
-
-	if (!(entry = create_proc_entry(PROCNAME_PML, 0644, NULL)))
-		printk("latency_fs_init(): can't create %s\n", PROCNAME_PML);
-	else {
-		entry->nlink = 1;
-		entry->data = &preempt_max_latency;
-		entry->read_proc = preempt_read_proc;
-		entry->write_proc = preempt_write_proc;
-	}
-
-#ifdef CONFIG_EVENT_TRACE
-	if (!(entry = create_proc_entry(PROCNAME_PT, 0644, NULL)))
-		printk("latency_fs_init(): can't create %s\n", PROCNAME_PT);
-	else {
-		entry->nlink = 1;
-		entry->data = &preempt_thresh;
-		entry->read_proc = preempt_read_proc;
-		entry->write_proc = preempt_write_proc;
-	}
-#endif
+	sysctl_header = register_sysctl_table(kernel_root);
 	return 0;
 }
 __initcall(latency_fs_init);



-- 
Michal Schmidt             Kernel Developer
mschmidt@redhat.com    Red Hat Czech s.r.o.

-
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH 0/59] Cleanup sysctl , Eric W. Biederman, (Tue Jan 16, 9:33 am)
[PATCH 1/59] sysctl x25: Remove unnecessary insert_at_head ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 2/59] sysctl: Move CTL_SUNRPC to sysctl.h where it ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 3/59] sysctl: sunrpc Remove unnecessary insert_at_h ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 4/59] sysctl: sunrpc Don't unnecessarily set ctl_ta ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 5/59] sysctl: rose remove unnecessary insert_at_hea ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 6/59] sysctl: netrom remove unnecessary insert_at_h ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 7/59] sysctl: llc remove unnecessary insert_at_head ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 8/59] sysctl: ipx remove unnecessary insert_at_head ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 9/59] sysctl: decnet remove unnecessary insert_at_h ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 10/59] sysctl: dccp remove unnecessary insert_at_he ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 11/59] sysctl: ax25 remove unnecessary insert_at_he ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 12/59] sysctl: atalk remove unnecessary insert_at_h ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 13/59] sysctl: xfs remove unnecessary insert_at_hea ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 14/59] sysctl: C99 convert xfs ctl_tables, Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 15/59] sysctl: scsi remove unnecessary insert_at_he ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 16/59] sysctl: md Remove unnecessary insert_at_head ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 17/59] sysctl: mac_hid remove unnecessary insert_at ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 18/59] sysctl: ipmi remove unnecessary insert_at_he ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 19/59] sysctl: cdrom remove unnecessary insert_at_h ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 20/59] sysctl: cdrom Don't set de-&gt;owner, Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 21/59] sysctl: Move CTL_PM into sysctl.h where it b ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 22/59] sysctl: frv pm remove unnecessary insert_at_ ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 23/59] sysctl: Move CTL_FRV into sysctl.h where it ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 24/59] sysctl: frv remove unnecessary insert_at_hea ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 25/59] sysctl: C99 convert arch/frv/kernel/pm.c, Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 26/59] sysctl: C99 convert arch/frv/kernel/sysctl.c, Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 27/59] sysctl: sn Remove sysctl ABI BREAKAGE, Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 28/59] sysctl: C99 Convert arch/ia64/sn/kernel/xpc_ ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 29/59] sysctl: C99 convert arch/ia64/kernel/perfmon ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 30/59] sysctl: mips/au1000 Remove sys_sysctl support, Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 31/59] sysctl: C99 convert the ctl_tables in arch/m ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 32/59] sysctl: C99 convert arch/mips/lasat/sysctl.c ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 33/59] sysctl: s390 move sysctl definitions to sysctl.h, Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 34/59] sysctl: s390 Remove unnecessary use of inser ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 35/59] sysctl: C99 convert ctl_tables in arch/power ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 36/59] sysctl: C99 convert ctl_tables entries in ar ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 37/59] sysctl: C99 convert arch/sh64/kernel/traps.c ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 38/59] sysctl: x86_64 Remove unnecessary use of ins ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 39/59] sysctl: C99 convert ctl_tables in arch/x86_6 ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 40/59] sysctl: C99 convert ctl_tables in arch/x86_6 ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 41/59] sysctl: C99 convert ctl_tables in arch/x86_6 ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 42/59] sysctl: Remove sys_sysctl support from the h ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 43/59] sysctl: Remove sys_sysctl support from drive ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 44/59] sysctl: Register the sysctl number used by t ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 45/59] sysctl: C99 convert ctl_tables in drivers/pa ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 46/59] sysctl: C99 convert coda ctl_tables and remo ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 47/59] sysctl: C99 convert ctl_tables in NTFS and r ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 48/59] sysctl: Register the ocfs2 sysctl numbers, Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 49/59] sysctl: Move init_irq_proc into init/main wh ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 50/59] sysctl: Move utsname sysctls to their own file, Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 51/59] sysctl: Move SYSV IPC sysctls to their own file, Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 52/59] sysctl: Create sys/fs/binfmt_misc as an ordi ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 53/59] sysctl: Remove support for CTL_ANY, Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 54/59] sysctl: Remove support for directory strateg ..., Eric W. Biederman, (Tue Jan 16, 9:39 am)
[PATCH 55/59] sysctl: Remove insert_at_head from register_ ..., Eric W. Biederman, (Tue Jan 16, 9:40 am)
[PATCH 56/59] sysctl: factor out sysctl_head_next from do_ ..., Eric W. Biederman, (Tue Jan 16, 9:40 am)
[PATCH 57/59] sysctl: allow sysctl_perm to be called from ..., Eric W. Biederman, (Tue Jan 16, 9:40 am)
[PATCH 58/59] sysctl: Reimplement the sysctl proc support, Eric W. Biederman, (Tue Jan 16, 9:40 am)
[PATCH 59/59] sysctl: Remove the proc_dir_entry member for ..., Eric W. Biederman, (Tue Jan 16, 9:40 am)
Re: [PATCH 0/59] Cleanup sysctl, H. Peter Anvin, (Tue Jan 16, 9:53 am)
Re: [PATCH 0/59] Cleanup sysctl, Eric W. Biederman, (Tue Jan 16, 11:12 am)
Re: [PATCH 0/59] Cleanup sysctl , David Howells, (Tue Jan 16, 1:02 pm)
Re: [PATCH 18/59] sysctl: ipmi remove unnecessary insert_a ..., Benjamin Herrenschmidt, (Tue Jan 16, 8:14 pm)
Re: [PATCH 35/59] sysctl: C99 convert ctl_tables in arch/p ..., Benjamin Herrenschmidt, (Tue Jan 16, 8:16 pm)
Re: [PATCH 36/59] sysctl: C99 convert ctl_tables entries i ..., Benjamin Herrenschmidt, (Tue Jan 16, 8:16 pm)
Re: [PATCH 0/59] Cleanup sysctl, Andi Kleen, (Tue Jan 16, 9:21 pm)
Re: [PATCH 0/59] Cleanup sysctl, Martin Schwidefsky, (Wed Jan 17, 5:10 am)
Re: [PATCH 14/59] sysctl: C99 convert xfs ctl_tables, Kirill Korotaev, (Wed Jan 17, 10:01 am)
Re: [PATCH 25/59] sysctl: C99 convert arch/frv/kernel/pm.c, Kirill Korotaev, (Wed Jan 17, 10:14 am)
Re: [PATCH 33/59] sysctl: s390 move sysctl definitions to ..., Kirill Korotaev, (Wed Jan 17, 10:23 am)
Re: [PATCH 0/59] Cleanup sysctl, Kirill Korotaev, (Wed Jan 17, 11:10 am)
Re: [PATCH 25/59] sysctl: C99 convert arch/frv/kernel/pm.c, Herbert Poetzl, (Mon Jan 22, 3:21 pm)
Re: [PATCH 58/59] sysctl: Reimplement the sysctl proc support, Eric W. Biederman, (Wed Mar 14, 6:34 am)
Re: [PATCH 58/59] sysctl: Reimplement the sysctl proc support, Michal Schmidt, (Wed Mar 14, 8:44 am)