[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