You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull VFS updates from Al Viro,
Misc cleanups all over the place, mainly wrt /proc interfaces (switch
create_proc_entry to proc_create(), get rid of the deprecated
create_proc_read_entry() in favor of using proc_create_data() and
seq_file etc).
7kloc removed.
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (204 commits)
don't bother with deferred freeing of fdtables
proc: Move non-public stuff from linux/proc_fs.h to fs/proc/internal.h
proc: Make the PROC_I() and PDE() macros internal to procfs
proc: Supply a function to remove a proc entry by PDE
take cgroup_open() and cpuset_open() to fs/proc/base.c
ppc: Clean up scanlog
ppc: Clean up rtas_flash driver somewhat
hostap: proc: Use remove_proc_subtree()
drm: proc: Use remove_proc_subtree()
drm: proc: Use minor->index to label things, not PDE->name
drm: Constify drm_proc_list[]
zoran: Don't print proc_dir_entry data in debug
reiserfs: Don't access the proc_dir_entry in r_open(), r_start() r_show()
proc: Supply an accessor for getting the data from a PDE's parent
airo: Use remove_proc_subtree()
rtl8192u: Don't need to save device proc dir PDE
rtl8187se: Use a dir under /proc/net/r8180/
proc: Add proc_mkdir_data()
proc: Move some bits from linux/proc_fs.h to linux/{of.h,signal.h,tty.h}
proc: Move PDE_NET() to fs/proc/proc_net.c
...
This commit is contained in:
+14
-79
@@ -51,13 +51,11 @@ MODULE_LICENSE("GPL");
|
||||
typedef struct _srm_env {
|
||||
char *name;
|
||||
unsigned long id;
|
||||
struct proc_dir_entry *proc_entry;
|
||||
} srm_env_t;
|
||||
|
||||
static struct proc_dir_entry *base_dir;
|
||||
static struct proc_dir_entry *named_dir;
|
||||
static struct proc_dir_entry *numbered_dir;
|
||||
static char number[256][4];
|
||||
|
||||
static srm_env_t srm_named_entries[] = {
|
||||
{ "auto_action", ENV_AUTO_ACTION },
|
||||
@@ -77,21 +75,18 @@ static srm_env_t srm_named_entries[] = {
|
||||
{ "tty_dev", ENV_TTY_DEV },
|
||||
{ NULL, 0 },
|
||||
};
|
||||
static srm_env_t srm_numbered_entries[256];
|
||||
|
||||
|
||||
static int srm_env_proc_show(struct seq_file *m, void *v)
|
||||
{
|
||||
unsigned long ret;
|
||||
srm_env_t *entry;
|
||||
unsigned long id = (unsigned long)m->private;
|
||||
char *page;
|
||||
|
||||
entry = m->private;
|
||||
page = (char *)__get_free_page(GFP_USER);
|
||||
if (!page)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = callback_getenv(entry->id, page, PAGE_SIZE);
|
||||
ret = callback_getenv(id, page, PAGE_SIZE);
|
||||
|
||||
if ((ret >> 61) == 0) {
|
||||
seq_write(m, page, ret);
|
||||
@@ -104,14 +99,14 @@ static int srm_env_proc_show(struct seq_file *m, void *v)
|
||||
|
||||
static int srm_env_proc_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, srm_env_proc_show, PDE(inode)->data);
|
||||
return single_open(file, srm_env_proc_show, PDE_DATA(inode));
|
||||
}
|
||||
|
||||
static ssize_t srm_env_proc_write(struct file *file, const char __user *buffer,
|
||||
size_t count, loff_t *pos)
|
||||
{
|
||||
int res;
|
||||
srm_env_t *entry = PDE(file_inode(file))->data;
|
||||
unsigned long id = (unsigned long)PDE_DATA(file_inode(file));
|
||||
char *buf = (char *) __get_free_page(GFP_USER);
|
||||
unsigned long ret1, ret2;
|
||||
|
||||
@@ -127,7 +122,7 @@ static ssize_t srm_env_proc_write(struct file *file, const char __user *buffer,
|
||||
goto out;
|
||||
buf[count] = '\0';
|
||||
|
||||
ret1 = callback_setenv(entry->id, buf, count);
|
||||
ret1 = callback_setenv(id, buf, count);
|
||||
if ((ret1 >> 61) == 0) {
|
||||
do
|
||||
ret2 = callback_save_env();
|
||||
@@ -149,52 +144,6 @@ static const struct file_operations srm_env_proc_fops = {
|
||||
.write = srm_env_proc_write,
|
||||
};
|
||||
|
||||
static void
|
||||
srm_env_cleanup(void)
|
||||
{
|
||||
srm_env_t *entry;
|
||||
unsigned long var_num;
|
||||
|
||||
if (base_dir) {
|
||||
/*
|
||||
* Remove named entries
|
||||
*/
|
||||
if (named_dir) {
|
||||
entry = srm_named_entries;
|
||||
while (entry->name != NULL && entry->id != 0) {
|
||||
if (entry->proc_entry) {
|
||||
remove_proc_entry(entry->name,
|
||||
named_dir);
|
||||
entry->proc_entry = NULL;
|
||||
}
|
||||
entry++;
|
||||
}
|
||||
remove_proc_entry(NAMED_DIR, base_dir);
|
||||
}
|
||||
|
||||
/*
|
||||
* Remove numbered entries
|
||||
*/
|
||||
if (numbered_dir) {
|
||||
for (var_num = 0; var_num <= 255; var_num++) {
|
||||
entry = &srm_numbered_entries[var_num];
|
||||
|
||||
if (entry->proc_entry) {
|
||||
remove_proc_entry(entry->name,
|
||||
numbered_dir);
|
||||
entry->proc_entry = NULL;
|
||||
entry->name = NULL;
|
||||
}
|
||||
}
|
||||
remove_proc_entry(NUMBERED_DIR, base_dir);
|
||||
}
|
||||
|
||||
remove_proc_entry(BASE_DIR, NULL);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static int __init
|
||||
srm_env_init(void)
|
||||
{
|
||||
@@ -212,12 +161,6 @@ srm_env_init(void)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/*
|
||||
* Init numbers
|
||||
*/
|
||||
for (var_num = 0; var_num <= 255; var_num++)
|
||||
sprintf(number[var_num], "%ld", var_num);
|
||||
|
||||
/*
|
||||
* Create base directory
|
||||
*/
|
||||
@@ -225,7 +168,7 @@ srm_env_init(void)
|
||||
if (!base_dir) {
|
||||
printk(KERN_ERR "Couldn't create base dir /proc/%s\n",
|
||||
BASE_DIR);
|
||||
goto cleanup;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -254,9 +197,8 @@ srm_env_init(void)
|
||||
*/
|
||||
entry = srm_named_entries;
|
||||
while (entry->name && entry->id) {
|
||||
entry->proc_entry = proc_create_data(entry->name, 0644, named_dir,
|
||||
&srm_env_proc_fops, entry);
|
||||
if (!entry->proc_entry)
|
||||
if (!proc_create_data(entry->name, 0644, named_dir,
|
||||
&srm_env_proc_fops, (void *)entry->id))
|
||||
goto cleanup;
|
||||
entry++;
|
||||
}
|
||||
@@ -265,15 +207,11 @@ srm_env_init(void)
|
||||
* Create all numbered nodes
|
||||
*/
|
||||
for (var_num = 0; var_num <= 255; var_num++) {
|
||||
entry = &srm_numbered_entries[var_num];
|
||||
entry->name = number[var_num];
|
||||
|
||||
entry->proc_entry = proc_create_data(entry->name, 0644, numbered_dir,
|
||||
&srm_env_proc_fops, entry);
|
||||
if (!entry->proc_entry)
|
||||
char name[4];
|
||||
sprintf(name, "%ld", var_num);
|
||||
if (!proc_create_data(name, 0644, numbered_dir,
|
||||
&srm_env_proc_fops, (void *)var_num))
|
||||
goto cleanup;
|
||||
|
||||
entry->id = var_num;
|
||||
}
|
||||
|
||||
printk(KERN_INFO "%s: version %s loaded successfully\n", NAME,
|
||||
@@ -282,18 +220,15 @@ srm_env_init(void)
|
||||
return 0;
|
||||
|
||||
cleanup:
|
||||
srm_env_cleanup();
|
||||
|
||||
remove_proc_subtree(BASE_DIR, NULL);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static void __exit
|
||||
srm_env_exit(void)
|
||||
{
|
||||
srm_env_cleanup();
|
||||
remove_proc_subtree(BASE_DIR, NULL);
|
||||
printk(KERN_INFO "%s: unloaded successfully\n", NAME);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
module_init(srm_env_init);
|
||||
|
||||
@@ -9,24 +9,18 @@ struct buffer {
|
||||
char data[];
|
||||
};
|
||||
|
||||
static int
|
||||
read_buffer(char* page, char** start, off_t off, int count,
|
||||
int* eof, void* data)
|
||||
static ssize_t atags_read(struct file *file, char __user *buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct buffer *buffer = (struct buffer *)data;
|
||||
|
||||
if (off >= buffer->size) {
|
||||
*eof = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
count = min((int) (buffer->size - off), count);
|
||||
|
||||
memcpy(page, &buffer->data[off], count);
|
||||
|
||||
return count;
|
||||
struct buffer *b = PDE_DATA(file_inode(file));
|
||||
return simple_read_from_buffer(buf, count, ppos, b->data, b->size);
|
||||
}
|
||||
|
||||
static const struct file_operations atags_fops = {
|
||||
.read = atags_read,
|
||||
.llseek = default_llseek,
|
||||
};
|
||||
|
||||
#define BOOT_PARAMS_SIZE 1536
|
||||
static char __initdata atags_copy[BOOT_PARAMS_SIZE];
|
||||
|
||||
@@ -66,9 +60,7 @@ static int __init init_atags_procfs(void)
|
||||
b->size = size;
|
||||
memcpy(b->data, atags_copy, size);
|
||||
|
||||
tags_entry = create_proc_read_entry("atags", 0400,
|
||||
NULL, read_buffer, b);
|
||||
|
||||
tags_entry = proc_create_data("atags", 0400, NULL, &atags_fops, b);
|
||||
if (!tags_entry)
|
||||
goto nomem;
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/syscalls.h>
|
||||
#include <linux/perf_event.h>
|
||||
@@ -79,27 +80,27 @@ static unsigned long abtcounter;
|
||||
static pid_t previous_pid;
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
static int proc_read_status(char *page, char **start, off_t off, int count,
|
||||
int *eof, void *data)
|
||||
static int proc_status_show(struct seq_file *m, void *v)
|
||||
{
|
||||
char *p = page;
|
||||
int len;
|
||||
|
||||
p += sprintf(p, "Emulated SWP:\t\t%lu\n", swpcounter);
|
||||
p += sprintf(p, "Emulated SWPB:\t\t%lu\n", swpbcounter);
|
||||
p += sprintf(p, "Aborted SWP{B}:\t\t%lu\n", abtcounter);
|
||||
seq_printf(m, "Emulated SWP:\t\t%lu\n", swpcounter);
|
||||
seq_printf(m, "Emulated SWPB:\t\t%lu\n", swpbcounter);
|
||||
seq_printf(m, "Aborted SWP{B}:\t\t%lu\n", abtcounter);
|
||||
if (previous_pid != 0)
|
||||
p += sprintf(p, "Last process:\t\t%d\n", previous_pid);
|
||||
|
||||
len = (p - page) - off;
|
||||
if (len < 0)
|
||||
len = 0;
|
||||
|
||||
*eof = (len <= count) ? 1 : 0;
|
||||
*start = page + off;
|
||||
|
||||
return len;
|
||||
seq_printf(m, "Last process:\t\t%d\n", previous_pid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int proc_status_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, proc_status_show, PDE_DATA(inode));
|
||||
}
|
||||
|
||||
static const struct file_operations proc_status_fops = {
|
||||
.open = proc_status_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = seq_release,
|
||||
};
|
||||
#endif
|
||||
|
||||
/*
|
||||
@@ -266,14 +267,8 @@ static struct undef_hook swp_hook = {
|
||||
static int __init swp_emulation_init(void)
|
||||
{
|
||||
#ifdef CONFIG_PROC_FS
|
||||
struct proc_dir_entry *res;
|
||||
|
||||
res = create_proc_entry("cpu/swp_emulation", S_IRUGO, NULL);
|
||||
|
||||
if (!res)
|
||||
if (!proc_create("cpu/swp_emulation", S_IRUGO, NULL, &proc_status_fops))
|
||||
return -ENOMEM;
|
||||
|
||||
res->read_proc = proc_read_status;
|
||||
#endif /* CONFIG_PROC_FS */
|
||||
|
||||
printk(KERN_NOTICE "Registering SWP/SWPB emulation handler\n");
|
||||
|
||||
@@ -31,20 +31,8 @@ extern void *smem_item(unsigned id, unsigned *size);
|
||||
static ssize_t last_radio_log_read(struct file *file, char __user *buf,
|
||||
size_t len, loff_t *offset)
|
||||
{
|
||||
loff_t pos = *offset;
|
||||
ssize_t count;
|
||||
|
||||
if (pos >= radio_log_size)
|
||||
return 0;
|
||||
|
||||
count = min(len, (size_t)(radio_log_size - pos));
|
||||
if (copy_to_user(buf, radio_log_base + pos, count)) {
|
||||
pr_err("%s: copy to user failed\n", __func__);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
*offset += count;
|
||||
return count;
|
||||
return simple_read_from_buffer(buf, len, offset,
|
||||
radio_log_base, radio_log_size);
|
||||
}
|
||||
|
||||
static struct file_operations last_radio_log_fops = {
|
||||
@@ -67,7 +55,8 @@ void msm_init_last_radio_log(struct module *owner)
|
||||
return;
|
||||
}
|
||||
|
||||
entry = create_proc_entry("last_radio_log", S_IFREG | S_IRUGO, NULL);
|
||||
entry = proc_create("last_radio_log", S_IRUGO, NULL,
|
||||
&last_radio_log_fops);
|
||||
if (!entry) {
|
||||
pr_err("%s: could not create proc entry for radio log\n",
|
||||
__func__);
|
||||
@@ -77,7 +66,6 @@ void msm_init_last_radio_log(struct module *owner)
|
||||
pr_err("%s: last radio log is %d bytes long\n", __func__,
|
||||
radio_log_size);
|
||||
last_radio_log_fops.owner = owner;
|
||||
entry->proc_fops = &last_radio_log_fops;
|
||||
entry->size = radio_log_size;
|
||||
}
|
||||
EXPORT_SYMBOL(msm_init_last_radio_log);
|
||||
|
||||
+37
-41
@@ -37,7 +37,8 @@
|
||||
|
||||
#include <linux/suspend.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/sysfs.h>
|
||||
#include <linux/module.h>
|
||||
@@ -423,23 +424,12 @@ void omap1_pm_suspend(void)
|
||||
omap_rev());
|
||||
}
|
||||
|
||||
#if defined(DEBUG) && defined(CONFIG_PROC_FS)
|
||||
static int g_read_completed;
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
/*
|
||||
* Read system PM registers for debugging
|
||||
*/
|
||||
static int omap_pm_read_proc(
|
||||
char *page_buffer,
|
||||
char **my_first_byte,
|
||||
off_t virtual_start,
|
||||
int length,
|
||||
int *eof,
|
||||
void *data)
|
||||
static int omap_pm_debug_show(struct seq_file *m, void *v)
|
||||
{
|
||||
int my_buffer_offset = 0;
|
||||
char * const my_base = page_buffer;
|
||||
|
||||
ARM_SAVE(ARM_CKCTL);
|
||||
ARM_SAVE(ARM_IDLECT1);
|
||||
ARM_SAVE(ARM_IDLECT2);
|
||||
@@ -480,10 +470,7 @@ static int omap_pm_read_proc(
|
||||
MPUI1610_SAVE(EMIFS_CONFIG);
|
||||
}
|
||||
|
||||
if (virtual_start == 0) {
|
||||
g_read_completed = 0;
|
||||
|
||||
my_buffer_offset += sprintf(my_base + my_buffer_offset,
|
||||
seq_printf(m,
|
||||
"ARM_CKCTL_REG: 0x%-8x \n"
|
||||
"ARM_IDLECT1_REG: 0x%-8x \n"
|
||||
"ARM_IDLECT2_REG: 0x%-8x \n"
|
||||
@@ -513,8 +500,8 @@ static int omap_pm_read_proc(
|
||||
ULPD_SHOW(ULPD_STATUS_REQ),
|
||||
ULPD_SHOW(ULPD_POWER_CTRL));
|
||||
|
||||
if (cpu_is_omap7xx()) {
|
||||
my_buffer_offset += sprintf(my_base + my_buffer_offset,
|
||||
if (cpu_is_omap7xx()) {
|
||||
seq_printf(m,
|
||||
"MPUI7XX_CTRL_REG 0x%-8x \n"
|
||||
"MPUI7XX_DSP_STATUS_REG: 0x%-8x \n"
|
||||
"MPUI7XX_DSP_BOOT_CONFIG_REG: 0x%-8x \n"
|
||||
@@ -527,8 +514,8 @@ static int omap_pm_read_proc(
|
||||
MPUI7XX_SHOW(MPUI_DSP_API_CONFIG),
|
||||
MPUI7XX_SHOW(EMIFF_SDRAM_CONFIG),
|
||||
MPUI7XX_SHOW(EMIFS_CONFIG));
|
||||
} else if (cpu_is_omap15xx()) {
|
||||
my_buffer_offset += sprintf(my_base + my_buffer_offset,
|
||||
} else if (cpu_is_omap15xx()) {
|
||||
seq_printf(m,
|
||||
"MPUI1510_CTRL_REG 0x%-8x \n"
|
||||
"MPUI1510_DSP_STATUS_REG: 0x%-8x \n"
|
||||
"MPUI1510_DSP_BOOT_CONFIG_REG: 0x%-8x \n"
|
||||
@@ -541,8 +528,8 @@ static int omap_pm_read_proc(
|
||||
MPUI1510_SHOW(MPUI_DSP_API_CONFIG),
|
||||
MPUI1510_SHOW(EMIFF_SDRAM_CONFIG),
|
||||
MPUI1510_SHOW(EMIFS_CONFIG));
|
||||
} else if (cpu_is_omap16xx()) {
|
||||
my_buffer_offset += sprintf(my_base + my_buffer_offset,
|
||||
} else if (cpu_is_omap16xx()) {
|
||||
seq_printf(m,
|
||||
"MPUI1610_CTRL_REG 0x%-8x \n"
|
||||
"MPUI1610_DSP_STATUS_REG: 0x%-8x \n"
|
||||
"MPUI1610_DSP_BOOT_CONFIG_REG: 0x%-8x \n"
|
||||
@@ -555,28 +542,37 @@ static int omap_pm_read_proc(
|
||||
MPUI1610_SHOW(MPUI_DSP_API_CONFIG),
|
||||
MPUI1610_SHOW(EMIFF_SDRAM_CONFIG),
|
||||
MPUI1610_SHOW(EMIFS_CONFIG));
|
||||
}
|
||||
|
||||
g_read_completed++;
|
||||
} else if (g_read_completed >= 1) {
|
||||
*eof = 1;
|
||||
return 0;
|
||||
}
|
||||
g_read_completed++;
|
||||
|
||||
*my_first_byte = page_buffer;
|
||||
return my_buffer_offset;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void omap_pm_init_proc(void)
|
||||
static int omap_pm_debug_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
/* XXX Appears to leak memory */
|
||||
create_proc_read_entry("driver/omap_pm",
|
||||
S_IWUSR | S_IRUGO, NULL,
|
||||
omap_pm_read_proc, NULL);
|
||||
return single_open(file, omap_pm_debug_show,
|
||||
&inode->i_private);
|
||||
}
|
||||
|
||||
#endif /* DEBUG && CONFIG_PROC_FS */
|
||||
static const struct file_operations omap_pm_debug_fops = {
|
||||
.open = omap_pm_debug_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = seq_release,
|
||||
};
|
||||
|
||||
static void omap_pm_init_debugfs(void)
|
||||
{
|
||||
struct dentry *d;
|
||||
|
||||
d = debugfs_create_dir("pm_debug", NULL);
|
||||
if (!d)
|
||||
return;
|
||||
|
||||
(void) debugfs_create_file("omap_pm", S_IWUSR | S_IRUGO,
|
||||
d, NULL, &omap_pm_debug_fops);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_DEBUG_FS */
|
||||
|
||||
/*
|
||||
* omap_pm_prepare - Do preliminary suspend work.
|
||||
@@ -701,8 +697,8 @@ static int __init omap_pm_init(void)
|
||||
|
||||
suspend_set_ops(&omap_pm_ops);
|
||||
|
||||
#if defined(DEBUG) && defined(CONFIG_PROC_FS)
|
||||
omap_pm_init_proc();
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
omap_pm_init_debugfs();
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_OMAP_32K_TIMER
|
||||
|
||||
@@ -116,14 +116,12 @@ static const struct seq_operations cplbinfo_sops = {
|
||||
|
||||
static int cplbinfo_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct proc_dir_entry *pde = PDE(file_inode(file));
|
||||
char cplb_type;
|
||||
unsigned int cpu;
|
||||
unsigned int cpu = (unsigned long)PDE_DATA(file_inode(file));
|
||||
int ret;
|
||||
struct seq_file *m;
|
||||
struct cplbinfo_data *cdata;
|
||||
|
||||
cpu = (unsigned int)pde->data;
|
||||
cplb_type = cpu & CPLBINFO_DCPLB_FLAG ? 'D' : 'I';
|
||||
cpu &= ~CPLBINFO_DCPLB_FLAG;
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <arch/svinto.h>
|
||||
#include <asm/fasttimer.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
|
||||
|
||||
#define DEBUG_LOG_INCLUDED
|
||||
@@ -489,197 +490,162 @@ void schedule_usleep(unsigned long us)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
static int proc_fasttimer_read(char *buf, char **start, off_t offset, int len
|
||||
,int *eof, void *data_unused);
|
||||
static struct proc_dir_entry *fasttimer_proc_entry;
|
||||
#endif /* CONFIG_PROC_FS */
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
|
||||
/* This value is very much based on testing */
|
||||
#define BIG_BUF_SIZE (500 + NUM_TIMER_STATS * 300)
|
||||
|
||||
static int proc_fasttimer_read(char *buf, char **start, off_t offset, int len
|
||||
,int *eof, void *data_unused)
|
||||
static int proc_fasttimer_show(struct seq_file *m, void *v)
|
||||
{
|
||||
unsigned long flags;
|
||||
int i = 0;
|
||||
int num_to_show;
|
||||
unsigned long flags;
|
||||
int i = 0;
|
||||
int num_to_show;
|
||||
struct fasttime_t tv;
|
||||
struct fast_timer *t, *nextt;
|
||||
static char *bigbuf = NULL;
|
||||
static unsigned long used;
|
||||
struct fast_timer *t, *nextt;
|
||||
|
||||
if (!bigbuf && !(bigbuf = vmalloc(BIG_BUF_SIZE)))
|
||||
{
|
||||
used = 0;
|
||||
if (buf)
|
||||
buf[0] = '\0';
|
||||
return 0;
|
||||
}
|
||||
do_gettimeofday_fast(&tv);
|
||||
|
||||
if (!offset || !used)
|
||||
{
|
||||
do_gettimeofday_fast(&tv);
|
||||
|
||||
used = 0;
|
||||
used += sprintf(bigbuf + used, "Fast timers added: %i\n",
|
||||
fast_timers_added);
|
||||
used += sprintf(bigbuf + used, "Fast timers started: %i\n",
|
||||
fast_timers_started);
|
||||
used += sprintf(bigbuf + used, "Fast timer interrupts: %i\n",
|
||||
fast_timer_ints);
|
||||
used += sprintf(bigbuf + used, "Fast timers expired: %i\n",
|
||||
fast_timers_expired);
|
||||
used += sprintf(bigbuf + used, "Fast timers deleted: %i\n",
|
||||
fast_timers_deleted);
|
||||
used += sprintf(bigbuf + used, "Fast timer running: %s\n",
|
||||
fast_timer_running ? "yes" : "no");
|
||||
used += sprintf(bigbuf + used, "Current time: %lu.%06lu\n",
|
||||
(unsigned long)tv.tv_jiff,
|
||||
(unsigned long)tv.tv_usec);
|
||||
seq_printf(m, "Fast timers added: %i\n", fast_timers_added);
|
||||
seq_printf(m, "Fast timers started: %i\n", fast_timers_started);
|
||||
seq_printf(m, "Fast timer interrupts: %i\n", fast_timer_ints);
|
||||
seq_printf(m, "Fast timers expired: %i\n", fast_timers_expired);
|
||||
seq_printf(m, "Fast timers deleted: %i\n", fast_timers_deleted);
|
||||
seq_printf(m, "Fast timer running: %s\n",
|
||||
fast_timer_running ? "yes" : "no");
|
||||
seq_printf(m, "Current time: %lu.%06lu\n",
|
||||
(unsigned long)tv.tv_jiff,
|
||||
(unsigned long)tv.tv_usec);
|
||||
#ifdef FAST_TIMER_SANITY_CHECKS
|
||||
used += sprintf(bigbuf + used, "Sanity failed: %i\n",
|
||||
sanity_failed);
|
||||
seq_printf(m, "Sanity failed: %i\n", sanity_failed);
|
||||
#endif
|
||||
used += sprintf(bigbuf + used, "\n");
|
||||
seq_putc(m, '\n');
|
||||
|
||||
#ifdef DEBUG_LOG_INCLUDED
|
||||
{
|
||||
int end_i = debug_log_cnt;
|
||||
i = 0;
|
||||
{
|
||||
int end_i = debug_log_cnt;
|
||||
i = 0;
|
||||
|
||||
if (debug_log_cnt_wrapped)
|
||||
{
|
||||
i = debug_log_cnt;
|
||||
}
|
||||
if (debug_log_cnt_wrapped)
|
||||
i = debug_log_cnt;
|
||||
|
||||
while ((i != end_i || (debug_log_cnt_wrapped && !used)) &&
|
||||
used+100 < BIG_BUF_SIZE)
|
||||
{
|
||||
used += sprintf(bigbuf + used, debug_log_string[i],
|
||||
debug_log_value[i]);
|
||||
i = (i+1) % DEBUG_LOG_MAX;
|
||||
}
|
||||
}
|
||||
used += sprintf(bigbuf + used, "\n");
|
||||
while (i != end_i || debug_log_cnt_wrapped) {
|
||||
if (seq_printf(m, debug_log_string[i], debug_log_value[i]) < 0)
|
||||
return 0;
|
||||
i = (i+1) % DEBUG_LOG_MAX;
|
||||
}
|
||||
}
|
||||
seq_putc(m, '\n');
|
||||
#endif
|
||||
|
||||
num_to_show = (fast_timers_started < NUM_TIMER_STATS ? fast_timers_started:
|
||||
NUM_TIMER_STATS);
|
||||
used += sprintf(bigbuf + used, "Timers started: %i\n", fast_timers_started);
|
||||
for (i = 0; i < num_to_show && (used+100 < BIG_BUF_SIZE) ; i++)
|
||||
{
|
||||
int cur = (fast_timers_started - i - 1) % NUM_TIMER_STATS;
|
||||
num_to_show = (fast_timers_started < NUM_TIMER_STATS ? fast_timers_started:
|
||||
NUM_TIMER_STATS);
|
||||
seq_printf(m, "Timers started: %i\n", fast_timers_started);
|
||||
for (i = 0; i < num_to_show; i++) {
|
||||
int cur = (fast_timers_started - i - 1) % NUM_TIMER_STATS;
|
||||
|
||||
#if 1 //ndef FAST_TIMER_LOG
|
||||
used += sprintf(bigbuf + used, "div: %i freq: %i delay: %i"
|
||||
"\n",
|
||||
timer_div_settings[cur],
|
||||
timer_freq_settings[cur],
|
||||
timer_delay_settings[cur]
|
||||
);
|
||||
seq_printf(m, "div: %i freq: %i delay: %i"
|
||||
"\n",
|
||||
timer_div_settings[cur],
|
||||
timer_freq_settings[cur],
|
||||
timer_delay_settings[cur]);
|
||||
#endif
|
||||
#ifdef FAST_TIMER_LOG
|
||||
t = &timer_started_log[cur];
|
||||
used += sprintf(bigbuf + used, "%-14s s: %6lu.%06lu e: %6lu.%06lu "
|
||||
"d: %6li us data: 0x%08lX"
|
||||
"\n",
|
||||
t->name,
|
||||
(unsigned long)t->tv_set.tv_jiff,
|
||||
(unsigned long)t->tv_set.tv_usec,
|
||||
(unsigned long)t->tv_expires.tv_jiff,
|
||||
(unsigned long)t->tv_expires.tv_usec,
|
||||
t->delay_us,
|
||||
t->data
|
||||
);
|
||||
t = &timer_started_log[cur];
|
||||
if (seq_printf(m, "%-14s s: %6lu.%06lu e: %6lu.%06lu "
|
||||
"d: %6li us data: 0x%08lX"
|
||||
"\n",
|
||||
t->name,
|
||||
(unsigned long)t->tv_set.tv_jiff,
|
||||
(unsigned long)t->tv_set.tv_usec,
|
||||
(unsigned long)t->tv_expires.tv_jiff,
|
||||
(unsigned long)t->tv_expires.tv_usec,
|
||||
t->delay_us,
|
||||
t->data) < 0)
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
used += sprintf(bigbuf + used, "\n");
|
||||
}
|
||||
seq_putc(m, '\n');
|
||||
|
||||
#ifdef FAST_TIMER_LOG
|
||||
num_to_show = (fast_timers_added < NUM_TIMER_STATS ? fast_timers_added:
|
||||
NUM_TIMER_STATS);
|
||||
used += sprintf(bigbuf + used, "Timers added: %i\n", fast_timers_added);
|
||||
for (i = 0; i < num_to_show && (used+100 < BIG_BUF_SIZE); i++)
|
||||
{
|
||||
t = &timer_added_log[(fast_timers_added - i - 1) % NUM_TIMER_STATS];
|
||||
used += sprintf(bigbuf + used, "%-14s s: %6lu.%06lu e: %6lu.%06lu "
|
||||
"d: %6li us data: 0x%08lX"
|
||||
"\n",
|
||||
t->name,
|
||||
(unsigned long)t->tv_set.tv_jiff,
|
||||
(unsigned long)t->tv_set.tv_usec,
|
||||
(unsigned long)t->tv_expires.tv_jiff,
|
||||
(unsigned long)t->tv_expires.tv_usec,
|
||||
t->delay_us,
|
||||
t->data
|
||||
);
|
||||
}
|
||||
used += sprintf(bigbuf + used, "\n");
|
||||
num_to_show = (fast_timers_added < NUM_TIMER_STATS ? fast_timers_added:
|
||||
NUM_TIMER_STATS);
|
||||
seq_printf(m, "Timers added: %i\n", fast_timers_added);
|
||||
for (i = 0; i < num_to_show; i++) {
|
||||
t = &timer_added_log[(fast_timers_added - i - 1) % NUM_TIMER_STATS];
|
||||
if (seq_printf(m, "%-14s s: %6lu.%06lu e: %6lu.%06lu "
|
||||
"d: %6li us data: 0x%08lX"
|
||||
"\n",
|
||||
t->name,
|
||||
(unsigned long)t->tv_set.tv_jiff,
|
||||
(unsigned long)t->tv_set.tv_usec,
|
||||
(unsigned long)t->tv_expires.tv_jiff,
|
||||
(unsigned long)t->tv_expires.tv_usec,
|
||||
t->delay_us,
|
||||
t->data) < 0)
|
||||
return 0;
|
||||
}
|
||||
seq_putc(m, '\n');
|
||||
|
||||
num_to_show = (fast_timers_expired < NUM_TIMER_STATS ? fast_timers_expired:
|
||||
NUM_TIMER_STATS);
|
||||
used += sprintf(bigbuf + used, "Timers expired: %i\n", fast_timers_expired);
|
||||
for (i = 0; i < num_to_show && (used+100 < BIG_BUF_SIZE); i++)
|
||||
{
|
||||
t = &timer_expired_log[(fast_timers_expired - i - 1) % NUM_TIMER_STATS];
|
||||
used += sprintf(bigbuf + used, "%-14s s: %6lu.%06lu e: %6lu.%06lu "
|
||||
"d: %6li us data: 0x%08lX"
|
||||
"\n",
|
||||
t->name,
|
||||
(unsigned long)t->tv_set.tv_jiff,
|
||||
(unsigned long)t->tv_set.tv_usec,
|
||||
(unsigned long)t->tv_expires.tv_jiff,
|
||||
(unsigned long)t->tv_expires.tv_usec,
|
||||
t->delay_us,
|
||||
t->data
|
||||
);
|
||||
}
|
||||
used += sprintf(bigbuf + used, "\n");
|
||||
num_to_show = (fast_timers_expired < NUM_TIMER_STATS ? fast_timers_expired:
|
||||
NUM_TIMER_STATS);
|
||||
seq_printf(m, "Timers expired: %i\n", fast_timers_expired);
|
||||
for (i = 0; i < num_to_show; i++) {
|
||||
t = &timer_expired_log[(fast_timers_expired - i - 1) % NUM_TIMER_STATS];
|
||||
if (seq_printf(m, "%-14s s: %6lu.%06lu e: %6lu.%06lu "
|
||||
"d: %6li us data: 0x%08lX"
|
||||
"\n",
|
||||
t->name,
|
||||
(unsigned long)t->tv_set.tv_jiff,
|
||||
(unsigned long)t->tv_set.tv_usec,
|
||||
(unsigned long)t->tv_expires.tv_jiff,
|
||||
(unsigned long)t->tv_expires.tv_usec,
|
||||
t->delay_us,
|
||||
t->data) < 0)
|
||||
return 0;
|
||||
}
|
||||
seq_putc(m, '\n');
|
||||
#endif
|
||||
|
||||
used += sprintf(bigbuf + used, "Active timers:\n");
|
||||
local_irq_save(flags);
|
||||
t = fast_timer_list;
|
||||
while (t != NULL && (used+100 < BIG_BUF_SIZE))
|
||||
{
|
||||
nextt = t->next;
|
||||
local_irq_restore(flags);
|
||||
used += sprintf(bigbuf + used, "%-14s s: %6lu.%06lu e: %6lu.%06lu "
|
||||
"d: %6li us data: 0x%08lX"
|
||||
/* " func: 0x%08lX" */
|
||||
"\n",
|
||||
t->name,
|
||||
(unsigned long)t->tv_set.tv_jiff,
|
||||
(unsigned long)t->tv_set.tv_usec,
|
||||
(unsigned long)t->tv_expires.tv_jiff,
|
||||
(unsigned long)t->tv_expires.tv_usec,
|
||||
t->delay_us,
|
||||
t->data
|
||||
/* , t->function */
|
||||
);
|
||||
seq_puts(m, "Active timers:\n");
|
||||
local_irq_save(flags);
|
||||
if (t->next != nextt)
|
||||
{
|
||||
printk(KERN_WARNING "timer removed!\n");
|
||||
}
|
||||
t = nextt;
|
||||
}
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
t = fast_timer_list;
|
||||
while (t) {
|
||||
nextt = t->next;
|
||||
local_irq_restore(flags);
|
||||
if (seq_printf(m, "%-14s s: %6lu.%06lu e: %6lu.%06lu "
|
||||
"d: %6li us data: 0x%08lX"
|
||||
/* " func: 0x%08lX" */
|
||||
"\n",
|
||||
t->name,
|
||||
(unsigned long)t->tv_set.tv_jiff,
|
||||
(unsigned long)t->tv_set.tv_usec,
|
||||
(unsigned long)t->tv_expires.tv_jiff,
|
||||
(unsigned long)t->tv_expires.tv_usec,
|
||||
t->delay_us,
|
||||
t->data
|
||||
/* , t->function */
|
||||
) < 0)
|
||||
return 0;
|
||||
local_irq_save(flags);
|
||||
if (t->next != nextt)
|
||||
printk(KERN_WARNING "timer removed!\n");
|
||||
t = nextt;
|
||||
}
|
||||
local_irq_restore(flags);
|
||||
|
||||
if (used - offset < len)
|
||||
{
|
||||
len = used - offset;
|
||||
}
|
||||
|
||||
memcpy(buf, bigbuf + offset, len);
|
||||
*start = buf;
|
||||
*eof = 1;
|
||||
|
||||
return len;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int proc_fasttimer_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open_size(file, proc_fasttimer_show, PDE_DATA(inode), BIG_BUF_SIZE);
|
||||
}
|
||||
|
||||
static const struct file_operations proc_fasttimer_fops = {
|
||||
.open = proc_fasttimer_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = seq_release,
|
||||
};
|
||||
#endif /* PROC_FS */
|
||||
|
||||
#ifdef FAST_TIMER_TEST
|
||||
@@ -857,8 +823,7 @@ int fast_timer_init(void)
|
||||
}
|
||||
#endif
|
||||
#ifdef CONFIG_PROC_FS
|
||||
if ((fasttimer_proc_entry = create_proc_entry( "fasttimer", 0, 0 )))
|
||||
fasttimer_proc_entry->read_proc = proc_fasttimer_read;
|
||||
proc_create("fasttimer", 0, NULL, &proc_fasttimer_fops);
|
||||
#endif /* PROC_FS */
|
||||
if(request_irq(TIMER1_IRQ_NBR, timer1_handler, 0,
|
||||
"fast timer int", NULL))
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#include <hwregs/timer_defs.h>
|
||||
#include <asm/fasttimer.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
|
||||
/*
|
||||
* timer0 is running at 100MHz and generating jiffies timer ticks
|
||||
@@ -463,195 +464,161 @@ void schedule_usleep(unsigned long us)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
static int proc_fasttimer_read(char *buf, char **start, off_t offset, int len
|
||||
,int *eof, void *data_unused);
|
||||
static struct proc_dir_entry *fasttimer_proc_entry;
|
||||
#endif /* CONFIG_PROC_FS */
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
|
||||
/* This value is very much based on testing */
|
||||
#define BIG_BUF_SIZE (500 + NUM_TIMER_STATS * 300)
|
||||
|
||||
static int proc_fasttimer_read(char *buf, char **start, off_t offset, int len
|
||||
,int *eof, void *data_unused)
|
||||
static int proc_fasttimer_show(struct seq_file *m, void *v)
|
||||
{
|
||||
unsigned long flags;
|
||||
int i = 0;
|
||||
int num_to_show;
|
||||
unsigned long flags;
|
||||
int i = 0;
|
||||
int num_to_show;
|
||||
struct fasttime_t tv;
|
||||
struct fast_timer *t, *nextt;
|
||||
static char *bigbuf = NULL;
|
||||
static unsigned long used;
|
||||
struct fast_timer *t, *nextt;
|
||||
|
||||
if (!bigbuf) {
|
||||
bigbuf = vmalloc(BIG_BUF_SIZE);
|
||||
if (!bigbuf) {
|
||||
used = 0;
|
||||
if (buf)
|
||||
buf[0] = '\0';
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
do_gettimeofday_fast(&tv);
|
||||
|
||||
if (!offset || !used) {
|
||||
do_gettimeofday_fast(&tv);
|
||||
|
||||
used = 0;
|
||||
used += sprintf(bigbuf + used, "Fast timers added: %i\n",
|
||||
fast_timers_added);
|
||||
used += sprintf(bigbuf + used, "Fast timers started: %i\n",
|
||||
fast_timers_started);
|
||||
used += sprintf(bigbuf + used, "Fast timer interrupts: %i\n",
|
||||
fast_timer_ints);
|
||||
used += sprintf(bigbuf + used, "Fast timers expired: %i\n",
|
||||
fast_timers_expired);
|
||||
used += sprintf(bigbuf + used, "Fast timers deleted: %i\n",
|
||||
fast_timers_deleted);
|
||||
used += sprintf(bigbuf + used, "Fast timer running: %s\n",
|
||||
fast_timer_running ? "yes" : "no");
|
||||
used += sprintf(bigbuf + used, "Current time: %lu.%06lu\n",
|
||||
(unsigned long)tv.tv_jiff,
|
||||
(unsigned long)tv.tv_usec);
|
||||
seq_printf(m, "Fast timers added: %i\n", fast_timers_added);
|
||||
seq_printf(m, "Fast timers started: %i\n", fast_timers_started);
|
||||
seq_printf(m, "Fast timer interrupts: %i\n", fast_timer_ints);
|
||||
seq_printf(m, "Fast timers expired: %i\n", fast_timers_expired);
|
||||
seq_printf(m, "Fast timers deleted: %i\n", fast_timers_deleted);
|
||||
seq_printf(m, "Fast timer running: %s\n",
|
||||
fast_timer_running ? "yes" : "no");
|
||||
seq_printf(m, "Current time: %lu.%06lu\n",
|
||||
(unsigned long)tv.tv_jiff,
|
||||
(unsigned long)tv.tv_usec);
|
||||
#ifdef FAST_TIMER_SANITY_CHECKS
|
||||
used += sprintf(bigbuf + used, "Sanity failed: %i\n",
|
||||
sanity_failed);
|
||||
seq_printf(m, "Sanity failed: %i\n", sanity_failed);
|
||||
#endif
|
||||
used += sprintf(bigbuf + used, "\n");
|
||||
seq_putc(m, '\n');
|
||||
|
||||
#ifdef DEBUG_LOG_INCLUDED
|
||||
{
|
||||
int end_i = debug_log_cnt;
|
||||
i = 0;
|
||||
{
|
||||
int end_i = debug_log_cnt;
|
||||
i = 0;
|
||||
|
||||
if (debug_log_cnt_wrapped)
|
||||
i = debug_log_cnt;
|
||||
if (debug_log_cnt_wrapped)
|
||||
i = debug_log_cnt;
|
||||
|
||||
while ((i != end_i || (debug_log_cnt_wrapped && !used)) &&
|
||||
used+100 < BIG_BUF_SIZE)
|
||||
{
|
||||
used += sprintf(bigbuf + used, debug_log_string[i],
|
||||
debug_log_value[i]);
|
||||
i = (i+1) % DEBUG_LOG_MAX;
|
||||
}
|
||||
}
|
||||
used += sprintf(bigbuf + used, "\n");
|
||||
while ((i != end_i || debug_log_cnt_wrapped)) {
|
||||
if (seq_printf(m, debug_log_string[i], debug_log_value[i]) < 0)
|
||||
return 0;
|
||||
i = (i+1) % DEBUG_LOG_MAX;
|
||||
}
|
||||
}
|
||||
seq_putc(m, '\n');
|
||||
#endif
|
||||
|
||||
num_to_show = (fast_timers_started < NUM_TIMER_STATS ? fast_timers_started:
|
||||
NUM_TIMER_STATS);
|
||||
used += sprintf(bigbuf + used, "Timers started: %i\n", fast_timers_started);
|
||||
for (i = 0; i < num_to_show && (used+100 < BIG_BUF_SIZE) ; i++)
|
||||
{
|
||||
int cur = (fast_timers_started - i - 1) % NUM_TIMER_STATS;
|
||||
num_to_show = (fast_timers_started < NUM_TIMER_STATS ? fast_timers_started:
|
||||
NUM_TIMER_STATS);
|
||||
seq_printf(m, "Timers started: %i\n", fast_timers_started);
|
||||
for (i = 0; i < num_to_show; i++) {
|
||||
int cur = (fast_timers_started - i - 1) % NUM_TIMER_STATS;
|
||||
|
||||
#if 1 //ndef FAST_TIMER_LOG
|
||||
used += sprintf(bigbuf + used, "div: %i delay: %i"
|
||||
"\n",
|
||||
timer_div_settings[cur],
|
||||
timer_delay_settings[cur]
|
||||
);
|
||||
seq_printf(m, "div: %i delay: %i"
|
||||
"\n",
|
||||
timer_div_settings[cur],
|
||||
timer_delay_settings[cur]);
|
||||
#endif
|
||||
#ifdef FAST_TIMER_LOG
|
||||
t = &timer_started_log[cur];
|
||||
used += sprintf(bigbuf + used, "%-14s s: %6lu.%06lu e: %6lu.%06lu "
|
||||
"d: %6li us data: 0x%08lX"
|
||||
"\n",
|
||||
t->name,
|
||||
(unsigned long)t->tv_set.tv_jiff,
|
||||
(unsigned long)t->tv_set.tv_usec,
|
||||
(unsigned long)t->tv_expires.tv_jiff,
|
||||
(unsigned long)t->tv_expires.tv_usec,
|
||||
t->delay_us,
|
||||
t->data
|
||||
);
|
||||
t = &timer_started_log[cur];
|
||||
if (seq_printf(m, "%-14s s: %6lu.%06lu e: %6lu.%06lu "
|
||||
"d: %6li us data: 0x%08lX"
|
||||
"\n",
|
||||
t->name,
|
||||
(unsigned long)t->tv_set.tv_jiff,
|
||||
(unsigned long)t->tv_set.tv_usec,
|
||||
(unsigned long)t->tv_expires.tv_jiff,
|
||||
(unsigned long)t->tv_expires.tv_usec,
|
||||
t->delay_us,
|
||||
t->data) < 0)
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
used += sprintf(bigbuf + used, "\n");
|
||||
}
|
||||
seq_putc(m, '\n');
|
||||
|
||||
#ifdef FAST_TIMER_LOG
|
||||
num_to_show = (fast_timers_added < NUM_TIMER_STATS ? fast_timers_added:
|
||||
NUM_TIMER_STATS);
|
||||
used += sprintf(bigbuf + used, "Timers added: %i\n", fast_timers_added);
|
||||
for (i = 0; i < num_to_show && (used+100 < BIG_BUF_SIZE); i++)
|
||||
{
|
||||
t = &timer_added_log[(fast_timers_added - i - 1) % NUM_TIMER_STATS];
|
||||
used += sprintf(bigbuf + used, "%-14s s: %6lu.%06lu e: %6lu.%06lu "
|
||||
"d: %6li us data: 0x%08lX"
|
||||
"\n",
|
||||
t->name,
|
||||
(unsigned long)t->tv_set.tv_jiff,
|
||||
(unsigned long)t->tv_set.tv_usec,
|
||||
(unsigned long)t->tv_expires.tv_jiff,
|
||||
(unsigned long)t->tv_expires.tv_usec,
|
||||
t->delay_us,
|
||||
t->data
|
||||
);
|
||||
}
|
||||
used += sprintf(bigbuf + used, "\n");
|
||||
num_to_show = (fast_timers_added < NUM_TIMER_STATS ? fast_timers_added:
|
||||
NUM_TIMER_STATS);
|
||||
seq_printf(m, "Timers added: %i\n", fast_timers_added);
|
||||
for (i = 0; i < num_to_show; i++) {
|
||||
t = &timer_added_log[(fast_timers_added - i - 1) % NUM_TIMER_STATS];
|
||||
if (seq_printf(m, "%-14s s: %6lu.%06lu e: %6lu.%06lu "
|
||||
"d: %6li us data: 0x%08lX"
|
||||
"\n",
|
||||
t->name,
|
||||
(unsigned long)t->tv_set.tv_jiff,
|
||||
(unsigned long)t->tv_set.tv_usec,
|
||||
(unsigned long)t->tv_expires.tv_jiff,
|
||||
(unsigned long)t->tv_expires.tv_usec,
|
||||
t->delay_us,
|
||||
t->data) < 0)
|
||||
return 0;
|
||||
}
|
||||
seq_putc(m, '\n');
|
||||
|
||||
num_to_show = (fast_timers_expired < NUM_TIMER_STATS ? fast_timers_expired:
|
||||
NUM_TIMER_STATS);
|
||||
used += sprintf(bigbuf + used, "Timers expired: %i\n", fast_timers_expired);
|
||||
for (i = 0; i < num_to_show && (used+100 < BIG_BUF_SIZE); i++)
|
||||
{
|
||||
t = &timer_expired_log[(fast_timers_expired - i - 1) % NUM_TIMER_STATS];
|
||||
used += sprintf(bigbuf + used, "%-14s s: %6lu.%06lu e: %6lu.%06lu "
|
||||
"d: %6li us data: 0x%08lX"
|
||||
"\n",
|
||||
t->name,
|
||||
(unsigned long)t->tv_set.tv_jiff,
|
||||
(unsigned long)t->tv_set.tv_usec,
|
||||
(unsigned long)t->tv_expires.tv_jiff,
|
||||
(unsigned long)t->tv_expires.tv_usec,
|
||||
t->delay_us,
|
||||
t->data
|
||||
);
|
||||
}
|
||||
used += sprintf(bigbuf + used, "\n");
|
||||
num_to_show = (fast_timers_expired < NUM_TIMER_STATS ? fast_timers_expired:
|
||||
NUM_TIMER_STATS);
|
||||
seq_printf(m, "Timers expired: %i\n", fast_timers_expired);
|
||||
for (i = 0; i < num_to_show; i++){
|
||||
t = &timer_expired_log[(fast_timers_expired - i - 1) % NUM_TIMER_STATS];
|
||||
if (seq_printf(m, "%-14s s: %6lu.%06lu e: %6lu.%06lu "
|
||||
"d: %6li us data: 0x%08lX"
|
||||
"\n",
|
||||
t->name,
|
||||
(unsigned long)t->tv_set.tv_jiff,
|
||||
(unsigned long)t->tv_set.tv_usec,
|
||||
(unsigned long)t->tv_expires.tv_jiff,
|
||||
(unsigned long)t->tv_expires.tv_usec,
|
||||
t->delay_us,
|
||||
t->data) < 0)
|
||||
return 0;
|
||||
}
|
||||
seq_putc(m, '\n');
|
||||
#endif
|
||||
|
||||
used += sprintf(bigbuf + used, "Active timers:\n");
|
||||
local_irq_save(flags);
|
||||
t = fast_timer_list;
|
||||
while (t != NULL && (used+100 < BIG_BUF_SIZE))
|
||||
{
|
||||
nextt = t->next;
|
||||
local_irq_restore(flags);
|
||||
used += sprintf(bigbuf + used, "%-14s s: %6lu.%06lu e: %6lu.%06lu "
|
||||
"d: %6li us data: 0x%08lX"
|
||||
seq_puts(m, "Active timers:\n");
|
||||
local_irq_save(flags);
|
||||
t = fast_timer_list;
|
||||
while (t != NULL){
|
||||
nextt = t->next;
|
||||
local_irq_restore(flags);
|
||||
if (seq_printf(m, "%-14s s: %6lu.%06lu e: %6lu.%06lu "
|
||||
"d: %6li us data: 0x%08lX"
|
||||
/* " func: 0x%08lX" */
|
||||
"\n",
|
||||
t->name,
|
||||
(unsigned long)t->tv_set.tv_jiff,
|
||||
(unsigned long)t->tv_set.tv_usec,
|
||||
(unsigned long)t->tv_expires.tv_jiff,
|
||||
(unsigned long)t->tv_expires.tv_usec,
|
||||
t->delay_us,
|
||||
t->data
|
||||
"\n",
|
||||
t->name,
|
||||
(unsigned long)t->tv_set.tv_jiff,
|
||||
(unsigned long)t->tv_set.tv_usec,
|
||||
(unsigned long)t->tv_expires.tv_jiff,
|
||||
(unsigned long)t->tv_expires.tv_usec,
|
||||
t->delay_us,
|
||||
t->data
|
||||
/* , t->function */
|
||||
);
|
||||
local_irq_save(flags);
|
||||
if (t->next != nextt)
|
||||
{
|
||||
printk("timer removed!\n");
|
||||
}
|
||||
t = nextt;
|
||||
}
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
if (used - offset < len)
|
||||
{
|
||||
len = used - offset;
|
||||
}
|
||||
|
||||
memcpy(buf, bigbuf + offset, len);
|
||||
*start = buf;
|
||||
*eof = 1;
|
||||
|
||||
return len;
|
||||
) < 0)
|
||||
return 0;
|
||||
local_irq_save(flags);
|
||||
if (t->next != nextt)
|
||||
printk("timer removed!\n");
|
||||
t = nextt;
|
||||
}
|
||||
local_irq_restore(flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int proc_fasttimer_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open_size(file, proc_fasttimer_show, PDE_DATA(inode), BIG_BUF_SIZE);
|
||||
}
|
||||
|
||||
static const struct file_operations proc_fasttimer_fops = {
|
||||
.open = proc_fasttimer_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = seq_release,
|
||||
};
|
||||
|
||||
#endif /* PROC_FS */
|
||||
|
||||
#ifdef FAST_TIMER_TEST
|
||||
@@ -816,9 +783,7 @@ int fast_timer_init(void)
|
||||
printk("fast_timer_init()\n");
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
fasttimer_proc_entry = create_proc_entry("fasttimer", 0, 0);
|
||||
if (fasttimer_proc_entry)
|
||||
fasttimer_proc_entry->read_proc = proc_fasttimer_read;
|
||||
proc_create("fasttimer", 0, NULL, &proc_fasttimer_fops);
|
||||
#endif /* PROC_FS */
|
||||
if (request_irq(TIMER0_INTR_VECT, timer_trig_interrupt,
|
||||
IRQF_SHARED | IRQF_DISABLED,
|
||||
|
||||
+20
-15
@@ -11,6 +11,7 @@
|
||||
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/fs.h>
|
||||
@@ -138,30 +139,34 @@ static char *port_status(int portno)
|
||||
return result;
|
||||
}
|
||||
|
||||
static int gpio_proc_read(char *buf, char **start, off_t offset,
|
||||
int len, int *unused_i, void *unused_v)
|
||||
static int gpio_proc_show(struct seq_file *m, void *v)
|
||||
{
|
||||
int c,outlen;
|
||||
static const char port_name[]="123456789ABCDEFGH";
|
||||
outlen = 0;
|
||||
int c;
|
||||
|
||||
for (c = 0; c < MAX_PORT; c++) {
|
||||
if (ddrs[c] == NULL)
|
||||
continue ;
|
||||
len = sprintf(buf,"P%c: %s\n",port_name[c],port_status(c));
|
||||
buf += len;
|
||||
outlen += len;
|
||||
continue;
|
||||
seq_printf(m, "P%c: %s\n", port_name[c], port_status(c));
|
||||
}
|
||||
return outlen;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int gpio_proc_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, gpio_proc_show, PDE_DATA(inode));
|
||||
}
|
||||
|
||||
static const struct file_operations gpio_proc_fops = {
|
||||
.open = gpio_proc_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = seq_release,
|
||||
};
|
||||
|
||||
static __init int register_proc(void)
|
||||
{
|
||||
struct proc_dir_entry *proc_gpio;
|
||||
|
||||
proc_gpio = create_proc_entry("gpio", S_IRUGO, NULL);
|
||||
if (proc_gpio)
|
||||
proc_gpio->read_proc = gpio_proc_read;
|
||||
return proc_gpio != NULL;
|
||||
return proc_create("gpio", S_IRUGO, NULL, &gpio_proc_fops) != NULL;
|
||||
}
|
||||
|
||||
__initcall(register_proc);
|
||||
|
||||
+233
-259
File diff suppressed because it is too large
Load Diff
+27
-32
@@ -40,6 +40,7 @@
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/timer.h>
|
||||
@@ -53,7 +54,7 @@ MODULE_AUTHOR("Jesse Barnes <jbarnes@sgi.com>");
|
||||
MODULE_DESCRIPTION("/proc interface to IA-64 SAL features");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static int salinfo_read(char *page, char **start, off_t off, int count, int *eof, void *data);
|
||||
static const struct file_operations proc_salinfo_fops;
|
||||
|
||||
typedef struct {
|
||||
const char *name; /* name of the proc entry */
|
||||
@@ -65,7 +66,7 @@ typedef struct {
|
||||
* List {name,feature} pairs for every entry in /proc/sal/<feature>
|
||||
* that this module exports
|
||||
*/
|
||||
static salinfo_entry_t salinfo_entries[]={
|
||||
static const salinfo_entry_t salinfo_entries[]={
|
||||
{ "bus_lock", IA64_SAL_PLATFORM_FEATURE_BUS_LOCK, },
|
||||
{ "irq_redirection", IA64_SAL_PLATFORM_FEATURE_IRQ_REDIR_HINT, },
|
||||
{ "ipi_redirection", IA64_SAL_PLATFORM_FEATURE_IPI_REDIR_HINT, },
|
||||
@@ -301,9 +302,7 @@ salinfo_event_open(struct inode *inode, struct file *file)
|
||||
static ssize_t
|
||||
salinfo_event_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
|
||||
{
|
||||
struct inode *inode = file_inode(file);
|
||||
struct proc_dir_entry *entry = PDE(inode);
|
||||
struct salinfo_data *data = entry->data;
|
||||
struct salinfo_data *data = PDE_DATA(file_inode(file));
|
||||
char cmd[32];
|
||||
size_t size;
|
||||
int i, n, cpu = -1;
|
||||
@@ -360,8 +359,7 @@ static const struct file_operations salinfo_event_fops = {
|
||||
static int
|
||||
salinfo_log_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct proc_dir_entry *entry = PDE(inode);
|
||||
struct salinfo_data *data = entry->data;
|
||||
struct salinfo_data *data = PDE_DATA(inode);
|
||||
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
@@ -386,8 +384,7 @@ salinfo_log_open(struct inode *inode, struct file *file)
|
||||
static int
|
||||
salinfo_log_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct proc_dir_entry *entry = PDE(inode);
|
||||
struct salinfo_data *data = entry->data;
|
||||
struct salinfo_data *data = PDE_DATA(inode);
|
||||
|
||||
if (data->state == STATE_NO_DATA) {
|
||||
vfree(data->log_buffer);
|
||||
@@ -463,9 +460,7 @@ retry:
|
||||
static ssize_t
|
||||
salinfo_log_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
|
||||
{
|
||||
struct inode *inode = file_inode(file);
|
||||
struct proc_dir_entry *entry = PDE(inode);
|
||||
struct salinfo_data *data = entry->data;
|
||||
struct salinfo_data *data = PDE_DATA(file_inode(file));
|
||||
u8 *buf;
|
||||
u64 bufsize;
|
||||
|
||||
@@ -524,9 +519,7 @@ salinfo_log_clear(struct salinfo_data *data, int cpu)
|
||||
static ssize_t
|
||||
salinfo_log_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
|
||||
{
|
||||
struct inode *inode = file_inode(file);
|
||||
struct proc_dir_entry *entry = PDE(inode);
|
||||
struct salinfo_data *data = entry->data;
|
||||
struct salinfo_data *data = PDE_DATA(file_inode(file));
|
||||
char cmd[32];
|
||||
size_t size;
|
||||
u32 offset;
|
||||
@@ -637,8 +630,9 @@ salinfo_init(void)
|
||||
|
||||
for (i=0; i < NR_SALINFO_ENTRIES; i++) {
|
||||
/* pass the feature bit in question as misc data */
|
||||
*sdir++ = create_proc_read_entry (salinfo_entries[i].name, 0, salinfo_dir,
|
||||
salinfo_read, (void *)salinfo_entries[i].feature);
|
||||
*sdir++ = proc_create_data(salinfo_entries[i].name, 0, salinfo_dir,
|
||||
&proc_salinfo_fops,
|
||||
(void *)salinfo_entries[i].feature);
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(salinfo_log_name); i++) {
|
||||
@@ -684,22 +678,23 @@ salinfo_init(void)
|
||||
* 'data' contains an integer that corresponds to the feature we're
|
||||
* testing
|
||||
*/
|
||||
static int
|
||||
salinfo_read(char *page, char **start, off_t off, int count, int *eof, void *data)
|
||||
static int proc_salinfo_show(struct seq_file *m, void *v)
|
||||
{
|
||||
int len = 0;
|
||||
|
||||
len = sprintf(page, (sal_platform_features & (unsigned long)data) ? "1\n" : "0\n");
|
||||
|
||||
if (len <= off+count) *eof = 1;
|
||||
|
||||
*start = page + off;
|
||||
len -= off;
|
||||
|
||||
if (len>count) len = count;
|
||||
if (len<0) len = 0;
|
||||
|
||||
return len;
|
||||
unsigned long data = (unsigned long)v;
|
||||
seq_puts(m, (sal_platform_features & data) ? "1\n" : "0\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int proc_salinfo_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, proc_salinfo_show, PDE_DATA(inode));
|
||||
}
|
||||
|
||||
static const struct file_operations proc_salinfo_fops = {
|
||||
.open = proc_salinfo_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = seq_release,
|
||||
};
|
||||
|
||||
module_init(salinfo_init);
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/nodemask.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/sn/sn_sal.h>
|
||||
@@ -101,18 +102,18 @@ get_fit_entry(unsigned long nasid, int index, unsigned long *fentry,
|
||||
/*
|
||||
* These two routines display the FIT table for each node.
|
||||
*/
|
||||
static int dump_fit_entry(char *page, unsigned long *fentry)
|
||||
static void dump_fit_entry(struct seq_file *m, unsigned long *fentry)
|
||||
{
|
||||
unsigned type;
|
||||
|
||||
type = FIT_TYPE(fentry[1]);
|
||||
return sprintf(page, "%02x %-25s %x.%02x %016lx %u\n",
|
||||
type,
|
||||
fit_type_name(type),
|
||||
FIT_MAJOR(fentry[1]), FIT_MINOR(fentry[1]),
|
||||
fentry[0],
|
||||
/* mult by sixteen to get size in bytes */
|
||||
(unsigned)(fentry[1] & 0xffffff) * 16);
|
||||
seq_printf(m, "%02x %-25s %x.%02x %016lx %u\n",
|
||||
type,
|
||||
fit_type_name(type),
|
||||
FIT_MAJOR(fentry[1]), FIT_MINOR(fentry[1]),
|
||||
fentry[0],
|
||||
/* mult by sixteen to get size in bytes */
|
||||
(unsigned)(fentry[1] & 0xffffff) * 16);
|
||||
}
|
||||
|
||||
|
||||
@@ -124,31 +125,39 @@ static int dump_fit_entry(char *page, unsigned long *fentry)
|
||||
* OK except for 4kB pages (and no one is going to do that on SN
|
||||
* anyway).
|
||||
*/
|
||||
static int
|
||||
dump_fit(char *page, unsigned long nasid)
|
||||
static int proc_fit_show(struct seq_file *m, void *v)
|
||||
{
|
||||
unsigned long nasid = (unsigned long)m->private;
|
||||
unsigned long fentry[2];
|
||||
int index;
|
||||
char *p;
|
||||
|
||||
p = page;
|
||||
for (index=0;;index++) {
|
||||
BUG_ON(index * 60 > PAGE_SIZE);
|
||||
if (get_fit_entry(nasid, index, fentry, NULL, 0))
|
||||
break;
|
||||
p += dump_fit_entry(p, fentry);
|
||||
dump_fit_entry(m, fentry);
|
||||
}
|
||||
|
||||
return p - page;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
dump_version(char *page, unsigned long nasid)
|
||||
static int proc_fit_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, proc_fit_show, PDE_DATA(inode));
|
||||
}
|
||||
|
||||
static const struct file_operations proc_fit_fops = {
|
||||
.open = proc_fit_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = seq_release,
|
||||
};
|
||||
|
||||
static int proc_version_show(struct seq_file *m, void *v)
|
||||
{
|
||||
unsigned long nasid = (unsigned long)m->private;
|
||||
unsigned long fentry[2];
|
||||
char banner[128];
|
||||
int index;
|
||||
int len;
|
||||
|
||||
for (index = 0; ; index++) {
|
||||
if (get_fit_entry(nasid, index, fentry, banner,
|
||||
@@ -158,56 +167,24 @@ dump_version(char *page, unsigned long nasid)
|
||||
break;
|
||||
}
|
||||
|
||||
len = sprintf(page, "%x.%02x\n", FIT_MAJOR(fentry[1]),
|
||||
FIT_MINOR(fentry[1]));
|
||||
page += len;
|
||||
seq_printf(m, "%x.%02x\n", FIT_MAJOR(fentry[1]), FIT_MINOR(fentry[1]));
|
||||
|
||||
if (banner[0])
|
||||
len += snprintf(page, PAGE_SIZE-len, "%s\n", banner);
|
||||
|
||||
return len;
|
||||
seq_printf(m, "%s\n", banner);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* same as in proc_misc.c */
|
||||
static int
|
||||
proc_calc_metrics(char *page, char **start, off_t off, int count, int *eof,
|
||||
int len)
|
||||
static int proc_version_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
if (len <= off + count)
|
||||
*eof = 1;
|
||||
*start = page + off;
|
||||
len -= off;
|
||||
if (len > count)
|
||||
len = count;
|
||||
if (len < 0)
|
||||
len = 0;
|
||||
return len;
|
||||
return single_open(file, proc_version_show, PDE_DATA(inode));
|
||||
}
|
||||
|
||||
static int
|
||||
read_version_entry(char *page, char **start, off_t off, int count, int *eof,
|
||||
void *data)
|
||||
{
|
||||
int len;
|
||||
|
||||
/* data holds the NASID of the node */
|
||||
len = dump_version(page, (unsigned long)data);
|
||||
len = proc_calc_metrics(page, start, off, count, eof, len);
|
||||
return len;
|
||||
}
|
||||
|
||||
static int
|
||||
read_fit_entry(char *page, char **start, off_t off, int count, int *eof,
|
||||
void *data)
|
||||
{
|
||||
int len;
|
||||
|
||||
/* data holds the NASID of the node */
|
||||
len = dump_fit(page, (unsigned long)data);
|
||||
len = proc_calc_metrics(page, start, off, count, eof, len);
|
||||
|
||||
return len;
|
||||
}
|
||||
static const struct file_operations proc_version_fops = {
|
||||
.open = proc_version_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = seq_release,
|
||||
};
|
||||
|
||||
/* module entry points */
|
||||
int __init prominfo_init(void);
|
||||
@@ -216,58 +193,39 @@ void __exit prominfo_exit(void);
|
||||
module_init(prominfo_init);
|
||||
module_exit(prominfo_exit);
|
||||
|
||||
static struct proc_dir_entry **proc_entries;
|
||||
static struct proc_dir_entry *sgi_prominfo_entry;
|
||||
|
||||
#define NODE_NAME_LEN 11
|
||||
|
||||
int __init prominfo_init(void)
|
||||
{
|
||||
struct proc_dir_entry **entp;
|
||||
struct proc_dir_entry *sgi_prominfo_entry;
|
||||
cnodeid_t cnodeid;
|
||||
unsigned long nasid;
|
||||
int size;
|
||||
char name[NODE_NAME_LEN];
|
||||
|
||||
if (!ia64_platform_is("sn2"))
|
||||
return 0;
|
||||
|
||||
size = num_online_nodes() * sizeof(struct proc_dir_entry *);
|
||||
proc_entries = kzalloc(size, GFP_KERNEL);
|
||||
if (!proc_entries)
|
||||
sgi_prominfo_entry = proc_mkdir("sgi_prominfo", NULL);
|
||||
if (!sgi_prominfo_entry)
|
||||
return -ENOMEM;
|
||||
|
||||
sgi_prominfo_entry = proc_mkdir("sgi_prominfo", NULL);
|
||||
|
||||
entp = proc_entries;
|
||||
for_each_online_node(cnodeid) {
|
||||
sprintf(name, "node%d", cnodeid);
|
||||
*entp = proc_mkdir(name, sgi_prominfo_entry);
|
||||
nasid = cnodeid_to_nasid(cnodeid);
|
||||
create_proc_read_entry("fit", 0, *entp, read_fit_entry,
|
||||
(void *)nasid);
|
||||
create_proc_read_entry("version", 0, *entp,
|
||||
read_version_entry, (void *)nasid);
|
||||
entp++;
|
||||
}
|
||||
struct proc_dir_entry *dir;
|
||||
unsigned long nasid;
|
||||
char name[NODE_NAME_LEN];
|
||||
|
||||
sprintf(name, "node%d", cnodeid);
|
||||
dir = proc_mkdir(name, sgi_prominfo_entry);
|
||||
if (!dir)
|
||||
continue;
|
||||
nasid = cnodeid_to_nasid(cnodeid);
|
||||
proc_create_data("fit", 0, dir,
|
||||
&proc_fit_fops, (void *)nasid);
|
||||
proc_create_data("version", 0, dir,
|
||||
&proc_version_fops, (void *)nasid);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __exit prominfo_exit(void)
|
||||
{
|
||||
struct proc_dir_entry **entp;
|
||||
unsigned int cnodeid;
|
||||
char name[NODE_NAME_LEN];
|
||||
|
||||
entp = proc_entries;
|
||||
for_each_online_node(cnodeid) {
|
||||
remove_proc_entry("fit", *entp);
|
||||
remove_proc_entry("version", *entp);
|
||||
sprintf(name, "node%d", cnodeid);
|
||||
remove_proc_entry(name, sgi_prominfo_entry);
|
||||
entp++;
|
||||
}
|
||||
remove_proc_entry("sgi_prominfo", NULL);
|
||||
kfree(proc_entries);
|
||||
remove_proc_subtree("sgi_prominfo", NULL);
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
|
||||
#include <asm/smtc_proc.h>
|
||||
|
||||
@@ -30,51 +31,39 @@ unsigned long selfipis[NR_CPUS];
|
||||
|
||||
struct smtc_cpu_proc smtc_cpu_stats[NR_CPUS];
|
||||
|
||||
static struct proc_dir_entry *smtc_stats;
|
||||
|
||||
atomic_t smtc_fpu_recoveries;
|
||||
|
||||
static int proc_read_smtc(char *page, char **start, off_t off,
|
||||
int count, int *eof, void *data)
|
||||
static int smtc_proc_show(struct seq_file *m, void *v)
|
||||
{
|
||||
int totalen = 0;
|
||||
int len;
|
||||
int i;
|
||||
extern unsigned long ebase;
|
||||
|
||||
len = sprintf(page, "SMTC Status Word: 0x%08x\n", smtc_status);
|
||||
totalen += len;
|
||||
page += len;
|
||||
len = sprintf(page, "Config7: 0x%08x\n", read_c0_config7());
|
||||
totalen += len;
|
||||
page += len;
|
||||
len = sprintf(page, "EBASE: 0x%08lx\n", ebase);
|
||||
totalen += len;
|
||||
page += len;
|
||||
len = sprintf(page, "Counter Interrupts taken per CPU (TC)\n");
|
||||
totalen += len;
|
||||
page += len;
|
||||
for (i=0; i < NR_CPUS; i++) {
|
||||
len = sprintf(page, "%d: %ld\n", i, smtc_cpu_stats[i].timerints);
|
||||
totalen += len;
|
||||
page += len;
|
||||
}
|
||||
len = sprintf(page, "Self-IPIs by CPU:\n");
|
||||
totalen += len;
|
||||
page += len;
|
||||
for(i = 0; i < NR_CPUS; i++) {
|
||||
len = sprintf(page, "%d: %ld\n", i, smtc_cpu_stats[i].selfipis);
|
||||
totalen += len;
|
||||
page += len;
|
||||
}
|
||||
len = sprintf(page, "%d Recoveries of \"stolen\" FPU\n",
|
||||
atomic_read(&smtc_fpu_recoveries));
|
||||
totalen += len;
|
||||
page += len;
|
||||
|
||||
return totalen;
|
||||
seq_printf(m, "SMTC Status Word: 0x%08x\n", smtc_status);
|
||||
seq_printf(m, "Config7: 0x%08x\n", read_c0_config7());
|
||||
seq_printf(m, "EBASE: 0x%08lx\n", ebase);
|
||||
seq_printf(m, "Counter Interrupts taken per CPU (TC)\n");
|
||||
for (i=0; i < NR_CPUS; i++)
|
||||
seq_printf(m, "%d: %ld\n", i, smtc_cpu_stats[i].timerints);
|
||||
seq_printf(m, "Self-IPIs by CPU:\n");
|
||||
for(i = 0; i < NR_CPUS; i++)
|
||||
seq_printf(m, "%d: %ld\n", i, smtc_cpu_stats[i].selfipis);
|
||||
seq_printf(m, "%d Recoveries of \"stolen\" FPU\n",
|
||||
atomic_read(&smtc_fpu_recoveries));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int smtc_proc_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, smtc_proc_show, NULL);
|
||||
}
|
||||
|
||||
static const struct file_operations smtc_proc_fops = {
|
||||
.open = smtc_proc_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = seq_release,
|
||||
};
|
||||
|
||||
void init_smtc_stats(void)
|
||||
{
|
||||
int i;
|
||||
@@ -86,6 +75,5 @@ void init_smtc_stats(void)
|
||||
|
||||
atomic_set(&smtc_fpu_recoveries, 0);
|
||||
|
||||
smtc_stats = create_proc_read_entry("smtc", 0444, NULL,
|
||||
proc_read_smtc, NULL);
|
||||
proc_create("smtc", 0444, NULL, &smtc_proc_fops);
|
||||
}
|
||||
|
||||
@@ -58,13 +58,13 @@ static int pvc_line_proc_show(struct seq_file *m, void *v)
|
||||
|
||||
static int pvc_line_proc_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, pvc_line_proc_show, PDE(inode)->data);
|
||||
return single_open(file, pvc_line_proc_show, PDE_DATA(inode));
|
||||
}
|
||||
|
||||
static ssize_t pvc_line_proc_write(struct file *file, const char __user *buf,
|
||||
size_t count, loff_t *pos)
|
||||
{
|
||||
int lineno = *(int *)PDE(file_inode(file))->data;
|
||||
int lineno = *(int *)PDE_DATA(file_inode(file));
|
||||
char kbuf[PVC_LINELEN];
|
||||
size_t len;
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include <linux/pfn.h>
|
||||
#include <linux/hardirq.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/kcore.h>
|
||||
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/bootinfo.h>
|
||||
|
||||
+43
-56
@@ -53,56 +53,51 @@ static void pci_proc_init(void);
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* FUNCTION: read_msp_pci_counts
|
||||
* FUNCTION: show_msp_pci_counts
|
||||
* _________________________________________________________________________
|
||||
*
|
||||
* DESCRIPTION: Prints the count of how many times each PCI
|
||||
* interrupt has asserted. Can be invoked by the
|
||||
* /proc filesystem.
|
||||
*
|
||||
* INPUTS: page - part of STDOUT calculation
|
||||
* off - part of STDOUT calculation
|
||||
* count - part of STDOUT calculation
|
||||
* data - unused
|
||||
* INPUTS: m - synthetic file construction data
|
||||
* v - iterator
|
||||
*
|
||||
* OUTPUTS: start - new start location
|
||||
* eof - end of file pointer
|
||||
*
|
||||
* RETURNS: len - STDOUT length
|
||||
* RETURNS: 0 or error
|
||||
*
|
||||
****************************************************************************/
|
||||
static int read_msp_pci_counts(char *page, char **start, off_t off,
|
||||
int count, int *eof, void *data)
|
||||
static int show_msp_pci_counts(struct seq_file *m, void *v)
|
||||
{
|
||||
int i;
|
||||
int len = 0;
|
||||
unsigned int intcount, total = 0;
|
||||
|
||||
for (i = 0; i < 32; ++i) {
|
||||
intcount = pci_int_count[i];
|
||||
if (intcount != 0) {
|
||||
len += sprintf(page + len, "[%d] = %u\n", i, intcount);
|
||||
seq_printf(m, "[%d] = %u\n", i, intcount);
|
||||
total += intcount;
|
||||
}
|
||||
}
|
||||
|
||||
len += sprintf(page + len, "total = %u\n", total);
|
||||
if (len <= off+count)
|
||||
*eof = 1;
|
||||
|
||||
*start = page + off;
|
||||
len -= off;
|
||||
if (len > count)
|
||||
len = count;
|
||||
if (len < 0)
|
||||
len = 0;
|
||||
|
||||
return len;
|
||||
seq_printf(m, "total = %u\n", total);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int msp_pci_rd_cnt_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, show_msp_pci_counts, NULL);
|
||||
}
|
||||
|
||||
static const struct file_operations msp_pci_rd_cnt_fops = {
|
||||
.open = msp_pci_rd_cnt_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = seq_release,
|
||||
};
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* FUNCTION: gen_pci_cfg_wr
|
||||
* FUNCTION: gen_pci_cfg_wr_show
|
||||
* _________________________________________________________________________
|
||||
*
|
||||
* DESCRIPTION: Generates a configuration write cycle for debug purposes.
|
||||
@@ -112,37 +107,30 @@ static int read_msp_pci_counts(char *page, char **start, off_t off,
|
||||
* PCI bus. Intent is that this function by invocable from
|
||||
* the /proc filesystem.
|
||||
*
|
||||
* INPUTS: page - part of STDOUT calculation
|
||||
* off - part of STDOUT calculation
|
||||
* count - part of STDOUT calculation
|
||||
* data - unused
|
||||
* INPUTS: m - synthetic file construction data
|
||||
* v - iterator
|
||||
*
|
||||
* OUTPUTS: start - new start location
|
||||
* eof - end of file pointer
|
||||
*
|
||||
* RETURNS: len - STDOUT length
|
||||
* RETURNS: 0 or error
|
||||
*
|
||||
****************************************************************************/
|
||||
static int gen_pci_cfg_wr(char *page, char **start, off_t off,
|
||||
int count, int *eof, void *data)
|
||||
static int gen_pci_cfg_wr_show(struct seq_file *m, void *v)
|
||||
{
|
||||
unsigned char where = 0; /* Write to static Device/Vendor ID */
|
||||
unsigned char bus_num = 0; /* Bus 0 */
|
||||
unsigned char dev_fn = 0xF; /* Arbitrary device number */
|
||||
u32 wr_data = 0xFF00AA00; /* Arbitrary data */
|
||||
struct msp_pci_regs *preg = (void *)PCI_BASE_REG;
|
||||
int len = 0;
|
||||
unsigned long value;
|
||||
int intr;
|
||||
|
||||
len += sprintf(page + len, "PMC MSP PCI: Beginning\n");
|
||||
seq_puts(m, "PMC MSP PCI: Beginning\n");
|
||||
|
||||
if (proc_init == 0) {
|
||||
pci_proc_init();
|
||||
proc_init = ~0;
|
||||
}
|
||||
|
||||
len += sprintf(page + len, "PMC MSP PCI: Before Cfg Wr\n");
|
||||
seq_puts(m, "PMC MSP PCI: Before Cfg Wr\n");
|
||||
|
||||
/*
|
||||
* Generate PCI Configuration Write Cycle
|
||||
@@ -168,21 +156,22 @@ static int gen_pci_cfg_wr(char *page, char **start, off_t off,
|
||||
*/
|
||||
intr = preg->if_status;
|
||||
|
||||
len += sprintf(page + len, "PMC MSP PCI: After Cfg Wr\n");
|
||||
|
||||
/* Handle STDOUT calculations */
|
||||
if (len <= off+count)
|
||||
*eof = 1;
|
||||
*start = page + off;
|
||||
len -= off;
|
||||
if (len > count)
|
||||
len = count;
|
||||
if (len < 0)
|
||||
len = 0;
|
||||
|
||||
return len;
|
||||
seq_puts(m, "PMC MSP PCI: After Cfg Wr\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int gen_pci_cfg_wr_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, gen_pci_cfg_wr_show, NULL);
|
||||
}
|
||||
|
||||
static const struct file_operations gen_pci_cfg_wr_fops = {
|
||||
.open = gen_pci_cfg_wr_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = seq_release,
|
||||
};
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* FUNCTION: pci_proc_init
|
||||
@@ -199,10 +188,8 @@ static int gen_pci_cfg_wr(char *page, char **start, off_t off,
|
||||
****************************************************************************/
|
||||
static void pci_proc_init(void)
|
||||
{
|
||||
create_proc_read_entry("pmc_msp_pci_rd_cnt", 0, NULL,
|
||||
read_msp_pci_counts, NULL);
|
||||
create_proc_read_entry("pmc_msp_pci_cfg_wr", 0, NULL,
|
||||
gen_pci_cfg_wr, NULL);
|
||||
proc_create("pmc_msp_pci_rd_cnt", 0, NULL, &msp_pci_rd_cnt_fops);
|
||||
proc_create("pmc_msp_pci_cfg_wr", 0, NULL, &gen_pci_cfg_wr_fops);
|
||||
}
|
||||
#endif /* CONFIG_PROC_FS && PCI_COUNTERS */
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
#include <asm/sibyte/sb1250.h>
|
||||
@@ -99,63 +100,60 @@ void check_bus_watcher(void)
|
||||
printk("Bus watcher indicates no error\n");
|
||||
}
|
||||
|
||||
static int bw_print_buffer(char *page, struct bw_stats_struct *stats)
|
||||
{
|
||||
int len;
|
||||
|
||||
len = sprintf(page, "SiByte Bus Watcher statistics\n");
|
||||
len += sprintf(page+len, "-----------------------------\n");
|
||||
len += sprintf(page+len, "L2-d-cor %8ld\nL2-d-bad %8ld\n",
|
||||
stats->l2_cor_d, stats->l2_bad_d);
|
||||
len += sprintf(page+len, "L2-t-cor %8ld\nL2-t-bad %8ld\n",
|
||||
stats->l2_cor_t, stats->l2_bad_t);
|
||||
len += sprintf(page+len, "MC-d-cor %8ld\nMC-d-bad %8ld\n",
|
||||
stats->mem_cor_d, stats->mem_bad_d);
|
||||
len += sprintf(page+len, "IO-err %8ld\n", stats->bus_error);
|
||||
len += sprintf(page+len, "\nLast recorded signature:\n");
|
||||
len += sprintf(page+len, "Request %02x from %d, answered by %d with Dcode %d\n",
|
||||
(unsigned int)(G_SCD_BERR_TID(stats->status) & 0x3f),
|
||||
(int)(G_SCD_BERR_TID(stats->status) >> 6),
|
||||
(int)G_SCD_BERR_RID(stats->status),
|
||||
(int)G_SCD_BERR_DCODE(stats->status));
|
||||
/* XXXKW indicate multiple errors between printings, or stats
|
||||
collection (or both)? */
|
||||
if (stats->status & M_SCD_BERR_MULTERRS)
|
||||
len += sprintf(page+len, "Multiple errors observed since last check.\n");
|
||||
if (stats->status_printed) {
|
||||
len += sprintf(page+len, "(no change since last printing)\n");
|
||||
} else {
|
||||
stats->status_printed = 1;
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
|
||||
/* For simplicity, I want to assume a single read is required each
|
||||
time */
|
||||
static int bw_read_proc(char *page, char **start, off_t off,
|
||||
int count, int *eof, void *data)
|
||||
static int bw_proc_show(struct seq_file *m, void *v)
|
||||
{
|
||||
int len;
|
||||
struct bw_stats_struct *stats = m->private;
|
||||
|
||||
if (off == 0) {
|
||||
len = bw_print_buffer(page, data);
|
||||
*start = page;
|
||||
seq_puts(m, "SiByte Bus Watcher statistics\n");
|
||||
seq_puts(m, "-----------------------------\n");
|
||||
seq_printf(m, "L2-d-cor %8ld\nL2-d-bad %8ld\n",
|
||||
stats->l2_cor_d, stats->l2_bad_d);
|
||||
seq_printf(m, "L2-t-cor %8ld\nL2-t-bad %8ld\n",
|
||||
stats->l2_cor_t, stats->l2_bad_t);
|
||||
seq_printf(m, "MC-d-cor %8ld\nMC-d-bad %8ld\n",
|
||||
stats->mem_cor_d, stats->mem_bad_d);
|
||||
seq_printf(m, "IO-err %8ld\n", stats->bus_error);
|
||||
seq_puts(m, "\nLast recorded signature:\n");
|
||||
seq_printf(m, "Request %02x from %d, answered by %d with Dcode %d\n",
|
||||
(unsigned int)(G_SCD_BERR_TID(stats->status) & 0x3f),
|
||||
(int)(G_SCD_BERR_TID(stats->status) >> 6),
|
||||
(int)G_SCD_BERR_RID(stats->status),
|
||||
(int)G_SCD_BERR_DCODE(stats->status));
|
||||
/* XXXKW indicate multiple errors between printings, or stats
|
||||
collection (or both)? */
|
||||
if (stats->status & M_SCD_BERR_MULTERRS)
|
||||
seq_puts(m, "Multiple errors observed since last check.\n");
|
||||
if (stats->status_printed) {
|
||||
seq_puts(m, "(no change since last printing)\n");
|
||||
} else {
|
||||
len = 0;
|
||||
*eof = 1;
|
||||
stats->status_printed = 1;
|
||||
}
|
||||
return len;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int bw_proc_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, bw_proc_show, PDE_DATA(inode));
|
||||
}
|
||||
|
||||
static const struct file_operations bw_proc_fops = {
|
||||
.open = bw_proc_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = seq_release,
|
||||
};
|
||||
|
||||
static void create_proc_decoder(struct bw_stats_struct *stats)
|
||||
{
|
||||
struct proc_dir_entry *ent;
|
||||
|
||||
ent = create_proc_read_entry("bus_watcher", S_IWUSR | S_IRUGO, NULL,
|
||||
bw_read_proc, stats);
|
||||
ent = proc_create_data("bus_watcher", S_IWUSR | S_IRUGO, NULL,
|
||||
&bw_proc_fops, stats);
|
||||
if (!ent) {
|
||||
printk(KERN_INFO "Unable to initialize bus_watcher /proc entry\n");
|
||||
return;
|
||||
@@ -210,11 +208,6 @@ static irqreturn_t sibyte_bw_int(int irq, void *data)
|
||||
stats->bus_error += G_SCD_MEM_BUSERR(cntr);
|
||||
csr_out32(0, IOADDR(A_BUS_MEM_IO_ERRORS));
|
||||
|
||||
#ifndef CONFIG_PROC_FS
|
||||
bw_print_buffer(bw_buf, stats);
|
||||
printk(bw_buf);
|
||||
#endif
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
||||
@@ -30,11 +30,13 @@
|
||||
#endif
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/cache.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
|
||||
#include <asm/pdc_chassis.h>
|
||||
#include <asm/processor.h>
|
||||
@@ -244,38 +246,38 @@ int pdc_chassis_send_status(int message)
|
||||
|
||||
#ifdef CONFIG_PDC_CHASSIS_WARN
|
||||
#ifdef CONFIG_PROC_FS
|
||||
static int pdc_chassis_warn_pread(char *page, char **start, off_t off,
|
||||
int count, int *eof, void *data)
|
||||
static int pdc_chassis_warn_show(struct seq_file *m, void *v)
|
||||
{
|
||||
char *out = page;
|
||||
int len, ret;
|
||||
unsigned long warn;
|
||||
u32 warnreg;
|
||||
|
||||
ret = pdc_chassis_warn(&warn);
|
||||
if (ret != PDC_OK)
|
||||
if (pdc_chassis_warn(&warn) != PDC_OK)
|
||||
return -EIO;
|
||||
|
||||
warnreg = (warn & 0xFFFFFFFF);
|
||||
|
||||
if ((warnreg >> 24) & 0xFF)
|
||||
out += sprintf(out, "Chassis component failure! (eg fan or PSU): 0x%.2x\n", ((warnreg >> 24) & 0xFF));
|
||||
seq_printf(m, "Chassis component failure! (eg fan or PSU): 0x%.2x\n",
|
||||
(warnreg >> 24) & 0xFF);
|
||||
|
||||
out += sprintf(out, "Battery: %s\n", (warnreg & 0x04) ? "Low!" : "OK");
|
||||
out += sprintf(out, "Temp low: %s\n", (warnreg & 0x02) ? "Exceeded!" : "OK");
|
||||
out += sprintf(out, "Temp mid: %s\n", (warnreg & 0x01) ? "Exceeded!" : "OK");
|
||||
|
||||
len = out - page - off;
|
||||
if (len < count) {
|
||||
*eof = 1;
|
||||
if (len <= 0) return 0;
|
||||
} else {
|
||||
len = count;
|
||||
}
|
||||
*start = page + off;
|
||||
return len;
|
||||
seq_printf(m, "Battery: %s\n", (warnreg & 0x04) ? "Low!" : "OK");
|
||||
seq_printf(m, "Temp low: %s\n", (warnreg & 0x02) ? "Exceeded!" : "OK");
|
||||
seq_printf(m, "Temp mid: %s\n", (warnreg & 0x01) ? "Exceeded!" : "OK");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pdc_chassis_warn_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, pdc_chassis_warn_show, NULL);
|
||||
}
|
||||
|
||||
static const struct file_operations pdc_chassis_warn_fops = {
|
||||
.open = pdc_chassis_warn_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = seq_release,
|
||||
};
|
||||
|
||||
static int __init pdc_chassis_create_procfs(void)
|
||||
{
|
||||
unsigned long test;
|
||||
@@ -290,8 +292,7 @@ static int __init pdc_chassis_create_procfs(void)
|
||||
|
||||
printk(KERN_INFO "Enabling PDC chassis warnings support v%s\n",
|
||||
PDC_CHASSIS_VER);
|
||||
create_proc_read_entry("chassis", 0400, NULL, pdc_chassis_warn_pread,
|
||||
NULL);
|
||||
proc_create("chassis", 0400, NULL, &pdc_chassis_warn_fops);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -41,8 +41,6 @@
|
||||
|
||||
/* #define LPARCFG_DEBUG */
|
||||
|
||||
static struct proc_dir_entry *proc_ppc64_lparcfg;
|
||||
|
||||
/*
|
||||
* Track sum of all purrs across all processors. This is used to further
|
||||
* calculate usage values by different applications
|
||||
@@ -688,27 +686,22 @@ static const struct file_operations lparcfg_fops = {
|
||||
|
||||
static int __init lparcfg_init(void)
|
||||
{
|
||||
struct proc_dir_entry *ent;
|
||||
umode_t mode = S_IRUSR | S_IRGRP | S_IROTH;
|
||||
|
||||
/* Allow writing if we have FW_FEATURE_SPLPAR */
|
||||
if (firmware_has_feature(FW_FEATURE_SPLPAR))
|
||||
mode |= S_IWUSR;
|
||||
|
||||
ent = proc_create("powerpc/lparcfg", mode, NULL, &lparcfg_fops);
|
||||
if (!ent) {
|
||||
if (!proc_create("powerpc/lparcfg", mode, NULL, &lparcfg_fops)) {
|
||||
printk(KERN_ERR "Failed to create powerpc/lparcfg\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
proc_ppc64_lparcfg = ent;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit lparcfg_cleanup(void)
|
||||
{
|
||||
if (proc_ppc64_lparcfg)
|
||||
remove_proc_entry("lparcfg", proc_ppc64_lparcfg->parent);
|
||||
remove_proc_subtree("powerpc/lparcfg", NULL);
|
||||
}
|
||||
|
||||
module_init(lparcfg_init);
|
||||
|
||||
@@ -32,8 +32,6 @@
|
||||
static loff_t page_map_seek( struct file *file, loff_t off, int whence)
|
||||
{
|
||||
loff_t new;
|
||||
struct proc_dir_entry *dp = PDE(file_inode(file));
|
||||
|
||||
switch(whence) {
|
||||
case 0:
|
||||
new = off;
|
||||
@@ -42,12 +40,12 @@ static loff_t page_map_seek( struct file *file, loff_t off, int whence)
|
||||
new = file->f_pos + off;
|
||||
break;
|
||||
case 2:
|
||||
new = dp->size + off;
|
||||
new = PAGE_SIZE + off;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
if ( new < 0 || new > dp->size )
|
||||
if ( new < 0 || new > PAGE_SIZE )
|
||||
return -EINVAL;
|
||||
return (file->f_pos = new);
|
||||
}
|
||||
@@ -55,19 +53,18 @@ static loff_t page_map_seek( struct file *file, loff_t off, int whence)
|
||||
static ssize_t page_map_read( struct file *file, char __user *buf, size_t nbytes,
|
||||
loff_t *ppos)
|
||||
{
|
||||
struct proc_dir_entry *dp = PDE(file_inode(file));
|
||||
return simple_read_from_buffer(buf, nbytes, ppos, dp->data, dp->size);
|
||||
return simple_read_from_buffer(buf, nbytes, ppos,
|
||||
PDE_DATA(file_inode(file)), PAGE_SIZE);
|
||||
}
|
||||
|
||||
static int page_map_mmap( struct file *file, struct vm_area_struct *vma )
|
||||
{
|
||||
struct proc_dir_entry *dp = PDE(file_inode(file));
|
||||
|
||||
if ((vma->vm_end - vma->vm_start) > dp->size)
|
||||
if ((vma->vm_end - vma->vm_start) > PAGE_SIZE)
|
||||
return -EINVAL;
|
||||
|
||||
remap_pfn_range(vma, vma->vm_start, __pa(dp->data) >> PAGE_SHIFT,
|
||||
dp->size, vma->vm_page_prot);
|
||||
remap_pfn_range(vma, vma->vm_start,
|
||||
__pa(PDE_DATA(file_inode(file))) >> PAGE_SHIFT,
|
||||
PAGE_SIZE, vma->vm_page_prot);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -86,7 +83,7 @@ static int __init proc_ppc64_init(void)
|
||||
&page_map_fops, vdso_data);
|
||||
if (!pde)
|
||||
return 1;
|
||||
pde->size = PAGE_SIZE;
|
||||
proc_set_size(pde, PAGE_SIZE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user