[PATCH 1/9] relay
Chris Wilson
chris at chris-wilson.co.uk
Tue Aug 14 20:31:53 UTC 2018
---
kernel/relay.c | 24 +++++++++++++-----------
1 file changed, 13 insertions(+), 11 deletions(-)
diff --git a/kernel/relay.c b/kernel/relay.c
index 04f248644e06..9247741fa197 100644
--- a/kernel/relay.c
+++ b/kernel/relay.c
@@ -397,11 +397,11 @@ void relay_reset(struct rchan *chan)
return;
}
- mutex_lock(&relay_channels_mutex);
+ cpus_read_lock();
for_each_possible_cpu(i)
if ((buf = *per_cpu_ptr(chan->buf, i)))
__relay_reset(buf, 0);
- mutex_unlock(&relay_channels_mutex);
+ cpus_read_unlock();
}
EXPORT_SYMBOL_GPL(relay_reset);
@@ -522,19 +522,19 @@ int relay_prepare_cpu(unsigned int cpu)
struct rchan *chan;
struct rchan_buf *buf;
- mutex_lock(&relay_channels_mutex);
list_for_each_entry(chan, &relay_channels, list) {
if ((buf = *per_cpu_ptr(chan->buf, cpu)))
continue;
+
buf = relay_open_buf(chan, cpu);
if (!buf) {
pr_err("relay: cpu %d buffer creation failed\n", cpu);
- mutex_unlock(&relay_channels_mutex);
return -ENOMEM;
}
+
*per_cpu_ptr(chan->buf, cpu) = buf;
}
- mutex_unlock(&relay_channels_mutex);
+
return 0;
}
@@ -592,15 +592,16 @@ struct rchan *relay_open(const char *base_filename,
setup_callbacks(chan, cb);
kref_init(&chan->kref);
- mutex_lock(&relay_channels_mutex);
+ cpus_read_lock();
for_each_online_cpu(i) {
buf = relay_open_buf(chan, i);
if (!buf)
goto free_bufs;
+
*per_cpu_ptr(chan->buf, i) = buf;
}
list_add(&chan->list, &relay_channels);
- mutex_unlock(&relay_channels_mutex);
+ cpus_read_unlock();
return chan;
@@ -837,7 +838,7 @@ void relay_close(struct rchan *chan)
if (!chan)
return;
- mutex_lock(&relay_channels_mutex);
+ cpus_read_lock();
if (chan->is_global && (buf = *per_cpu_ptr(chan->buf, 0)))
relay_close_buf(buf);
else
@@ -851,8 +852,9 @@ void relay_close(struct rchan *chan)
chan->last_toobig, chan->subbuf_size);
list_del(&chan->list);
+ cpus_read_unlock();
+
kref_put(&chan->kref, relay_destroy_channel);
- mutex_unlock(&relay_channels_mutex);
}
EXPORT_SYMBOL_GPL(relay_close);
@@ -875,11 +877,11 @@ void relay_flush(struct rchan *chan)
return;
}
- mutex_lock(&relay_channels_mutex);
+ cpus_read_lock();
for_each_possible_cpu(i)
if ((buf = *per_cpu_ptr(chan->buf, i)))
relay_switch_subbuf(buf, 0);
- mutex_unlock(&relay_channels_mutex);
+ cpus_read_unlock();
}
EXPORT_SYMBOL_GPL(relay_flush);
--
2.18.0
More information about the Intel-gfx-trybot
mailing list