aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2011-10-14 12:32:07 -0400
committerSteven Rostedt <rostedt@goodmis.org>2011-10-14 12:32:07 -0400
commit954cbf8b759dc8b7b372132e872ac8d695ce8f47 (patch)
treecf94b8e43233e98f0367c8f7496a203f8a5e2396
parente10a935438f282817f0fbe854b7006266a13ef1b (diff)
trace-cmd: Use splice to filter out rest of buffer
When the main thread tells the recorders that they are finished, have the recorders still use splice till all data is read that splice can handle (full page sizes only). Then use the read function for the rest. Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r--trace-recorder.c54
1 files changed, 40 insertions, 14 deletions
diff --git a/trace-recorder.c b/trace-recorder.c
index 2a754b9..e57ef9b 100644
--- a/trace-recorder.c
+++ b/trace-recorder.c
@@ -128,11 +128,39 @@ struct tracecmd_recorder *tracecmd_create_recorder(const char *file, int cpu)
128 return recorder; 128 return recorder;
129} 129}
130 130
131/*
132 * Returns -1 on error.
133 * or bytes of data read.
134 */
135static long splice_data(struct tracecmd_recorder *recorder)
136{
137 long ret;
138
139 ret = splice(recorder->trace_fd, NULL, recorder->brass[1], NULL,
140 recorder->page_size, 1 /* SPLICE_F_MOVE */);
141 if (ret < 0) {
142 warning("recorder error in splice input");
143 return -1;
144 }
145
146 ret = splice(recorder->brass[0], NULL, recorder->fd, NULL,
147 recorder->page_size, 3 /* and NON_BLOCK */);
148 if (ret < 0) {
149 if (errno != EAGAIN) {
150 warning("recorder error in splice output");
151 return -1;
152 }
153 ret = 0;
154 }
155
156 return ret;
157}
158
131int tracecmd_start_recording(struct tracecmd_recorder *recorder, unsigned long sleep) 159int tracecmd_start_recording(struct tracecmd_recorder *recorder, unsigned long sleep)
132{ 160{
133 struct timespec req; 161 struct timespec req;
134 char *buf[recorder->page_size]; 162 char *buf[recorder->page_size];
135 int ret; 163 long ret;
136 164
137 recorder->stop = 0; 165 recorder->stop = 0;
138 166
@@ -142,21 +170,19 @@ int tracecmd_start_recording(struct tracecmd_recorder *recorder, unsigned long s
142 req.tv_nsec = (sleep % 1000000) * 1000; 170 req.tv_nsec = (sleep % 1000000) * 1000;
143 nanosleep(&req, NULL); 171 nanosleep(&req, NULL);
144 } 172 }
145 173 ret = splice_data(recorder);
146 ret = splice(recorder->trace_fd, NULL, recorder->brass[1], NULL, 174 if (ret < 0)
147 recorder->page_size, 1 /* SPLICE_F_MOVE */); 175 return ret;
148 if (ret < 0) {
149 warning("recorder error in splice input");
150 return -1;
151 }
152 ret = splice(recorder->brass[0], NULL, recorder->fd, NULL,
153 recorder->page_size, 3 /* and NON_BLOCK */);
154 if (ret < 0 && errno != EAGAIN) {
155 warning("recorder error in splice output");
156 return -1;
157 }
158 } while (!recorder->stop); 176 } while (!recorder->stop);
159 177
178 /* Flush via splice first */
179 do {
180 ret = splice_data(recorder);
181 } while (ret > 0);
182
183 if (ret < 0)
184 return ret;
185
160 /* splice only reads full pages */ 186 /* splice only reads full pages */
161 do { 187 do {
162 ret = read(recorder->trace_fd, buf, recorder->page_size); 188 ret = read(recorder->trace_fd, buf, recorder->page_size);