|
@@ -40,6 +40,7 @@ static DECLARE_WAIT_QUEUE_HEAD(sputrace_wait);
|
|
|
static ktime_t sputrace_start;
|
|
|
static unsigned long sputrace_head, sputrace_tail;
|
|
|
static struct sputrace *sputrace_log;
|
|
|
+static int sputrace_logging;
|
|
|
|
|
|
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)
|
|
|
{
|
|
|
+ int rc;
|
|
|
+
|
|
|
spin_lock(&sputrace_lock);
|
|
|
+ if (sputrace_logging) {
|
|
|
+ rc = -EBUSY;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ sputrace_logging = 1;
|
|
|
sputrace_head = sputrace_tail = 0;
|
|
|
sputrace_start = ktime_get();
|
|
|
+ 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;
|
|
|
}
|
|
|
|
|
|
static const struct file_operations sputrace_fops = {
|
|
|
- .owner = THIS_MODULE,
|
|
|
- .open = sputrace_open,
|
|
|
- .read = sputrace_read,
|
|
|
+ .owner = THIS_MODULE,
|
|
|
+ .open = sputrace_open,
|
|
|
+ .read = sputrace_read,
|
|
|
+ .release = sputrace_release,
|
|
|
};
|
|
|
|
|
|
static void sputrace_log_item(const char *name, struct spu_context *ctx,
|
|
|
struct spu *spu)
|
|
|
{
|
|
|
spin_lock(&sputrace_lock);
|
|
|
+
|
|
|
+ if (!sputrace_logging) {
|
|
|
+ spin_unlock(&sputrace_lock);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
if (sputrace_avail() > 1) {
|
|
|
struct sputrace *t = sputrace_log + sputrace_head;
|
|
|
|