a5598ca0d4
The issue is the SPU code is not holding the kernel mutex lock while adding samples to the kernel buffer. This patch creates per SPU buffers to hold the data. Data is added to the buffers from in interrupt context. The data is periodically pushed to the kernel buffer via a new Oprofile function oprofile_put_buff(). The oprofile_put_buff() function is called via a work queue enabling the funtion to acquire the mutex lock. The existing user controls for adjusting the per CPU buffer size is used to control the size of the per SPU buffers. Similarly, overflows of the SPU buffers are reported by incrementing the per CPU buffer stats. This eliminates the need to have architecture specific controls for the per SPU buffers which is not acceptable to the OProfile user tool maintainer. The export of the oprofile add_event_entry() is removed as it is no longer needed given this patch. Note, this patch has not addressed the issue of indexing arrays by the spu number. This still needs to be fixed as the spu numbering is not guarenteed to be 0 to max_num_spus-1. Signed-off-by: Carl Love <carll@us.ibm.com> Signed-off-by: Maynard Johnson <maynardj@us.ibm.com> Signed-off-by: Arnd Bergmann <arnd@arndb.de> Acked-by: Acked-by: Robert Richter <robert.richter@amd.com> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
40 lines
863 B
C
40 lines
863 B
C
/**
|
|
* @file event_buffer.h
|
|
*
|
|
* @remark Copyright 2002 OProfile authors
|
|
* @remark Read the file COPYING
|
|
*
|
|
* @author John Levon <levon@movementarian.org>
|
|
*/
|
|
|
|
#ifndef EVENT_BUFFER_H
|
|
#define EVENT_BUFFER_H
|
|
|
|
#include <linux/types.h>
|
|
#include <asm/mutex.h>
|
|
|
|
int alloc_event_buffer(void);
|
|
|
|
void free_event_buffer(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);
|
|
|
|
/* wake up the process sleeping on the event file */
|
|
void wake_up_buffer_waiter(void);
|
|
|
|
#define INVALID_COOKIE ~0UL
|
|
#define NO_COOKIE 0UL
|
|
|
|
extern const struct file_operations event_buffer_fops;
|
|
|
|
/* mutex between sync_cpu_buffers() and the
|
|
* file reading code.
|
|
*/
|
|
extern struct mutex buffer_mutex;
|
|
|
|
#endif /* EVENT_BUFFER_H */
|