Lines Matching full:remote

27 	struct trace_remote		*remote;  member
60 static bool trace_remote_loaded(struct trace_remote *remote) in trace_remote_loaded() argument
62 return !!remote->trace_buffer; in trace_remote_loaded()
65 static int trace_remote_load(struct trace_remote *remote) in trace_remote_load() argument
67 struct ring_buffer_remote *rb_remote = &remote->rb_remote; in trace_remote_load()
70 lockdep_assert_held(&remote->lock); in trace_remote_load()
72 if (trace_remote_loaded(remote)) in trace_remote_load()
75 desc = remote->cbs->load_trace_buffer(remote->trace_buffer_size, remote->priv); in trace_remote_load()
80 rb_remote->swap_reader_page = remote->cbs->swap_reader_page; in trace_remote_load()
81 rb_remote->priv = remote->priv; in trace_remote_load()
82 rb_remote->reset = remote->cbs->reset; in trace_remote_load()
83 remote->trace_buffer = ring_buffer_alloc_remote(rb_remote); in trace_remote_load()
84 if (!remote->trace_buffer) { in trace_remote_load()
85 remote->cbs->unload_trace_buffer(desc, remote->priv); in trace_remote_load()
89 remote->trace_buffer_desc = desc; in trace_remote_load()
94 static void trace_remote_try_unload(struct trace_remote *remote) in trace_remote_try_unload() argument
96 lockdep_assert_held(&remote->lock); in trace_remote_try_unload()
98 if (!trace_remote_loaded(remote)) in trace_remote_try_unload()
102 if (remote->nr_readers || remote->tracing_on) in trace_remote_try_unload()
106 if (!ring_buffer_empty(remote->trace_buffer)) in trace_remote_try_unload()
109 ring_buffer_free(remote->trace_buffer); in trace_remote_try_unload()
110 remote->trace_buffer = NULL; in trace_remote_try_unload()
111 remote->cbs->unload_trace_buffer(remote->trace_buffer_desc, remote->priv); in trace_remote_try_unload()
114 static int trace_remote_enable_tracing(struct trace_remote *remote) in trace_remote_enable_tracing() argument
118 lockdep_assert_held(&remote->lock); in trace_remote_enable_tracing()
120 if (remote->tracing_on) in trace_remote_enable_tracing()
123 ret = trace_remote_load(remote); in trace_remote_enable_tracing()
127 ret = remote->cbs->enable_tracing(true, remote->priv); in trace_remote_enable_tracing()
129 trace_remote_try_unload(remote); in trace_remote_enable_tracing()
133 remote->tracing_on = true; in trace_remote_enable_tracing()
138 static int trace_remote_disable_tracing(struct trace_remote *remote) in trace_remote_disable_tracing() argument
142 lockdep_assert_held(&remote->lock); in trace_remote_disable_tracing()
144 if (!remote->tracing_on) in trace_remote_disable_tracing()
147 ret = remote->cbs->enable_tracing(false, remote->priv); in trace_remote_disable_tracing()
151 ring_buffer_poll_remote(remote->trace_buffer, RING_BUFFER_ALL_CPUS); in trace_remote_disable_tracing()
152 remote->tracing_on = false; in trace_remote_disable_tracing()
153 trace_remote_try_unload(remote); in trace_remote_disable_tracing()
158 static void trace_remote_reset(struct trace_remote *remote, int cpu) in trace_remote_reset() argument
160 lockdep_assert_held(&remote->lock); in trace_remote_reset()
162 if (!trace_remote_loaded(remote)) in trace_remote_reset()
166 ring_buffer_reset(remote->trace_buffer); in trace_remote_reset()
168 ring_buffer_reset_cpu(remote->trace_buffer, cpu); in trace_remote_reset()
170 trace_remote_try_unload(remote); in trace_remote_reset()
177 struct trace_remote *remote = seq->private; in tracing_on_write() local
185 guard(mutex)(&remote->lock); in tracing_on_write()
187 ret = val ? trace_remote_enable_tracing(remote) : trace_remote_disable_tracing(remote); in tracing_on_write()
195 struct trace_remote *remote = s->private; in tracing_on_show() local
197 seq_printf(s, "%d\n", remote->tracing_on); in tracing_on_show()
207 struct trace_remote *remote = seq->private; in buffer_size_kb_write() local
219 guard(mutex)(&remote->lock); in buffer_size_kb_write()
221 if (trace_remote_loaded(remote)) in buffer_size_kb_write()
224 remote->trace_buffer_size = val; in buffer_size_kb_write()
231 struct trace_remote *remote = s->private; in buffer_size_kb_show() local
233 seq_printf(s, "%lu (%s)\n", remote->trace_buffer_size >> 10, in buffer_size_kb_show()
234 trace_remote_loaded(remote) ? "loaded" : "unloaded"); in buffer_size_kb_show()
240 static int trace_remote_get(struct trace_remote *remote, int cpu) in trace_remote_get() argument
244 if (remote->nr_readers == UINT_MAX) in trace_remote_get()
247 ret = trace_remote_load(remote); in trace_remote_get()
251 if (cpu != RING_BUFFER_ALL_CPUS && !remote->pcpu_reader_locks) { in trace_remote_get()
254 remote->pcpu_reader_locks = kcalloc(nr_cpu_ids, sizeof(*remote->pcpu_reader_locks), in trace_remote_get()
256 if (!remote->pcpu_reader_locks) { in trace_remote_get()
257 trace_remote_try_unload(remote); in trace_remote_get()
262 init_rwsem(&remote->pcpu_reader_locks[lock_cpu]); in trace_remote_get()
265 remote->nr_readers++; in trace_remote_get()
270 static void trace_remote_put(struct trace_remote *remote) in trace_remote_put() argument
272 if (WARN_ON(!remote->nr_readers)) in trace_remote_put()
275 remote->nr_readers--; in trace_remote_put()
276 if (remote->nr_readers) in trace_remote_put()
279 kfree(remote->pcpu_reader_locks); in trace_remote_put()
280 remote->pcpu_reader_locks = NULL; in trace_remote_put()
282 trace_remote_try_unload(remote); in trace_remote_put()
285 static bool trace_remote_has_cpu(struct trace_remote *remote, int cpu) in trace_remote_has_cpu() argument
290 return ring_buffer_poll_remote(remote->trace_buffer, cpu) == 0; in trace_remote_has_cpu()
299 ring_buffer_poll_remote(iter->remote->trace_buffer, iter->cpu); in __poll_remote()
301 msecs_to_jiffies(iter->remote->poll_ms)); in __poll_remote()
322 iter->rb_iter = ring_buffer_read_start(iter->remote->trace_buffer, cpu, GFP_KERNEL); in __alloc_ring_buffer_iter()
332 iter->rb_iters[cpu] = ring_buffer_read_start(iter->remote->trace_buffer, cpu, in __alloc_ring_buffer_iter()
336 if (!trace_remote_has_cpu(iter->remote, cpu)) in __alloc_ring_buffer_iter()
348 *trace_remote_iter(struct trace_remote *remote, int cpu, enum tri_type type) in trace_remote_iter() argument
353 lockdep_assert_held(&remote->lock); in trace_remote_iter()
355 if (type == TRI_NONCONSUMING && !trace_remote_loaded(remote)) in trace_remote_iter()
358 ret = trace_remote_get(remote, cpu); in trace_remote_iter()
362 if (!trace_remote_has_cpu(remote, cpu)) { in trace_remote_iter()
369 iter->remote = remote; in trace_remote_iter()
376 ring_buffer_poll_remote(remote->trace_buffer, cpu); in trace_remote_iter()
378 schedule_delayed_work(&iter->poll_work, msecs_to_jiffies(remote->poll_ms)); in trace_remote_iter()
394 trace_remote_put(remote); in trace_remote_iter()
401 struct trace_remote *remote; in trace_remote_iter_free() local
406 remote = iter->remote; in trace_remote_iter_free()
408 lockdep_assert_held(&remote->lock); in trace_remote_iter_free()
420 trace_remote_put(remote); in trace_remote_iter_free()
425 struct trace_remote *remote = iter->remote; in trace_remote_iter_read_start() local
430 down_write(&remote->reader_lock); in trace_remote_iter_read_start()
432 down_read(&remote->reader_lock); in trace_remote_iter_read_start()
438 * No need for the remote lock here, iter holds a reference on in trace_remote_iter_read_start()
439 * remote->nr_readers in trace_remote_iter_read_start()
443 if (WARN_ON_ONCE(!remote->pcpu_reader_locks)) in trace_remote_iter_read_start()
447 down_write(&remote->pcpu_reader_locks[cpu]); in trace_remote_iter_read_start()
449 down_read(&remote->pcpu_reader_locks[cpu]); in trace_remote_iter_read_start()
454 struct trace_remote *remote = iter->remote; in trace_remote_iter_read_finished() local
460 * No need for the remote lock here, iter holds a reference on in trace_remote_iter_read_finished()
461 * remote->nr_readers in trace_remote_iter_read_finished()
464 up_write(&remote->pcpu_reader_locks[cpu]); in trace_remote_iter_read_finished()
466 up_read(&remote->pcpu_reader_locks[cpu]); in trace_remote_iter_read_finished()
471 up_write(&remote->reader_lock); in trace_remote_iter_read_finished()
473 up_read(&remote->reader_lock); in trace_remote_iter_read_finished()
489 return ring_buffer_peek(iter->remote->trace_buffer, cpu, ts, lost_events); in __peek_event()
509 struct trace_buffer *trace_buffer = iter->remote->trace_buffer; in trace_remote_iter_read_event()
552 struct trace_buffer *trace_buffer = iter->remote->trace_buffer; in trace_remote_iter_move()
564 static struct remote_event *trace_remote_find_event(struct trace_remote *remote, unsigned short id);
582 evt = trace_remote_find_event(iter->remote, iter->evt->id); in trace_remote_iter_print_event()
593 struct trace_remote *remote = inode->i_private; in trace_pipe_open() local
597 guard(mutex)(&remote->lock); in trace_pipe_open()
599 iter = trace_remote_iter(remote, cpu, TRI_CONSUMING); in trace_pipe_open()
611 struct trace_remote *remote = iter->remote; in trace_pipe_release() local
613 guard(mutex)(&remote->lock); in trace_pipe_release()
623 struct trace_buffer *trace_buffer = iter->remote->trace_buffer; in trace_pipe_read()
732 struct trace_remote *remote = inode->i_private; in trace_open() local
740 guard(mutex)(&remote->lock); in trace_open()
742 iter = trace_remote_iter(remote, cpu, TRI_NONCONSUMING); in trace_open()
770 guard(mutex)(&iter->remote->lock); in trace_release()
780 struct trace_remote *remote = inode->i_private; in trace_write() local
783 guard(mutex)(&remote->lock); in trace_write()
785 trace_remote_reset(remote, cpu); in trace_write()
798 static int trace_remote_init_tracefs(const char *name, struct trace_remote *remote) in trace_remote_init_tracefs() argument
823 d = trace_create_file("tracing_on", TRACEFS_MODE_WRITE, remote_d, remote, &tracing_on_fops); in trace_remote_init_tracefs()
827 d = trace_create_file("buffer_size_kb", TRACEFS_MODE_WRITE, remote_d, remote, in trace_remote_init_tracefs()
832 d = trace_create_file("trace_pipe", TRACEFS_MODE_READ, remote_d, remote, &trace_pipe_fops); in trace_remote_init_tracefs()
836 d = trace_create_file("trace", TRACEFS_MODE_WRITE, remote_d, remote, &trace_fops); in trace_remote_init_tracefs()
858 d = trace_create_cpu_file("trace_pipe", TRACEFS_MODE_READ, cpu_d, remote, cpu, in trace_remote_init_tracefs()
863 d = trace_create_cpu_file("trace", TRACEFS_MODE_WRITE, cpu_d, remote, cpu, in trace_remote_init_tracefs()
869 remote->dentry = remote_d; in trace_remote_init_tracefs()
884 static int trace_remote_register_events(const char *remote_name, struct trace_remote *remote,
888 * trace_remote_register() - Register a Tracefs remote
889 * @name: Name of the remote, used for the Tracefs remotes/ directory.
890 * @cbs: Set of callbacks used to control the remote.
896 * A trace remote is an entity, outside of the kernel (most likely firmware or
900 * The registered remote will be found under the Tracefs directory
908 struct trace_remote *remote; in trace_remote_register() local
911 remote = kzalloc_obj(*remote); in trace_remote_register()
912 if (!remote) in trace_remote_register()
915 remote->cbs = cbs; in trace_remote_register()
916 remote->priv = priv; in trace_remote_register()
917 remote->trace_buffer_size = 7 << 10; in trace_remote_register()
918 remote->poll_ms = 100; in trace_remote_register()
919 mutex_init(&remote->lock); in trace_remote_register()
920 init_rwsem(&remote->reader_lock); in trace_remote_register()
922 if (trace_remote_init_tracefs(name, remote)) { in trace_remote_register()
923 kfree(remote); in trace_remote_register()
927 ret = trace_remote_register_events(name, remote, events, nr_events); in trace_remote_register()
929 pr_err("Failed to register events for trace remote '%s' (%d)\n", in trace_remote_register()
934 ret = cbs->init ? cbs->init(remote->dentry, priv) : 0; in trace_remote_register()
936 pr_err("Init failed for trace remote '%s' (%d)\n", name, ret); in trace_remote_register()
1024 trace_remote_enable_event(struct trace_remote *remote, struct remote_event *evt, bool enable) in trace_remote_enable_event() argument
1028 lockdep_assert_held(&remote->lock); in trace_remote_enable_event()
1033 ret = remote->cbs->enable_event(evt->id, enable, remote->priv); in trace_remote_enable_event()
1056 struct trace_remote *remote = evt->remote; in remote_event_enable_write() local
1064 guard(mutex)(&remote->lock); in remote_event_enable_write()
1066 ret = trace_remote_enable_event(remote, evt, enable); in remote_event_enable_write()
1140 struct trace_remote *remote = file_inode(filp)->i_private; in remote_events_dir_enable_write() local
1148 guard(mutex)(&remote->lock); in remote_events_dir_enable_write()
1150 for (i = 0; i < remote->nr_events; i++) { in remote_events_dir_enable_write()
1151 struct remote_event *evt = &remote->events[i]; in remote_events_dir_enable_write()
1154 eret = trace_remote_enable_event(remote, evt, enable); in remote_events_dir_enable_write()
1173 struct trace_remote *remote = file_inode(filp)->i_private; in remote_events_dir_enable_read() local
1178 guard(mutex)(&remote->lock); in remote_events_dir_enable_read()
1180 for (i = 0; i < remote->nr_events; i++) { in remote_events_dir_enable_read()
1181 struct remote_event *evt = &remote->events[i]; in remote_events_dir_enable_read()
1271 static int trace_remote_init_eventfs(const char *remote_name, struct trace_remote *remote, in trace_remote_init_eventfs() argument
1274 struct eventfs_inode *eventfs = remote->eventfs; in trace_remote_init_eventfs()
1302 eventfs = eventfs_create_events_dir("events", remote->dentry, dir_entries, in trace_remote_init_eventfs()
1303 ARRAY_SIZE(dir_entries), remote); in trace_remote_init_eventfs()
1315 remote->eventfs = eventfs; in trace_remote_init_eventfs()
1322 eventfs_remove_events_dir(remote->eventfs); in trace_remote_init_eventfs()
1323 remote->eventfs = NULL; in trace_remote_init_eventfs()
1331 static int trace_remote_attach_events(struct trace_remote *remote, struct remote_event *events, in trace_remote_attach_events() argument
1339 if (evt->remote) in trace_remote_attach_events()
1342 evt->remote = remote; in trace_remote_attach_events()
1349 remote->events = events; in trace_remote_attach_events()
1350 remote->nr_events = nr_events; in trace_remote_attach_events()
1355 static int trace_remote_register_events(const char *remote_name, struct trace_remote *remote, in trace_remote_register_events() argument
1360 ret = trace_remote_attach_events(remote, events, nr_events); in trace_remote_register_events()
1367 ret = trace_remote_init_eventfs(remote_name, remote, evt); in trace_remote_register_events()
1384 static struct remote_event *trace_remote_find_event(struct trace_remote *remote, unsigned short id) in trace_remote_find_event() argument
1386 return bsearch((const void *)(unsigned long)id, remote->events, remote->nr_events, in trace_remote_find_event()
1387 sizeof(*remote->events), __cmp_events); in trace_remote_find_event()