powerpc/spufs: sputrace: Only enable logging on open(), prevent multiple openers
Currently, sputrace will start logging to the event buffer before the log buffer has been open()ed. This results in a heap of "lost samples" warnings if the sputrace file hasn't yet been opened. Since the buffer is reset on open() anyway, there's no need to enable logging when no-one has opened the log. Because open clears the log, make it return EBUSY for mutliple open calls. Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
This commit is contained in:
parent
04ab591808
commit
baf399273f
@ -40,6 +40,7 @@ static DECLARE_WAIT_QUEUE_HEAD(sputrace_wait);
|
|||||||
static ktime_t sputrace_start;
|
static ktime_t sputrace_start;
|
||||||
static unsigned long sputrace_head, sputrace_tail;
|
static unsigned long sputrace_head, sputrace_tail;
|
||||||
static struct sputrace *sputrace_log;
|
static struct sputrace *sputrace_log;
|
||||||
|
static int sputrace_logging;
|
||||||
|
|
||||||
static int sputrace_used(void)
|
static int sputrace_used(void)
|
||||||
{
|
{
|
||||||
@ -109,24 +110,49 @@ static ssize_t sputrace_read(struct file *file, char __user *buf,
|
|||||||
|
|
||||||
static int sputrace_open(struct inode *inode, struct file *file)
|
static int sputrace_open(struct inode *inode, struct file *file)
|
||||||
{
|
{
|
||||||
|
int rc;
|
||||||
|
|
||||||
spin_lock(&sputrace_lock);
|
spin_lock(&sputrace_lock);
|
||||||
|
if (sputrace_logging) {
|
||||||
|
rc = -EBUSY;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
sputrace_logging = 1;
|
||||||
sputrace_head = sputrace_tail = 0;
|
sputrace_head = sputrace_tail = 0;
|
||||||
sputrace_start = ktime_get();
|
sputrace_start = ktime_get();
|
||||||
spin_unlock(&sputrace_lock);
|
rc = 0;
|
||||||
|
|
||||||
|
out:
|
||||||
|
spin_unlock(&sputrace_lock);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int sputrace_release(struct inode *inode, struct file *file)
|
||||||
|
{
|
||||||
|
spin_lock(&sputrace_lock);
|
||||||
|
sputrace_logging = 0;
|
||||||
|
spin_unlock(&sputrace_lock);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct file_operations sputrace_fops = {
|
static const struct file_operations sputrace_fops = {
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
.open = sputrace_open,
|
.open = sputrace_open,
|
||||||
.read = sputrace_read,
|
.read = sputrace_read,
|
||||||
|
.release = sputrace_release,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void sputrace_log_item(const char *name, struct spu_context *ctx,
|
static void sputrace_log_item(const char *name, struct spu_context *ctx,
|
||||||
struct spu *spu)
|
struct spu *spu)
|
||||||
{
|
{
|
||||||
spin_lock(&sputrace_lock);
|
spin_lock(&sputrace_lock);
|
||||||
|
|
||||||
|
if (!sputrace_logging) {
|
||||||
|
spin_unlock(&sputrace_lock);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (sputrace_avail() > 1) {
|
if (sputrace_avail() > 1) {
|
||||||
struct sputrace *t = sputrace_log + sputrace_head;
|
struct sputrace *t = sputrace_log + sputrace_head;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user