Locking fixes:
- Fix a Sparc crash - Fix a number of objtool warnings - Fix /proc/lockdep output on certain configs - Restore a kprobes fail-safe Signed-off-by: Ingo Molnar <mingo@kernel.org> -----BEGIN PGP SIGNATURE----- iQJFBAABCgAvFiEEBpT5eoXrXCwVQwEKEnMQ0APhK1gFAmDq8DMRHG1pbmdvQGtl cm5lbC5vcmcACgkQEnMQ0APhK1jZcA//aYhW8gm3rjtXeRme6H5vLF3fehxw9xoC g6RTAHStHd9xJyctsFYR7Fx7o1l2G05jf5tv4MWoAYMtnjz6OKfPQu7b8eTD3Z+3 n0AAfsrrVaK4f8AgGZ+bj4kw/BCJL0Xx8HyRXjDWODVZVY+yUEo2c5vsw02inQeW 3AQ1m4ZhQBYvl7r4pD0oi6BrL0ruvC0NN5kRYuh1Ib4I8GtF1h9ACPFICxsV6Glx 4SKqzsvaQbV+9EiiLpKqEpi/EJqMmAE5sr4EUnQxWsMeuOKavzETck1ZxWTO5iIh gXI2yTuLS6++yBPCQer/8eePsP3bAiQeNJ+71xpfFdmwx9osA7DFe3aV3f5Ug+Bq f4yswcw1Y1jZhvNp3AV9kE+h2mrSUEWGKAj9LCIV6VqNfOeKKrAyrxSfLRYiB1Ek M9+ML+lN3M2c4n5P7qxx1ZUOZ1It19Nx6HNEeTPkfKhlI+57hpmvPvKIjqZQRdAD oE9exVRssFxDQLIHWoshoDQ7JVR7fsqn7I6ExejnAIpl6veFAAQ457gOHmFyi+jo aLeCTAie0hA18TrMqWtp/ftnpTTJvRJKtHPQXIYmqEkp8S85ryd7Co/9sMRHDS8e XhQRFPSfp4MHqucmoyUIlbRkv16f/0RsC0gv10U0T/WUkjQGMBL5/dvZLpJILtDm DOmYxoe0UP8= =WvwL -----END PGP SIGNATURE----- Merge tag 'locking-urgent-2021-07-11' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip Pull locking fixes from Ingo Molnar: - Fix a Sparc crash - Fix a number of objtool warnings - Fix /proc/lockdep output on certain configs - Restore a kprobes fail-safe * tag 'locking-urgent-2021-07-11' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: locking/atomic: sparc: Fix arch_cmpxchg64_local() kprobe/static_call: Restore missing static_call_text_reserved() static_call: Fix static_call_text_reserved() vs __init jump_label: Fix jump_label_text_reserved() vs __init locking/lockdep: Fix meaningless /proc/lockdep output of lock classes on !CONFIG_PROVE_LOCKING
This commit is contained in:
commit
301c8b1d7c
|
@ -201,7 +201,7 @@ static inline unsigned long __cmpxchg_local(volatile void *ptr,
|
||||||
#define arch_cmpxchg64_local(ptr, o, n) \
|
#define arch_cmpxchg64_local(ptr, o, n) \
|
||||||
({ \
|
({ \
|
||||||
BUILD_BUG_ON(sizeof(*(ptr)) != 8); \
|
BUILD_BUG_ON(sizeof(*(ptr)) != 8); \
|
||||||
cmpxchg_local((ptr), (o), (n)); \
|
arch_cmpxchg_local((ptr), (o), (n)); \
|
||||||
})
|
})
|
||||||
#define arch_cmpxchg64(ptr, o, n) arch_cmpxchg64_local((ptr), (o), (n))
|
#define arch_cmpxchg64(ptr, o, n) arch_cmpxchg64_local((ptr), (o), (n))
|
||||||
|
|
||||||
|
|
|
@ -316,14 +316,16 @@ static int addr_conflict(struct jump_entry *entry, void *start, void *end)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __jump_label_text_reserved(struct jump_entry *iter_start,
|
static int __jump_label_text_reserved(struct jump_entry *iter_start,
|
||||||
struct jump_entry *iter_stop, void *start, void *end)
|
struct jump_entry *iter_stop, void *start, void *end, bool init)
|
||||||
{
|
{
|
||||||
struct jump_entry *iter;
|
struct jump_entry *iter;
|
||||||
|
|
||||||
iter = iter_start;
|
iter = iter_start;
|
||||||
while (iter < iter_stop) {
|
while (iter < iter_stop) {
|
||||||
if (addr_conflict(iter, start, end))
|
if (init || !jump_entry_is_init(iter)) {
|
||||||
return 1;
|
if (addr_conflict(iter, start, end))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
iter++;
|
iter++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -562,7 +564,7 @@ static int __jump_label_mod_text_reserved(void *start, void *end)
|
||||||
|
|
||||||
ret = __jump_label_text_reserved(mod->jump_entries,
|
ret = __jump_label_text_reserved(mod->jump_entries,
|
||||||
mod->jump_entries + mod->num_jump_entries,
|
mod->jump_entries + mod->num_jump_entries,
|
||||||
start, end);
|
start, end, mod->state == MODULE_STATE_COMING);
|
||||||
|
|
||||||
module_put(mod);
|
module_put(mod);
|
||||||
|
|
||||||
|
@ -788,8 +790,9 @@ early_initcall(jump_label_init_module);
|
||||||
*/
|
*/
|
||||||
int jump_label_text_reserved(void *start, void *end)
|
int jump_label_text_reserved(void *start, void *end)
|
||||||
{
|
{
|
||||||
|
bool init = system_state < SYSTEM_RUNNING;
|
||||||
int ret = __jump_label_text_reserved(__start___jump_table,
|
int ret = __jump_label_text_reserved(__start___jump_table,
|
||||||
__stop___jump_table, start, end);
|
__stop___jump_table, start, end, init);
|
||||||
|
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
#include <linux/ftrace.h>
|
#include <linux/ftrace.h>
|
||||||
#include <linux/cpu.h>
|
#include <linux/cpu.h>
|
||||||
#include <linux/jump_label.h>
|
#include <linux/jump_label.h>
|
||||||
|
#include <linux/static_call.h>
|
||||||
#include <linux/perf_event.h>
|
#include <linux/perf_event.h>
|
||||||
|
|
||||||
#include <asm/sections.h>
|
#include <asm/sections.h>
|
||||||
|
@ -1561,6 +1562,7 @@ static int check_kprobe_address_safe(struct kprobe *p,
|
||||||
if (!kernel_text_address((unsigned long) p->addr) ||
|
if (!kernel_text_address((unsigned long) p->addr) ||
|
||||||
within_kprobe_blacklist((unsigned long) p->addr) ||
|
within_kprobe_blacklist((unsigned long) p->addr) ||
|
||||||
jump_label_text_reserved(p->addr, p->addr) ||
|
jump_label_text_reserved(p->addr, p->addr) ||
|
||||||
|
static_call_text_reserved(p->addr, p->addr) ||
|
||||||
find_bug((unsigned long)p->addr)) {
|
find_bug((unsigned long)p->addr)) {
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto out;
|
goto out;
|
||||||
|
|
|
@ -70,26 +70,28 @@ static int l_show(struct seq_file *m, void *v)
|
||||||
#ifdef CONFIG_DEBUG_LOCKDEP
|
#ifdef CONFIG_DEBUG_LOCKDEP
|
||||||
seq_printf(m, " OPS:%8ld", debug_class_ops_read(class));
|
seq_printf(m, " OPS:%8ld", debug_class_ops_read(class));
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_PROVE_LOCKING
|
if (IS_ENABLED(CONFIG_PROVE_LOCKING)) {
|
||||||
seq_printf(m, " FD:%5ld", lockdep_count_forward_deps(class));
|
seq_printf(m, " FD:%5ld", lockdep_count_forward_deps(class));
|
||||||
seq_printf(m, " BD:%5ld", lockdep_count_backward_deps(class));
|
seq_printf(m, " BD:%5ld", lockdep_count_backward_deps(class));
|
||||||
#endif
|
|
||||||
|
|
||||||
get_usage_chars(class, usage);
|
get_usage_chars(class, usage);
|
||||||
seq_printf(m, " %s", usage);
|
seq_printf(m, " %s", usage);
|
||||||
|
}
|
||||||
|
|
||||||
seq_printf(m, ": ");
|
seq_printf(m, ": ");
|
||||||
print_name(m, class);
|
print_name(m, class);
|
||||||
seq_puts(m, "\n");
|
seq_puts(m, "\n");
|
||||||
|
|
||||||
list_for_each_entry(entry, &class->locks_after, entry) {
|
if (IS_ENABLED(CONFIG_PROVE_LOCKING)) {
|
||||||
if (entry->distance == 1) {
|
list_for_each_entry(entry, &class->locks_after, entry) {
|
||||||
seq_printf(m, " -> [%p] ", entry->class->key);
|
if (entry->distance == 1) {
|
||||||
print_name(m, entry->class);
|
seq_printf(m, " -> [%p] ", entry->class->key);
|
||||||
seq_puts(m, "\n");
|
print_name(m, entry->class);
|
||||||
|
seq_puts(m, "\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
seq_puts(m, "\n");
|
||||||
}
|
}
|
||||||
seq_puts(m, "\n");
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -292,13 +292,15 @@ static int addr_conflict(struct static_call_site *site, void *start, void *end)
|
||||||
|
|
||||||
static int __static_call_text_reserved(struct static_call_site *iter_start,
|
static int __static_call_text_reserved(struct static_call_site *iter_start,
|
||||||
struct static_call_site *iter_stop,
|
struct static_call_site *iter_stop,
|
||||||
void *start, void *end)
|
void *start, void *end, bool init)
|
||||||
{
|
{
|
||||||
struct static_call_site *iter = iter_start;
|
struct static_call_site *iter = iter_start;
|
||||||
|
|
||||||
while (iter < iter_stop) {
|
while (iter < iter_stop) {
|
||||||
if (addr_conflict(iter, start, end))
|
if (init || !static_call_is_init(iter)) {
|
||||||
return 1;
|
if (addr_conflict(iter, start, end))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
iter++;
|
iter++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -324,7 +326,7 @@ static int __static_call_mod_text_reserved(void *start, void *end)
|
||||||
|
|
||||||
ret = __static_call_text_reserved(mod->static_call_sites,
|
ret = __static_call_text_reserved(mod->static_call_sites,
|
||||||
mod->static_call_sites + mod->num_static_call_sites,
|
mod->static_call_sites + mod->num_static_call_sites,
|
||||||
start, end);
|
start, end, mod->state == MODULE_STATE_COMING);
|
||||||
|
|
||||||
module_put(mod);
|
module_put(mod);
|
||||||
|
|
||||||
|
@ -459,8 +461,9 @@ static inline int __static_call_mod_text_reserved(void *start, void *end)
|
||||||
|
|
||||||
int static_call_text_reserved(void *start, void *end)
|
int static_call_text_reserved(void *start, void *end)
|
||||||
{
|
{
|
||||||
|
bool init = system_state < SYSTEM_RUNNING;
|
||||||
int ret = __static_call_text_reserved(__start_static_call_sites,
|
int ret = __static_call_text_reserved(__start_static_call_sites,
|
||||||
__stop_static_call_sites, start, end);
|
__stop_static_call_sites, start, end, init);
|
||||||
|
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Reference in New Issue