Commit baf39927 authored by Jeremy Kerr's avatar Jeremy Kerr

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: default avatarJeremy Kerr <jk@ozlabs.org>
parent 04ab5918
...@@ -40,6 +40,7 @@ static DECLARE_WAIT_QUEUE_HEAD(sputrace_wait); ...@@ -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,11 +110,29 @@ static ssize_t sputrace_read(struct file *file, char __user *buf, ...@@ -109,11 +110,29 @@ 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();
rc = 0;
out:
spin_unlock(&sputrace_lock); 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;
} }
...@@ -121,12 +140,19 @@ static const struct file_operations sputrace_fops = { ...@@ -121,12 +140,19 @@ 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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment