The seqfile iteration listing tracepoints operates on the probe list
directly, without going through the lttng_get_probe_list_head()
accessor which ensures that the lazy list of probes is moved to the
actual list of probes.
This causes an issue when loading a probe and then listing the
tracepoints when no tracing sessions are active: the last probe loaded
is missing from the listing.
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
void *tp_list_start(struct seq_file *m, loff_t *pos)
{
struct lttng_probe_desc *probe_desc;
void *tp_list_start(struct seq_file *m, loff_t *pos)
{
struct lttng_probe_desc *probe_desc;
+ struct list_head *probe_list;
int iter = 0, i;
lttng_lock_sessions();
int iter = 0, i;
lttng_lock_sessions();
- list_for_each_entry(probe_desc, &_probe_list, head) {
+ probe_list = lttng_get_probe_list_head();
+ list_for_each_entry(probe_desc, probe_list, head) {
for (i = 0; i < probe_desc->nr_events; i++) {
if (iter++ >= *pos)
return (void *) probe_desc->event_desc[i];
for (i = 0; i < probe_desc->nr_events; i++) {
if (iter++ >= *pos)
return (void *) probe_desc->event_desc[i];
void *tp_list_next(struct seq_file *m, void *p, loff_t *ppos)
{
struct lttng_probe_desc *probe_desc;
void *tp_list_next(struct seq_file *m, void *p, loff_t *ppos)
{
struct lttng_probe_desc *probe_desc;
+ struct list_head *probe_list;
int iter = 0, i;
(*ppos)++;
int iter = 0, i;
(*ppos)++;
- list_for_each_entry(probe_desc, &_probe_list, head) {
+ probe_list = lttng_get_probe_list_head();
+ list_for_each_entry(probe_desc, probe_list, head) {
for (i = 0; i < probe_desc->nr_events; i++) {
if (iter++ >= *ppos)
return (void *) probe_desc->event_desc[i];
for (i = 0; i < probe_desc->nr_events; i++) {
if (iter++ >= *ppos)
return (void *) probe_desc->event_desc[i];