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)
 {
 
 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;