diff options
author | Alexander Viro <viro@parcelfarce.linux.theplanet.co.uk> | 2004-08-05 07:13:56 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2004-08-05 07:13:56 -0700 |
commit | 00c9e926cffdf2b4258750566820b344bfaeb904 (patch) | |
tree | a291c9afbc4d8944c06eb8638da5d197a98bbf24 /arch | |
parent | ca4a69853b12f29c5fe2bf97480f255750d96677 (diff) | |
download | history-00c9e926cffdf2b4258750566820b344bfaeb904.tar.gz |
[PATCH] ppc: seq_file conversion for ppc_htab
This converts the 32-bit ppc htab code to use the seq_file interfaces.
Less code means fewer bugs..
Diffstat (limited to 'arch')
-rw-r--r-- | arch/ppc/kernel/ppc_htab.c | 75 |
1 files changed, 22 insertions, 53 deletions
diff --git a/arch/ppc/kernel/ppc_htab.c b/arch/ppc/kernel/ppc_htab.c index ac30ec217c9e61..74051e0d440275 100644 --- a/arch/ppc/kernel/ppc_htab.c +++ b/arch/ppc/kernel/ppc_htab.c @@ -30,11 +30,9 @@ #include <asm/system.h> #include <asm/reg.h> -static ssize_t ppc_htab_read(struct file * file, char __user * buf, - size_t count, loff_t *ppos); +static int ppc_htab_show(struct seq_file *m, void *v); static ssize_t ppc_htab_write(struct file * file, const char __user * buffer, size_t count, loff_t *ppos); -static long long ppc_htab_lseek(struct file * file, loff_t offset, int orig); int proc_dol2crvec(ctl_table *table, int write, struct file *filp, void __user *buffer, size_t *lenp); @@ -49,10 +47,17 @@ extern unsigned long pte_errors; extern unsigned int primary_pteg_full; extern unsigned int htab_hash_searches; +static int ppc_htab_open(struct inode *inode, struct file *file) +{ + return single_open(file, ppc_htab_show, NULL); +} + struct file_operations ppc_htab_operations = { - .llseek = ppc_htab_lseek, - .read = ppc_htab_read, - .write = ppc_htab_write, + .open = ppc_htab_open, + .read = seq_read, + .llseek = seq_lseek, + .write = ppc_htab_write, + .release = single_release, }; static char *pmc1_lookup(unsigned long mmcr0) @@ -96,8 +101,7 @@ static char *pmc2_lookup(unsigned long mmcr0) * is _REALLY_ slow (see the nested for loops below) but nothing * in here should be really timing critical. -- Cort */ -static ssize_t ppc_htab_read(struct file * file, char __user * buf, - size_t count, loff_t *ppos) +static int ppc_htab_show(struct seq_file *m, void *v) { unsigned long mmcr0 = 0, pmc1 = 0, pmc2 = 0; int n = 0; @@ -105,22 +109,18 @@ static ssize_t ppc_htab_read(struct file * file, char __user * buf, unsigned int kptes = 0, uptes = 0; PTE *ptr; #endif /* CONFIG_PPC_STD_MMU */ - char buffer[512]; - - if (count < 0) - return -EINVAL; if (cur_cpu_spec[0]->cpu_features & CPU_FTR_604_PERF_MON) { mmcr0 = mfspr(SPRN_MMCR0); pmc1 = mfspr(SPRN_PMC1); pmc2 = mfspr(SPRN_PMC2); - n += sprintf( buffer + n, + seq_printf(m, "604 Performance Monitoring\n" "MMCR0\t\t: %08lx %s%s ", mmcr0, ( mmcr0>>28 & 0x2 ) ? "(user mode counted)" : "", ( mmcr0>>28 & 0x4 ) ? "(kernel mode counted)" : ""); - n += sprintf( buffer + n, + seq_printf(m, "\nPMC1\t\t: %08lx (%s)\n" "PMC2\t\t: %08lx (%s)\n", pmc1, pmc1_lookup(mmcr0), @@ -129,10 +129,9 @@ static ssize_t ppc_htab_read(struct file * file, char __user * buf, #ifdef CONFIG_PPC_STD_MMU /* if we don't have a htab */ - if ( Hash_size == 0 ) - { - n += sprintf( buffer + n, "No Hash Table used\n"); - goto return_string; + if ( Hash_size == 0 ) { + seq_printf(m, "No Hash Table used\n"); + return 0; } #ifndef CONFIG_PPC64BRIDGE @@ -151,7 +150,7 @@ static ssize_t ppc_htab_read(struct file * file, char __user * buf, } #endif - n += sprintf( buffer + n, + seq_printf(m, "PTE Hash Table Information\n" "Size\t\t: %luKb\n" "Buckets\t\t: %lu\n" @@ -173,7 +172,7 @@ static ssize_t ppc_htab_read(struct file * file, char __user * buf, #endif ); - n += sprintf( buffer + n, + seq_printf(m, "Reloads\t\t: %lu\n" "Preloads\t: %lu\n" "Searches\t: %u\n" @@ -181,23 +180,13 @@ static ssize_t ppc_htab_read(struct file * file, char __user * buf, "Evicts\t\t: %lu\n", htab_reloads, htab_preloads, htab_hash_searches, primary_pteg_full, htab_evicts); -return_string: #endif /* CONFIG_PPC_STD_MMU */ - n += sprintf( buffer + n, + seq_printf(m, "Non-error misses: %lu\n" "Error misses\t: %lu\n", pte_misses, pte_errors); - if (*ppos >= strlen(buffer)) - return 0; - if (n > strlen(buffer) - *ppos) - n = strlen(buffer) - *ppos; - if (n > count) - n = count; - if (copy_to_user(buf, buffer + *ppos, n)) - return -EFAULT; - *ppos += n; - return n; + return 0; } /* @@ -210,7 +199,7 @@ static ssize_t ppc_htab_write(struct file * file, const char __user * ubuffer, unsigned long tmp; char buffer[16]; - if ( current->uid != 0 ) + if (!capable(CAPS_SYS_ADMIN)) return -EACCES; if (strncpy_from_user(buffer, ubuffer, 15)) return -EFAULT; @@ -330,26 +319,6 @@ static ssize_t ppc_htab_write(struct file * file, const char __user * ubuffer, #endif /* CONFIG_PPC_STD_MMU */ } - -static long long -ppc_htab_lseek(struct file * file, loff_t offset, int orig) -{ - long long ret = -EINVAL; - - lock_kernel(); - switch (orig) { - case 0: - file->f_pos = offset; - ret = file->f_pos; - break; - case 1: - file->f_pos += offset; - ret = file->f_pos; - } - unlock_kernel(); - return ret; -} - int proc_dol2crvec(ctl_table *table, int write, struct file *filp, void __user *buffer_arg, size_t *lenp) { |