diff options
author | behlendo <behlendo@7e1ea52c-4ff2-0310-8f11-9dd32ca42a1c> | 2008-05-07 17:58:22 +0000 |
---|---|---|
committer | behlendo <behlendo@7e1ea52c-4ff2-0310-8f11-9dd32ca42a1c> | 2008-05-07 17:58:22 +0000 |
commit | 404992e31ab16e5d128f73c6d716952a4eda463f (patch) | |
tree | d58b7515c9c827aa5548c560a7c9429427533eba /modules | |
parent | 4f86a887d88ef2d28fb14a020f91e0cd8757ed21 (diff) |
- Relocate 'stats_per' in to proper /proc/sys/spl/mutex/ directory
- Shift to spinlock for mutex list addition and removal
git-svn-id: https://outreach.scidac.gov/svn/spl/trunk@98 7e1ea52c-4ff2-0310-8f11-9dd32ca42a1c
Diffstat (limited to 'modules')
-rw-r--r-- | modules/spl/spl-mutex.c | 23 | ||||
-rw-r--r-- | modules/spl/spl-proc.c | 76 |
2 files changed, 66 insertions, 33 deletions
diff --git a/modules/spl/spl-mutex.c b/modules/spl/spl-mutex.c index c6d83eb21..1eabda610 100644 --- a/modules/spl/spl-mutex.c +++ b/modules/spl/spl-mutex.c @@ -29,7 +29,7 @@ int mutex_spin_max = 100; #ifdef DEBUG_MUTEX int mutex_stats[MUTEX_STATS_SIZE] = { 0 }; -struct rw_semaphore mutex_stats_sem; +spinlock_t mutex_stats_lock; struct list_head mutex_stats_list; #endif @@ -88,17 +88,9 @@ __spl_mutex_init(kmutex_t *mp, char *name, int type, void *ibc) return; } - /* We may be called when there is a non-zero preempt_count or - * interrupts are disabled is which case we must not sleep. - */ - if (flags == KM_SLEEP) - down_write(&mutex_stats_sem); - else - while (!down_write_trylock(&mutex_stats_sem)); - + spin_lock(&mutex_stats_lock); list_add_tail(&mp->km_list, &mutex_stats_list); - - up_write(&mutex_stats_sem); + spin_unlock(&mutex_stats_lock); #endif } EXPORT_SYMBOL(__spl_mutex_init); @@ -110,12 +102,9 @@ __spl_mutex_destroy(kmutex_t *mp) ASSERT(mp->km_magic == KM_MAGIC); #ifdef DEBUG_MUTEX - /* We may be called when there is a non-zero preempt_count or - * interrupts are disabled is which case we must not sleep. - */ - while (!down_write_trylock(&mutex_stats_sem)); + spin_lock(&mutex_stats_lock); list_del_init(&mp->km_list); - up_write(&mutex_stats_sem); + spin_unlock(&mutex_stats_lock); kmem_free(mp->km_stats, sizeof(int) * MUTEX_STATS_SIZE); #endif @@ -261,7 +250,7 @@ spl_mutex_init(void) { ENTRY; #ifdef DEBUG_MUTEX - init_rwsem(&mutex_stats_sem); + spin_lock_init(&mutex_stats_lock); INIT_LIST_HEAD(&mutex_stats_list); #endif RETURN(0); diff --git a/modules/spl/spl-proc.c b/modules/spl/spl-proc.c index 61fb38532..1b9787a79 100644 --- a/modules/spl/spl-proc.c +++ b/modules/spl/spl-proc.c @@ -16,9 +16,20 @@ #define DEBUG_SUBSYSTEM S_PROC -static struct ctl_table_header *spl_header = NULL; +#ifdef DEBUG_KMEM static unsigned long table_min = 0; static unsigned long table_max = ~0; +#endif + +#ifdef CONFIG_SYSCTL +static struct ctl_table_header *spl_header = NULL; +static struct proc_dir_entry *proc_sys = NULL; +static struct proc_dir_entry *proc_sys_spl = NULL; +#ifdef DEBUG_MUTEX +static struct proc_dir_entry *proc_sys_spl_mutex = NULL; +static struct proc_dir_entry *proc_sys_spl_mutex_stats = NULL; +#endif +#endif #define CTL_SPL 0x87 #define CTL_SPL_DEBUG 0x88 @@ -426,7 +437,7 @@ mutex_seq_start(struct seq_file *f, loff_t *pos) loff_t n = *pos; ENTRY; - down_read(&mutex_stats_sem); + spin_lock(&mutex_stats_lock); if (!n) mutex_seq_show_headers(f); @@ -454,7 +465,7 @@ mutex_seq_next(struct seq_file *f, void *p, loff_t *pos) static void mutex_seq_stop(struct seq_file *f, void *v) { - up_read(&mutex_stats_sem); + spin_unlock(&mutex_stats_lock); } static struct seq_operations mutex_seq_ops = { @@ -719,9 +730,31 @@ static struct ctl_table spl_dir[] = { {0} }; +static int +proc_dir_entry_match(int len, const char *name, struct proc_dir_entry *de) +{ + if (de->namelen != len) + return 0; + + return !memcmp(name, de->name, len); +} + +static struct proc_dir_entry * +proc_dir_entry_find(struct proc_dir_entry *root, const char *str) +{ + struct proc_dir_entry *de; + + for (de = root->subdir; de; de = de->next) + if (proc_dir_entry_match(strlen(str), str, de)) + return de; + + return NULL; +} + int proc_init(void) { + int rc = 0; ENTRY; #ifdef CONFIG_SYSCTL @@ -729,20 +762,31 @@ proc_init(void) if (spl_header == NULL) RETURN(-EUNATCH); + proc_sys = proc_dir_entry_find(&proc_root, "sys"); + if (proc_sys == NULL) + GOTO(out, rc = -EUNATCH); + + proc_sys_spl = proc_dir_entry_find(proc_sys, "spl"); + if (proc_sys_spl == NULL) + GOTO(out, rc = -EUNATCH); + #ifdef DEBUG_MUTEX - { - struct proc_dir_entry *entry = create_proc_entry("mutex_stats", - 0444, NULL); - if (entry) { - entry->proc_fops = &proc_mutex_operations; - } else { - unregister_sysctl_table(spl_header); - RETURN(-EUNATCH); - } - } + proc_sys_spl_mutex = proc_dir_entry_find(proc_sys_spl, "mutex"); + if (proc_sys_spl_mutex == NULL) + GOTO(out, rc = -EUNATCH); + + proc_sys_spl_mutex_stats = create_proc_entry("stats_per", 0444, + proc_sys_spl_mutex); + if (proc_sys_spl_mutex_stats == NULL) + GOTO(out, rc = -EUNATCH); + + proc_sys_spl_mutex_stats->proc_fops = &proc_mutex_operations; #endif /* DEBUG_MUTEX */ -#endif - RETURN(0); + RETURN(rc); +out: + unregister_sysctl_table(spl_header); +#endif /* CONFIG_SYSCTL */ + RETURN(rc); } void @@ -752,7 +796,7 @@ proc_fini(void) #ifdef CONFIG_SYSCTL ASSERT(spl_header != NULL); - remove_proc_entry("mutex_stats", NULL); + remove_proc_entry("stats_per", proc_sys_spl_mutex); unregister_sysctl_table(spl_header); #endif EXIT; |