tracing: Move pipe waiting code out of tracing_read_pipe().
authorEduard - Gabriel Munteanu <eduard.munteanu@linux360.ro>
Mon, 9 Feb 2009 06:15:55 +0000 (08:15 +0200)
committerSteven Rostedt <srostedt@redhat.com>
Mon, 9 Feb 2009 17:24:51 +0000 (12:24 -0500)
This moves the pipe waiting code from tracing_read_pipe() into
tracing_wait_pipe(), which is useful to implement other fops, like
splice_read.

Signed-off-by: Eduard - Gabriel Munteanu <eduard.munteanu@linux360.ro>
Signed-off-by: Steven Rostedt <srostedt@redhat.com>
kernel/trace/trace.c

index 9e29fdb0dfe569a49947610787c4cc270ae41859..11fde0ad9cb66e31fb29bb7f1d470df7b2be32b2 100644 (file)
@@ -2388,37 +2388,15 @@ tracing_poll_pipe(struct file *filp, poll_table *poll_table)
        }
 }
 
-/*
- * Consumer reader.
- */
-static ssize_t
-tracing_read_pipe(struct file *filp, char __user *ubuf,
-                 size_t cnt, loff_t *ppos)
+/* Must be called with trace_types_lock mutex held. */
+static int tracing_wait_pipe(struct file *filp)
 {
        struct trace_iterator *iter = filp->private_data;
-       ssize_t sret;
-
-       /* return any leftover data */
-       sret = trace_seq_to_user(&iter->seq, ubuf, cnt);
-       if (sret != -EBUSY)
-               return sret;
-
-       trace_seq_reset(&iter->seq);
 
-       mutex_lock(&trace_types_lock);
-       if (iter->trace->read) {
-               sret = iter->trace->read(iter, filp, ubuf, cnt, ppos);
-               if (sret)
-                       goto out;
-       }
-
-waitagain:
-       sret = 0;
        while (trace_empty(iter)) {
 
                if ((filp->f_flags & O_NONBLOCK)) {
-                       sret = -EAGAIN;
-                       goto out;
+                       return -EAGAIN;
                }
 
                /*
@@ -2443,12 +2421,11 @@ waitagain:
                iter->tr->waiter = NULL;
 
                if (signal_pending(current)) {
-                       sret = -EINTR;
-                       goto out;
+                       return -EINTR;
                }
 
                if (iter->trace != current_trace)
-                       goto out;
+                       return 0;
 
                /*
                 * We block until we read something and tracing is disabled.
@@ -2465,9 +2442,43 @@ waitagain:
                continue;
        }
 
+       return 1;
+}
+
+/*
+ * Consumer reader.
+ */
+static ssize_t
+tracing_read_pipe(struct file *filp, char __user *ubuf,
+                 size_t cnt, loff_t *ppos)
+{
+       struct trace_iterator *iter = filp->private_data;
+       ssize_t sret;
+
+       /* return any leftover data */
+       sret = trace_seq_to_user(&iter->seq, ubuf, cnt);
+       if (sret != -EBUSY)
+               return sret;
+
+       trace_seq_reset(&iter->seq);
+
+       mutex_lock(&trace_types_lock);
+       if (iter->trace->read) {
+               sret = iter->trace->read(iter, filp, ubuf, cnt, ppos);
+               if (sret)
+                       goto out;
+       }
+
+waitagain:
+       sret = tracing_wait_pipe(filp);
+       if (sret <= 0)
+               goto out;
+
        /* stop when tracing is finished */
-       if (trace_empty(iter))
+       if (trace_empty(iter)) {
+               sret = 0;
                goto out;
+       }
 
        if (cnt >= PAGE_SIZE)
                cnt = PAGE_SIZE - 1;