@@ -5599,6 +5599,7 @@ static void hist_trigger_show(struct seq_file *m,
struct hist_file_data {
struct file *file;
u64 last_read;
+ u64 last_act;
};
static u64 get_hist_hit_count(struct trace_event_file *event_file)
@@ -5636,6 +5637,11 @@ static int hist_show(struct seq_file *m, void *v)
hist_trigger_show(m, data, n++);
}
hist_file->last_read = get_hist_hit_count(event_file);
+ /*
+ * Update last_act too so that poll()/POLLPRI can wait for the next
+ * event after any syscall on hist file.
+ */
+ hist_file->last_act = hist_file->last_read;
out_unlock:
mutex_unlock(&event_mutex);
@@ -5649,6 +5655,7 @@ static __poll_t event_hist_poll(struct file *file, struct poll_table_struct *wai
struct seq_file *m = file->private_data;
struct hist_file_data *hist_file = m->private;
__poll_t ret = 0;
+ u64 cnt;
mutex_lock(&event_mutex);
@@ -5660,8 +5667,13 @@ static __poll_t event_hist_poll(struct file *file, struct poll_table_struct *wai
poll_wait(file, &event_file->hist_wq, wait);
- if (hist_file->last_read != get_hist_hit_count(event_file))
- ret = EPOLLIN | EPOLLRDNORM;
+ cnt = get_hist_hit_count(event_file);
+ if (hist_file->last_read != cnt)
+ ret |= EPOLLIN | EPOLLRDNORM;
+ if (hist_file->last_act != cnt) {
+ hist_file->last_act = cnt;
+ ret |= EPOLLPRI;
+ }
out_unlock:
mutex_unlock(&event_mutex);
@@ -5680,6 +5692,7 @@ static int event_hist_release(struct inode *inode, struct file *file)
static int event_hist_open(struct inode *inode, struct file *file)
{
+ struct trace_event_file *event_file;
struct hist_file_data *hist_file;
int ret;
@@ -5690,13 +5703,25 @@ static int event_hist_open(struct inode *inode, struct file *file)
hist_file = kzalloc(sizeof(*hist_file), GFP_KERNEL);
if (!hist_file)
return -ENOMEM;
+
+ mutex_lock(&event_mutex);
+ event_file = event_file_data(file);
+ if (!event_file) {
+ ret = -ENODEV;
+ goto out_unlock;
+ }
+
hist_file->file = file;
+ hist_file->last_act = get_hist_hit_count(event_file);
/* Clear private_data to avoid warning in single_open() */
file->private_data = NULL;
ret = single_open(file, hist_show, hist_file);
+
+out_unlock:
if (ret)
kfree(hist_file);
+ mutex_unlock(&event_mutex);
return ret;
}