Merge branch 'for-2.6.23' of master.kernel.org:/pub/scm/linux/kernel/git/arnd/cell-2.6
* 'for-2.6.23' of master.kernel.org:/pub/scm/linux/kernel/git/arnd/cell-2.6: (37 commits) [CELL] spufs: rework list management and associated locking [CELL] oprofile: add support to OProfile for profiling CELL BE SPUs [CELL] oprofile: enable SPU switch notification to detect currently active SPU tasks [CELL] spu_base: locking cleanup [CELL] cell: indexing of SPUs based on firmware vicinity properties [CELL] spufs: integration of SPE affinity with the scheduller [CELL] cell: add placement computation for scheduling of affinity contexts [CELL] spufs: extension of spu_create to support affinity definition [CELL] cell: add hardcoded spu vicinity information for QS20 [CELL] cell: add vicinity information on spus [CELL] cell: add per BE structure with info about its SPUs [CELL] spufs: use find_first_bit() instead of sched_find_first_bit() [CELL] spufs: remove unused file argument from spufs_run_spu() [CELL] spufs: change decrementer restore timing [CELL] spufs: dont halt decrementer at restore step 47 [CELL] spufs: limit saving MFC_CNTL bits [CELL] spufs: fix read and write for decr_status file [CELL] spufs: fix decr_status meanings [CELL] spufs: remove needless context save/restore code [CELL] spufs: fix array size of channel index ...
This commit is contained in:
@@ -39,14 +39,16 @@ struct op_system_config {
|
||||
|
||||
/* Per-arch configuration */
|
||||
struct op_powerpc_model {
|
||||
void (*reg_setup) (struct op_counter_config *,
|
||||
int (*reg_setup) (struct op_counter_config *,
|
||||
struct op_system_config *,
|
||||
int num_counters);
|
||||
void (*cpu_setup) (struct op_counter_config *);
|
||||
void (*start) (struct op_counter_config *);
|
||||
void (*global_start) (struct op_counter_config *);
|
||||
int (*cpu_setup) (struct op_counter_config *);
|
||||
int (*start) (struct op_counter_config *);
|
||||
int (*global_start) (struct op_counter_config *);
|
||||
void (*stop) (void);
|
||||
void (*global_stop) (void);
|
||||
int (*sync_start)(void);
|
||||
int (*sync_stop)(void);
|
||||
void (*handle_interrupt) (struct pt_regs *,
|
||||
struct op_counter_config *);
|
||||
int num_counters;
|
||||
|
||||
@@ -55,13 +55,13 @@ typedef struct {
|
||||
struct pmi_handler {
|
||||
struct list_head node;
|
||||
u8 type;
|
||||
void (*handle_pmi_message) (struct of_device *, pmi_message_t);
|
||||
void (*handle_pmi_message) (pmi_message_t);
|
||||
};
|
||||
|
||||
void pmi_register_handler(struct of_device *, struct pmi_handler *);
|
||||
void pmi_unregister_handler(struct of_device *, struct pmi_handler *);
|
||||
int pmi_register_handler(struct pmi_handler *);
|
||||
void pmi_unregister_handler(struct pmi_handler *);
|
||||
|
||||
void pmi_send_message(struct of_device *, pmi_message_t);
|
||||
int pmi_send_message(pmi_message_t);
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _POWERPC_PMI_H */
|
||||
|
||||
+50
-12
@@ -107,10 +107,10 @@ struct spu_runqueue;
|
||||
struct device_node;
|
||||
|
||||
enum spu_utilization_state {
|
||||
SPU_UTIL_SYSTEM,
|
||||
SPU_UTIL_USER,
|
||||
SPU_UTIL_SYSTEM,
|
||||
SPU_UTIL_IOWAIT,
|
||||
SPU_UTIL_IDLE,
|
||||
SPU_UTIL_IDLE_LOADED,
|
||||
SPU_UTIL_MAX
|
||||
};
|
||||
|
||||
@@ -121,9 +121,9 @@ struct spu {
|
||||
unsigned long problem_phys;
|
||||
struct spu_problem __iomem *problem;
|
||||
struct spu_priv2 __iomem *priv2;
|
||||
struct list_head list;
|
||||
struct list_head sched_list;
|
||||
struct list_head cbe_list;
|
||||
struct list_head full_list;
|
||||
enum { SPU_FREE, SPU_USED } alloc_state;
|
||||
int number;
|
||||
unsigned int irqs[3];
|
||||
u32 node;
|
||||
@@ -137,6 +137,7 @@ struct spu {
|
||||
struct spu_runqueue *rq;
|
||||
unsigned long long timestamp;
|
||||
pid_t pid;
|
||||
pid_t tgid;
|
||||
int class_0_pending;
|
||||
spinlock_t register_lock;
|
||||
|
||||
@@ -165,11 +166,14 @@ struct spu {
|
||||
|
||||
struct sys_device sysdev;
|
||||
|
||||
int has_mem_affinity;
|
||||
struct list_head aff_list;
|
||||
|
||||
struct {
|
||||
/* protected by interrupt reentrancy */
|
||||
enum spu_utilization_state utilization_state;
|
||||
unsigned long tstamp; /* time of last ctx switch */
|
||||
unsigned long times[SPU_UTIL_MAX];
|
||||
enum spu_utilization_state util_state;
|
||||
unsigned long long tstamp;
|
||||
unsigned long long times[SPU_UTIL_MAX];
|
||||
unsigned long long vol_ctx_switch;
|
||||
unsigned long long invol_ctx_switch;
|
||||
unsigned long long min_flt;
|
||||
@@ -181,13 +185,29 @@ struct spu {
|
||||
} stats;
|
||||
};
|
||||
|
||||
struct spu *spu_alloc(void);
|
||||
struct spu *spu_alloc_node(int node);
|
||||
void spu_free(struct spu *spu);
|
||||
struct cbe_spu_info {
|
||||
struct mutex list_mutex;
|
||||
struct list_head spus;
|
||||
int n_spus;
|
||||
int nr_active;
|
||||
atomic_t reserved_spus;
|
||||
};
|
||||
|
||||
extern struct cbe_spu_info cbe_spu_info[];
|
||||
|
||||
void spu_init_channels(struct spu *spu);
|
||||
int spu_irq_class_0_bottom(struct spu *spu);
|
||||
int spu_irq_class_1_bottom(struct spu *spu);
|
||||
void spu_irq_setaffinity(struct spu *spu, int cpu);
|
||||
|
||||
#ifdef CONFIG_KEXEC
|
||||
void crash_register_spus(struct list_head *list);
|
||||
#else
|
||||
static inline void crash_register_spus(struct list_head *list)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
extern void spu_invalidate_slbs(struct spu *spu);
|
||||
extern void spu_associate_mm(struct spu *spu, struct mm_struct *mm);
|
||||
|
||||
@@ -195,6 +215,20 @@ extern void spu_associate_mm(struct spu *spu, struct mm_struct *mm);
|
||||
struct mm_struct;
|
||||
extern void spu_flush_all_slbs(struct mm_struct *mm);
|
||||
|
||||
/* This interface allows a profiler (e.g., OProfile) to store a ref
|
||||
* to spu context information that it creates. This caching technique
|
||||
* avoids the need to recreate this information after a save/restore operation.
|
||||
*
|
||||
* Assumes the caller has already incremented the ref count to
|
||||
* profile_info; then spu_context_destroy must call kref_put
|
||||
* on prof_info_kref.
|
||||
*/
|
||||
void spu_set_profile_private_kref(struct spu_context *ctx,
|
||||
struct kref *prof_info_kref,
|
||||
void ( * prof_info_release) (struct kref *kref));
|
||||
|
||||
void *spu_get_profile_private_kref(struct spu_context *ctx);
|
||||
|
||||
/* system callbacks from the SPU */
|
||||
struct spu_syscall_block {
|
||||
u64 nr_ret;
|
||||
@@ -206,7 +240,8 @@ extern long spu_sys_callback(struct spu_syscall_block *s);
|
||||
struct file;
|
||||
extern struct spufs_calls {
|
||||
asmlinkage long (*create_thread)(const char __user *name,
|
||||
unsigned int flags, mode_t mode);
|
||||
unsigned int flags, mode_t mode,
|
||||
struct file *neighbor);
|
||||
asmlinkage long (*spu_run)(struct file *filp, __u32 __user *unpc,
|
||||
__u32 __user *ustatus);
|
||||
struct module *owner;
|
||||
@@ -233,8 +268,10 @@ struct spu_coredump_calls {
|
||||
#define SPU_CREATE_GANG 0x0002
|
||||
#define SPU_CREATE_NOSCHED 0x0004
|
||||
#define SPU_CREATE_ISOLATE 0x0008
|
||||
#define SPU_CREATE_AFFINITY_SPU 0x0010
|
||||
#define SPU_CREATE_AFFINITY_MEM 0x0020
|
||||
|
||||
#define SPU_CREATE_FLAG_ALL 0x000f /* mask of all valid flags */
|
||||
#define SPU_CREATE_FLAG_ALL 0x003f /* mask of all valid flags */
|
||||
|
||||
|
||||
#ifdef CONFIG_SPU_FS_MODULE
|
||||
@@ -403,6 +440,7 @@ struct spu_priv2 {
|
||||
#define MFC_CNTL_RESUME_DMA_QUEUE (0ull << 0)
|
||||
#define MFC_CNTL_SUSPEND_DMA_QUEUE (1ull << 0)
|
||||
#define MFC_CNTL_SUSPEND_DMA_QUEUE_MASK (1ull << 0)
|
||||
#define MFC_CNTL_SUSPEND_MASK (1ull << 4)
|
||||
#define MFC_CNTL_NORMAL_DMA_QUEUE_OPERATION (0ull << 8)
|
||||
#define MFC_CNTL_SUSPEND_IN_PROGRESS (1ull << 8)
|
||||
#define MFC_CNTL_SUSPEND_COMPLETE (3ull << 8)
|
||||
|
||||
@@ -50,6 +50,12 @@
|
||||
#define SPU_STOPPED_STATUS_P_I 8
|
||||
#define SPU_STOPPED_STATUS_R 9
|
||||
|
||||
/*
|
||||
* Definitions for software decrementer status flag.
|
||||
*/
|
||||
#define SPU_DECR_STATUS_RUNNING 0x1
|
||||
#define SPU_DECR_STATUS_WRAPPED 0x2
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
/**
|
||||
* spu_reg128 - generic 128-bit register definition.
|
||||
@@ -63,7 +69,7 @@ struct spu_reg128 {
|
||||
* @gprs: Array of saved registers.
|
||||
* @fpcr: Saved floating point status control register.
|
||||
* @decr: Saved decrementer value.
|
||||
* @decr_status: Indicates decrementer run status.
|
||||
* @decr_status: Indicates software decrementer status flags.
|
||||
* @ppu_mb: Saved PPU mailbox data.
|
||||
* @ppuint_mb: Saved PPU interrupting mailbox data.
|
||||
* @tag_mask: Saved tag group mask.
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
|
||||
#ifdef CONFIG_PROFILING
|
||||
|
||||
#include <linux/dcache.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
struct dcookie_user;
|
||||
|
||||
@@ -20,7 +20,8 @@
|
||||
#define EM_PARISC 15 /* HPPA */
|
||||
#define EM_SPARC32PLUS 18 /* Sun's "v8plus" */
|
||||
#define EM_PPC 20 /* PowerPC */
|
||||
#define EM_PPC64 21 /* PowerPC64 */
|
||||
#define EM_PPC64 21 /* PowerPC64 */
|
||||
#define EM_SPU 23 /* Cell BE SPU */
|
||||
#define EM_SH 42 /* SuperH */
|
||||
#define EM_SPARCV9 43 /* SPARC v9 64-bit */
|
||||
#define EM_IA_64 50 /* HP/Intel IA-64 */
|
||||
|
||||
@@ -17,6 +17,26 @@
|
||||
#include <linux/spinlock.h>
|
||||
#include <asm/atomic.h>
|
||||
|
||||
/* Each escaped entry is prefixed by ESCAPE_CODE
|
||||
* then one of the following codes, then the
|
||||
* relevant data.
|
||||
* These #defines live in this file so that arch-specific
|
||||
* buffer sync'ing code can access them.
|
||||
*/
|
||||
#define ESCAPE_CODE ~0UL
|
||||
#define CTX_SWITCH_CODE 1
|
||||
#define CPU_SWITCH_CODE 2
|
||||
#define COOKIE_SWITCH_CODE 3
|
||||
#define KERNEL_ENTER_SWITCH_CODE 4
|
||||
#define KERNEL_EXIT_SWITCH_CODE 5
|
||||
#define MODULE_LOADED_CODE 6
|
||||
#define CTX_TGID_CODE 7
|
||||
#define TRACE_BEGIN_CODE 8
|
||||
#define TRACE_END_CODE 9
|
||||
#define XEN_ENTER_SWITCH_CODE 10
|
||||
#define SPU_PROFILING_CODE 11
|
||||
#define SPU_CTX_SWITCH_CODE 12
|
||||
|
||||
struct super_block;
|
||||
struct dentry;
|
||||
struct file_operations;
|
||||
@@ -35,6 +55,14 @@ struct oprofile_operations {
|
||||
int (*start)(void);
|
||||
/* Stop delivering interrupts. */
|
||||
void (*stop)(void);
|
||||
/* Arch-specific buffer sync functions.
|
||||
* Return value = 0: Success
|
||||
* Return value = -1: Failure
|
||||
* Return value = 1: Run generic sync function
|
||||
*/
|
||||
int (*sync_start)(void);
|
||||
int (*sync_stop)(void);
|
||||
|
||||
/* Initiate a stack backtrace. Optional. */
|
||||
void (*backtrace)(struct pt_regs * const regs, unsigned int depth);
|
||||
/* CPU identification string. */
|
||||
@@ -55,6 +83,13 @@ int oprofile_arch_init(struct oprofile_operations * ops);
|
||||
*/
|
||||
void oprofile_arch_exit(void);
|
||||
|
||||
/**
|
||||
* Add data to the event buffer.
|
||||
* The data passed is free-form, but typically consists of
|
||||
* file offsets, dcookies, context information, and ESCAPE codes.
|
||||
*/
|
||||
void add_event_entry(unsigned long data);
|
||||
|
||||
/**
|
||||
* Add a sample. This may be called from any context. Pass
|
||||
* smp_processor_id() as cpu.
|
||||
|
||||
@@ -549,7 +549,7 @@ asmlinkage long sys_inotify_rm_watch(int fd, u32 wd);
|
||||
asmlinkage long sys_spu_run(int fd, __u32 __user *unpc,
|
||||
__u32 __user *ustatus);
|
||||
asmlinkage long sys_spu_create(const char __user *name,
|
||||
unsigned int flags, mode_t mode);
|
||||
unsigned int flags, mode_t mode, int fd);
|
||||
|
||||
asmlinkage long sys_mknodat(int dfd, const char __user * filename, int mode,
|
||||
unsigned dev);
|
||||
|
||||
Reference in New Issue
Block a user