]> git.hungrycats.org Git - linux/commitdiff
[PATCH] OProfile: export kernel pointer size in oprofilefs
authorJohn Levon <levon@movementarian.org>
Thu, 21 Aug 2003 09:57:11 +0000 (02:57 -0700)
committerLinus Torvalds <torvalds@home.osdl.org>
Thu, 21 Aug 2003 09:57:11 +0000 (02:57 -0700)
Tell user-space how big kernel pointers are, as preferable to sniffing /proc/kcore.
Improve the oprofilefs_ulong_to_user() prototype.

drivers/oprofile/oprofile_files.c
drivers/oprofile/oprofilefs.c
include/linux/oprofile.h

index 21ae41a54e9056da0c86a639478a0363e1e420e7..b7466377afd4bbc06584e1429bf4ceec1a39337a 100644 (file)
@@ -19,6 +19,17 @@ unsigned long fs_cpu_buffer_size = 8192;
 unsigned long fs_buffer_watershed = 32768; /* FIXME: tune */
 
  
+static ssize_t pointer_size_read(struct file * file, char * buf, size_t count, loff_t * offset)
+{
+       return oprofilefs_ulong_to_user((unsigned long)sizeof(void *), buf, count, offset);
+}
+
+
+static struct file_operations pointer_size_fops = {
+       .read           = pointer_size_read,
+};
+
+
 static ssize_t cpu_type_read(struct file * file, char * buf, size_t count, loff_t * offset)
 {
        return oprofilefs_str_to_user(oprofile_ops->cpu_type, buf, count, offset);
@@ -32,7 +43,7 @@ static struct file_operations cpu_type_fops = {
  
 static ssize_t enable_read(struct file * file, char * buf, size_t count, loff_t * offset)
 {
-       return oprofilefs_ulong_to_user(&oprofile_started, buf, count, offset);
+       return oprofilefs_ulong_to_user(oprofile_started, buf, count, offset);
 }
 
 
@@ -85,6 +96,7 @@ void oprofile_create_files(struct super_block * sb, struct dentry * root)
        oprofilefs_create_ulong(sb, root, "buffer_watershed", &fs_buffer_watershed);
        oprofilefs_create_ulong(sb, root, "cpu_buffer_size", &fs_cpu_buffer_size);
        oprofilefs_create_file(sb, root, "cpu_type", &cpu_type_fops); 
+       oprofilefs_create_file(sb, root, "pointer_size", &pointer_size_fops);
        oprofile_create_stats_files(sb, root);
        if (oprofile_ops->create_files)
                oprofile_ops->create_files(sb, root);
index c82630ec1819d9e3ba72a306d7e566023a294304..ed1efe61f6e319f08997fb6283f0c3751e08c9e7 100644 (file)
@@ -69,7 +69,7 @@ ssize_t oprofilefs_str_to_user(char const * str, char * buf, size_t count, loff_
 
 #define TMPBUFSIZE 50
 
-ssize_t oprofilefs_ulong_to_user(unsigned long val, char * buf, size_t count, loff_t * offset)
+ssize_t oprofilefs_ulong_to_user(unsigned long val, char * buf, size_t count, loff_t * offset)
 {
        char tmpbuf[TMPBUFSIZE];
        size_t maxlen;
@@ -78,7 +78,7 @@ ssize_t oprofilefs_ulong_to_user(unsigned long * val, char * buf, size_t count,
                return 0;
 
        spin_lock(&oprofilefs_lock);
-       maxlen = snprintf(tmpbuf, TMPBUFSIZE, "%lu\n", *val);
+       maxlen = snprintf(tmpbuf, TMPBUFSIZE, "%lu\n", val);
        spin_unlock(&oprofilefs_lock);
        if (maxlen > TMPBUFSIZE)
                maxlen = TMPBUFSIZE;
@@ -122,7 +122,8 @@ int oprofilefs_ulong_from_user(unsigned long * val, char const * buf, size_t cou
 
 static ssize_t ulong_read_file(struct file * file, char * buf, size_t count, loff_t * offset)
 {
-       return oprofilefs_ulong_to_user(file->private_data, buf, count, offset);
+       unsigned long * val = file->private_data;
+       return oprofilefs_ulong_to_user(*val, buf, count, offset);
 }
 
 
@@ -212,9 +213,8 @@ int oprofilefs_create_ro_ulong(struct super_block * sb, struct dentry * root,
 
 static ssize_t atomic_read_file(struct file * file, char * buf, size_t count, loff_t * offset)
 {
-       atomic_t * aval = file->private_data;
-       unsigned long val = atomic_read(aval);
-       return oprofilefs_ulong_to_user(&val, buf, count, offset);
+       atomic_t * val = file->private_data;
+       return oprofilefs_ulong_to_user(atomic_read(val), buf, count, offset);
 }
  
 
index c2b4fd735f40cf377561159e4a28b8ede4543e49..9555dd4d69fc47cbe8a6a25834bfad5fb575a19f 100644 (file)
@@ -92,7 +92,7 @@ ssize_t oprofilefs_str_to_user(char const * str, char * buf, size_t count, loff_
  * Convert an unsigned long value into ASCII and copy it to the user buffer @buf,
  * updating *offset appropriately. Returns bytes written or -EFAULT.
  */
-ssize_t oprofilefs_ulong_to_user(unsigned long val, char * buf, size_t count, loff_t * offset);
+ssize_t oprofilefs_ulong_to_user(unsigned long val, char * buf, size_t count, loff_t * offset);
 
 /**
  * Read an ASCII string for a number from a userspace buffer and fill *val on success.