From 8be4c8a38ee1e297578e094a6e4c143ec5259aba Mon Sep 17 00:00:00 2001
|
From: Michael Jeanson <mjeanson@efficios.com>
|
Date: Mon, 13 Sep 2021 12:00:38 -0400
|
Subject: [PATCH 1/2] fix: cpu/hotplug: Remove deprecated CPU-hotplug
|
functions. (v5.15)
|
|
The CPU-hotplug functions get|put_online_cpus() were deprecated in v4.13
|
and removed in v5.15.
|
|
See upstream commits :
|
|
commit 8c854303ce0e38e5bbedd725ff39da7e235865d8
|
Author: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
Date: Tue Aug 3 16:16:21 2021 +0200
|
|
cpu/hotplug: Remove deprecated CPU-hotplug functions.
|
|
No users in tree use the deprecated CPU-hotplug functions anymore.
|
|
Remove them.
|
|
Introduced in v4.13 :
|
|
commit 8f553c498e1772cccb39a114da4a498d22992758
|
Author: Thomas Gleixner <tglx@linutronix.de>
|
Date: Wed May 24 10:15:12 2017 +0200
|
|
cpu/hotplug: Provide cpus_read|write_[un]lock()
|
|
The counting 'rwsem' hackery of get|put_online_cpus() is going to be
|
replaced by percpu rwsem.
|
|
Rename the functions to make it clear that it's locking and not some
|
refcount style interface. These new functions will be used for the
|
preparatory patches which make the code ready for the percpu rwsem
|
conversion.
|
|
Rename all instances in the cpu hotplug code while at it.
|
|
Upstream-Status: backport [https://git.lttng.org/?p=lttng-modules.git;a=commit;h=ffcc873470121ef1ebb110df3d9038a38d9cb7cb]
|
|
Change-Id: I5a37cf5afc075a402b7347989fac637dfa60a1ed
|
Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
|
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
|
---
|
include/wrapper/cpu.h | 44 +++++++++++++++++++++++
|
src/lib/ringbuffer/ring_buffer_backend.c | 8 ++---
|
src/lib/ringbuffer/ring_buffer_frontend.c | 17 ++++-----
|
src/lib/ringbuffer/ring_buffer_iterator.c | 15 ++++----
|
src/lttng-context-perf-counters.c | 11 +++---
|
src/lttng-statedump-impl.c | 6 ++--
|
6 files changed, 74 insertions(+), 27 deletions(-)
|
create mode 100644 include/wrapper/cpu.h
|
|
diff --git a/include/wrapper/cpu.h b/include/wrapper/cpu.h
|
new file mode 100644
|
index 00000000..cbee1962
|
--- /dev/null
|
+++ b/include/wrapper/cpu.h
|
@@ -0,0 +1,44 @@
|
+/* SPDX-License-Identifier: (GPL-2.0-only or LGPL-2.1-only)
|
+ *
|
+ * wrapper/cpu.h
|
+ *
|
+ * Copyright (C) 2021 Michael Jeanson <mjeanson@efficios.com>
|
+ */
|
+
|
+#ifndef _LTTNG_WRAPPER_CPU_H
|
+#define _LTTNG_WRAPPER_CPU_H
|
+
|
+#include <linux/cpu.h>
|
+#include <lttng/kernel-version.h>
|
+
|
+#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,13,0))
|
+
|
+static inline
|
+void lttng_cpus_read_lock(void)
|
+{
|
+ cpus_read_lock();
|
+}
|
+
|
+static inline
|
+void lttng_cpus_read_unlock(void)
|
+{
|
+ cpus_read_unlock();
|
+}
|
+
|
+#else /* LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,13,0) */
|
+
|
+static inline
|
+void lttng_cpus_read_lock(void)
|
+{
|
+ get_online_cpus();
|
+}
|
+
|
+static inline
|
+void lttng_cpus_read_unlock(void)
|
+{
|
+ put_online_cpus();
|
+}
|
+
|
+#endif /* LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,13,0) */
|
+
|
+#endif /* _LTTNG_WRAPPER_CPU_H */
|
diff --git a/src/lib/ringbuffer/ring_buffer_backend.c b/src/lib/ringbuffer/ring_buffer_backend.c
|
index 26efb2bc..9a339be0 100644
|
--- a/src/lib/ringbuffer/ring_buffer_backend.c
|
+++ b/src/lib/ringbuffer/ring_buffer_backend.c
|
@@ -12,10 +12,10 @@
|
#include <linux/delay.h>
|
#include <linux/errno.h>
|
#include <linux/slab.h>
|
-#include <linux/cpu.h>
|
#include <linux/mm.h>
|
#include <linux/vmalloc.h>
|
|
+#include <wrapper/cpu.h>
|
#include <wrapper/mm.h>
|
#include <wrapper/vmalloc.h> /* for wrapper_vmalloc_sync_mappings() */
|
#include <ringbuffer/config.h>
|
@@ -445,14 +445,14 @@ int channel_backend_init(struct channel_backend *chanb,
|
chanb->cpu_hp_notifier.priority = 5;
|
register_hotcpu_notifier(&chanb->cpu_hp_notifier);
|
|
- get_online_cpus();
|
+ lttng_cpus_read_lock();
|
for_each_online_cpu(i) {
|
ret = lib_ring_buffer_create(per_cpu_ptr(chanb->buf, i),
|
chanb, i);
|
if (ret)
|
goto free_bufs; /* cpu hotplug locked */
|
}
|
- put_online_cpus();
|
+ lttng_cpus_read_unlock();
|
#else
|
for_each_possible_cpu(i) {
|
ret = lib_ring_buffer_create(per_cpu_ptr(chanb->buf, i),
|
@@ -485,7 +485,7 @@ free_bufs:
|
*/
|
#else /* #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,10,0)) */
|
#ifdef CONFIG_HOTPLUG_CPU
|
- put_online_cpus();
|
+ lttng_cpus_read_unlock();
|
unregister_hotcpu_notifier(&chanb->cpu_hp_notifier);
|
#endif
|
#endif /* #else #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,10,0)) */
|
diff --git a/src/lib/ringbuffer/ring_buffer_frontend.c b/src/lib/ringbuffer/ring_buffer_frontend.c
|
index e9056118..87a575d0 100644
|
--- a/src/lib/ringbuffer/ring_buffer_frontend.c
|
+++ b/src/lib/ringbuffer/ring_buffer_frontend.c
|
@@ -48,6 +48,7 @@
|
#include <ringbuffer/iterator.h>
|
#include <ringbuffer/nohz.h>
|
#include <wrapper/atomic.h>
|
+#include <wrapper/cpu.h>
|
#include <wrapper/kref.h>
|
#include <wrapper/percpu-defs.h>
|
#include <wrapper/timer.h>
|
@@ -724,7 +725,7 @@ static void channel_unregister_notifiers(struct lttng_kernel_ring_buffer_channel
|
int cpu;
|
|
#ifdef CONFIG_HOTPLUG_CPU
|
- get_online_cpus();
|
+ lttng_cpus_read_lock();
|
chan->cpu_hp_enable = 0;
|
for_each_online_cpu(cpu) {
|
struct lttng_kernel_ring_buffer *buf = per_cpu_ptr(chan->backend.buf,
|
@@ -732,7 +733,7 @@ static void channel_unregister_notifiers(struct lttng_kernel_ring_buffer_channel
|
lib_ring_buffer_stop_switch_timer(buf);
|
lib_ring_buffer_stop_read_timer(buf);
|
}
|
- put_online_cpus();
|
+ lttng_cpus_read_unlock();
|
unregister_cpu_notifier(&chan->cpu_hp_notifier);
|
#else
|
for_each_possible_cpu(cpu) {
|
@@ -772,14 +773,14 @@ void lib_ring_buffer_set_quiescent_channel(struct lttng_kernel_ring_buffer_chann
|
const struct lttng_kernel_ring_buffer_config *config = &chan->backend.config;
|
|
if (config->alloc == RING_BUFFER_ALLOC_PER_CPU) {
|
- get_online_cpus();
|
+ lttng_cpus_read_lock();
|
for_each_channel_cpu(cpu, chan) {
|
struct lttng_kernel_ring_buffer *buf = per_cpu_ptr(chan->backend.buf,
|
cpu);
|
|
lib_ring_buffer_set_quiescent(buf);
|
}
|
- put_online_cpus();
|
+ lttng_cpus_read_unlock();
|
} else {
|
struct lttng_kernel_ring_buffer *buf = chan->backend.buf;
|
|
@@ -794,14 +795,14 @@ void lib_ring_buffer_clear_quiescent_channel(struct lttng_kernel_ring_buffer_cha
|
const struct lttng_kernel_ring_buffer_config *config = &chan->backend.config;
|
|
if (config->alloc == RING_BUFFER_ALLOC_PER_CPU) {
|
- get_online_cpus();
|
+ lttng_cpus_read_lock();
|
for_each_channel_cpu(cpu, chan) {
|
struct lttng_kernel_ring_buffer *buf = per_cpu_ptr(chan->backend.buf,
|
cpu);
|
|
lib_ring_buffer_clear_quiescent(buf);
|
}
|
- put_online_cpus();
|
+ lttng_cpus_read_unlock();
|
} else {
|
struct lttng_kernel_ring_buffer *buf = chan->backend.buf;
|
|
@@ -899,7 +900,7 @@ struct lttng_kernel_ring_buffer_channel *channel_create(const struct lttng_kerne
|
chan->cpu_hp_notifier.priority = 6;
|
register_cpu_notifier(&chan->cpu_hp_notifier);
|
|
- get_online_cpus();
|
+ lttng_cpus_read_lock();
|
for_each_online_cpu(cpu) {
|
struct lttng_kernel_ring_buffer *buf = per_cpu_ptr(chan->backend.buf,
|
cpu);
|
@@ -909,7 +910,7 @@ struct lttng_kernel_ring_buffer_channel *channel_create(const struct lttng_kerne
|
spin_unlock(&per_cpu(ring_buffer_nohz_lock, cpu));
|
}
|
chan->cpu_hp_enable = 1;
|
- put_online_cpus();
|
+ lttng_cpus_read_unlock();
|
#else
|
for_each_possible_cpu(cpu) {
|
struct lttng_kernel_ring_buffer *buf = per_cpu_ptr(chan->backend.buf,
|
diff --git a/src/lib/ringbuffer/ring_buffer_iterator.c b/src/lib/ringbuffer/ring_buffer_iterator.c
|
index 25839af6..60c95ca6 100644
|
--- a/src/lib/ringbuffer/ring_buffer_iterator.c
|
+++ b/src/lib/ringbuffer/ring_buffer_iterator.c
|
@@ -10,6 +10,7 @@
|
*/
|
|
#include <ringbuffer/iterator.h>
|
+#include <wrapper/cpu.h>
|
#include <wrapper/file.h>
|
#include <wrapper/uaccess.h>
|
#include <linux/jiffies.h>
|
@@ -440,13 +441,13 @@ int channel_iterator_init(struct lttng_kernel_ring_buffer_channel *chan)
|
chan->hp_iter_notifier.priority = 10;
|
register_cpu_notifier(&chan->hp_iter_notifier);
|
|
- get_online_cpus();
|
+ lttng_cpus_read_lock();
|
for_each_online_cpu(cpu) {
|
buf = per_cpu_ptr(chan->backend.buf, cpu);
|
lib_ring_buffer_iterator_init(chan, buf);
|
}
|
chan->hp_iter_enable = 1;
|
- put_online_cpus();
|
+ lttng_cpus_read_unlock();
|
#else
|
for_each_possible_cpu(cpu) {
|
buf = per_cpu_ptr(chan->backend.buf, cpu);
|
@@ -519,7 +520,7 @@ int channel_iterator_open(struct lttng_kernel_ring_buffer_channel *chan)
|
CHAN_WARN_ON(chan, config->output != RING_BUFFER_ITERATOR);
|
|
if (config->alloc == RING_BUFFER_ALLOC_PER_CPU) {
|
- get_online_cpus();
|
+ lttng_cpus_read_lock();
|
/* Allow CPU hotplug to keep track of opened reader */
|
chan->iter.read_open = 1;
|
for_each_channel_cpu(cpu, chan) {
|
@@ -529,7 +530,7 @@ int channel_iterator_open(struct lttng_kernel_ring_buffer_channel *chan)
|
goto error;
|
buf->iter.read_open = 1;
|
}
|
- put_online_cpus();
|
+ lttng_cpus_read_unlock();
|
} else {
|
buf = channel_get_ring_buffer(config, chan, 0);
|
ret = lib_ring_buffer_iterator_open(buf);
|
@@ -538,7 +539,7 @@ int channel_iterator_open(struct lttng_kernel_ring_buffer_channel *chan)
|
error:
|
/* Error should always happen on CPU 0, hence no close is required. */
|
CHAN_WARN_ON(chan, cpu != 0);
|
- put_online_cpus();
|
+ lttng_cpus_read_unlock();
|
return ret;
|
}
|
EXPORT_SYMBOL_GPL(channel_iterator_open);
|
@@ -550,7 +551,7 @@ void channel_iterator_release(struct lttng_kernel_ring_buffer_channel *chan)
|
int cpu;
|
|
if (config->alloc == RING_BUFFER_ALLOC_PER_CPU) {
|
- get_online_cpus();
|
+ lttng_cpus_read_lock();
|
for_each_channel_cpu(cpu, chan) {
|
buf = channel_get_ring_buffer(config, chan, cpu);
|
if (buf->iter.read_open) {
|
@@ -559,7 +560,7 @@ void channel_iterator_release(struct lttng_kernel_ring_buffer_channel *chan)
|
}
|
}
|
chan->iter.read_open = 0;
|
- put_online_cpus();
|
+ lttng_cpus_read_unlock();
|
} else {
|
buf = channel_get_ring_buffer(config, chan, 0);
|
lib_ring_buffer_iterator_release(buf);
|
diff --git a/src/lttng-context-perf-counters.c b/src/lttng-context-perf-counters.c
|
index b0227d47..372f05e0 100644
|
--- a/src/lttng-context-perf-counters.c
|
+++ b/src/lttng-context-perf-counters.c
|
@@ -16,6 +16,7 @@
|
#include <lttng/events.h>
|
#include <lttng/events-internal.h>
|
#include <ringbuffer/frontend_types.h>
|
+#include <wrapper/cpu.h>
|
#include <wrapper/vmalloc.h>
|
#include <wrapper/perf.h>
|
#include <lttng/tracer.h>
|
@@ -97,10 +98,10 @@ void lttng_destroy_perf_counter_ctx_field(void *priv)
|
{
|
int cpu;
|
|
- get_online_cpus();
|
+ lttng_cpus_read_lock();
|
for_each_online_cpu(cpu)
|
perf_event_release_kernel(events[cpu]);
|
- put_online_cpus();
|
+ lttng_cpus_read_unlock();
|
#ifdef CONFIG_HOTPLUG_CPU
|
unregister_cpu_notifier(&perf_field->nb);
|
#endif
|
@@ -304,7 +305,7 @@ int lttng_add_perf_counter_to_ctx(uint32_t type,
|
perf_field->nb.priority = 0;
|
register_cpu_notifier(&perf_field->nb);
|
#endif
|
- get_online_cpus();
|
+ lttng_cpus_read_lock();
|
for_each_online_cpu(cpu) {
|
events[cpu] = wrapper_perf_event_create_kernel_counter(attr,
|
cpu, NULL, overflow_callback);
|
@@ -317,7 +318,7 @@ int lttng_add_perf_counter_to_ctx(uint32_t type,
|
goto counter_busy;
|
}
|
}
|
- put_online_cpus();
|
+ lttng_cpus_read_unlock();
|
perf_field->hp_enable = 1;
|
}
|
#endif /* #else #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,10,0)) */
|
@@ -351,7 +352,7 @@ counter_error:
|
if (events[cpu] && !IS_ERR(events[cpu]))
|
perf_event_release_kernel(events[cpu]);
|
}
|
- put_online_cpus();
|
+ lttng_cpus_read_unlock();
|
#ifdef CONFIG_HOTPLUG_CPU
|
unregister_cpu_notifier(&perf_field->nb);
|
#endif
|
diff --git a/src/lttng-statedump-impl.c b/src/lttng-statedump-impl.c
|
index 4dfbca0b..2b42783a 100644
|
--- a/src/lttng-statedump-impl.c
|
+++ b/src/lttng-statedump-impl.c
|
@@ -23,7 +23,6 @@
|
#include <linux/file.h>
|
#include <linux/interrupt.h>
|
#include <linux/irqnr.h>
|
-#include <linux/cpu.h>
|
#include <linux/netdevice.h>
|
#include <linux/inetdevice.h>
|
#include <linux/mm.h>
|
@@ -34,6 +33,7 @@
|
|
#include <lttng/events.h>
|
#include <lttng/tracer.h>
|
+#include <wrapper/cpu.h>
|
#include <wrapper/irqdesc.h>
|
#include <wrapper/fdtable.h>
|
#include <wrapper/namespace.h>
|
@@ -770,7 +770,7 @@ int do_lttng_statedump(struct lttng_kernel_session *session)
|
* is to guarantee that each CPU has been in a state where is was in
|
* syscall mode (i.e. not in a trap, an IRQ or a soft IRQ).
|
*/
|
- get_online_cpus();
|
+ lttng_cpus_read_lock();
|
atomic_set(&kernel_threads_to_run, num_online_cpus());
|
for_each_online_cpu(cpu) {
|
INIT_DELAYED_WORK(&cpu_work[cpu], lttng_statedump_work_func);
|
@@ -778,7 +778,7 @@ int do_lttng_statedump(struct lttng_kernel_session *session)
|
}
|
/* Wait for all threads to run */
|
__wait_event(statedump_wq, (atomic_read(&kernel_threads_to_run) == 0));
|
- put_online_cpus();
|
+ lttng_cpus_read_unlock();
|
/* Our work is done */
|
trace_lttng_statedump_end(session);
|
return 0;
|
--
|
2.19.1
|