* [PATCH v3 02/12] powerpc: Use 'struct func_desc' instead of 'struct ppc64_opd_entry'
From: Christophe Leroy @ 2021-10-17 12:38 UTC (permalink / raw)
To: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
Andrew Morton, James E.J. Bottomley, Helge Deller, Arnd Bergmann,
Kees Cook, Greg Kroah-Hartman
Cc: linux-arch, linux-ia64, linux-parisc, linux-kernel, linux-mm,
Nicholas Piggin, linuxppc-dev, Daniel Axtens
In-Reply-To: <cover.1634457599.git.christophe.leroy@csgroup.eu>
'struct ppc64_opd_entry' is somehow redundant with 'struct func_desc',
the later is more correct/complete as it includes the third
field which is unused.
So use 'struct func_desc' instead of 'struct ppc64_opd_entry'
Reviewed-by: Kees Cook <keescook@chromium.org>
Reviewed-by: Daniel Axtens <dja@axtens.net>
Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
---
arch/powerpc/include/asm/sections.h | 4 ++--
arch/powerpc/kernel/module_64.c | 10 +++++-----
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/arch/powerpc/include/asm/sections.h b/arch/powerpc/include/asm/sections.h
index 6e4af4492a14..abd2e5213197 100644
--- a/arch/powerpc/include/asm/sections.h
+++ b/arch/powerpc/include/asm/sections.h
@@ -74,10 +74,10 @@ static inline int overlaps_kernel_text(unsigned long start, unsigned long end)
#undef dereference_function_descriptor
static inline void *dereference_function_descriptor(void *ptr)
{
- struct ppc64_opd_entry *desc = ptr;
+ struct func_desc *desc = ptr;
void *p;
- if (!get_kernel_nofault(p, (void *)&desc->funcaddr))
+ if (!get_kernel_nofault(p, (void *)&desc->addr))
ptr = p;
return ptr;
}
diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c
index 6baa676e7cb6..a89da0ee25e2 100644
--- a/arch/powerpc/kernel/module_64.c
+++ b/arch/powerpc/kernel/module_64.c
@@ -64,19 +64,19 @@ static unsigned int local_entry_offset(const Elf64_Sym *sym)
#else
/* An address is address of the OPD entry, which contains address of fn. */
-typedef struct ppc64_opd_entry func_desc_t;
+typedef struct func_desc func_desc_t;
static func_desc_t func_desc(unsigned long addr)
{
- return *(struct ppc64_opd_entry *)addr;
+ return *(struct func_desc *)addr;
}
static unsigned long func_addr(unsigned long addr)
{
- return func_desc(addr).funcaddr;
+ return func_desc(addr).addr;
}
static unsigned long stub_func_addr(func_desc_t func)
{
- return func.funcaddr;
+ return func.addr;
}
static unsigned int local_entry_offset(const Elf64_Sym *sym)
{
@@ -187,7 +187,7 @@ static int relacmp(const void *_x, const void *_y)
static unsigned long get_stubs_size(const Elf64_Ehdr *hdr,
const Elf64_Shdr *sechdrs)
{
- /* One extra reloc so it's always 0-funcaddr terminated */
+ /* One extra reloc so it's always 0-addr terminated */
unsigned long relocs = 1;
unsigned i;
--
2.31.1
^ permalink raw reply related
* [PATCH v3 05/12] ia64: Rename 'ip' to 'addr' in 'struct fdesc'
From: Christophe Leroy @ 2021-10-17 12:38 UTC (permalink / raw)
To: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
Andrew Morton, James E.J. Bottomley, Helge Deller, Arnd Bergmann,
Kees Cook, Greg Kroah-Hartman
Cc: linux-arch, linux-ia64, linux-parisc, linux-kernel, linux-mm,
linuxppc-dev
In-Reply-To: <cover.1634457599.git.christophe.leroy@csgroup.eu>
There are three architectures with function descriptors, try to
have common names for the address they contain in order to
refactor some functions into generic functions later.
powerpc has 'entry'
ia64 has 'ip'
parisc has 'addr'
Vote for 'addr' and update 'struct fdesc' accordingly.
Reviewed-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
---
arch/ia64/include/asm/elf.h | 2 +-
arch/ia64/include/asm/sections.h | 2 +-
arch/ia64/kernel/module.c | 6 +++---
3 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/arch/ia64/include/asm/elf.h b/arch/ia64/include/asm/elf.h
index 6629301a2620..2ef5f9966ad1 100644
--- a/arch/ia64/include/asm/elf.h
+++ b/arch/ia64/include/asm/elf.h
@@ -226,7 +226,7 @@ struct got_entry {
* Layout of the Function Descriptor
*/
struct fdesc {
- uint64_t ip;
+ uint64_t addr;
uint64_t gp;
};
diff --git a/arch/ia64/include/asm/sections.h b/arch/ia64/include/asm/sections.h
index 3a033d2008b3..35f24e52149a 100644
--- a/arch/ia64/include/asm/sections.h
+++ b/arch/ia64/include/asm/sections.h
@@ -35,7 +35,7 @@ static inline void *dereference_function_descriptor(void *ptr)
struct fdesc *desc = ptr;
void *p;
- if (!get_kernel_nofault(p, (void *)&desc->ip))
+ if (!get_kernel_nofault(p, (void *)&desc->addr))
ptr = p;
return ptr;
}
diff --git a/arch/ia64/kernel/module.c b/arch/ia64/kernel/module.c
index 2cba53c1da82..4f6400cbf79e 100644
--- a/arch/ia64/kernel/module.c
+++ b/arch/ia64/kernel/module.c
@@ -602,15 +602,15 @@ get_fdesc (struct module *mod, uint64_t value, int *okp)
return value;
/* Look for existing function descriptor. */
- while (fdesc->ip) {
- if (fdesc->ip == value)
+ while (fdesc->addr) {
+ if (fdesc->addr == value)
return (uint64_t)fdesc;
if ((uint64_t) ++fdesc >= mod->arch.opd->sh_addr + mod->arch.opd->sh_size)
BUG();
}
/* Create new one */
- fdesc->ip = value;
+ fdesc->addr = value;
fdesc->gp = mod->arch.gp;
return (uint64_t) fdesc;
}
--
2.31.1
^ permalink raw reply related
* [PATCH v3 08/12] asm-generic: Refactor dereference_[kernel]_function_descriptor()
From: Christophe Leroy @ 2021-10-17 12:38 UTC (permalink / raw)
To: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
Andrew Morton, James E.J. Bottomley, Helge Deller, Arnd Bergmann,
Kees Cook, Greg Kroah-Hartman
Cc: linux-arch, linux-ia64, linux-parisc, linux-kernel, linux-mm,
linuxppc-dev
In-Reply-To: <cover.1634457599.git.christophe.leroy@csgroup.eu>
dereference_function_descriptor() and
dereference_kernel_function_descriptor() are identical on the
three architectures implementing them.
Make them common and put them out-of-line in kernel/extable.c
which is one of the users and has similar type of functions.
Reviewed-by: Kees Cook <keescook@chromium.org>
Reviewed-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
---
arch/ia64/include/asm/sections.h | 19 -------------------
arch/parisc/include/asm/sections.h | 9 ---------
arch/parisc/kernel/process.c | 21 ---------------------
arch/powerpc/include/asm/sections.h | 23 -----------------------
include/asm-generic/sections.h | 2 ++
kernel/extable.c | 23 ++++++++++++++++++++++-
6 files changed, 24 insertions(+), 73 deletions(-)
diff --git a/arch/ia64/include/asm/sections.h b/arch/ia64/include/asm/sections.h
index 3abe0562b01a..8e0875cf6071 100644
--- a/arch/ia64/include/asm/sections.h
+++ b/arch/ia64/include/asm/sections.h
@@ -30,23 +30,4 @@ extern char __start_gate_brl_fsys_bubble_down_patchlist[], __end_gate_brl_fsys_b
extern char __start_unwind[], __end_unwind[];
extern char __start_ivt_text[], __end_ivt_text[];
-#undef dereference_function_descriptor
-static inline void *dereference_function_descriptor(void *ptr)
-{
- struct fdesc *desc = ptr;
- void *p;
-
- if (!get_kernel_nofault(p, (void *)&desc->addr))
- ptr = p;
- return ptr;
-}
-
-#undef dereference_kernel_function_descriptor
-static inline void *dereference_kernel_function_descriptor(void *ptr)
-{
- if (ptr < (void *)__start_opd || ptr >= (void *)__end_opd)
- return ptr;
- return dereference_function_descriptor(ptr);
-}
-
#endif /* _ASM_IA64_SECTIONS_H */
diff --git a/arch/parisc/include/asm/sections.h b/arch/parisc/include/asm/sections.h
index ace1d4047a0b..33df42b5cc6d 100644
--- a/arch/parisc/include/asm/sections.h
+++ b/arch/parisc/include/asm/sections.h
@@ -12,13 +12,4 @@ typedef Elf64_Fdesc func_desc_t;
extern char __alt_instructions[], __alt_instructions_end[];
-#ifdef CONFIG_64BIT
-
-#undef dereference_function_descriptor
-void *dereference_function_descriptor(void *);
-
-#undef dereference_kernel_function_descriptor
-void *dereference_kernel_function_descriptor(void *);
-#endif
-
#endif
diff --git a/arch/parisc/kernel/process.c b/arch/parisc/kernel/process.c
index 38ec4ae81239..7382576b52a8 100644
--- a/arch/parisc/kernel/process.c
+++ b/arch/parisc/kernel/process.c
@@ -266,27 +266,6 @@ get_wchan(struct task_struct *p)
return 0;
}
-#ifdef CONFIG_64BIT
-void *dereference_function_descriptor(void *ptr)
-{
- Elf64_Fdesc *desc = ptr;
- void *p;
-
- if (!get_kernel_nofault(p, (void *)&desc->addr))
- ptr = p;
- return ptr;
-}
-
-void *dereference_kernel_function_descriptor(void *ptr)
-{
- if (ptr < (void *)__start_opd ||
- ptr >= (void *)__end_opd)
- return ptr;
-
- return dereference_function_descriptor(ptr);
-}
-#endif
-
static inline unsigned long brk_rnd(void)
{
return (get_random_int() & BRK_RND_MASK) << PAGE_SHIFT;
diff --git a/arch/powerpc/include/asm/sections.h b/arch/powerpc/include/asm/sections.h
index 1e6b6e732fb3..2c3de9bd1a90 100644
--- a/arch/powerpc/include/asm/sections.h
+++ b/arch/powerpc/include/asm/sections.h
@@ -71,29 +71,6 @@ static inline int overlaps_kernel_text(unsigned long start, unsigned long end)
(unsigned long)_stext < end;
}
-#ifdef PPC64_ELF_ABI_v1
-
-#undef dereference_function_descriptor
-static inline void *dereference_function_descriptor(void *ptr)
-{
- struct func_desc *desc = ptr;
- void *p;
-
- if (!get_kernel_nofault(p, (void *)&desc->addr))
- ptr = p;
- return ptr;
-}
-
-#undef dereference_kernel_function_descriptor
-static inline void *dereference_kernel_function_descriptor(void *ptr)
-{
- if (ptr < (void *)__start_opd || ptr >= (void *)__end_opd)
- return ptr;
-
- return dereference_function_descriptor(ptr);
-}
-#endif /* PPC64_ELF_ABI_v1 */
-
#endif
#endif /* __KERNEL__ */
diff --git a/include/asm-generic/sections.h b/include/asm-generic/sections.h
index 33b51efe3a24..c9f30b6e81f9 100644
--- a/include/asm-generic/sections.h
+++ b/include/asm-generic/sections.h
@@ -60,6 +60,8 @@ extern __visible const void __nosave_begin, __nosave_end;
/* Function descriptor handling (if any). Override in asm/sections.h */
#ifdef CONFIG_HAVE_FUNCTION_DESCRIPTORS
+void *dereference_function_descriptor(void *ptr);
+void *dereference_kernel_function_descriptor(void *ptr);
#else
#define dereference_function_descriptor(p) ((void *)(p))
#define dereference_kernel_function_descriptor(p) ((void *)(p))
diff --git a/kernel/extable.c b/kernel/extable.c
index b0ea5eb0c3b4..1ef13789bea9 100644
--- a/kernel/extable.c
+++ b/kernel/extable.c
@@ -3,6 +3,7 @@
Copyright (C) 2001 Rusty Russell, 2002 Rusty Russell IBM.
*/
+#include <linux/elf.h>
#include <linux/ftrace.h>
#include <linux/memory.h>
#include <linux/extable.h>
@@ -159,12 +160,32 @@ int kernel_text_address(unsigned long addr)
}
/*
- * On some architectures (PPC64, IA64) function pointers
+ * On some architectures (PPC64, IA64, PARISC) function pointers
* are actually only tokens to some data that then holds the
* real function address. As a result, to find if a function
* pointer is part of the kernel text, we need to do some
* special dereferencing first.
*/
+#ifdef CONFIG_HAVE_FUNCTION_DESCRIPTORS
+void *dereference_function_descriptor(void *ptr)
+{
+ func_desc_t *desc = ptr;
+ void *p;
+
+ if (!get_kernel_nofault(p, (void *)&desc->addr))
+ ptr = p;
+ return ptr;
+}
+
+void *dereference_kernel_function_descriptor(void *ptr)
+{
+ if (ptr < (void *)__start_opd || ptr >= (void *)__end_opd)
+ return ptr;
+
+ return dereference_function_descriptor(ptr);
+}
+#endif
+
int func_ptr_is_kernel_text(void *ptr)
{
unsigned long addr;
--
2.31.1
^ permalink raw reply related
* [PATCH v3 12/12] lkdtm: Add a test for function descriptors protection
From: Christophe Leroy @ 2021-10-17 12:38 UTC (permalink / raw)
To: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
Andrew Morton, James E.J. Bottomley, Helge Deller, Arnd Bergmann,
Kees Cook, Greg Kroah-Hartman
Cc: linux-arch, linux-ia64, linux-parisc, linux-kernel, linux-mm,
linuxppc-dev
In-Reply-To: <cover.1634457599.git.christophe.leroy@csgroup.eu>
Add WRITE_OPD to check that you can't modify function
descriptors.
Gives the following result when function descriptors are
not protected:
lkdtm: Performing direct entry WRITE_OPD
lkdtm: attempting bad 16 bytes write at c00000000269b358
lkdtm: FAIL: survived bad write
lkdtm: do_nothing was hijacked!
Looks like a standard compiler barrier() is not enough to force
GCC to use the modified function descriptor. Had to add a fake empty
inline assembly to force GCC to reload the function descriptor.
Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
---
drivers/misc/lkdtm/core.c | 1 +
drivers/misc/lkdtm/lkdtm.h | 1 +
drivers/misc/lkdtm/perms.c | 22 ++++++++++++++++++++++
3 files changed, 24 insertions(+)
diff --git a/drivers/misc/lkdtm/core.c b/drivers/misc/lkdtm/core.c
index fe6fd34b8caf..de092aa03b5d 100644
--- a/drivers/misc/lkdtm/core.c
+++ b/drivers/misc/lkdtm/core.c
@@ -148,6 +148,7 @@ static const struct crashtype crashtypes[] = {
CRASHTYPE(WRITE_RO),
CRASHTYPE(WRITE_RO_AFTER_INIT),
CRASHTYPE(WRITE_KERN),
+ CRASHTYPE(WRITE_OPD),
CRASHTYPE(REFCOUNT_INC_OVERFLOW),
CRASHTYPE(REFCOUNT_ADD_OVERFLOW),
CRASHTYPE(REFCOUNT_INC_NOT_ZERO_OVERFLOW),
diff --git a/drivers/misc/lkdtm/lkdtm.h b/drivers/misc/lkdtm/lkdtm.h
index c212a253edde..188bd0fd6575 100644
--- a/drivers/misc/lkdtm/lkdtm.h
+++ b/drivers/misc/lkdtm/lkdtm.h
@@ -105,6 +105,7 @@ void __init lkdtm_perms_init(void);
void lkdtm_WRITE_RO(void);
void lkdtm_WRITE_RO_AFTER_INIT(void);
void lkdtm_WRITE_KERN(void);
+void lkdtm_WRITE_OPD(void);
void lkdtm_EXEC_DATA(void);
void lkdtm_EXEC_STACK(void);
void lkdtm_EXEC_KMALLOC(void);
diff --git a/drivers/misc/lkdtm/perms.c b/drivers/misc/lkdtm/perms.c
index 1cf24c4a79e9..2c6aba3ff32b 100644
--- a/drivers/misc/lkdtm/perms.c
+++ b/drivers/misc/lkdtm/perms.c
@@ -44,6 +44,11 @@ static noinline void do_overwritten(void)
return;
}
+static noinline void do_almost_nothing(void)
+{
+ pr_info("do_nothing was hijacked!\n");
+}
+
static void *setup_function_descriptor(func_desc_t *fdesc, void *dst)
{
if (!have_function_descriptors())
@@ -144,6 +149,23 @@ void lkdtm_WRITE_KERN(void)
do_overwritten();
}
+void lkdtm_WRITE_OPD(void)
+{
+ size_t size = sizeof(func_desc_t);
+ void (*func)(void) = do_nothing;
+
+ if (!have_function_descriptors()) {
+ pr_info("XFAIL: Platform doesn't use function descriptors.\n");
+ return;
+ }
+ pr_info("attempting bad %zu bytes write at %px\n", size, do_nothing);
+ memcpy(do_nothing, do_almost_nothing, size);
+ pr_err("FAIL: survived bad write\n");
+
+ asm("" : "=m"(func));
+ func();
+}
+
void lkdtm_EXEC_DATA(void)
{
execute_location(data_area, CODE_WRITE);
--
2.31.1
^ permalink raw reply related
* [PATCH v3 04/12] powerpc: Prepare func_desc_t for refactorisation
From: Christophe Leroy @ 2021-10-17 12:38 UTC (permalink / raw)
To: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
Andrew Morton, James E.J. Bottomley, Helge Deller, Arnd Bergmann,
Kees Cook, Greg Kroah-Hartman
Cc: linux-arch, linux-ia64, linux-parisc, linux-kernel, linux-mm,
linuxppc-dev
In-Reply-To: <cover.1634457599.git.christophe.leroy@csgroup.eu>
In preparation of making func_desc_t generic, change the ELFv2
version to a struct containing 'addr' element.
This allows using single helpers common to ELFv1 and ELFv2.
Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
---
arch/powerpc/kernel/module_64.c | 32 ++++++++++++++------------------
1 file changed, 14 insertions(+), 18 deletions(-)
diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c
index a89da0ee25e2..b687ef88c4c4 100644
--- a/arch/powerpc/kernel/module_64.c
+++ b/arch/powerpc/kernel/module_64.c
@@ -33,19 +33,13 @@
#ifdef PPC64_ELF_ABI_v2
/* An address is simply the address of the function. */
-typedef unsigned long func_desc_t;
+typedef struct {
+ unsigned long addr;
+} func_desc_t;
static func_desc_t func_desc(unsigned long addr)
{
- return addr;
-}
-static unsigned long func_addr(unsigned long addr)
-{
- return addr;
-}
-static unsigned long stub_func_addr(func_desc_t func)
-{
- return func;
+ return (func_desc_t){addr};
}
/* PowerPC64 specific values for the Elf64_Sym st_other field. */
@@ -70,14 +64,6 @@ static func_desc_t func_desc(unsigned long addr)
{
return *(struct func_desc *)addr;
}
-static unsigned long func_addr(unsigned long addr)
-{
- return func_desc(addr).addr;
-}
-static unsigned long stub_func_addr(func_desc_t func)
-{
- return func.addr;
-}
static unsigned int local_entry_offset(const Elf64_Sym *sym)
{
return 0;
@@ -93,6 +79,16 @@ void *dereference_module_function_descriptor(struct module *mod, void *ptr)
}
#endif
+static unsigned long func_addr(unsigned long addr)
+{
+ return func_desc(addr).addr;
+}
+
+static unsigned long stub_func_addr(func_desc_t func)
+{
+ return func.addr;
+}
+
#define STUB_MAGIC 0x73747562 /* stub */
/* Like PPC32, we need little trampolines to do > 24-bit jumps (into
--
2.31.1
^ permalink raw reply related
* [PATCH v3 00/12] Fix LKDTM for PPC64/IA64/PARISC
From: Christophe Leroy @ 2021-10-17 12:38 UTC (permalink / raw)
To: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
Andrew Morton, James E.J. Bottomley, Helge Deller, Arnd Bergmann,
Kees Cook, Greg Kroah-Hartman
Cc: linux-arch, linux-ia64, linux-parisc, linux-kernel, linux-mm,
linuxppc-dev
PPC64/IA64/PARISC have function descriptors. LKDTM doesn't work
on those three architectures because LKDTM messes up function
descriptors with functions.
This series does some cleanup in the three architectures and
refactors function descriptors so that it can then easily use it
in a generic way in LKDTM.
Patch 8 is not absolutely necessary but it is a good trivial cleanup.
Changes in v3:
- Addressed received comments
- Swapped some of the powerpc patches to keep func_descr_t renamed as struct func_desc and remove 'struct ppc64_opd_entry'
- Changed HAVE_FUNCTION_DESCRIPTORS macro to a config item CONFIG_HAVE_FUNCTION_DESCRIPTORS
- Dropped patch 11 ("Fix lkdtm_EXEC_RODATA()")
Changes in v2:
- Addressed received comments
- Moved dereference_[kernel]_function_descriptor() out of line
- Added patches to remove func_descr_t and func_desc_t in powerpc
- Using func_desc_t instead of funct_descr_t
- Renamed HAVE_DEREFERENCE_FUNCTION_DESCRIPTOR to HAVE_FUNCTION_DESCRIPTORS
- Added a new lkdtm test to check protection of function descriptors
Christophe Leroy (12):
powerpc: Move and rename func_descr_t
powerpc: Use 'struct func_desc' instead of 'struct ppc64_opd_entry'
powerpc: Remove 'struct ppc64_opd_entry'
powerpc: Prepare func_desc_t for refactorisation
ia64: Rename 'ip' to 'addr' in 'struct fdesc'
asm-generic: Define CONFIG_HAVE_FUNCTION_DESCRIPTORS
asm-generic: Define 'func_desc_t' to commonly describe function
descriptors
asm-generic: Refactor dereference_[kernel]_function_descriptor()
lkdtm: Force do_nothing() out of line
lkdtm: Really write into kernel text in WRITE_KERN
lkdtm: Fix execute_[user]_location()
lkdtm: Add a test for function descriptors protection
arch/Kconfig | 3 +
arch/ia64/Kconfig | 1 +
arch/ia64/include/asm/elf.h | 2 +-
arch/ia64/include/asm/sections.h | 24 +-------
arch/ia64/kernel/module.c | 6 +-
arch/parisc/Kconfig | 1 +
arch/parisc/include/asm/sections.h | 16 ++----
arch/parisc/kernel/process.c | 21 -------
arch/powerpc/Kconfig | 1 +
arch/powerpc/include/asm/code-patching.h | 2 +-
arch/powerpc/include/asm/elf.h | 6 ++
arch/powerpc/include/asm/sections.h | 29 ++--------
arch/powerpc/include/asm/types.h | 6 --
arch/powerpc/include/uapi/asm/elf.h | 8 ---
arch/powerpc/kernel/module_64.c | 38 +++++--------
arch/powerpc/kernel/ptrace/ptrace.c | 6 ++
arch/powerpc/kernel/signal_64.c | 8 +--
drivers/misc/lkdtm/core.c | 1 +
drivers/misc/lkdtm/lkdtm.h | 1 +
drivers/misc/lkdtm/perms.c | 71 +++++++++++++++++++-----
include/asm-generic/sections.h | 13 ++++-
include/linux/kallsyms.h | 2 +-
kernel/extable.c | 23 +++++++-
23 files changed, 146 insertions(+), 143 deletions(-)
--
2.31.1
^ permalink raw reply
* [PATCH v3 06/12] asm-generic: Define CONFIG_HAVE_FUNCTION_DESCRIPTORS
From: Christophe Leroy @ 2021-10-17 12:38 UTC (permalink / raw)
To: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
Andrew Morton, James E.J. Bottomley, Helge Deller, Arnd Bergmann,
Kees Cook, Greg Kroah-Hartman
Cc: linux-arch, linux-ia64, linux-parisc, linux-kernel, linux-mm,
Nicholas Piggin, linuxppc-dev
In-Reply-To: <cover.1634457599.git.christophe.leroy@csgroup.eu>
Replace HAVE_DEREFERENCE_FUNCTION_DESCRIPTOR by a config option
named CONFIG_HAVE_FUNCTION_DESCRIPTORS and use it instead of
'dereference_function_descriptor' macro to know whether an
arch has function descriptors.
To limit churn in one of the following patches, use
an #ifdef/#else construct with empty first part
instead of an #ifndef in asm-generic/sections.h
On powerpc, make sure the config option matches the ABI used
by the compiler with a BUILD_BUG_ON().
And include a helper to check whether an arch has function
descriptors or not : have_function_descriptors()
Reviewed-by: Kees Cook <keescook@chromium.org>
Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
---
arch/Kconfig | 3 +++
arch/ia64/Kconfig | 1 +
arch/ia64/include/asm/sections.h | 2 --
arch/parisc/Kconfig | 1 +
arch/parisc/include/asm/sections.h | 2 --
arch/powerpc/Kconfig | 1 +
arch/powerpc/include/asm/sections.h | 2 --
arch/powerpc/kernel/ptrace/ptrace.c | 6 ++++++
include/asm-generic/sections.h | 8 +++++++-
include/linux/kallsyms.h | 2 +-
10 files changed, 20 insertions(+), 8 deletions(-)
diff --git a/arch/Kconfig b/arch/Kconfig
index 8df1c7102643..6e610a53d832 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -197,6 +197,9 @@ config HAVE_FUNCTION_ERROR_INJECTION
config HAVE_NMI
bool
+config HAVE_FUNCTION_DESCRIPTORS
+ bool
+
config TRACE_IRQFLAGS_SUPPORT
bool
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig
index 1e33666fa679..97cf02951610 100644
--- a/arch/ia64/Kconfig
+++ b/arch/ia64/Kconfig
@@ -34,6 +34,7 @@ config IA64
select HAVE_FUNCTION_TRACER
select TTY
select HAVE_ARCH_TRACEHOOK
+ select HAVE_FUNCTION_DESCRIPTORS
select HAVE_VIRT_CPU_ACCOUNTING
select HUGETLB_PAGE_SIZE_VARIABLE if HUGETLB_PAGE
select VIRT_TO_BUS
diff --git a/arch/ia64/include/asm/sections.h b/arch/ia64/include/asm/sections.h
index 35f24e52149a..2460d365a057 100644
--- a/arch/ia64/include/asm/sections.h
+++ b/arch/ia64/include/asm/sections.h
@@ -27,8 +27,6 @@ extern char __start_gate_brl_fsys_bubble_down_patchlist[], __end_gate_brl_fsys_b
extern char __start_unwind[], __end_unwind[];
extern char __start_ivt_text[], __end_ivt_text[];
-#define HAVE_DEREFERENCE_FUNCTION_DESCRIPTOR 1
-
#undef dereference_function_descriptor
static inline void *dereference_function_descriptor(void *ptr)
{
diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig
index 27a8b49af11f..01d46ca32119 100644
--- a/arch/parisc/Kconfig
+++ b/arch/parisc/Kconfig
@@ -65,6 +65,7 @@ config PARISC
select HAVE_DYNAMIC_FTRACE_WITH_REGS
select HAVE_SOFTIRQ_ON_OWN_STACK if IRQSTACKS
select TRACE_IRQFLAGS_SUPPORT
+ select HAVE_FUNCTION_DESCRIPTORS if 64BIT
help
The PA-RISC microprocessor is designed by Hewlett-Packard and used
diff --git a/arch/parisc/include/asm/sections.h b/arch/parisc/include/asm/sections.h
index bb52aea0cb21..c8092e4d94de 100644
--- a/arch/parisc/include/asm/sections.h
+++ b/arch/parisc/include/asm/sections.h
@@ -9,8 +9,6 @@ extern char __alt_instructions[], __alt_instructions_end[];
#ifdef CONFIG_64BIT
-#define HAVE_DEREFERENCE_FUNCTION_DESCRIPTOR 1
-
#undef dereference_function_descriptor
void *dereference_function_descriptor(void *);
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index ba5b66189358..0effedba082f 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -208,6 +208,7 @@ config PPC
select HAVE_EFFICIENT_UNALIGNED_ACCESS if !(CPU_LITTLE_ENDIAN && POWER7_CPU)
select HAVE_FAST_GUP
select HAVE_FTRACE_MCOUNT_RECORD
+ select HAVE_FUNCTION_DESCRIPTORS if PPC64 && !CPU_LITTLE_ENDIAN
select HAVE_FUNCTION_ERROR_INJECTION
select HAVE_FUNCTION_GRAPH_TRACER
select HAVE_FUNCTION_TRACER
diff --git a/arch/powerpc/include/asm/sections.h b/arch/powerpc/include/asm/sections.h
index abd2e5213197..fb11544d7e6a 100644
--- a/arch/powerpc/include/asm/sections.h
+++ b/arch/powerpc/include/asm/sections.h
@@ -69,8 +69,6 @@ static inline int overlaps_kernel_text(unsigned long start, unsigned long end)
#ifdef PPC64_ELF_ABI_v1
-#define HAVE_DEREFERENCE_FUNCTION_DESCRIPTOR 1
-
#undef dereference_function_descriptor
static inline void *dereference_function_descriptor(void *ptr)
{
diff --git a/arch/powerpc/kernel/ptrace/ptrace.c b/arch/powerpc/kernel/ptrace/ptrace.c
index 7c7093c17c45..740b682caa73 100644
--- a/arch/powerpc/kernel/ptrace/ptrace.c
+++ b/arch/powerpc/kernel/ptrace/ptrace.c
@@ -446,4 +446,10 @@ void __init pt_regs_check(void)
* real registers.
*/
BUILD_BUG_ON(PT_DSCR < sizeof(struct user_pt_regs) / sizeof(unsigned long));
+
+#ifdef PPC64_ELF_ABI_v1
+ BUILD_BUG_ON(!IS_ENABLED(CONFIG_HAVE_FUNCTION_DESCRIPTORS));
+#else
+ BUILD_BUG_ON(IS_ENABLED(CONFIG_HAVE_FUNCTION_DESCRIPTORS));
+#endif
}
diff --git a/include/asm-generic/sections.h b/include/asm-generic/sections.h
index d16302d3eb59..a918388d9bf6 100644
--- a/include/asm-generic/sections.h
+++ b/include/asm-generic/sections.h
@@ -59,11 +59,17 @@ extern char __noinstr_text_start[], __noinstr_text_end[];
extern __visible const void __nosave_begin, __nosave_end;
/* Function descriptor handling (if any). Override in asm/sections.h */
-#ifndef dereference_function_descriptor
+#ifdef CONFIG_HAVE_FUNCTION_DESCRIPTORS
+#else
#define dereference_function_descriptor(p) ((void *)(p))
#define dereference_kernel_function_descriptor(p) ((void *)(p))
#endif
+static inline bool have_function_descriptors(void)
+{
+ return IS_ENABLED(CONFIG_HAVE_FUNCTION_DESCRIPTORS);
+}
+
/* random extra sections (if any). Override
* in asm/sections.h */
#ifndef arch_is_kernel_text
diff --git a/include/linux/kallsyms.h b/include/linux/kallsyms.h
index a1d6fc82d7f0..18799df0c9bf 100644
--- a/include/linux/kallsyms.h
+++ b/include/linux/kallsyms.h
@@ -57,7 +57,7 @@ static inline int is_ksym_addr(unsigned long addr)
static inline void *dereference_symbol_descriptor(void *ptr)
{
-#ifdef HAVE_DEREFERENCE_FUNCTION_DESCRIPTOR
+#ifdef CONFIG_HAVE_FUNCTION_DESCRIPTORS
struct module *mod;
ptr = dereference_kernel_function_descriptor(ptr);
--
2.31.1
^ permalink raw reply related
* [PATCH v3 07/12] asm-generic: Define 'func_desc_t' to commonly describe function descriptors
From: Christophe Leroy @ 2021-10-17 12:38 UTC (permalink / raw)
To: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
Andrew Morton, James E.J. Bottomley, Helge Deller, Arnd Bergmann,
Kees Cook, Greg Kroah-Hartman
Cc: linux-arch, linux-ia64, linux-parisc, linux-kernel, linux-mm,
linuxppc-dev
In-Reply-To: <cover.1634457599.git.christophe.leroy@csgroup.eu>
We have three architectures using function descriptors, each with its
own type and name.
Add a common typedef that can be used in generic code.
Also add a stub typedef for architecture without function descriptors,
to avoid a forest of #ifdefs.
It replaces the similar 'func_desc_t' previously defined in
arch/powerpc/kernel/module_64.c
Reviewed-by: Kees Cook <keescook@chromium.org>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
---
arch/ia64/include/asm/sections.h | 3 +++
arch/parisc/include/asm/sections.h | 5 +++++
arch/powerpc/include/asm/sections.h | 4 ++++
arch/powerpc/kernel/module_64.c | 8 --------
include/asm-generic/sections.h | 3 +++
5 files changed, 15 insertions(+), 8 deletions(-)
diff --git a/arch/ia64/include/asm/sections.h b/arch/ia64/include/asm/sections.h
index 2460d365a057..3abe0562b01a 100644
--- a/arch/ia64/include/asm/sections.h
+++ b/arch/ia64/include/asm/sections.h
@@ -9,6 +9,9 @@
#include <linux/elf.h>
#include <linux/uaccess.h>
+
+typedef struct fdesc func_desc_t;
+
#include <asm-generic/sections.h>
extern char __phys_per_cpu_start[];
diff --git a/arch/parisc/include/asm/sections.h b/arch/parisc/include/asm/sections.h
index c8092e4d94de..ace1d4047a0b 100644
--- a/arch/parisc/include/asm/sections.h
+++ b/arch/parisc/include/asm/sections.h
@@ -2,6 +2,11 @@
#ifndef _PARISC_SECTIONS_H
#define _PARISC_SECTIONS_H
+#ifdef CONFIG_HAVE_FUNCTION_DESCRIPTORS
+#include <asm/elf.h>
+typedef Elf64_Fdesc func_desc_t;
+#endif
+
/* nothing to see, move along */
#include <asm-generic/sections.h>
diff --git a/arch/powerpc/include/asm/sections.h b/arch/powerpc/include/asm/sections.h
index fb11544d7e6a..1e6b6e732fb3 100644
--- a/arch/powerpc/include/asm/sections.h
+++ b/arch/powerpc/include/asm/sections.h
@@ -8,6 +8,10 @@
#define arch_is_kernel_initmem_freed arch_is_kernel_initmem_freed
+#ifdef CONFIG_HAVE_FUNCTION_DESCRIPTORS
+typedef struct func_desc func_desc_t;
+#endif
+
#include <asm-generic/sections.h>
extern bool init_mem_is_free;
diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c
index b687ef88c4c4..3d06b996d504 100644
--- a/arch/powerpc/kernel/module_64.c
+++ b/arch/powerpc/kernel/module_64.c
@@ -32,11 +32,6 @@
#ifdef PPC64_ELF_ABI_v2
-/* An address is simply the address of the function. */
-typedef struct {
- unsigned long addr;
-} func_desc_t;
-
static func_desc_t func_desc(unsigned long addr)
{
return (func_desc_t){addr};
@@ -57,9 +52,6 @@ static unsigned int local_entry_offset(const Elf64_Sym *sym)
}
#else
-/* An address is address of the OPD entry, which contains address of fn. */
-typedef struct func_desc func_desc_t;
-
static func_desc_t func_desc(unsigned long addr)
{
return *(struct func_desc *)addr;
diff --git a/include/asm-generic/sections.h b/include/asm-generic/sections.h
index a918388d9bf6..33b51efe3a24 100644
--- a/include/asm-generic/sections.h
+++ b/include/asm-generic/sections.h
@@ -63,6 +63,9 @@ extern __visible const void __nosave_begin, __nosave_end;
#else
#define dereference_function_descriptor(p) ((void *)(p))
#define dereference_kernel_function_descriptor(p) ((void *)(p))
+typedef struct {
+ unsigned long addr;
+} func_desc_t;
#endif
static inline bool have_function_descriptors(void)
--
2.31.1
^ permalink raw reply related
* [PATCH v3 11/12] lkdtm: Fix execute_[user]_location()
From: Christophe Leroy @ 2021-10-17 12:38 UTC (permalink / raw)
To: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
Andrew Morton, James E.J. Bottomley, Helge Deller, Arnd Bergmann,
Kees Cook, Greg Kroah-Hartman
Cc: linux-arch, linux-ia64, linux-parisc, linux-kernel, linux-mm,
linuxppc-dev
In-Reply-To: <cover.1634457599.git.christophe.leroy@csgroup.eu>
execute_location() and execute_user_location() intent
to copy do_nothing() text and execute it at a new location.
However, at the time being it doesn't copy do_nothing() function
but do_nothing() function descriptor which still points to the
original text. So at the end it still executes do_nothing() at
its original location allthough using a copied function descriptor.
So, fix that by really copying do_nothing() text and build a new
function descriptor by copying do_nothing() function descriptor and
updating the target address with the new location.
Also fix the displayed addresses by dereferencing do_nothing()
function descriptor.
Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
---
drivers/misc/lkdtm/perms.c | 37 ++++++++++++++++++++++++++++---------
1 file changed, 28 insertions(+), 9 deletions(-)
diff --git a/drivers/misc/lkdtm/perms.c b/drivers/misc/lkdtm/perms.c
index 035fcca441f0..1cf24c4a79e9 100644
--- a/drivers/misc/lkdtm/perms.c
+++ b/drivers/misc/lkdtm/perms.c
@@ -44,19 +44,34 @@ static noinline void do_overwritten(void)
return;
}
+static void *setup_function_descriptor(func_desc_t *fdesc, void *dst)
+{
+ if (!have_function_descriptors())
+ return dst;
+
+ memcpy(fdesc, do_nothing, sizeof(*fdesc));
+ fdesc->addr = (unsigned long)dst;
+ barrier();
+
+ return fdesc;
+}
+
static noinline void execute_location(void *dst, bool write)
{
- void (*func)(void) = dst;
+ void (*func)(void);
+ func_desc_t fdesc;
+ void *do_nothing_text = dereference_function_descriptor(do_nothing);
- pr_info("attempting ok execution at %px\n", do_nothing);
+ pr_info("attempting ok execution at %px\n", do_nothing_text);
do_nothing();
if (write == CODE_WRITE) {
- memcpy(dst, do_nothing, EXEC_SIZE);
+ memcpy(dst, do_nothing_text, EXEC_SIZE);
flush_icache_range((unsigned long)dst,
(unsigned long)dst + EXEC_SIZE);
}
- pr_info("attempting bad execution at %px\n", func);
+ pr_info("attempting bad execution at %px\n", dst);
+ func = setup_function_descriptor(&fdesc, dst);
func();
pr_err("FAIL: func returned\n");
}
@@ -66,16 +81,19 @@ static void execute_user_location(void *dst)
int copied;
/* Intentionally crossing kernel/user memory boundary. */
- void (*func)(void) = dst;
+ void (*func)(void);
+ func_desc_t fdesc;
+ void *do_nothing_text = dereference_function_descriptor(do_nothing);
- pr_info("attempting ok execution at %px\n", do_nothing);
+ pr_info("attempting ok execution at %px\n", do_nothing_text);
do_nothing();
- copied = access_process_vm(current, (unsigned long)dst, do_nothing,
+ copied = access_process_vm(current, (unsigned long)dst, do_nothing_text,
EXEC_SIZE, FOLL_WRITE);
if (copied < EXEC_SIZE)
return;
- pr_info("attempting bad execution at %px\n", func);
+ pr_info("attempting bad execution at %px\n", dst);
+ func = setup_function_descriptor(&fdesc, dst);
func();
pr_err("FAIL: func returned\n");
}
@@ -153,7 +171,8 @@ void lkdtm_EXEC_VMALLOC(void)
void lkdtm_EXEC_RODATA(void)
{
- execute_location(lkdtm_rodata_do_nothing, CODE_AS_IS);
+ execute_location(dereference_function_descriptor(lkdtm_rodata_do_nothing),
+ CODE_AS_IS);
}
void lkdtm_EXEC_USERSPACE(void)
--
2.31.1
^ permalink raw reply related
* Re: [PATCH 00/13] block: add_disk() error handling stragglers
From: Geoff Levand @ 2021-10-17 15:26 UTC (permalink / raw)
To: Luis Chamberlain, axboe, mpe, benh, paulus, jim, minchan, ngupta,
senozhatsky, richard, miquel.raynal, vigneshr, dan.j.williams,
vishal.l.verma, dave.jiang, ira.weiny, kbusch, hch, sagi
Cc: nvdimm, linux-kernel, linux-nvme, linux-block, linux-mtd,
linuxppc-dev
In-Reply-To: <20211015235219.2191207-1-mcgrof@kernel.org>
Hi Luis,
On 10/15/21 4:52 PM, Luis Chamberlain wrote:
> This patch set consists of al the straggler drivers for which we have
> have no patch reviews done for yet. I'd like to ask for folks to please
> consider chiming in, specially if you're the maintainer for the driver.
> Additionally if you can specify if you'll take the patch in yourself or
> if you want Jens to take it, that'd be great too.
Do you have a git repo with the patch set applied that I can use to test with?
Thanks.
-Geoff
^ permalink raw reply
* [RFC PATCH] lkdtm: Replace lkdtm_rodata_do_nothing() by do_nothing()
From: Christophe Leroy @ 2021-10-17 17:19 UTC (permalink / raw)
To: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
Andrew Morton, James E.J. Bottomley, Helge Deller, Arnd Bergmann,
Kees Cook, Greg Kroah-Hartman
Cc: linux-arch, linux-ia64, linux-parisc, linux-kernel, linux-mm,
linuxppc-dev
All EXEC tests are based on running a copy of do_nothing()
except lkdtm_EXEC_RODATA which uses a different function
called lkdtm_rodata_do_nothing().
On architectures using function descriptors, EXEC tests are
performed using execute_location() which is a function
that most of the time copies do_nothing() at the tested
location then duplicates do_nothing() function descriptor
and updates it with the address of the copy of do_nothing().
But for EXEC_RODATA test, execute_location() uses
lkdtm_rodata_do_nothing() which is already in rodata section
at build time instead of using a copy of do_nothing(). However
it still uses the function descriptor of do_nothing(). There
is a risk that running lkdtm_rodata_do_nothing() with the
function descriptor of do_thing() is wrong.
To remove the above risk, change the approach and do the same
as for other EXEC tests: use a copy of do_nothing(). The copy
cannot be done during the test because RODATA area is write
protected. Do the copy during init, before RODATA becomes
write protected.
Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
---
This applies on top of series v3 "Fix LKDTM for PPC64/IA64/PARISC"
drivers/misc/lkdtm/Makefile | 11 -----------
drivers/misc/lkdtm/lkdtm.h | 3 ---
drivers/misc/lkdtm/perms.c | 9 +++++++--
drivers/misc/lkdtm/rodata.c | 11 -----------
4 files changed, 7 insertions(+), 27 deletions(-)
delete mode 100644 drivers/misc/lkdtm/rodata.c
diff --git a/drivers/misc/lkdtm/Makefile b/drivers/misc/lkdtm/Makefile
index e2984ce51fe4..3d45a2b3007d 100644
--- a/drivers/misc/lkdtm/Makefile
+++ b/drivers/misc/lkdtm/Makefile
@@ -6,21 +6,10 @@ lkdtm-$(CONFIG_LKDTM) += bugs.o
lkdtm-$(CONFIG_LKDTM) += heap.o
lkdtm-$(CONFIG_LKDTM) += perms.o
lkdtm-$(CONFIG_LKDTM) += refcount.o
-lkdtm-$(CONFIG_LKDTM) += rodata_objcopy.o
lkdtm-$(CONFIG_LKDTM) += usercopy.o
lkdtm-$(CONFIG_LKDTM) += stackleak.o
lkdtm-$(CONFIG_LKDTM) += cfi.o
lkdtm-$(CONFIG_LKDTM) += fortify.o
lkdtm-$(CONFIG_PPC_BOOK3S_64) += powerpc.o
-KASAN_SANITIZE_rodata.o := n
KASAN_SANITIZE_stackleak.o := n
-KCOV_INSTRUMENT_rodata.o := n
-CFLAGS_REMOVE_rodata.o += $(CC_FLAGS_LTO)
-
-OBJCOPYFLAGS :=
-OBJCOPYFLAGS_rodata_objcopy.o := \
- --rename-section .noinstr.text=.rodata,alloc,readonly,load,contents
-targets += rodata.o rodata_objcopy.o
-$(obj)/rodata_objcopy.o: $(obj)/rodata.o FORCE
- $(call if_changed,objcopy)
diff --git a/drivers/misc/lkdtm/lkdtm.h b/drivers/misc/lkdtm/lkdtm.h
index 188bd0fd6575..905555d4c2cf 100644
--- a/drivers/misc/lkdtm/lkdtm.h
+++ b/drivers/misc/lkdtm/lkdtm.h
@@ -137,9 +137,6 @@ void lkdtm_REFCOUNT_SUB_AND_TEST_SATURATED(void);
void lkdtm_REFCOUNT_TIMING(void);
void lkdtm_ATOMIC_TIMING(void);
-/* rodata.c */
-void lkdtm_rodata_do_nothing(void);
-
/* usercopy.c */
void __init lkdtm_usercopy_init(void);
void __exit lkdtm_usercopy_exit(void);
diff --git a/drivers/misc/lkdtm/perms.c b/drivers/misc/lkdtm/perms.c
index 2c6aba3ff32b..9b951ca48363 100644
--- a/drivers/misc/lkdtm/perms.c
+++ b/drivers/misc/lkdtm/perms.c
@@ -27,6 +27,7 @@ static const unsigned long rodata = 0xAA55AA55;
/* This is marked __ro_after_init, so it should ultimately be .rodata. */
static unsigned long ro_after_init __ro_after_init = 0x55AA5500;
+static u8 rodata_area[EXEC_SIZE] __ro_after_init;
/*
* This just returns to the caller. It is designed to be copied into
@@ -193,8 +194,7 @@ void lkdtm_EXEC_VMALLOC(void)
void lkdtm_EXEC_RODATA(void)
{
- execute_location(dereference_function_descriptor(lkdtm_rodata_do_nothing),
- CODE_AS_IS);
+ execute_location(rodata_area, CODE_AS_IS);
}
void lkdtm_EXEC_USERSPACE(void)
@@ -269,4 +269,9 @@ void __init lkdtm_perms_init(void)
{
/* Make sure we can write to __ro_after_init values during __init */
ro_after_init |= 0xAA;
+
+ memcpy(rodata_area, dereference_function_descriptor(do_nothing),
+ EXEC_SIZE);
+ flush_icache_range((unsigned long)rodata_area,
+ (unsigned long)rodata_area + EXEC_SIZE);
}
diff --git a/drivers/misc/lkdtm/rodata.c b/drivers/misc/lkdtm/rodata.c
deleted file mode 100644
index baacb876d1d9..000000000000
--- a/drivers/misc/lkdtm/rodata.c
+++ /dev/null
@@ -1,11 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * This includes functions that are meant to live entirely in .rodata
- * (via objcopy tricks), to validate the non-executability of .rodata.
- */
-#include "lkdtm.h"
-
-void noinstr lkdtm_rodata_do_nothing(void)
-{
- /* Does nothing. We just want an architecture agnostic "return". */
-}
--
2.31.1
^ permalink raw reply related
* [powerpc:fixes-test] BUILD SUCCESS 6c44be1b8e2d8c0161ac39d5d39ea4dff39da71c
From: kernel test robot @ 2021-10-18 1:16 UTC (permalink / raw)
To: Michael Ellerman; +Cc: linuxppc-dev
tree/branch: https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git fixes-test
branch HEAD: 6c44be1b8e2d8c0161ac39d5d39ea4dff39da71c powerpc/smp: do not decrement idle task preempt count in CPU offline
elapsed time: 2077m
configs tested: 233
configs skipped: 111
The following configs have been built successfully.
More configs may be tested in the coming days.
gcc tested configs:
arm defconfig
arm64 allyesconfig
arm64 defconfig
arm allyesconfig
arm allmodconfig
h8300 h8s-sim_defconfig
arc haps_hs_smp_defconfig
powerpc tqm5200_defconfig
sh sh03_defconfig
sh sh7785lcr_32bit_defconfig
arm axm55xx_defconfig
sh landisk_defconfig
arm tegra_defconfig
arm oxnas_v6_defconfig
arm orion5x_defconfig
arm imx_v4_v5_defconfig
arm corgi_defconfig
xtensa xip_kc705_defconfig
csky alldefconfig
sh sh7770_generic_defconfig
powerpc ppc40x_defconfig
sh defconfig
riscv alldefconfig
mips maltaup_defconfig
arm collie_defconfig
sparc defconfig
riscv nommu_k210_defconfig
nios2 10m50_defconfig
mips rb532_defconfig
arc axs103_defconfig
nds32 defconfig
arm pxa255-idp_defconfig
powerpc stx_gp3_defconfig
mips cobalt_defconfig
powerpc ebony_defconfig
s390 alldefconfig
sh dreamcast_defconfig
openrisc simple_smp_defconfig
powerpc allnoconfig
arm h5000_defconfig
arm multi_v4t_defconfig
arm multi_v7_defconfig
sh edosk7705_defconfig
sh sdk7786_defconfig
m68k bvme6000_defconfig
arm am200epdkit_defconfig
powerpc chrp32_defconfig
sh rsk7264_defconfig
arm mmp2_defconfig
m68k amcore_defconfig
sparc64 alldefconfig
xtensa nommu_kc705_defconfig
mips loongson1b_defconfig
mips xway_defconfig
ia64 generic_defconfig
mips workpad_defconfig
powerpc xes_mpc85xx_defconfig
powerpc ppc6xx_defconfig
h8300 defconfig
ia64 gensparse_defconfig
powerpc tqm8541_defconfig
arm pxa3xx_defconfig
powerpc mpc8540_ads_defconfig
sh se7780_defconfig
arc haps_hs_defconfig
arm keystone_defconfig
arm colibri_pxa270_defconfig
arm moxart_defconfig
m68k m5307c3_defconfig
m68k sun3x_defconfig
powerpc sequoia_defconfig
sh ap325rxa_defconfig
sh se7751_defconfig
m68k m5272c3_defconfig
arm viper_defconfig
sparc64 defconfig
riscv allnoconfig
mips e55_defconfig
powerpc kmeter1_defconfig
powerpc allyesconfig
powerpc adder875_defconfig
nds32 allnoconfig
arm mxs_defconfig
ia64 tiger_defconfig
powerpc mpc836x_rdk_defconfig
arm hackkit_defconfig
powerpc mpc8560_ads_defconfig
mips cu1000-neo_defconfig
m68k sun3_defconfig
m68k hp300_defconfig
powerpc bluestone_defconfig
powerpc mvme5100_defconfig
arm ep93xx_defconfig
s390 debug_defconfig
nios2 3c120_defconfig
mips malta_qemu_32r6_defconfig
arc vdk_hs38_smp_defconfig
arm hisi_defconfig
arc tb10x_defconfig
powerpc sam440ep_defconfig
sh kfr2r09-romimage_defconfig
powerpc powernv_defconfig
arc axs103_smp_defconfig
mips rm200_defconfig
x86_64 defconfig
h8300 allyesconfig
powerpc ge_imp3a_defconfig
powerpc linkstation_defconfig
ia64 zx1_defconfig
sh lboxre2_defconfig
powerpc pcm030_defconfig
powerpc microwatt_defconfig
alpha defconfig
sh shmin_defconfig
arm zeus_defconfig
arm s5pv210_defconfig
mips allmodconfig
m68k defconfig
powerpc ep8248e_defconfig
sh magicpanelr2_defconfig
ia64 defconfig
powerpc rainier_defconfig
powerpc holly_defconfig
mips nlm_xlr_defconfig
powerpc ksi8560_defconfig
arm pxa910_defconfig
riscv defconfig
microblaze mmu_defconfig
s390 zfcpdump_defconfig
mips loongson2k_defconfig
mips malta_kvm_defconfig
arm stm32_defconfig
powerpc mpc836x_mds_defconfig
sh kfr2r09_defconfig
powerpc mpc5200_defconfig
powerpc arches_defconfig
powerpc storcenter_defconfig
arm cerfcube_defconfig
arm assabet_defconfig
arm pcm027_defconfig
sh microdev_defconfig
powerpc taishan_defconfig
powerpc mpc512x_defconfig
powerpc mpc834x_mds_defconfig
sh sh7757lcr_defconfig
powerpc asp8347_defconfig
sparc sparc64_defconfig
mips decstation_defconfig
powerpc gamecube_defconfig
mips ip32_defconfig
mips gpr_defconfig
powerpc ep88xc_defconfig
arm shannon_defconfig
arm cm_x300_defconfig
sh titan_defconfig
m68k multi_defconfig
mips gcw0_defconfig
powerpc iss476-smp_defconfig
sh edosk7760_defconfig
sh sh7763rdp_defconfig
arm u8500_defconfig
powerpc mpc866_ads_defconfig
arc nsimosci_hs_smp_defconfig
powerpc mpc837x_rdb_defconfig
powerpc tqm8xx_defconfig
arm mainstone_defconfig
sh r7785rp_defconfig
arm randconfig-c002-20211017
i386 randconfig-c001-20211017
x86_64 randconfig-c001-20211017
ia64 allmodconfig
ia64 allyesconfig
nios2 defconfig
arc allyesconfig
nios2 allyesconfig
csky defconfig
alpha allyesconfig
arc defconfig
sh allmodconfig
parisc defconfig
s390 defconfig
parisc allyesconfig
sparc allyesconfig
i386 defconfig
i386 allyesconfig
mips allyesconfig
powerpc allmodconfig
x86_64 randconfig-a006-20211016
x86_64 randconfig-a004-20211016
x86_64 randconfig-a001-20211016
x86_64 randconfig-a005-20211016
x86_64 randconfig-a002-20211016
x86_64 randconfig-a003-20211016
x86_64 randconfig-a012-20211017
x86_64 randconfig-a015-20211017
x86_64 randconfig-a016-20211017
x86_64 randconfig-a014-20211017
x86_64 randconfig-a011-20211017
x86_64 randconfig-a013-20211017
i386 randconfig-a016-20211017
i386 randconfig-a014-20211017
i386 randconfig-a011-20211017
i386 randconfig-a015-20211017
i386 randconfig-a012-20211017
i386 randconfig-a013-20211017
riscv nommu_virt_defconfig
riscv rv32_defconfig
riscv allyesconfig
riscv allmodconfig
um x86_64_defconfig
um i386_defconfig
x86_64 rhel-8.3-kselftests
x86_64 rhel-8.3
x86_64 kexec
clang tested configs:
mips randconfig-c004-20211017
arm randconfig-c002-20211017
i386 randconfig-c001-20211017
s390 randconfig-c005-20211017
x86_64 randconfig-c007-20211017
powerpc randconfig-c003-20211017
riscv randconfig-c006-20211017
x86_64 randconfig-a006-20211017
x86_64 randconfig-a004-20211017
x86_64 randconfig-a001-20211017
x86_64 randconfig-a005-20211017
x86_64 randconfig-a002-20211017
x86_64 randconfig-a003-20211017
i386 randconfig-a003-20211017
i386 randconfig-a001-20211017
i386 randconfig-a005-20211017
i386 randconfig-a004-20211017
i386 randconfig-a002-20211017
i386 randconfig-a006-20211017
hexagon randconfig-r041-20211017
hexagon randconfig-r045-20211017
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
^ permalink raw reply
* [powerpc:fixes] BUILD SUCCESS cdeb5d7d890e14f3b70e8087e745c4a6a7d9f337
From: kernel test robot @ 2021-10-18 1:16 UTC (permalink / raw)
To: Michael Ellerman; +Cc: linuxppc-dev
tree/branch: https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git fixes
branch HEAD: cdeb5d7d890e14f3b70e8087e745c4a6a7d9f337 KVM: PPC: Book3S HV: Make idle_kvm_start_guest() return 0 if it went to guest
elapsed time: 2078m
configs tested: 233
configs skipped: 122
The following configs have been built successfully.
More configs may be tested in the coming days.
gcc tested configs:
arm defconfig
arm64 allyesconfig
arm64 defconfig
arm allyesconfig
arm allmodconfig
h8300 h8s-sim_defconfig
arc haps_hs_smp_defconfig
powerpc tqm5200_defconfig
sh sh03_defconfig
sh sh7785lcr_32bit_defconfig
arm axm55xx_defconfig
sh landisk_defconfig
arm tegra_defconfig
arm oxnas_v6_defconfig
arm orion5x_defconfig
arm imx_v4_v5_defconfig
arm corgi_defconfig
xtensa xip_kc705_defconfig
csky alldefconfig
sh sh7770_generic_defconfig
powerpc ppc40x_defconfig
sh defconfig
riscv alldefconfig
mips maltaup_defconfig
arm collie_defconfig
sparc defconfig
riscv nommu_k210_defconfig
nios2 10m50_defconfig
mips rb532_defconfig
arc axs103_defconfig
nds32 defconfig
arm pxa255-idp_defconfig
powerpc stx_gp3_defconfig
mips cobalt_defconfig
powerpc ebony_defconfig
s390 alldefconfig
sh dreamcast_defconfig
openrisc simple_smp_defconfig
powerpc allnoconfig
arm h5000_defconfig
arm multi_v4t_defconfig
arm multi_v7_defconfig
sh edosk7705_defconfig
sh sdk7786_defconfig
m68k bvme6000_defconfig
arm am200epdkit_defconfig
powerpc chrp32_defconfig
sh rsk7264_defconfig
arm mmp2_defconfig
m68k amcore_defconfig
sparc64 alldefconfig
xtensa nommu_kc705_defconfig
mips loongson1b_defconfig
mips xway_defconfig
ia64 generic_defconfig
mips workpad_defconfig
powerpc xes_mpc85xx_defconfig
powerpc ppc6xx_defconfig
h8300 defconfig
ia64 gensparse_defconfig
powerpc tqm8541_defconfig
arm pxa3xx_defconfig
powerpc mpc8540_ads_defconfig
sh se7780_defconfig
arc haps_hs_defconfig
arm keystone_defconfig
arm colibri_pxa270_defconfig
arm moxart_defconfig
m68k m5307c3_defconfig
m68k sun3x_defconfig
powerpc sequoia_defconfig
sh ap325rxa_defconfig
sh se7751_defconfig
m68k m5272c3_defconfig
arm viper_defconfig
sparc64 defconfig
riscv allnoconfig
mips e55_defconfig
powerpc kmeter1_defconfig
powerpc allyesconfig
powerpc adder875_defconfig
nds32 allnoconfig
arm mxs_defconfig
ia64 tiger_defconfig
powerpc mpc836x_rdk_defconfig
arm hackkit_defconfig
powerpc mpc8560_ads_defconfig
mips cu1000-neo_defconfig
m68k sun3_defconfig
m68k hp300_defconfig
powerpc bluestone_defconfig
powerpc mvme5100_defconfig
arm ep93xx_defconfig
s390 debug_defconfig
nios2 3c120_defconfig
mips malta_qemu_32r6_defconfig
arc vdk_hs38_smp_defconfig
arm hisi_defconfig
arc tb10x_defconfig
powerpc sam440ep_defconfig
sh kfr2r09-romimage_defconfig
powerpc powernv_defconfig
arc axs103_smp_defconfig
mips rm200_defconfig
x86_64 defconfig
h8300 allyesconfig
powerpc ge_imp3a_defconfig
powerpc linkstation_defconfig
ia64 zx1_defconfig
sh lboxre2_defconfig
powerpc pcm030_defconfig
powerpc microwatt_defconfig
alpha defconfig
sh shmin_defconfig
arm zeus_defconfig
arm s5pv210_defconfig
mips allmodconfig
m68k defconfig
powerpc ep8248e_defconfig
sh magicpanelr2_defconfig
ia64 defconfig
powerpc rainier_defconfig
powerpc holly_defconfig
mips nlm_xlr_defconfig
powerpc ksi8560_defconfig
arm pxa910_defconfig
riscv defconfig
microblaze mmu_defconfig
s390 zfcpdump_defconfig
mips loongson2k_defconfig
mips malta_kvm_defconfig
arm stm32_defconfig
powerpc mpc836x_mds_defconfig
sh kfr2r09_defconfig
powerpc mpc5200_defconfig
powerpc arches_defconfig
powerpc storcenter_defconfig
arm cerfcube_defconfig
arm assabet_defconfig
arm pcm027_defconfig
sh microdev_defconfig
powerpc taishan_defconfig
powerpc mpc512x_defconfig
powerpc mpc834x_mds_defconfig
sh sh7757lcr_defconfig
powerpc asp8347_defconfig
sparc sparc64_defconfig
mips decstation_defconfig
powerpc gamecube_defconfig
mips ip32_defconfig
mips gpr_defconfig
powerpc ep88xc_defconfig
arm shannon_defconfig
arm cm_x300_defconfig
sh titan_defconfig
m68k multi_defconfig
mips gcw0_defconfig
powerpc iss476-smp_defconfig
sh edosk7760_defconfig
sh sh7763rdp_defconfig
arm u8500_defconfig
powerpc mpc866_ads_defconfig
arc nsimosci_hs_smp_defconfig
powerpc mpc837x_rdb_defconfig
powerpc tqm8xx_defconfig
arm mainstone_defconfig
sh r7785rp_defconfig
arm randconfig-c002-20211017
i386 randconfig-c001-20211017
x86_64 randconfig-c001-20211017
ia64 allmodconfig
ia64 allyesconfig
nios2 defconfig
arc allyesconfig
nios2 allyesconfig
csky defconfig
alpha allyesconfig
arc defconfig
sh allmodconfig
parisc defconfig
s390 defconfig
parisc allyesconfig
sparc allyesconfig
i386 defconfig
i386 allyesconfig
mips allyesconfig
powerpc allmodconfig
x86_64 randconfig-a006-20211016
x86_64 randconfig-a004-20211016
x86_64 randconfig-a001-20211016
x86_64 randconfig-a005-20211016
x86_64 randconfig-a002-20211016
x86_64 randconfig-a003-20211016
x86_64 randconfig-a012-20211017
x86_64 randconfig-a015-20211017
x86_64 randconfig-a016-20211017
x86_64 randconfig-a014-20211017
x86_64 randconfig-a011-20211017
x86_64 randconfig-a013-20211017
i386 randconfig-a016-20211017
i386 randconfig-a014-20211017
i386 randconfig-a011-20211017
i386 randconfig-a015-20211017
i386 randconfig-a012-20211017
i386 randconfig-a013-20211017
riscv nommu_virt_defconfig
riscv rv32_defconfig
riscv allyesconfig
riscv allmodconfig
um x86_64_defconfig
um i386_defconfig
x86_64 rhel-8.3-kselftests
x86_64 rhel-8.3
x86_64 kexec
clang tested configs:
mips randconfig-c004-20211017
arm randconfig-c002-20211017
i386 randconfig-c001-20211017
s390 randconfig-c005-20211017
x86_64 randconfig-c007-20211017
powerpc randconfig-c003-20211017
riscv randconfig-c006-20211017
x86_64 randconfig-a006-20211017
x86_64 randconfig-a004-20211017
x86_64 randconfig-a001-20211017
x86_64 randconfig-a005-20211017
x86_64 randconfig-a002-20211017
x86_64 randconfig-a003-20211017
i386 randconfig-a003-20211017
i386 randconfig-a001-20211017
i386 randconfig-a005-20211017
i386 randconfig-a004-20211017
i386 randconfig-a002-20211017
i386 randconfig-a006-20211017
hexagon randconfig-r041-20211017
hexagon randconfig-r045-20211017
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
^ permalink raw reply
* [powerpc:merge] BUILD SUCCESS ec39a6fbda87af02313146b0c951342749e507af
From: kernel test robot @ 2021-10-18 1:16 UTC (permalink / raw)
To: Michael Ellerman; +Cc: linuxppc-dev
tree/branch: https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git merge
branch HEAD: ec39a6fbda87af02313146b0c951342749e507af Automatic merge of 'next' into merge (2021-10-17 23:24)
elapsed time: 721m
configs tested: 173
configs skipped: 21
The following configs have been built successfully.
More configs may be tested in the coming days.
gcc tested configs:
arm defconfig
arm64 allyesconfig
arm64 defconfig
arm allyesconfig
arm allmodconfig
h8300 h8s-sim_defconfig
arc haps_hs_smp_defconfig
powerpc tqm5200_defconfig
sh sh03_defconfig
sh sh7785lcr_32bit_defconfig
arm imx_v4_v5_defconfig
arm corgi_defconfig
xtensa xip_kc705_defconfig
csky alldefconfig
sh sh7770_generic_defconfig
powerpc ppc40x_defconfig
arm h5000_defconfig
arm multi_v4t_defconfig
arm multi_v7_defconfig
sh edosk7705_defconfig
arc axs103_defconfig
powerpc chrp32_defconfig
sh sdk7786_defconfig
m68k bvme6000_defconfig
arm am200epdkit_defconfig
sh rsk7264_defconfig
arm mmp2_defconfig
m68k amcore_defconfig
sparc64 alldefconfig
xtensa nommu_kc705_defconfig
powerpc tqm8541_defconfig
arm pxa3xx_defconfig
powerpc mpc8540_ads_defconfig
sh se7780_defconfig
arm moxart_defconfig
m68k m5307c3_defconfig
m68k sun3x_defconfig
powerpc sequoia_defconfig
um i386_defconfig
powerpc allyesconfig
sparc64 defconfig
riscv allnoconfig
mips e55_defconfig
powerpc kmeter1_defconfig
powerpc mpc836x_rdk_defconfig
arm hackkit_defconfig
powerpc mpc8560_ads_defconfig
mips cu1000-neo_defconfig
m68k sun3_defconfig
s390 debug_defconfig
nios2 3c120_defconfig
mips malta_qemu_32r6_defconfig
arc vdk_hs38_smp_defconfig
arm hisi_defconfig
arc tb10x_defconfig
powerpc sam440ep_defconfig
sh kfr2r09-romimage_defconfig
powerpc powernv_defconfig
arc axs103_smp_defconfig
mips rm200_defconfig
x86_64 defconfig
h8300 allyesconfig
powerpc ge_imp3a_defconfig
powerpc linkstation_defconfig
ia64 zx1_defconfig
sh lboxre2_defconfig
powerpc pcm030_defconfig
powerpc microwatt_defconfig
alpha defconfig
sh shmin_defconfig
arm zeus_defconfig
arm s5pv210_defconfig
ia64 defconfig
powerpc rainier_defconfig
powerpc holly_defconfig
mips nlm_xlr_defconfig
powerpc ksi8560_defconfig
arm pxa910_defconfig
s390 zfcpdump_defconfig
mips loongson2k_defconfig
mips malta_kvm_defconfig
arm stm32_defconfig
powerpc mpc836x_mds_defconfig
sh microdev_defconfig
powerpc taishan_defconfig
powerpc mpc512x_defconfig
powerpc mpc834x_mds_defconfig
sh sh7757lcr_defconfig
powerpc allnoconfig
powerpc ep88xc_defconfig
arm shannon_defconfig
arm cm_x300_defconfig
nios2 10m50_defconfig
sh titan_defconfig
m68k multi_defconfig
sh edosk7760_defconfig
sh sh7763rdp_defconfig
arm u8500_defconfig
powerpc tqm8xx_defconfig
arm mainstone_defconfig
sh r7785rp_defconfig
arm randconfig-c002-20211017
i386 randconfig-c001-20211017
x86_64 randconfig-c001-20211017
ia64 allmodconfig
ia64 allyesconfig
m68k defconfig
nds32 defconfig
csky defconfig
alpha allyesconfig
nios2 allyesconfig
arc defconfig
sh allmodconfig
parisc defconfig
parisc allyesconfig
s390 defconfig
s390 allyesconfig
s390 allmodconfig
sparc allyesconfig
sparc defconfig
i386 defconfig
i386 allyesconfig
nios2 defconfig
nds32 allnoconfig
arc allyesconfig
mips allyesconfig
mips allmodconfig
powerpc allmodconfig
x86_64 randconfig-a015-20211017
x86_64 randconfig-a016-20211017
x86_64 randconfig-a012-20211017
x86_64 randconfig-a014-20211017
x86_64 randconfig-a011-20211017
x86_64 randconfig-a013-20211017
i386 randconfig-a016-20211017
i386 randconfig-a014-20211017
i386 randconfig-a011-20211017
i386 randconfig-a015-20211017
i386 randconfig-a012-20211017
i386 randconfig-a013-20211017
arc randconfig-r043-20211017
s390 randconfig-r044-20211017
riscv randconfig-r042-20211017
riscv nommu_k210_defconfig
riscv nommu_virt_defconfig
riscv defconfig
riscv rv32_defconfig
riscv allyesconfig
riscv allmodconfig
um x86_64_defconfig
x86_64 rhel-8.3-kselftests
x86_64 rhel-8.3
x86_64 kexec
x86_64 allyesconfig
clang tested configs:
mips randconfig-c004-20211017
arm randconfig-c002-20211017
i386 randconfig-c001-20211017
s390 randconfig-c005-20211017
x86_64 randconfig-c007-20211017
powerpc randconfig-c003-20211017
riscv randconfig-c006-20211017
x86_64 randconfig-a006-20211017
x86_64 randconfig-a004-20211017
x86_64 randconfig-a001-20211017
x86_64 randconfig-a005-20211017
x86_64 randconfig-a002-20211017
x86_64 randconfig-a003-20211017
i386 randconfig-a003-20211017
i386 randconfig-a001-20211017
i386 randconfig-a005-20211017
i386 randconfig-a004-20211017
i386 randconfig-a002-20211017
i386 randconfig-a006-20211017
hexagon randconfig-r041-20211017
hexagon randconfig-r045-20211017
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
^ permalink raw reply
* [powerpc:next-test] BUILD SUCCESS 84bd5be941806ec9d18a071efa093efc244a3dd9
From: kernel test robot @ 2021-10-18 1:17 UTC (permalink / raw)
To: Michael Ellerman; +Cc: linuxppc-dev
tree/branch: https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next-test
branch HEAD: 84bd5be941806ec9d18a071efa093efc244a3dd9 powerpc/pseries/iommu: Add of_node_put() before break
elapsed time: 2073m
configs tested: 270
configs skipped: 5
The following configs have been built successfully.
More configs may be tested in the coming days.
gcc tested configs:
arm defconfig
arm64 allyesconfig
arm64 defconfig
arm allyesconfig
arm allmodconfig
h8300 h8s-sim_defconfig
arc haps_hs_smp_defconfig
powerpc tqm5200_defconfig
sh sh03_defconfig
sh sh7785lcr_32bit_defconfig
arm axm55xx_defconfig
sh landisk_defconfig
arm tegra_defconfig
arm oxnas_v6_defconfig
arm orion5x_defconfig
arm imx_v4_v5_defconfig
arm corgi_defconfig
xtensa xip_kc705_defconfig
csky alldefconfig
sh sh7770_generic_defconfig
powerpc ppc40x_defconfig
sh defconfig
riscv alldefconfig
mips maltaup_defconfig
arm collie_defconfig
sparc defconfig
riscv nommu_k210_defconfig
nios2 10m50_defconfig
mips rb532_defconfig
arc axs103_defconfig
powerpc ebony_defconfig
s390 alldefconfig
sh dreamcast_defconfig
openrisc simple_smp_defconfig
powerpc allnoconfig
arm h5000_defconfig
arm multi_v4t_defconfig
arm multi_v7_defconfig
sh edosk7705_defconfig
sh sdk7786_defconfig
m68k bvme6000_defconfig
arm am200epdkit_defconfig
powerpc chrp32_defconfig
sh rsk7264_defconfig
arm mmp2_defconfig
m68k amcore_defconfig
sparc64 alldefconfig
xtensa nommu_kc705_defconfig
mips loongson1b_defconfig
mips xway_defconfig
ia64 generic_defconfig
mips workpad_defconfig
powerpc xes_mpc85xx_defconfig
powerpc ppc6xx_defconfig
h8300 defconfig
ia64 gensparse_defconfig
powerpc tqm8541_defconfig
arm pxa3xx_defconfig
powerpc mpc8540_ads_defconfig
sh se7780_defconfig
powerpc pcm030_defconfig
powerpc klondike_defconfig
sh se7712_defconfig
sh apsh4ad0a_defconfig
arm ep93xx_defconfig
arc haps_hs_defconfig
arm keystone_defconfig
arm colibri_pxa270_defconfig
arm moxart_defconfig
m68k m5307c3_defconfig
m68k sun3x_defconfig
powerpc sequoia_defconfig
um i386_defconfig
sh ap325rxa_defconfig
sh se7751_defconfig
m68k m5272c3_defconfig
arm viper_defconfig
sparc64 defconfig
riscv allnoconfig
mips e55_defconfig
powerpc kmeter1_defconfig
powerpc allyesconfig
powerpc adder875_defconfig
nds32 allnoconfig
arm mxs_defconfig
ia64 tiger_defconfig
powerpc mpc836x_rdk_defconfig
arm hackkit_defconfig
powerpc mpc8560_ads_defconfig
mips cu1000-neo_defconfig
m68k sun3_defconfig
m68k hp300_defconfig
powerpc bluestone_defconfig
powerpc mvme5100_defconfig
s390 debug_defconfig
nios2 3c120_defconfig
mips malta_qemu_32r6_defconfig
arc vdk_hs38_smp_defconfig
arm hisi_defconfig
arc tb10x_defconfig
powerpc sam440ep_defconfig
sh kfr2r09-romimage_defconfig
powerpc powernv_defconfig
arc axs103_smp_defconfig
mips rm200_defconfig
x86_64 defconfig
h8300 allyesconfig
powerpc ge_imp3a_defconfig
powerpc linkstation_defconfig
ia64 zx1_defconfig
sh lboxre2_defconfig
powerpc microwatt_defconfig
alpha defconfig
sh shmin_defconfig
sh se7206_defconfig
um x86_64_defconfig
arm mvebu_v5_defconfig
arm lubbock_defconfig
microblaze mmu_defconfig
arm zeus_defconfig
arm s5pv210_defconfig
mips allmodconfig
m68k defconfig
powerpc ep8248e_defconfig
sh magicpanelr2_defconfig
ia64 defconfig
powerpc rainier_defconfig
powerpc holly_defconfig
mips nlm_xlr_defconfig
powerpc ksi8560_defconfig
arm pxa910_defconfig
powerpc pq2fads_defconfig
powerpc bamboo_defconfig
powerpc pseries_defconfig
riscv allmodconfig
riscv defconfig
s390 zfcpdump_defconfig
mips loongson2k_defconfig
mips malta_kvm_defconfig
arm stm32_defconfig
powerpc mpc836x_mds_defconfig
sh kfr2r09_defconfig
powerpc mpc5200_defconfig
powerpc arches_defconfig
powerpc storcenter_defconfig
arm cerfcube_defconfig
arm assabet_defconfig
arm pcm027_defconfig
sh microdev_defconfig
powerpc taishan_defconfig
powerpc mpc512x_defconfig
powerpc mpc834x_mds_defconfig
sh sh7757lcr_defconfig
powerpc asp8347_defconfig
sparc sparc64_defconfig
mips decstation_defconfig
powerpc gamecube_defconfig
mips ip32_defconfig
mips gpr_defconfig
powerpc ep88xc_defconfig
sh se7724_defconfig
openrisc defconfig
mips omega2p_defconfig
arc nsim_700_defconfig
arm trizeps4_defconfig
arm shannon_defconfig
arm cm_x300_defconfig
sh titan_defconfig
m68k multi_defconfig
mips gcw0_defconfig
powerpc iss476-smp_defconfig
sh edosk7760_defconfig
sh sh7763rdp_defconfig
arm u8500_defconfig
powerpc mpc866_ads_defconfig
arc nsimosci_hs_smp_defconfig
powerpc mpc837x_rdb_defconfig
powerpc tqm8xx_defconfig
arm mainstone_defconfig
sh r7785rp_defconfig
arm randconfig-c002-20211017
i386 randconfig-c001-20211017
x86_64 randconfig-c001-20211017
ia64 allmodconfig
ia64 allyesconfig
m68k allmodconfig
m68k allyesconfig
nios2 defconfig
arc allyesconfig
nds32 defconfig
nios2 allyesconfig
csky defconfig
alpha allyesconfig
arc defconfig
sh allmodconfig
xtensa allyesconfig
parisc defconfig
s390 defconfig
parisc allyesconfig
s390 allyesconfig
s390 allmodconfig
sparc allyesconfig
i386 defconfig
i386 allyesconfig
mips allyesconfig
powerpc allmodconfig
x86_64 randconfig-a006-20211016
x86_64 randconfig-a004-20211016
x86_64 randconfig-a001-20211016
x86_64 randconfig-a005-20211016
x86_64 randconfig-a002-20211016
x86_64 randconfig-a003-20211016
x86_64 randconfig-a012-20211017
x86_64 randconfig-a015-20211017
x86_64 randconfig-a016-20211017
x86_64 randconfig-a014-20211017
x86_64 randconfig-a011-20211017
x86_64 randconfig-a013-20211017
i386 randconfig-a016-20211017
i386 randconfig-a014-20211017
i386 randconfig-a011-20211017
i386 randconfig-a015-20211017
i386 randconfig-a012-20211017
i386 randconfig-a013-20211017
arc randconfig-r043-20211017
s390 randconfig-r044-20211017
riscv randconfig-r042-20211017
arc randconfig-r043-20211016
riscv nommu_virt_defconfig
riscv rv32_defconfig
riscv allyesconfig
x86_64 rhel-8.3-kselftests
x86_64 rhel-8.3
x86_64 kexec
x86_64 allyesconfig
clang tested configs:
mips randconfig-c004-20211017
arm randconfig-c002-20211017
i386 randconfig-c001-20211017
s390 randconfig-c005-20211017
x86_64 randconfig-c007-20211017
powerpc randconfig-c003-20211017
riscv randconfig-c006-20211017
x86_64 randconfig-a006-20211017
x86_64 randconfig-a004-20211017
x86_64 randconfig-a001-20211017
x86_64 randconfig-a005-20211017
x86_64 randconfig-a002-20211017
x86_64 randconfig-a003-20211017
i386 randconfig-a003-20211017
i386 randconfig-a001-20211017
i386 randconfig-a005-20211017
i386 randconfig-a004-20211017
i386 randconfig-a002-20211017
i386 randconfig-a006-20211017
x86_64 randconfig-a012-20211016
x86_64 randconfig-a015-20211016
x86_64 randconfig-a016-20211016
x86_64 randconfig-a014-20211016
x86_64 randconfig-a011-20211016
x86_64 randconfig-a013-20211016
i386 randconfig-a016-20211016
i386 randconfig-a014-20211016
i386 randconfig-a011-20211016
i386 randconfig-a015-20211016
i386 randconfig-a012-20211016
i386 randconfig-a013-20211016
hexagon randconfig-r041-20211017
hexagon randconfig-r045-20211017
hexagon randconfig-r041-20211016
s390 randconfig-r044-20211016
riscv randconfig-r042-20211016
hexagon randconfig-r045-20211016
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
^ permalink raw reply
* [PATCH] powerpc/kexec_file: Add of_node_put() before goto
From: Wan Jiabing @ 2021-10-18 1:54 UTC (permalink / raw)
To: Michael Ellerman, Benjamin Herrenschmidt, Paul Mackerras,
Rob Herring, Thiago Jung Bauermann, Lakshmi Ramasubramanian,
Hari Bathini, Wan Jiabing, Sourabh Jain, linuxppc-dev,
linux-kernel
Cc: kael_w
Fix following coccicheck warning:
./arch/powerpc/kexec/file_load_64.c:698:1-22: WARNING: Function
for_each_node_by_type should have of_node_put() before goto
Early exits from for_each_node_by_type should decrement the
node reference counter.
Signed-off-by: Wan Jiabing <wanjiabing@vivo.com>
---
arch/powerpc/kexec/file_load_64.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/arch/powerpc/kexec/file_load_64.c b/arch/powerpc/kexec/file_load_64.c
index 5056e175ca2c..b4981b651d9a 100644
--- a/arch/powerpc/kexec/file_load_64.c
+++ b/arch/powerpc/kexec/file_load_64.c
@@ -700,6 +700,7 @@ static int update_usable_mem_fdt(void *fdt, struct crash_mem *usable_mem)
if (ret) {
pr_err("Failed to set linux,usable-memory property for %s node",
dn->full_name);
+ of_node_put(dn);
goto out;
}
}
--
2.20.1
^ permalink raw reply related
* [PATCH v4 0/2] fix & prevent the missing preemption disabling
From: 王贇 @ 2021-10-18 3:38 UTC (permalink / raw)
To: Guo Ren, Steven Rostedt, Ingo Molnar, James E.J. Bottomley,
Helge Deller, Michael Ellerman, Benjamin Herrenschmidt,
Paul Mackerras, Paul Walmsley, Palmer Dabbelt, Albert Ou,
Thomas Gleixner, Borislav Petkov, x86, H. Peter Anvin,
Josh Poimboeuf, Jiri Kosina, Miroslav Benes, Petr Mladek,
Joe Lawrence, Colin Ian King, Masami Hiramatsu,
Peter Zijlstra (Intel), Nicholas Piggin, Jisheng Zhang,
linux-csky, linux-kernel, linux-parisc, linuxppc-dev, linux-riscv,
live-patching
The testing show that perf_ftrace_function_call() are using smp_processor_id()
with preemption enabled, all the checking on CPU could be wrong after preemption.
As Peter point out, the section between ftrace_test_recursion_trylock/unlock()
pair require the preemption to be disabled as 'Documentation/trace/ftrace-uses.rst'
explained, but currently the work is done outside of the helpers.
And since the internal using of trace_test_and_set_recursion()
and trace_clear_recursion() also require preemption to be disabled, we
can just merge the logical together.
Patch 1/2 will make sure preemption disabled when recursion lock succeed,
patch 2/2 will do smp_processor_id() checking after trylock() to address the
issue.
v1: https://lore.kernel.org/all/8c7de46d-9869-aa5e-2bb9-5dbc2eda395e@linux.alibaba.com/
v2: https://lore.kernel.org/all/b1d7fe43-ce84-0ed7-32f7-ea1d12d0b716@linux.alibaba.com/
v3: https://lore.kernel.org/all/609b565a-ed6e-a1da-f025-166691b5d994@linux.alibaba.com/
Michael Wang (2):
ftrace: disable preemption when recursion locked
ftrace: do CPU checking after preemption disabled
arch/csky/kernel/probes/ftrace.c | 2 --
arch/parisc/kernel/ftrace.c | 2 --
arch/powerpc/kernel/kprobes-ftrace.c | 2 --
arch/riscv/kernel/probes/ftrace.c | 2 --
arch/x86/kernel/kprobes/ftrace.c | 2 --
include/linux/trace_recursion.h | 20 +++++++++++++++++++-
kernel/livepatch/patch.c | 13 +++++++------
kernel/trace/ftrace.c | 15 +++++----------
kernel/trace/trace_event_perf.c | 6 +++---
kernel/trace/trace_functions.c | 5 -----
10 files changed, 34 insertions(+), 35 deletions(-)
--
1.8.3.1
^ permalink raw reply
* [PATCH v4 1/2] ftrace: disable preemption when recursion locked
From: 王贇 @ 2021-10-18 3:39 UTC (permalink / raw)
To: Guo Ren, Steven Rostedt, Ingo Molnar, James E.J. Bottomley,
Helge Deller, Michael Ellerman, Benjamin Herrenschmidt,
Paul Mackerras, Paul Walmsley, Palmer Dabbelt, Albert Ou,
Thomas Gleixner, Borislav Petkov, x86, H. Peter Anvin,
Josh Poimboeuf, Jiri Kosina, Miroslav Benes, Petr Mladek,
Joe Lawrence, Colin Ian King, Masami Hiramatsu,
Peter Zijlstra (Intel), Nicholas Piggin, Jisheng Zhang,
linux-csky, linux-kernel, linux-parisc, linuxppc-dev, linux-riscv,
live-patching
In-Reply-To: <32a36348-69ee-6464-390c-3a8d6e9d2b53@linux.alibaba.com>
As the documentation explained, ftrace_test_recursion_trylock()
and ftrace_test_recursion_unlock() were supposed to disable and
enable preemption properly, however currently this work is done
outside of the function, which could be missing by mistake.
And since the internal using of trace_test_and_set_recursion()
and trace_clear_recursion() also require preemption disabled, we
can just merge the logical.
This patch will make sure the preemption has been disabled when
trace_test_and_set_recursion() return bit >= 0, and
trace_clear_recursion() will enable the preemption if previously
enabled.
CC: Petr Mladek <pmladek@suse.com>
CC: Steven Rostedt <rostedt@goodmis.org>
CC: Miroslav Benes <mbenes@suse.cz>
Reported-by: Abaci <abaci@linux.alibaba.com>
Suggested-by: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Michael Wang <yun.wang@linux.alibaba.com>
---
arch/csky/kernel/probes/ftrace.c | 2 --
arch/parisc/kernel/ftrace.c | 2 --
arch/powerpc/kernel/kprobes-ftrace.c | 2 --
arch/riscv/kernel/probes/ftrace.c | 2 --
arch/x86/kernel/kprobes/ftrace.c | 2 --
include/linux/trace_recursion.h | 20 +++++++++++++++++++-
kernel/livepatch/patch.c | 13 +++++++------
kernel/trace/ftrace.c | 15 +++++----------
kernel/trace/trace_functions.c | 5 -----
9 files changed, 31 insertions(+), 32 deletions(-)
diff --git a/arch/csky/kernel/probes/ftrace.c b/arch/csky/kernel/probes/ftrace.c
index b388228..834cffc 100644
--- a/arch/csky/kernel/probes/ftrace.c
+++ b/arch/csky/kernel/probes/ftrace.c
@@ -17,7 +17,6 @@ void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip,
return;
regs = ftrace_get_regs(fregs);
- preempt_disable_notrace();
p = get_kprobe((kprobe_opcode_t *)ip);
if (!p) {
p = get_kprobe((kprobe_opcode_t *)(ip - MCOUNT_INSN_SIZE));
@@ -57,7 +56,6 @@ void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip,
__this_cpu_write(current_kprobe, NULL);
}
out:
- preempt_enable_notrace();
ftrace_test_recursion_unlock(bit);
}
NOKPROBE_SYMBOL(kprobe_ftrace_handler);
diff --git a/arch/parisc/kernel/ftrace.c b/arch/parisc/kernel/ftrace.c
index 0a1e75a..3543496 100644
--- a/arch/parisc/kernel/ftrace.c
+++ b/arch/parisc/kernel/ftrace.c
@@ -216,7 +216,6 @@ void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip,
return;
regs = ftrace_get_regs(fregs);
- preempt_disable_notrace();
p = get_kprobe((kprobe_opcode_t *)ip);
if (unlikely(!p) || kprobe_disabled(p))
goto out;
@@ -245,7 +244,6 @@ void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip,
}
__this_cpu_write(current_kprobe, NULL);
out:
- preempt_enable_notrace();
ftrace_test_recursion_unlock(bit);
}
NOKPROBE_SYMBOL(kprobe_ftrace_handler);
diff --git a/arch/powerpc/kernel/kprobes-ftrace.c b/arch/powerpc/kernel/kprobes-ftrace.c
index 7154d58..072ebe7 100644
--- a/arch/powerpc/kernel/kprobes-ftrace.c
+++ b/arch/powerpc/kernel/kprobes-ftrace.c
@@ -26,7 +26,6 @@ void kprobe_ftrace_handler(unsigned long nip, unsigned long parent_nip,
return;
regs = ftrace_get_regs(fregs);
- preempt_disable_notrace();
p = get_kprobe((kprobe_opcode_t *)nip);
if (unlikely(!p) || kprobe_disabled(p))
goto out;
@@ -61,7 +60,6 @@ void kprobe_ftrace_handler(unsigned long nip, unsigned long parent_nip,
__this_cpu_write(current_kprobe, NULL);
}
out:
- preempt_enable_notrace();
ftrace_test_recursion_unlock(bit);
}
NOKPROBE_SYMBOL(kprobe_ftrace_handler);
diff --git a/arch/riscv/kernel/probes/ftrace.c b/arch/riscv/kernel/probes/ftrace.c
index aab85a8..7142ec4 100644
--- a/arch/riscv/kernel/probes/ftrace.c
+++ b/arch/riscv/kernel/probes/ftrace.c
@@ -15,7 +15,6 @@ void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip,
if (bit < 0)
return;
- preempt_disable_notrace();
p = get_kprobe((kprobe_opcode_t *)ip);
if (unlikely(!p) || kprobe_disabled(p))
goto out;
@@ -52,7 +51,6 @@ void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip,
__this_cpu_write(current_kprobe, NULL);
}
out:
- preempt_enable_notrace();
ftrace_test_recursion_unlock(bit);
}
NOKPROBE_SYMBOL(kprobe_ftrace_handler);
diff --git a/arch/x86/kernel/kprobes/ftrace.c b/arch/x86/kernel/kprobes/ftrace.c
index 596de2f..dd2ec14 100644
--- a/arch/x86/kernel/kprobes/ftrace.c
+++ b/arch/x86/kernel/kprobes/ftrace.c
@@ -25,7 +25,6 @@ void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip,
if (bit < 0)
return;
- preempt_disable_notrace();
p = get_kprobe((kprobe_opcode_t *)ip);
if (unlikely(!p) || kprobe_disabled(p))
goto out;
@@ -59,7 +58,6 @@ void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip,
__this_cpu_write(current_kprobe, NULL);
}
out:
- preempt_enable_notrace();
ftrace_test_recursion_unlock(bit);
}
NOKPROBE_SYMBOL(kprobe_ftrace_handler);
diff --git a/include/linux/trace_recursion.h b/include/linux/trace_recursion.h
index a9f9c57..f13a9f9 100644
--- a/include/linux/trace_recursion.h
+++ b/include/linux/trace_recursion.h
@@ -159,6 +159,9 @@ static __always_inline int trace_get_context_bit(void)
# define do_ftrace_record_recursion(ip, pip) do { } while (0)
#endif
+/*
+ * Preemption is promised to be disabled when return bit >= 0.
+ */
static __always_inline int trace_test_and_set_recursion(unsigned long ip, unsigned long pip,
int start, int max)
{
@@ -189,14 +192,29 @@ static __always_inline int trace_test_and_set_recursion(unsigned long ip, unsign
current->trace_recursion = val;
barrier();
+ /*
+ * Disable preemption to fulfill the promise.
+ *
+ * Don't worry about the bit 0 cases, they indicate
+ * the disabling behaviour has already been done by
+ * internal call previously.
+ */
+ preempt_disable_notrace();
+
return bit + 1;
}
+/*
+ * Preemption will be enabled (if it was previously enabled).
+ */
static __always_inline void trace_clear_recursion(int bit)
{
if (!bit)
return;
+ if (bit > 0)
+ preempt_enable_notrace();
+
barrier();
bit--;
trace_recursion_clear(bit);
@@ -209,7 +227,7 @@ static __always_inline void trace_clear_recursion(int bit)
* tracing recursed in the same context (normal vs interrupt),
*
* Returns: -1 if a recursion happened.
- * >= 0 if no recursion
+ * >= 0 if no recursion.
*/
static __always_inline int ftrace_test_recursion_trylock(unsigned long ip,
unsigned long parent_ip)
diff --git a/kernel/livepatch/patch.c b/kernel/livepatch/patch.c
index e8029ae..b8d75fb 100644
--- a/kernel/livepatch/patch.c
+++ b/kernel/livepatch/patch.c
@@ -49,14 +49,16 @@ static void notrace klp_ftrace_handler(unsigned long ip,
ops = container_of(fops, struct klp_ops, fops);
+ /*
+ *
+ * The ftrace_test_recursion_trylock() will disable preemption,
+ * which is required for the variant of synchronize_rcu() that is
+ * used to allow patching functions where RCU is not watching.
+ * See klp_synchronize_transition() for more details.
+ */
bit = ftrace_test_recursion_trylock(ip, parent_ip);
if (WARN_ON_ONCE(bit < 0))
return;
- /*
- * A variant of synchronize_rcu() is used to allow patching functions
- * where RCU is not watching, see klp_synchronize_transition().
- */
- preempt_disable_notrace();
func = list_first_or_null_rcu(&ops->func_stack, struct klp_func,
stack_node);
@@ -120,7 +122,6 @@ static void notrace klp_ftrace_handler(unsigned long ip,
klp_arch_set_pc(fregs, (unsigned long)func->new_func);
unlock:
- preempt_enable_notrace();
ftrace_test_recursion_unlock(bit);
}
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index 7d0fd89..35cccef 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -6977,16 +6977,15 @@ void ftrace_reset_array_ops(struct trace_array *tr)
struct ftrace_ops *op;
int bit;
+ /*
+ * The ftrace_test_and_set_recursion() will disable preemption,
+ * which is required since some of the ops may be dynamically
+ * allocated, they must be freed after a synchronize_rcu().
+ */
bit = trace_test_and_set_recursion(ip, parent_ip, TRACE_LIST_START, TRACE_LIST_MAX);
if (bit < 0)
return;
- /*
- * Some of the ops may be dynamically allocated,
- * they must be freed after a synchronize_rcu().
- */
- preempt_disable_notrace();
-
do_for_each_ftrace_op(op, ftrace_ops_list) {
/* Stub functions don't need to be called nor tested */
if (op->flags & FTRACE_OPS_FL_STUB)
@@ -7010,7 +7009,6 @@ void ftrace_reset_array_ops(struct trace_array *tr)
}
} while_for_each_ftrace_op(op);
out:
- preempt_enable_notrace();
trace_clear_recursion(bit);
}
@@ -7056,12 +7054,9 @@ static void ftrace_ops_assist_func(unsigned long ip, unsigned long parent_ip,
if (bit < 0)
return;
- preempt_disable_notrace();
-
if (!(op->flags & FTRACE_OPS_FL_RCU) || rcu_is_watching())
op->func(ip, parent_ip, op, fregs);
- preempt_enable_notrace();
trace_clear_recursion(bit);
}
NOKPROBE_SYMBOL(ftrace_ops_assist_func);
diff --git a/kernel/trace/trace_functions.c b/kernel/trace/trace_functions.c
index 1f0e63f..9f1bfbe 100644
--- a/kernel/trace/trace_functions.c
+++ b/kernel/trace/trace_functions.c
@@ -186,7 +186,6 @@ static void function_trace_start(struct trace_array *tr)
return;
trace_ctx = tracing_gen_ctx();
- preempt_disable_notrace();
cpu = smp_processor_id();
data = per_cpu_ptr(tr->array_buffer.data, cpu);
@@ -194,7 +193,6 @@ static void function_trace_start(struct trace_array *tr)
trace_function(tr, ip, parent_ip, trace_ctx);
ftrace_test_recursion_unlock(bit);
- preempt_enable_notrace();
}
#ifdef CONFIG_UNWINDER_ORC
@@ -298,8 +296,6 @@ static inline void process_repeats(struct trace_array *tr,
if (bit < 0)
return;
- preempt_disable_notrace();
-
cpu = smp_processor_id();
data = per_cpu_ptr(tr->array_buffer.data, cpu);
if (atomic_read(&data->disabled))
@@ -324,7 +320,6 @@ static inline void process_repeats(struct trace_array *tr,
out:
ftrace_test_recursion_unlock(bit);
- preempt_enable_notrace();
}
static void
--
1.8.3.1
^ permalink raw reply related
* [PATCH v4 2/2] ftrace: do CPU checking after preemption disabled
From: 王贇 @ 2021-10-18 3:39 UTC (permalink / raw)
To: Guo Ren, Steven Rostedt, Ingo Molnar, James E.J. Bottomley,
Helge Deller, Michael Ellerman, Benjamin Herrenschmidt,
Paul Mackerras, Paul Walmsley, Palmer Dabbelt, Albert Ou,
Thomas Gleixner, Borislav Petkov, x86, H. Peter Anvin,
Josh Poimboeuf, Jiri Kosina, Miroslav Benes, Petr Mladek,
Joe Lawrence, Colin Ian King, Masami Hiramatsu,
Peter Zijlstra (Intel), Nicholas Piggin, Jisheng Zhang,
linux-csky, linux-kernel, linux-parisc, linuxppc-dev, linux-riscv,
live-patching
In-Reply-To: <32a36348-69ee-6464-390c-3a8d6e9d2b53@linux.alibaba.com>
With CONFIG_DEBUG_PREEMPT we observed reports like:
BUG: using smp_processor_id() in preemptible
caller is perf_ftrace_function_call+0x6f/0x2e0
CPU: 1 PID: 680 Comm: a.out Not tainted
Call Trace:
<TASK>
dump_stack_lvl+0x8d/0xcf
check_preemption_disabled+0x104/0x110
? optimize_nops.isra.7+0x230/0x230
? text_poke_bp_batch+0x9f/0x310
perf_ftrace_function_call+0x6f/0x2e0
...
__text_poke+0x5/0x620
text_poke_bp_batch+0x9f/0x310
This telling us the CPU could be changed after task is preempted, and
the checking on CPU before preemption will be invalid.
Since now ftrace_test_recursion_trylock() will help to disable the
preemption, this patch just do the checking after trylock() to address
the issue.
CC: Steven Rostedt <rostedt@goodmis.org>
Reported-by: Abaci <abaci@linux.alibaba.com>
Signed-off-by: Michael Wang <yun.wang@linux.alibaba.com>
---
kernel/trace/trace_event_perf.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/kernel/trace/trace_event_perf.c b/kernel/trace/trace_event_perf.c
index 6aed10e..fba8cb7 100644
--- a/kernel/trace/trace_event_perf.c
+++ b/kernel/trace/trace_event_perf.c
@@ -441,13 +441,13 @@ void perf_trace_buf_update(void *record, u16 type)
if (!rcu_is_watching())
return;
- if ((unsigned long)ops->private != smp_processor_id())
- return;
-
bit = ftrace_test_recursion_trylock(ip, parent_ip);
if (bit < 0)
return;
+ if ((unsigned long)ops->private != smp_processor_id())
+ goto out;
+
event = container_of(ops, struct perf_event, ftrace_ops);
/*
--
1.8.3.1
^ permalink raw reply related
* Re: [PATCH v3 0/4] Add mem_hops field in perf_mem_data_src structure
From: Michael Ellerman @ 2021-10-18 3:46 UTC (permalink / raw)
To: Peter Zijlstra, Kajol Jain
Cc: mark.rutland, atrajeev, ak, daniel, rnsastry, alexander.shishkin,
linux-kernel, acme, ast, linux-perf-users, yao.jin, mingo, paulus,
maddy, jolsa, namhyung, songliubraving, linuxppc-dev, kan.liang
In-Reply-To: <20211007064933.GK174703@worktop.programming.kicks-ass.net>
Peter Zijlstra <peterz@infradead.org> writes:
> On Wed, Oct 06, 2021 at 07:36:50PM +0530, Kajol Jain wrote:
>
>> Kajol Jain (4):
>> perf: Add comment about current state of PERF_MEM_LVL_* namespace and
>> remove an extra line
>> perf: Add mem_hops field in perf_mem_data_src structure
>> tools/perf: Add mem_hops field in perf_mem_data_src structure
>> powerpc/perf: Fix data source encodings for L2.1 and L3.1 accesses
>>
>> arch/powerpc/perf/isa207-common.c | 26 +++++++++++++++++++++-----
>> arch/powerpc/perf/isa207-common.h | 2 ++
>> include/uapi/linux/perf_event.h | 19 ++++++++++++++++---
>> tools/include/uapi/linux/perf_event.h | 19 ++++++++++++++++---
>> tools/perf/util/mem-events.c | 20 ++++++++++++++++++--
>> 5 files changed, 73 insertions(+), 13 deletions(-)
>
> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
>
> How do we want this routed? Shall I take it, or does Michael want it in
> the Power tree?
It's mostly non-powerpc, so I think you should take it.
There's a slim chance we could end up with a conflict in the powerpc
part, but that's no big deal.
cheers
^ permalink raw reply
* Re: [GIT PULL] Please pull powerpc/linux.git powerpc-5.15-4 tag
From: pr-tracker-bot @ 2021-10-18 4:08 UTC (permalink / raw)
To: Michael Ellerman; +Cc: linuxppc-dev, Linus Torvalds, clg, linux-kernel
In-Reply-To: <87sfwzde0r.fsf@mpe.ellerman.id.au>
The pull request you sent on Sun, 17 Oct 2021 23:36:20 +1100:
> https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git tags/powerpc-5.15-4
has been merged into torvalds/linux.git:
https://git.kernel.org/torvalds/c/be9eb2f00fa7245116d49f76614054cce8e07af8
Thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/prtracker.html
^ permalink raw reply
* Re: [PATCH v3 01/12] powerpc: Move and rename func_descr_t
From: Nicholas Piggin @ 2021-10-18 5:58 UTC (permalink / raw)
To: Andrew Morton, Arnd Bergmann, Benjamin Herrenschmidt,
Christophe Leroy, Helge Deller, Greg Kroah-Hartman,
James E.J. Bottomley, Kees Cook, Michael Ellerman, Paul Mackerras
Cc: linux-arch, linux-ia64, linux-parisc, linux-kernel, linux-mm,
linuxppc-dev
In-Reply-To: <637a9a11263afa216fdfa7fb470a54479c67c61c.1634457599.git.christophe.leroy@csgroup.eu>
Excerpts from Christophe Leroy's message of October 17, 2021 10:38 pm:
> There are three architectures with function descriptors, try to
> have common names for the address they contain in order to
> refactor some functions into generic functions later.
>
> powerpc has 'entry'
> ia64 has 'ip'
> parisc has 'addr'
>
> Vote for 'addr' and update 'func_descr_t' accordingly.
>
> Move it in asm/elf.h to have it at the same place on all
> three architectures, remove the typedef which hides its real
> type, and change it to a smoother name 'struct func_desc'.
>
Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
> Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
> ---
> arch/powerpc/include/asm/code-patching.h | 2 +-
> arch/powerpc/include/asm/elf.h | 6 ++++++
> arch/powerpc/include/asm/types.h | 6 ------
> arch/powerpc/kernel/signal_64.c | 8 ++++----
> 4 files changed, 11 insertions(+), 11 deletions(-)
>
> diff --git a/arch/powerpc/include/asm/code-patching.h b/arch/powerpc/include/asm/code-patching.h
> index 4ba834599c4d..c6e805976e6f 100644
> --- a/arch/powerpc/include/asm/code-patching.h
> +++ b/arch/powerpc/include/asm/code-patching.h
> @@ -110,7 +110,7 @@ static inline unsigned long ppc_function_entry(void *func)
> * function's descriptor. The first entry in the descriptor is the
> * address of the function text.
> */
> - return ((func_descr_t *)func)->entry;
> + return ((struct func_desc *)func)->addr;
> #else
> return (unsigned long)func;
> #endif
> diff --git a/arch/powerpc/include/asm/elf.h b/arch/powerpc/include/asm/elf.h
> index b8425e3cfd81..971589a21bc0 100644
> --- a/arch/powerpc/include/asm/elf.h
> +++ b/arch/powerpc/include/asm/elf.h
> @@ -176,4 +176,10 @@ do { \
> /* Relocate the kernel image to @final_address */
> void relocate(unsigned long final_address);
>
> +struct func_desc {
> + unsigned long addr;
> + unsigned long toc;
> + unsigned long env;
> +};
> +
> #endif /* _ASM_POWERPC_ELF_H */
> diff --git a/arch/powerpc/include/asm/types.h b/arch/powerpc/include/asm/types.h
> index f1630c553efe..97da77bc48c9 100644
> --- a/arch/powerpc/include/asm/types.h
> +++ b/arch/powerpc/include/asm/types.h
> @@ -23,12 +23,6 @@
>
> typedef __vector128 vector128;
>
> -typedef struct {
> - unsigned long entry;
> - unsigned long toc;
> - unsigned long env;
> -} func_descr_t;
> -
> #endif /* __ASSEMBLY__ */
>
> #endif /* _ASM_POWERPC_TYPES_H */
> diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c
> index 1831bba0582e..36537d7d5191 100644
> --- a/arch/powerpc/kernel/signal_64.c
> +++ b/arch/powerpc/kernel/signal_64.c
> @@ -933,11 +933,11 @@ int handle_rt_signal64(struct ksignal *ksig, sigset_t *set,
> * descriptor is the entry address of signal and the second
> * entry is the TOC value we need to use.
> */
> - func_descr_t __user *funct_desc_ptr =
> - (func_descr_t __user *) ksig->ka.sa.sa_handler;
> + struct func_desc __user *ptr =
> + (struct func_desc __user *)ksig->ka.sa.sa_handler;
>
> - err |= get_user(regs->ctr, &funct_desc_ptr->entry);
> - err |= get_user(regs->gpr[2], &funct_desc_ptr->toc);
> + err |= get_user(regs->ctr, &ptr->addr);
> + err |= get_user(regs->gpr[2], &ptr->toc);
> }
>
> /* enter the signal handler in native-endian mode */
> --
> 2.31.1
>
>
>
^ permalink raw reply
* Re: [PATCH] dmaengine: bestcomm: fix system boot lockups
From: Vinod Koul @ 2021-10-18 6:13 UTC (permalink / raw)
To: Anatolij Gustschin; +Cc: dmaengine, linuxppc-dev, linux-kernel, stable
In-Reply-To: <20211014094012.21286-1-agust@denx.de>
On 14-10-21, 11:40, Anatolij Gustschin wrote:
> memset() and memcpy() on an MMIO region like here results in a
> lockup at startup on mpc5200 platform (since this first happens
> during probing of the ATA and Ethernet drivers). Use memset_io()
> and memcpy_toio() instead.
Applied, thanks
--
~Vinod
^ permalink raw reply
* Re: [PATCH v3 04/12] powerpc: Prepare func_desc_t for refactorisation
From: Nicholas Piggin @ 2021-10-18 6:27 UTC (permalink / raw)
To: Andrew Morton, Arnd Bergmann, Benjamin Herrenschmidt,
Christophe Leroy, Helge Deller, Greg Kroah-Hartman,
James E.J. Bottomley, Kees Cook, Michael Ellerman, Paul Mackerras
Cc: linux-arch, linux-ia64, linux-parisc, linux-kernel, linux-mm,
linuxppc-dev
In-Reply-To: <86c393ce0a6f603f94e6d2ceca08d535f654bb23.1634457599.git.christophe.leroy@csgroup.eu>
Excerpts from Christophe Leroy's message of October 17, 2021 10:38 pm:
> In preparation of making func_desc_t generic, change the ELFv2
> version to a struct containing 'addr' element.
>
> This allows using single helpers common to ELFv1 and ELFv2.
>
> Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
> ---
> arch/powerpc/kernel/module_64.c | 32 ++++++++++++++------------------
> 1 file changed, 14 insertions(+), 18 deletions(-)
>
> diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c
> index a89da0ee25e2..b687ef88c4c4 100644
> --- a/arch/powerpc/kernel/module_64.c
> +++ b/arch/powerpc/kernel/module_64.c
> @@ -33,19 +33,13 @@
> #ifdef PPC64_ELF_ABI_v2
>
> /* An address is simply the address of the function. */
> -typedef unsigned long func_desc_t;
> +typedef struct {
> + unsigned long addr;
> +} func_desc_t;
I'm not quite following why this change is done. I guess it is so you
can move this func_desc_t type into core code, but why do that? Is it
just to avoid using the preprocessor?
On its own this patch looks okay.
Acked-by: Nicholas Piggin <npiggin@gmail.com>
^ permalink raw reply
* Re: [PATCH v3 07/12] asm-generic: Define 'func_desc_t' to commonly describe function descriptors
From: Nicholas Piggin @ 2021-10-18 6:29 UTC (permalink / raw)
To: Andrew Morton, Arnd Bergmann, Benjamin Herrenschmidt,
Christophe Leroy, Helge Deller, Greg Kroah-Hartman,
James E.J. Bottomley, Kees Cook, Michael Ellerman, Paul Mackerras
Cc: linux-arch, linux-ia64, linux-parisc, linux-kernel, linux-mm,
linuxppc-dev
In-Reply-To: <a33107c5b82580862510cc20af0d61e33a2b841d.1634457599.git.christophe.leroy@csgroup.eu>
Excerpts from Christophe Leroy's message of October 17, 2021 10:38 pm:
> We have three architectures using function descriptors, each with its
> own type and name.
>
> Add a common typedef that can be used in generic code.
>
> Also add a stub typedef for architecture without function descriptors,
> to avoid a forest of #ifdefs.
>
> It replaces the similar 'func_desc_t' previously defined in
> arch/powerpc/kernel/module_64.c
>
> Reviewed-by: Kees Cook <keescook@chromium.org>
> Acked-by: Arnd Bergmann <arnd@arndb.de>
> Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
> ---
[...]
> diff --git a/include/asm-generic/sections.h b/include/asm-generic/sections.h
> index a918388d9bf6..33b51efe3a24 100644
> --- a/include/asm-generic/sections.h
> +++ b/include/asm-generic/sections.h
> @@ -63,6 +63,9 @@ extern __visible const void __nosave_begin, __nosave_end;
> #else
> #define dereference_function_descriptor(p) ((void *)(p))
> #define dereference_kernel_function_descriptor(p) ((void *)(p))
> +typedef struct {
> + unsigned long addr;
> +} func_desc_t;
> #endif
>
I think that deserves a comment. If it's just to allow ifdef to be
avoided, I guess that's okay with a comment. Would be nice if you could
cause it to generate a link time error if it was ever used like
undefined functions, but I guess you can't. It's not a necessity though.
Thanks,
Nick
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox