arm64 updates for 5.14
- Optimise SVE switching for CPUs with 128-bit implementations.
- Fix output format from SVE selftest.
- Add support for versions v1.2 and 1.3 of the SMC calling convention.
- Allow Pointer Authentication to be configured independently for
kernel and userspace.
- PMU driver cleanups for managing IRQ affinity and exposing event
attributes via sysfs.
- KASAN optimisations for both hardware tagging (MTE) and out-of-line
software tagging implementations.
- Relax frame record alignment requirements to facilitate 8-byte
alignment with KASAN and Clang.
- Cleanup of page-table definitions and removal of unused memory types.
- Reduction of ARCH_DMA_MINALIGN back to 64 bytes.
- Refactoring of our instruction decoding routines and addition of some
missing encodings.
- Move entry code moved into C and hardened against harmful compiler
instrumentation.
- Update booting requirements for the FEAT_HCX feature, added to v8.7
of the architecture.
- Fix resume from idle when pNMI is being used.
- Additional CPU sanity checks for MTE and preparatory changes for
systems where not all of the CPUs support 32-bit EL0.
- Update our kernel string routines to the latest Cortex Strings
implementation.
- Big cleanup of our cache maintenance routines, which were confusingly
named and inconsistent in their implementations.
- Tweak linker flags so that GDB can understand vmlinux when using RELR
relocations.
- Boot path cleanups to enable early initialisation of per-cpu
operations needed by KCSAN.
- Non-critical fixes and miscellaneous cleanup.
-----BEGIN PGP SIGNATURE-----
iQFEBAABCgAuFiEEPxTL6PPUbjXGY88ct6xw3ITBYzQFAmDUh1YQHHdpbGxAa2Vy
bmVsLm9yZwAKCRC3rHDchMFjNDaUCAC+2Jy2Yopd94uBPYajGybM0rqCUgE7b5n1
A7UzmQ6fia2hwqCPmxGG+sRabovwN7C1bKrUCc03RIbErIa7wum1edeyqmF/Aw44
DUDY1MAOSZaFmX8L62QCvxG1hfdLPtGmHMd1hdXvxYK7PCaigEFnzbLRWTtgE+Ok
JhdvNfsoeITJObHnvYPF3rV3NAbyYni9aNJ5AC/qb3dlf6XigEraXaMj29XHKfwc
+vmn+25oqFkLHyFeguqIoK+vUQAy/8TjFfjX83eN3LZknNhDJgWS1Iq1Nm+Vxt62
RvDUUecWJjAooCWgmil6pt0enI+q6E8LcX3A3cWWrM6psbxnYzkU
=I6KS
-----END PGP SIGNATURE-----
Merge tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux
Pull arm64 updates from Will Deacon:
"There's a reasonable amount here and the juicy details are all below.
It's worth noting that the MTE/KASAN changes strayed outside of our
usual directories due to core mm changes and some associated changes
to some other architectures; Andrew asked for us to carry these [1]
rather that take them via the -mm tree.
Summary:
- Optimise SVE switching for CPUs with 128-bit implementations.
- Fix output format from SVE selftest.
- Add support for versions v1.2 and 1.3 of the SMC calling
convention.
- Allow Pointer Authentication to be configured independently for
kernel and userspace.
- PMU driver cleanups for managing IRQ affinity and exposing event
attributes via sysfs.
- KASAN optimisations for both hardware tagging (MTE) and out-of-line
software tagging implementations.
- Relax frame record alignment requirements to facilitate 8-byte
alignment with KASAN and Clang.
- Cleanup of page-table definitions and removal of unused memory
types.
- Reduction of ARCH_DMA_MINALIGN back to 64 bytes.
- Refactoring of our instruction decoding routines and addition of
some missing encodings.
- Move entry code moved into C and hardened against harmful compiler
instrumentation.
- Update booting requirements for the FEAT_HCX feature, added to v8.7
of the architecture.
- Fix resume from idle when pNMI is being used.
- Additional CPU sanity checks for MTE and preparatory changes for
systems where not all of the CPUs support 32-bit EL0.
- Update our kernel string routines to the latest Cortex Strings
implementation.
- Big cleanup of our cache maintenance routines, which were
confusingly named and inconsistent in their implementations.
- Tweak linker flags so that GDB can understand vmlinux when using
RELR relocations.
- Boot path cleanups to enable early initialisation of per-cpu
operations needed by KCSAN.
- Non-critical fixes and miscellaneous cleanup"
* tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux: (150 commits)
arm64: tlb: fix the TTL value of tlb_get_level
arm64: Restrict undef hook for cpufeature registers
arm64/mm: Rename ARM64_SWAPPER_USES_SECTION_MAPS
arm64: insn: avoid circular include dependency
arm64: smp: Bump debugging information print down to KERN_DEBUG
drivers/perf: fix the missed ida_simple_remove() in ddr_perf_probe()
perf/arm-cmn: Fix invalid pointer when access dtc object sharing the same IRQ number
arm64: suspend: Use cpuidle context helpers in cpu_suspend()
PSCI: Use cpuidle context helpers in psci_cpu_suspend_enter()
arm64: Convert cpu_do_idle() to using cpuidle context helpers
arm64: Add cpuidle context save/restore helpers
arm64: head: fix code comments in set_cpu_boot_mode_flag
arm64: mm: drop unused __pa(__idmap_text_start)
arm64: mm: fix the count comments in compute_indices
arm64/mm: Fix ttbr0 values stored in struct thread_info for software-pan
arm64: mm: Pass original fault address to handle_mm_fault()
arm64/mm: Drop SECTION_[SHIFT|SIZE|MASK]
arm64/mm: Use CONT_PMD_SHIFT for ARM64_MEMSTART_SHIFT
arm64/mm: Drop SWAPPER_INIT_MAP_SIZE
arm64: Conditionally configure PTR_AUTH key of the kernel.
...
This commit is contained in:
commit
9840cfcb97
158 changed files with 3390 additions and 2583 deletions
|
|
@ -63,6 +63,9 @@
|
|||
#define ARM_SMCCC_VERSION_1_0 0x10000
|
||||
#define ARM_SMCCC_VERSION_1_1 0x10001
|
||||
#define ARM_SMCCC_VERSION_1_2 0x10002
|
||||
#define ARM_SMCCC_VERSION_1_3 0x10003
|
||||
|
||||
#define ARM_SMCCC_1_3_SVE_HINT 0x10000
|
||||
|
||||
#define ARM_SMCCC_VERSION_FUNC_ID \
|
||||
ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
|
||||
|
|
@ -216,6 +219,8 @@ u32 arm_smccc_get_version(void);
|
|||
|
||||
void __init arm_smccc_version_init(u32 version, enum arm_smccc_conduit conduit);
|
||||
|
||||
extern u64 smccc_has_sve_hint;
|
||||
|
||||
/**
|
||||
* struct arm_smccc_res - Result from SMC/HVC call
|
||||
* @a0-a3 result values from registers 0 to 3
|
||||
|
|
@ -227,6 +232,61 @@ struct arm_smccc_res {
|
|||
unsigned long a3;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_ARM64
|
||||
/**
|
||||
* struct arm_smccc_1_2_regs - Arguments for or Results from SMC/HVC call
|
||||
* @a0-a17 argument values from registers 0 to 17
|
||||
*/
|
||||
struct arm_smccc_1_2_regs {
|
||||
unsigned long a0;
|
||||
unsigned long a1;
|
||||
unsigned long a2;
|
||||
unsigned long a3;
|
||||
unsigned long a4;
|
||||
unsigned long a5;
|
||||
unsigned long a6;
|
||||
unsigned long a7;
|
||||
unsigned long a8;
|
||||
unsigned long a9;
|
||||
unsigned long a10;
|
||||
unsigned long a11;
|
||||
unsigned long a12;
|
||||
unsigned long a13;
|
||||
unsigned long a14;
|
||||
unsigned long a15;
|
||||
unsigned long a16;
|
||||
unsigned long a17;
|
||||
};
|
||||
|
||||
/**
|
||||
* arm_smccc_1_2_hvc() - make HVC calls
|
||||
* @args: arguments passed via struct arm_smccc_1_2_regs
|
||||
* @res: result values via struct arm_smccc_1_2_regs
|
||||
*
|
||||
* This function is used to make HVC calls following SMC Calling Convention
|
||||
* v1.2 or above. The content of the supplied param are copied from the
|
||||
* structure to registers prior to the HVC instruction. The return values
|
||||
* are updated with the content from registers on return from the HVC
|
||||
* instruction.
|
||||
*/
|
||||
asmlinkage void arm_smccc_1_2_hvc(const struct arm_smccc_1_2_regs *args,
|
||||
struct arm_smccc_1_2_regs *res);
|
||||
|
||||
/**
|
||||
* arm_smccc_1_2_smc() - make SMC calls
|
||||
* @args: arguments passed via struct arm_smccc_1_2_regs
|
||||
* @res: result values via struct arm_smccc_1_2_regs
|
||||
*
|
||||
* This function is used to make SMC calls following SMC Calling Convention
|
||||
* v1.2 or above. The content of the supplied param are copied from the
|
||||
* structure to registers prior to the SMC instruction. The return values
|
||||
* are updated with the content from registers on return from the SMC
|
||||
* instruction.
|
||||
*/
|
||||
asmlinkage void arm_smccc_1_2_smc(const struct arm_smccc_1_2_regs *args,
|
||||
struct arm_smccc_1_2_regs *res);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* struct arm_smccc_quirk - Contains quirk information
|
||||
* @id: quirk identification
|
||||
|
|
@ -240,6 +300,15 @@ struct arm_smccc_quirk {
|
|||
} state;
|
||||
};
|
||||
|
||||
/**
|
||||
* __arm_smccc_sve_check() - Set the SVE hint bit when doing SMC calls
|
||||
*
|
||||
* Sets the SMCCC hint bit to indicate if there is live state in the SVE
|
||||
* registers, this modifies x0 in place and should never be called from C
|
||||
* code.
|
||||
*/
|
||||
asmlinkage unsigned long __arm_smccc_sve_check(unsigned long x0);
|
||||
|
||||
/**
|
||||
* __arm_smccc_smc() - make SMC calls
|
||||
* @a0-a7: arguments passed in registers 0 to 7
|
||||
|
|
@ -297,6 +366,20 @@ asmlinkage void __arm_smccc_hvc(unsigned long a0, unsigned long a1,
|
|||
|
||||
#endif
|
||||
|
||||
/* nVHE hypervisor doesn't have a current thread so needs separate checks */
|
||||
#if defined(CONFIG_ARM64_SVE) && !defined(__KVM_NVHE_HYPERVISOR__)
|
||||
|
||||
#define SMCCC_SVE_CHECK ALTERNATIVE("nop \n", "bl __arm_smccc_sve_check \n", \
|
||||
ARM64_SVE)
|
||||
#define smccc_sve_clobbers "x16", "x30", "cc",
|
||||
|
||||
#else
|
||||
|
||||
#define SMCCC_SVE_CHECK
|
||||
#define smccc_sve_clobbers
|
||||
|
||||
#endif
|
||||
|
||||
#define ___count_args(_0, _1, _2, _3, _4, _5, _6, _7, _8, x, ...) x
|
||||
|
||||
#define __count_args(...) \
|
||||
|
|
@ -364,7 +447,7 @@ asmlinkage void __arm_smccc_hvc(unsigned long a0, unsigned long a1,
|
|||
|
||||
#define ___constraints(count) \
|
||||
: __constraint_read_ ## count \
|
||||
: "memory"
|
||||
: smccc_sve_clobbers "memory"
|
||||
#define __constraints(count) ___constraints(count)
|
||||
|
||||
/*
|
||||
|
|
@ -379,7 +462,8 @@ asmlinkage void __arm_smccc_hvc(unsigned long a0, unsigned long a1,
|
|||
register unsigned long r2 asm("r2"); \
|
||||
register unsigned long r3 asm("r3"); \
|
||||
__declare_args(__count_args(__VA_ARGS__), __VA_ARGS__); \
|
||||
asm volatile(inst "\n" : \
|
||||
asm volatile(SMCCC_SVE_CHECK \
|
||||
inst "\n" : \
|
||||
"=r" (r0), "=r" (r1), "=r" (r2), "=r" (r3) \
|
||||
__constraints(__count_args(__VA_ARGS__))); \
|
||||
if (___res) \
|
||||
|
|
|
|||
|
|
@ -53,8 +53,10 @@ struct vm_area_struct;
|
|||
#define ___GFP_HARDWALL 0x100000u
|
||||
#define ___GFP_THISNODE 0x200000u
|
||||
#define ___GFP_ACCOUNT 0x400000u
|
||||
#define ___GFP_ZEROTAGS 0x800000u
|
||||
#define ___GFP_SKIP_KASAN_POISON 0x1000000u
|
||||
#ifdef CONFIG_LOCKDEP
|
||||
#define ___GFP_NOLOCKDEP 0x800000u
|
||||
#define ___GFP_NOLOCKDEP 0x2000000u
|
||||
#else
|
||||
#define ___GFP_NOLOCKDEP 0
|
||||
#endif
|
||||
|
|
@ -229,16 +231,25 @@ struct vm_area_struct;
|
|||
* %__GFP_COMP address compound page metadata.
|
||||
*
|
||||
* %__GFP_ZERO returns a zeroed page on success.
|
||||
*
|
||||
* %__GFP_ZEROTAGS returns a page with zeroed memory tags on success, if
|
||||
* __GFP_ZERO is set.
|
||||
*
|
||||
* %__GFP_SKIP_KASAN_POISON returns a page which does not need to be poisoned
|
||||
* on deallocation. Typically used for userspace pages. Currently only has an
|
||||
* effect in HW tags mode.
|
||||
*/
|
||||
#define __GFP_NOWARN ((__force gfp_t)___GFP_NOWARN)
|
||||
#define __GFP_COMP ((__force gfp_t)___GFP_COMP)
|
||||
#define __GFP_ZERO ((__force gfp_t)___GFP_ZERO)
|
||||
#define __GFP_ZEROTAGS ((__force gfp_t)___GFP_ZEROTAGS)
|
||||
#define __GFP_SKIP_KASAN_POISON ((__force gfp_t)___GFP_SKIP_KASAN_POISON)
|
||||
|
||||
/* Disable lockdep for GFP context tracking */
|
||||
#define __GFP_NOLOCKDEP ((__force gfp_t)___GFP_NOLOCKDEP)
|
||||
|
||||
/* Room for N __GFP_FOO bits */
|
||||
#define __GFP_BITS_SHIFT (23 + IS_ENABLED(CONFIG_LOCKDEP))
|
||||
#define __GFP_BITS_SHIFT (25 + IS_ENABLED(CONFIG_LOCKDEP))
|
||||
#define __GFP_BITS_MASK ((__force gfp_t)((1 << __GFP_BITS_SHIFT) - 1))
|
||||
|
||||
/**
|
||||
|
|
@ -319,7 +330,8 @@ struct vm_area_struct;
|
|||
#define GFP_DMA __GFP_DMA
|
||||
#define GFP_DMA32 __GFP_DMA32
|
||||
#define GFP_HIGHUSER (GFP_USER | __GFP_HIGHMEM)
|
||||
#define GFP_HIGHUSER_MOVABLE (GFP_HIGHUSER | __GFP_MOVABLE)
|
||||
#define GFP_HIGHUSER_MOVABLE (GFP_HIGHUSER | __GFP_MOVABLE | \
|
||||
__GFP_SKIP_KASAN_POISON)
|
||||
#define GFP_TRANSHUGE_LIGHT ((GFP_HIGHUSER_MOVABLE | __GFP_COMP | \
|
||||
__GFP_NOMEMALLOC | __GFP_NOWARN) & ~__GFP_RECLAIM)
|
||||
#define GFP_TRANSHUGE (GFP_TRANSHUGE_LIGHT | __GFP_DIRECT_RECLAIM)
|
||||
|
|
|
|||
|
|
@ -152,28 +152,24 @@ static inline void clear_user_highpage(struct page *page, unsigned long vaddr)
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifndef __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE
|
||||
#ifndef __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE_MOVABLE
|
||||
/**
|
||||
* __alloc_zeroed_user_highpage - Allocate a zeroed HIGHMEM page for a VMA with caller-specified movable GFP flags
|
||||
* @movableflags: The GFP flags related to the pages future ability to move like __GFP_MOVABLE
|
||||
* alloc_zeroed_user_highpage_movable - Allocate a zeroed HIGHMEM page for a VMA that the caller knows can move
|
||||
* @vma: The VMA the page is to be allocated for
|
||||
* @vaddr: The virtual address the page will be inserted into
|
||||
*
|
||||
* This function will allocate a page for a VMA but the caller is expected
|
||||
* to specify via movableflags whether the page will be movable in the
|
||||
* future or not
|
||||
* This function will allocate a page for a VMA that the caller knows will
|
||||
* be able to migrate in the future using move_pages() or reclaimed
|
||||
*
|
||||
* An architecture may override this function by defining
|
||||
* __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE and providing their own
|
||||
* __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE_MOVABLE and providing their own
|
||||
* implementation.
|
||||
*/
|
||||
static inline struct page *
|
||||
__alloc_zeroed_user_highpage(gfp_t movableflags,
|
||||
struct vm_area_struct *vma,
|
||||
unsigned long vaddr)
|
||||
alloc_zeroed_user_highpage_movable(struct vm_area_struct *vma,
|
||||
unsigned long vaddr)
|
||||
{
|
||||
struct page *page = alloc_page_vma(GFP_HIGHUSER | movableflags,
|
||||
vma, vaddr);
|
||||
struct page *page = alloc_page_vma(GFP_HIGHUSER_MOVABLE, vma, vaddr);
|
||||
|
||||
if (page)
|
||||
clear_user_highpage(page, vaddr);
|
||||
|
|
@ -182,21 +178,6 @@ __alloc_zeroed_user_highpage(gfp_t movableflags,
|
|||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* alloc_zeroed_user_highpage_movable - Allocate a zeroed HIGHMEM page for a VMA that the caller knows can move
|
||||
* @vma: The VMA the page is to be allocated for
|
||||
* @vaddr: The virtual address the page will be inserted into
|
||||
*
|
||||
* This function will allocate a page for a VMA that the caller knows will
|
||||
* be able to migrate in the future using move_pages() or reclaimed
|
||||
*/
|
||||
static inline struct page *
|
||||
alloc_zeroed_user_highpage_movable(struct vm_area_struct *vma,
|
||||
unsigned long vaddr)
|
||||
{
|
||||
return __alloc_zeroed_user_highpage(__GFP_MOVABLE, vma, vaddr);
|
||||
}
|
||||
|
||||
static inline void clear_highpage(struct page *page)
|
||||
{
|
||||
void *kaddr = kmap_atomic(page);
|
||||
|
|
@ -204,6 +185,14 @@ static inline void clear_highpage(struct page *page)
|
|||
kunmap_atomic(kaddr);
|
||||
}
|
||||
|
||||
#ifndef __HAVE_ARCH_TAG_CLEAR_HIGHPAGE
|
||||
|
||||
static inline void tag_clear_highpage(struct page *page)
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* If we pass in a base or tail page, we can zero up to PAGE_SIZE.
|
||||
* If we pass in a head page, we can zero up to the size of the compound page.
|
||||
|
|
|
|||
|
|
@ -319,39 +319,8 @@ struct irq_affinity_desc {
|
|||
|
||||
extern cpumask_var_t irq_default_affinity;
|
||||
|
||||
/* Internal implementation. Use the helpers below */
|
||||
extern int __irq_set_affinity(unsigned int irq, const struct cpumask *cpumask,
|
||||
bool force);
|
||||
|
||||
/**
|
||||
* irq_set_affinity - Set the irq affinity of a given irq
|
||||
* @irq: Interrupt to set affinity
|
||||
* @cpumask: cpumask
|
||||
*
|
||||
* Fails if cpumask does not contain an online CPU
|
||||
*/
|
||||
static inline int
|
||||
irq_set_affinity(unsigned int irq, const struct cpumask *cpumask)
|
||||
{
|
||||
return __irq_set_affinity(irq, cpumask, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* irq_force_affinity - Force the irq affinity of a given irq
|
||||
* @irq: Interrupt to set affinity
|
||||
* @cpumask: cpumask
|
||||
*
|
||||
* Same as irq_set_affinity, but without checking the mask against
|
||||
* online cpus.
|
||||
*
|
||||
* Solely for low level cpu hotplug code, where we need to make per
|
||||
* cpu interrupts affine before the cpu becomes online.
|
||||
*/
|
||||
static inline int
|
||||
irq_force_affinity(unsigned int irq, const struct cpumask *cpumask)
|
||||
{
|
||||
return __irq_set_affinity(irq, cpumask, true);
|
||||
}
|
||||
extern int irq_set_affinity(unsigned int irq, const struct cpumask *cpumask);
|
||||
extern int irq_force_affinity(unsigned int irq, const struct cpumask *cpumask);
|
||||
|
||||
extern int irq_can_set_affinity(unsigned int irq);
|
||||
extern int irq_select_affinity(unsigned int irq);
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
#ifndef _LINUX_KASAN_H
|
||||
#define _LINUX_KASAN_H
|
||||
|
||||
#include <linux/bug.h>
|
||||
#include <linux/static_key.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
|
|
@ -79,14 +80,6 @@ static inline void kasan_disable_current(void) {}
|
|||
|
||||
#endif /* CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS */
|
||||
|
||||
#ifdef CONFIG_KASAN
|
||||
|
||||
struct kasan_cache {
|
||||
int alloc_meta_offset;
|
||||
int free_meta_offset;
|
||||
bool is_kmalloc;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_KASAN_HW_TAGS
|
||||
|
||||
DECLARE_STATIC_KEY_FALSE(kasan_flag_enabled);
|
||||
|
|
@ -101,11 +94,14 @@ static inline bool kasan_has_integrated_init(void)
|
|||
return kasan_enabled();
|
||||
}
|
||||
|
||||
void kasan_alloc_pages(struct page *page, unsigned int order, gfp_t flags);
|
||||
void kasan_free_pages(struct page *page, unsigned int order);
|
||||
|
||||
#else /* CONFIG_KASAN_HW_TAGS */
|
||||
|
||||
static inline bool kasan_enabled(void)
|
||||
{
|
||||
return true;
|
||||
return IS_ENABLED(CONFIG_KASAN);
|
||||
}
|
||||
|
||||
static inline bool kasan_has_integrated_init(void)
|
||||
|
|
@ -113,8 +109,30 @@ static inline bool kasan_has_integrated_init(void)
|
|||
return false;
|
||||
}
|
||||
|
||||
static __always_inline void kasan_alloc_pages(struct page *page,
|
||||
unsigned int order, gfp_t flags)
|
||||
{
|
||||
/* Only available for integrated init. */
|
||||
BUILD_BUG();
|
||||
}
|
||||
|
||||
static __always_inline void kasan_free_pages(struct page *page,
|
||||
unsigned int order)
|
||||
{
|
||||
/* Only available for integrated init. */
|
||||
BUILD_BUG();
|
||||
}
|
||||
|
||||
#endif /* CONFIG_KASAN_HW_TAGS */
|
||||
|
||||
#ifdef CONFIG_KASAN
|
||||
|
||||
struct kasan_cache {
|
||||
int alloc_meta_offset;
|
||||
int free_meta_offset;
|
||||
bool is_kmalloc;
|
||||
};
|
||||
|
||||
slab_flags_t __kasan_never_merge(void);
|
||||
static __always_inline slab_flags_t kasan_never_merge(void)
|
||||
{
|
||||
|
|
@ -130,20 +148,20 @@ static __always_inline void kasan_unpoison_range(const void *addr, size_t size)
|
|||
__kasan_unpoison_range(addr, size);
|
||||
}
|
||||
|
||||
void __kasan_alloc_pages(struct page *page, unsigned int order, bool init);
|
||||
static __always_inline void kasan_alloc_pages(struct page *page,
|
||||
void __kasan_poison_pages(struct page *page, unsigned int order, bool init);
|
||||
static __always_inline void kasan_poison_pages(struct page *page,
|
||||
unsigned int order, bool init)
|
||||
{
|
||||
if (kasan_enabled())
|
||||
__kasan_alloc_pages(page, order, init);
|
||||
__kasan_poison_pages(page, order, init);
|
||||
}
|
||||
|
||||
void __kasan_free_pages(struct page *page, unsigned int order, bool init);
|
||||
static __always_inline void kasan_free_pages(struct page *page,
|
||||
unsigned int order, bool init)
|
||||
void __kasan_unpoison_pages(struct page *page, unsigned int order, bool init);
|
||||
static __always_inline void kasan_unpoison_pages(struct page *page,
|
||||
unsigned int order, bool init)
|
||||
{
|
||||
if (kasan_enabled())
|
||||
__kasan_free_pages(page, order, init);
|
||||
__kasan_unpoison_pages(page, order, init);
|
||||
}
|
||||
|
||||
void __kasan_cache_create(struct kmem_cache *cache, unsigned int *size,
|
||||
|
|
@ -285,21 +303,15 @@ void kasan_restore_multi_shot(bool enabled);
|
|||
|
||||
#else /* CONFIG_KASAN */
|
||||
|
||||
static inline bool kasan_enabled(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
static inline bool kasan_has_integrated_init(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
static inline slab_flags_t kasan_never_merge(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void kasan_unpoison_range(const void *address, size_t size) {}
|
||||
static inline void kasan_alloc_pages(struct page *page, unsigned int order, bool init) {}
|
||||
static inline void kasan_free_pages(struct page *page, unsigned int order, bool init) {}
|
||||
static inline void kasan_poison_pages(struct page *page, unsigned int order,
|
||||
bool init) {}
|
||||
static inline void kasan_unpoison_pages(struct page *page, unsigned int order,
|
||||
bool init) {}
|
||||
static inline void kasan_cache_create(struct kmem_cache *cache,
|
||||
unsigned int *size,
|
||||
slab_flags_t *flags) {}
|
||||
|
|
|
|||
|
|
@ -137,6 +137,9 @@ enum pageflags {
|
|||
#endif
|
||||
#ifdef CONFIG_64BIT
|
||||
PG_arch_2,
|
||||
#endif
|
||||
#ifdef CONFIG_KASAN_HW_TAGS
|
||||
PG_skip_kasan_poison,
|
||||
#endif
|
||||
__NR_PAGEFLAGS,
|
||||
|
||||
|
|
@ -443,6 +446,12 @@ TESTCLEARFLAG(Young, young, PF_ANY)
|
|||
PAGEFLAG(Idle, idle, PF_ANY)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_KASAN_HW_TAGS
|
||||
PAGEFLAG(SkipKASanPoison, skip_kasan_poison, PF_HEAD)
|
||||
#else
|
||||
PAGEFLAG_FALSE(SkipKASanPoison)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* PageReported() is used to track reported free pages within the Buddy
|
||||
* allocator. We can use the non-atomic version of the test and set
|
||||
|
|
|
|||
|
|
@ -1576,6 +1576,12 @@ static struct perf_pmu_events_attr _var = { \
|
|||
.event_str = _str, \
|
||||
};
|
||||
|
||||
#define PMU_EVENT_ATTR_ID(_name, _show, _id) \
|
||||
(&((struct perf_pmu_events_attr[]) { \
|
||||
{ .attr = __ATTR(_name, 0444, _show, NULL), \
|
||||
.id = _id, } \
|
||||
})[0].attr.attr)
|
||||
|
||||
#define PMU_FORMAT_ATTR(_name, _format) \
|
||||
static ssize_t \
|
||||
_name##_show(struct device *dev, \
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue