]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blobdiff - src/patches/suse-2.6.27.31/patches.arch/ppc-spufs-03-sputrace-Only-enable-logging-on-open.patch
Reenabled linux-xen, added patches for Xen Kernel Version 2.6.27.31,
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.31 / patches.arch / ppc-spufs-03-sputrace-Only-enable-logging-on-open.patch
diff --git a/src/patches/suse-2.6.27.31/patches.arch/ppc-spufs-03-sputrace-Only-enable-logging-on-open.patch b/src/patches/suse-2.6.27.31/patches.arch/ppc-spufs-03-sputrace-Only-enable-logging-on-open.patch
new file mode 100644 (file)
index 0000000..abb460d
--- /dev/null
@@ -0,0 +1,83 @@
+Subject: Only enable logging on open(), prevent multiple openers
+From: Jeremy Kerr <jk@ozlabs.org>
+References: 447133 - LTC50070
+
+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>
+Signed-off-by: Olaf Hering <olh@suse.de>
+---
+ arch/powerpc/platforms/cell/spufs/sputrace.c |   32 ++++++++++++++++++++++++---
+ 1 file changed, 29 insertions(+), 3 deletions(-)
+
+--- a/arch/powerpc/platforms/cell/spufs/sputrace.c
++++ b/arch/powerpc/platforms/cell/spufs/sputrace.c
+@@ -40,6 +40,7 @@ static DECLARE_WAIT_QUEUE_HEAD(sputrace_
+ 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
+ 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;