Merge remote-tracking branch 'sm8250/lineage-20' into lineage-23.2
* sm8250/lineage-20: UPSTREAM: x86/jump_table: Use relative references UPSTREAM: x86/jump_label: Switch to jump_entry accessors UPSTREAM: arm64/kernel: jump_label: Switch to relative references UPSTREAM: net: add and use skb_unclone_keeptruesize() helper UPSTREAM: kfence: fix is_kfence_address() for addresses below KFENCE_POOL_SIZE BACKPORT: kbuild: check CONFIG_AS_IS_LLVM instead of LLVM_IAS BACKPORT: kbuild: Switch to 'f' variants of integrated assembler flag Revert "Makefile: Fix LLVM_IAS condition after IAS default flip" Change-Id: Ief486315e18b87b98ab171c34ccdda6d031bfe18
This commit is contained in:
13 files changed
+92
-106
No files matched your search
@@ -540,11 +540,11 @@ CLANG_FLAGS += --target=$(notdir $(CROSS_COMPILE:%-=%))
|
||||
endif # CROSS_COMPILE
|
||||
|
||||
ifeq ($(LLVM_IAS),0)
|
||||
CLANG_FLAGS += -no-integrated-as
|
||||
CLANG_FLAGS += -fno-integrated-as
|
||||
GCC_TOOLCHAIN_DIR := $(dir $(shell which $(CROSS_COMPILE)elfedit))
|
||||
CLANG_FLAGS += --prefix=$(GCC_TOOLCHAIN_DIR)$(notdir $(CROSS_COMPILE))
|
||||
else
|
||||
CLANG_FLAGS += -integrated-as
|
||||
CLANG_FLAGS += -fintegrated-as
|
||||
endif
|
||||
CLANG_FLAGS += -Werror=unknown-warning-option
|
||||
CLANG_FLAGS += $(call cc-option, -Wno-unsequenced)
|
||||
@@ -829,10 +829,11 @@ KBUILD_CFLAGS += $(call cc-option, -gsplit-dwarf, -g)
|
||||
else
|
||||
KBUILD_CFLAGS += -g
|
||||
endif
|
||||
ifeq ($(LLVM_IAS),0)
|
||||
KBUILD_AFLAGS += -Wa,-gdwarf-2
|
||||
else
|
||||
|
||||
ifdef CONFIG_AS_IS_LLVM
|
||||
KBUILD_AFLAGS += -g
|
||||
else
|
||||
KBUILD_AFLAGS += -Wa,-gdwarf-2
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
@@ -113,6 +113,7 @@ config ARM64
|
||||
select HAVE_ARCH_BITREVERSE
|
||||
select HAVE_ARCH_HUGE_VMAP
|
||||
select HAVE_ARCH_JUMP_LABEL
|
||||
select HAVE_ARCH_JUMP_LABEL_RELATIVE
|
||||
select HAVE_ARCH_KASAN if !(ARM64_16K_PAGES && ARM64_VA_BITS_48)
|
||||
select HAVE_ARCH_KASAN_SW_TAGS if HAVE_ARCH_KASAN
|
||||
select HAVE_ARCH_KFENCE
|
||||
|
||||
@@ -26,13 +26,16 @@
|
||||
|
||||
#define JUMP_LABEL_NOP_SIZE AARCH64_INSN_SIZE
|
||||
|
||||
static __always_inline bool arch_static_branch(struct static_key *key, bool branch)
|
||||
static __always_inline bool arch_static_branch(struct static_key *key,
|
||||
bool branch)
|
||||
{
|
||||
asm_volatile_goto("1: nop\n\t"
|
||||
".pushsection __jump_table, \"aw\"\n\t"
|
||||
".align 3\n\t"
|
||||
".quad 1b, %l[l_yes], %c0\n\t"
|
||||
".popsection\n\t"
|
||||
asm_volatile_goto(
|
||||
"1: nop \n\t"
|
||||
" .pushsection __jump_table, \"aw\" \n\t"
|
||||
" .align 3 \n\t"
|
||||
" .long 1b - ., %l[l_yes] - . \n\t"
|
||||
" .quad %c0 - . \n\t"
|
||||
" .popsection \n\t"
|
||||
: : "i"(&((char *)key)[branch]) : : l_yes);
|
||||
|
||||
return false;
|
||||
@@ -40,13 +43,16 @@ l_yes:
|
||||
return true;
|
||||
}
|
||||
|
||||
static __always_inline bool arch_static_branch_jump(struct static_key *key, bool branch)
|
||||
static __always_inline bool arch_static_branch_jump(struct static_key *key,
|
||||
bool branch)
|
||||
{
|
||||
asm_volatile_goto("1: b %l[l_yes]\n\t"
|
||||
".pushsection __jump_table, \"aw\"\n\t"
|
||||
".align 3\n\t"
|
||||
".quad 1b, %l[l_yes], %c0\n\t"
|
||||
".popsection\n\t"
|
||||
asm_volatile_goto(
|
||||
"1: b %l[l_yes] \n\t"
|
||||
" .pushsection __jump_table, \"aw\" \n\t"
|
||||
" .align 3 \n\t"
|
||||
" .long 1b - ., %l[l_yes] - . \n\t"
|
||||
" .quad %c0 - . \n\t"
|
||||
" .popsection \n\t"
|
||||
: : "i"(&((char *)key)[branch]) : : l_yes);
|
||||
|
||||
return false;
|
||||
@@ -54,13 +60,5 @@ l_yes:
|
||||
return true;
|
||||
}
|
||||
|
||||
typedef u64 jump_label_t;
|
||||
|
||||
struct jump_entry {
|
||||
jump_label_t code;
|
||||
jump_label_t target;
|
||||
jump_label_t key;
|
||||
};
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASM_JUMP_LABEL_H */
|
||||
@@ -23,12 +23,12 @@
|
||||
void arch_jump_label_transform(struct jump_entry *entry,
|
||||
enum jump_label_type type)
|
||||
{
|
||||
void *addr = (void *)entry->code;
|
||||
void *addr = (void *)jump_entry_code(entry);
|
||||
u32 insn;
|
||||
|
||||
if (type == JUMP_LABEL_JMP) {
|
||||
insn = aarch64_insn_gen_branch_imm(entry->code,
|
||||
entry->target,
|
||||
insn = aarch64_insn_gen_branch_imm(jump_entry_code(entry),
|
||||
jump_entry_target(entry),
|
||||
AARCH64_INSN_BRANCH_NOLINK);
|
||||
} else {
|
||||
insn = aarch64_insn_gen_nop();
|
||||
|
||||
@@ -126,6 +126,7 @@ config X86
|
||||
select HAVE_ARCH_AUDITSYSCALL
|
||||
select HAVE_ARCH_HUGE_VMAP if X86_64 || X86_PAE
|
||||
select HAVE_ARCH_JUMP_LABEL
|
||||
select HAVE_ARCH_JUMP_LABEL_RELATIVE
|
||||
select HAVE_ARCH_KASAN if X86_64
|
||||
select HAVE_ARCH_KFENCE
|
||||
select HAVE_ARCH_KGDB
|
||||
|
||||
@@ -24,7 +24,8 @@ static __always_inline bool arch_static_branch(struct static_key *key, bool bran
|
||||
".byte " __stringify(STATIC_KEY_INIT_NOP) "\n\t"
|
||||
".pushsection __jump_table, \"aw\" \n\t"
|
||||
_ASM_ALIGN "\n\t"
|
||||
_ASM_PTR "1b, %l[l_yes], %c0 + %c1 \n\t"
|
||||
".long 1b - ., %l[l_yes] - . \n\t"
|
||||
_ASM_PTR "%c0 + %c1 - .\n\t"
|
||||
".popsection \n\t"
|
||||
: : "i" (key), "i" (branch) : : l_yes);
|
||||
|
||||
@@ -40,7 +41,8 @@ static __always_inline bool arch_static_branch_jump(struct static_key *key, bool
|
||||
"2:\n\t"
|
||||
".pushsection __jump_table, \"aw\" \n\t"
|
||||
_ASM_ALIGN "\n\t"
|
||||
_ASM_PTR "1b, %l[l_yes], %c0 + %c1 \n\t"
|
||||
".long 1b - ., %l[l_yes] - . \n\t"
|
||||
_ASM_PTR "%c0 + %c1 - .\n\t"
|
||||
".popsection \n\t"
|
||||
: : "i" (key), "i" (branch) : : l_yes);
|
||||
|
||||
@@ -49,18 +51,6 @@ l_yes:
|
||||
return true;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
typedef u64 jump_label_t;
|
||||
#else
|
||||
typedef u32 jump_label_t;
|
||||
#endif
|
||||
|
||||
struct jump_entry {
|
||||
jump_label_t code;
|
||||
jump_label_t target;
|
||||
jump_label_t key;
|
||||
};
|
||||
|
||||
#else /* __ASSEMBLY__ */
|
||||
|
||||
.macro STATIC_JUMP_IF_TRUE target, key, def
|
||||
@@ -75,7 +65,8 @@ struct jump_entry {
|
||||
.endif
|
||||
.pushsection __jump_table, "aw"
|
||||
_ASM_ALIGN
|
||||
_ASM_PTR .Lstatic_jump_\@, \target, \key
|
||||
.long .Lstatic_jump_\@ - ., \target - .
|
||||
_ASM_PTR \key - .
|
||||
.popsection
|
||||
.endm
|
||||
|
||||
@@ -91,7 +82,8 @@ struct jump_entry {
|
||||
.endif
|
||||
.pushsection __jump_table, "aw"
|
||||
_ASM_ALIGN
|
||||
_ASM_PTR .Lstatic_jump_\@, \target, \key + 1
|
||||
.long .Lstatic_jump_\@ - ., \target - .
|
||||
_ASM_PTR \key + 1 - .
|
||||
.popsection
|
||||
.endm
|
||||
|
||||
|
||||
@@ -40,55 +40,40 @@ static void __ref __jump_label_transform(struct jump_entry *entry,
|
||||
void *(*poker)(void *, const void *, size_t),
|
||||
int init)
|
||||
{
|
||||
union jump_code_union code;
|
||||
union jump_code_union jmp;
|
||||
const unsigned char default_nop[] = { STATIC_KEY_INIT_NOP };
|
||||
const unsigned char *ideal_nop = ideal_nops[NOP_ATOMIC5];
|
||||
const void *expect, *code;
|
||||
int line;
|
||||
|
||||
jmp.jump = 0xe9;
|
||||
jmp.offset = jump_entry_target(entry) -
|
||||
(jump_entry_code(entry) + JUMP_LABEL_NOP_SIZE);
|
||||
|
||||
if (early_boot_irqs_disabled)
|
||||
poker = text_poke_early;
|
||||
|
||||
if (type == JUMP_LABEL_JMP) {
|
||||
if (init) {
|
||||
/*
|
||||
* Jump label is enabled for the first time.
|
||||
* So we expect a default_nop...
|
||||
*/
|
||||
if (unlikely(memcmp((void *)entry->code, default_nop, 5)
|
||||
!= 0))
|
||||
bug_at((void *)entry->code, __LINE__);
|
||||
expect = default_nop; line = __LINE__;
|
||||
} else {
|
||||
/*
|
||||
* ...otherwise expect an ideal_nop. Otherwise
|
||||
* something went horribly wrong.
|
||||
*/
|
||||
if (unlikely(memcmp((void *)entry->code, ideal_nop, 5)
|
||||
!= 0))
|
||||
bug_at((void *)entry->code, __LINE__);
|
||||
expect = ideal_nop; line = __LINE__;
|
||||
}
|
||||
|
||||
code.jump = 0xe9;
|
||||
code.offset = entry->target -
|
||||
(entry->code + JUMP_LABEL_NOP_SIZE);
|
||||
code = &jmp.code;
|
||||
} else {
|
||||
/*
|
||||
* We are disabling this jump label. If it is not what
|
||||
* we think it is, then something must have gone wrong.
|
||||
* If this is the first initialization call, then we
|
||||
* are converting the default nop to the ideal nop.
|
||||
*/
|
||||
if (init) {
|
||||
if (unlikely(memcmp((void *)entry->code, default_nop, 5) != 0))
|
||||
bug_at((void *)entry->code, __LINE__);
|
||||
expect = default_nop; line = __LINE__;
|
||||
} else {
|
||||
code.jump = 0xe9;
|
||||
code.offset = entry->target -
|
||||
(entry->code + JUMP_LABEL_NOP_SIZE);
|
||||
if (unlikely(memcmp((void *)entry->code, &code, 5) != 0))
|
||||
bug_at((void *)entry->code, __LINE__);
|
||||
expect = &jmp.code; line = __LINE__;
|
||||
}
|
||||
memcpy(&code, ideal_nops[NOP_ATOMIC5], JUMP_LABEL_NOP_SIZE);
|
||||
|
||||
code = ideal_nop;
|
||||
}
|
||||
|
||||
if (memcmp((void *)jump_entry_code(entry), expect, JUMP_LABEL_NOP_SIZE))
|
||||
bug_at((void *)jump_entry_code(entry), line);
|
||||
|
||||
/*
|
||||
* Make text_poke_bp() a default fallback poker.
|
||||
*
|
||||
@@ -97,11 +82,14 @@ static void __ref __jump_label_transform(struct jump_entry *entry,
|
||||
* always nop being the 'currently valid' instruction
|
||||
*
|
||||
*/
|
||||
if (poker)
|
||||
(*poker)((void *)entry->code, &code, JUMP_LABEL_NOP_SIZE);
|
||||
else
|
||||
text_poke_bp((void *)entry->code, &code, JUMP_LABEL_NOP_SIZE,
|
||||
(void *)entry->code + JUMP_LABEL_NOP_SIZE);
|
||||
if (poker) {
|
||||
(*poker)((void *)jump_entry_code(entry), code,
|
||||
JUMP_LABEL_NOP_SIZE);
|
||||
return;
|
||||
}
|
||||
|
||||
text_poke_bp((void *)jump_entry_code(entry), code, JUMP_LABEL_NOP_SIZE,
|
||||
(void *)jump_entry_code(entry) + JUMP_LABEL_NOP_SIZE);
|
||||
}
|
||||
|
||||
void arch_jump_label_transform(struct jump_entry *entry,
|
||||
|
||||
@@ -51,10 +51,11 @@ extern atomic_t kfence_allocation_gate;
|
||||
static __always_inline bool is_kfence_address(const void *addr)
|
||||
{
|
||||
/*
|
||||
* The non-NULL check is required in case the __kfence_pool pointer was
|
||||
* never initialized; keep it in the slow-path after the range-check.
|
||||
* The __kfence_pool != NULL check is required to deal with the case
|
||||
* where __kfence_pool == NULL && addr < KFENCE_POOL_SIZE. Keep it in
|
||||
* the slow-path after the range-check!
|
||||
*/
|
||||
return unlikely((unsigned long)((char *)addr - __kfence_pool) < KFENCE_POOL_SIZE && addr);
|
||||
return unlikely((unsigned long)((char *)addr - __kfence_pool) < KFENCE_POOL_SIZE && __kfence_pool);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1531,6 +1531,22 @@ static inline int skb_unclone(struct sk_buff *skb, gfp_t pri)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* This variant of skb_unclone() makes sure skb->truesize is not changed */
|
||||
static inline int skb_unclone_keeptruesize(struct sk_buff *skb, gfp_t pri)
|
||||
{
|
||||
might_sleep_if(gfpflags_allow_blocking(pri));
|
||||
|
||||
if (skb_cloned(skb)) {
|
||||
unsigned int save = skb->truesize;
|
||||
int res;
|
||||
|
||||
res = pskb_expand_head(skb, 0, 0, pri);
|
||||
skb->truesize = save;
|
||||
return res;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* skb_header_cloned - is the header a clone
|
||||
* @skb: buffer to check
|
||||
|
||||
+1
-13
@@ -3134,19 +3134,7 @@ EXPORT_SYMBOL(skb_split);
|
||||
*/
|
||||
static int skb_prepare_for_shift(struct sk_buff *skb)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if (skb_cloned(skb)) {
|
||||
/* Save and restore truesize: pskb_expand_head() may reallocate
|
||||
* memory where ksize(kmalloc(S)) != ksize(kmalloc(S)), but we
|
||||
* cannot change truesize at this point.
|
||||
*/
|
||||
unsigned int save_truesize = skb->truesize;
|
||||
|
||||
ret = pskb_expand_head(skb, 0, 0, GFP_ATOMIC);
|
||||
skb->truesize = save_truesize;
|
||||
}
|
||||
return ret;
|
||||
return skb_unclone_keeptruesize(skb, GFP_ATOMIC);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1486,7 +1486,7 @@ int tcp_fragment(struct sock *sk, enum tcp_queue tcp_queue,
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (skb_unclone(skb, gfp))
|
||||
if (skb_unclone_keeptruesize(skb, gfp))
|
||||
return -ENOMEM;
|
||||
|
||||
/* Get a new skb... force flag on. */
|
||||
@@ -1594,7 +1594,7 @@ int tcp_trim_head(struct sock *sk, struct sk_buff *skb, u32 len)
|
||||
{
|
||||
u32 delta_truesize;
|
||||
|
||||
if (skb_unclone(skb, GFP_ATOMIC))
|
||||
if (skb_unclone_keeptruesize(skb, GFP_ATOMIC))
|
||||
return -ENOMEM;
|
||||
|
||||
delta_truesize = __pskb_trim_head(skb, len);
|
||||
@@ -3123,7 +3123,7 @@ start:
|
||||
cur_mss, GFP_ATOMIC))
|
||||
return -ENOMEM; /* We'll try again later. */
|
||||
} else {
|
||||
if (skb_unclone(skb, GFP_ATOMIC))
|
||||
if (skb_unclone_keeptruesize(skb, GFP_ATOMIC))
|
||||
return -ENOMEM;
|
||||
|
||||
diff = tcp_skb_pcount(skb);
|
||||
|
||||
@@ -21,14 +21,14 @@ get_canonical_version()
|
||||
echo $((10000 * $1 + 100 * ${2:-0} + ${3:-0}))
|
||||
}
|
||||
|
||||
# Clang fails to handle -Wa,--version unless -no-integrated-as is given.
|
||||
# We check -(f)integrated-as, expecting it is explicitly passed in for the
|
||||
# Clang fails to handle -Wa,--version unless -fno-integrated-as is given.
|
||||
# We check -fintegrated-as, expecting it is explicitly passed in for the
|
||||
# integrated assembler case.
|
||||
check_integrated_as()
|
||||
{
|
||||
while [ $# -gt 0 ]; do
|
||||
if [ "$1" = -integrated-as -o "$1" = -fintegrated-as ]; then
|
||||
# For the intergrated assembler, we do not check the
|
||||
if [ "$1" = -fintegrated-as ]; then
|
||||
# For the integrated assembler, we do not check the
|
||||
# version here. It is the same as the clang version, and
|
||||
# it has been already checked by scripts/cc-version.sh.
|
||||
echo LLVM 0
|
||||
|
||||
@@ -30,9 +30,9 @@
|
||||
#define EX_ORIG_OFFSET 0
|
||||
#define EX_NEW_OFFSET 4
|
||||
|
||||
#define JUMP_ENTRY_SIZE 24
|
||||
#define JUMP_ENTRY_SIZE 16
|
||||
#define JUMP_ORIG_OFFSET 0
|
||||
#define JUMP_NEW_OFFSET 8
|
||||
#define JUMP_NEW_OFFSET 4
|
||||
|
||||
#define ALT_ENTRY_SIZE 13
|
||||
#define ALT_ORIG_OFFSET 0
|
||||
|
||||
Reference in new issue
Block a user