forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
oprofile, s390: Enhance OProfile to support System zs hardware sampli…
…ng feature OProfile is enhanced to export all files for controlling System z's hardware sampling, and to invoke hwsampler exported functions to initialize and use System z's hardware sampling. The patch invokes hwsampler_setup() during oprofile init and exports following hwsampler files under oprofilefs if hwsampler's setup succeeded: A new directory for hardware sampling based files /dev/oprofile/hwsampling/ The userland daemon must explicitly write to the following files to disable (or enable) hardware based sampling /dev/oprofile/hwsampling/hwsampler to modify the actual sampling rate /dev/oprofile/hwsampling/hw_interval to modify the amount of sampling memory (measured in 4K pages) /dev/oprofile/hwsampling/hw_sdbt_blocks The following files are read only and show the possible minimum sampling rate /dev/oprofile/hwsampling/hw_min_interval the possible maximum sampling rate /dev/oprofile/hwsampling/hw_max_interval The patch splits the oprofile_timer_[init/exit] function so that it can be also called through user context (oprofilefs) to avoid kernel oops. Applied with following changes: * whitespace changes in Makefile and timer_int.c Signed-off-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com> Signed-off-by: Maran Pakkirisamy <maranp@linux.vnet.ibm.com> Signed-off-by: Heinz Graalfs <graalfs@linux.vnet.ibm.com> Acked-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Robert Richter <robert.richter@amd.com>
- Loading branch information
Heinz Graalfs
authored and
Robert Richter
committed
Feb 15, 2011
1 parent
ec6a3df
commit 997dbb4
Showing
7 changed files
with
220 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,146 @@ | ||
/** | ||
* arch/s390/oprofile/hwsampler_files.c | ||
* | ||
* Copyright IBM Corp. 2010 | ||
* Author: Mahesh Salgaonkar (mahesh@linux.vnet.ibm.com) | ||
*/ | ||
#include <linux/oprofile.h> | ||
#include <linux/errno.h> | ||
#include <linux/fs.h> | ||
|
||
#include "hwsampler.h" | ||
|
||
#define DEFAULT_INTERVAL 4096 | ||
|
||
#define DEFAULT_SDBT_BLOCKS 1 | ||
#define DEFAULT_SDB_BLOCKS 511 | ||
|
||
static unsigned long oprofile_hw_interval = DEFAULT_INTERVAL; | ||
static unsigned long oprofile_min_interval; | ||
static unsigned long oprofile_max_interval; | ||
|
||
static unsigned long oprofile_sdbt_blocks = DEFAULT_SDBT_BLOCKS; | ||
static unsigned long oprofile_sdb_blocks = DEFAULT_SDB_BLOCKS; | ||
|
||
static unsigned long oprofile_hwsampler; | ||
|
||
static int oprofile_hwsampler_start(void) | ||
{ | ||
int retval; | ||
|
||
retval = hwsampler_allocate(oprofile_sdbt_blocks, oprofile_sdb_blocks); | ||
if (retval) | ||
return retval; | ||
|
||
retval = hwsampler_start_all(oprofile_hw_interval); | ||
if (retval) | ||
hwsampler_deallocate(); | ||
|
||
return retval; | ||
} | ||
|
||
static void oprofile_hwsampler_stop(void) | ||
{ | ||
hwsampler_stop_all(); | ||
hwsampler_deallocate(); | ||
return; | ||
} | ||
|
||
int oprofile_arch_set_hwsampler(struct oprofile_operations *ops) | ||
{ | ||
printk(KERN_INFO "oprofile: using hardware sampling\n"); | ||
ops->start = oprofile_hwsampler_start; | ||
ops->stop = oprofile_hwsampler_stop; | ||
ops->cpu_type = "timer"; | ||
|
||
return 0; | ||
} | ||
|
||
static ssize_t hwsampler_read(struct file *file, char __user *buf, | ||
size_t count, loff_t *offset) | ||
{ | ||
return oprofilefs_ulong_to_user(oprofile_hwsampler, buf, count, offset); | ||
} | ||
|
||
static ssize_t hwsampler_write(struct file *file, char const __user *buf, | ||
size_t count, loff_t *offset) | ||
{ | ||
unsigned long val; | ||
int retval; | ||
|
||
if (*offset) | ||
return -EINVAL; | ||
|
||
retval = oprofilefs_ulong_from_user(&val, buf, count); | ||
if (retval) | ||
return retval; | ||
|
||
if (oprofile_hwsampler == val) | ||
return -EINVAL; | ||
|
||
retval = oprofile_set_hwsampler(val); | ||
|
||
if (retval) | ||
return retval; | ||
|
||
oprofile_hwsampler = val; | ||
return count; | ||
} | ||
|
||
static const struct file_operations hwsampler_fops = { | ||
.read = hwsampler_read, | ||
.write = hwsampler_write, | ||
}; | ||
|
||
static int oprofile_create_hwsampling_files(struct super_block *sb, | ||
struct dentry *root) | ||
{ | ||
struct dentry *hw_dir; | ||
|
||
/* reinitialize default values */ | ||
oprofile_hwsampler = 1; | ||
|
||
hw_dir = oprofilefs_mkdir(sb, root, "hwsampling"); | ||
if (!hw_dir) | ||
return -EINVAL; | ||
|
||
oprofilefs_create_file(sb, hw_dir, "hwsampler", &hwsampler_fops); | ||
oprofilefs_create_ulong(sb, hw_dir, "hw_interval", | ||
&oprofile_hw_interval); | ||
oprofilefs_create_ro_ulong(sb, hw_dir, "hw_min_interval", | ||
&oprofile_min_interval); | ||
oprofilefs_create_ro_ulong(sb, hw_dir, "hw_max_interval", | ||
&oprofile_max_interval); | ||
oprofilefs_create_ulong(sb, hw_dir, "hw_sdbt_blocks", | ||
&oprofile_sdbt_blocks); | ||
|
||
return 0; | ||
} | ||
|
||
int oprofile_hwsampler_init(struct oprofile_operations* ops) | ||
{ | ||
if (hwsampler_setup()) | ||
return -ENODEV; | ||
|
||
/* | ||
* create hwsampler files only if hwsampler_setup() succeeds. | ||
*/ | ||
ops->create_files = oprofile_create_hwsampling_files; | ||
oprofile_min_interval = hwsampler_query_min_interval(); | ||
if (oprofile_min_interval < 0) { | ||
oprofile_min_interval = 0; | ||
return -ENODEV; | ||
} | ||
oprofile_max_interval = hwsampler_query_max_interval(); | ||
if (oprofile_max_interval < 0) { | ||
oprofile_max_interval = 0; | ||
return -ENODEV; | ||
} | ||
oprofile_arch_set_hwsampler(ops); | ||
return 0; | ||
} | ||
|
||
void oprofile_hwsampler_exit(void) | ||
{ | ||
hwsampler_shutdown(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters