Linux 5.12.14
Sasha Levin
maintainer-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512
I'm announcing the release of the 5.12.14 kernel.
All users of the 5.12 kernel series must upgrade.
The updated 5.12.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.12.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
Thanks,
Sasha
-----BEGIN PGP SIGNATURE-----
iQIzBAEBCgAdFiEE4n5dijQDou9mhzu83qZv95d3LNwFAmDcc0QACgkQ3qZv95d3 LNwH5w//TFlFjU8wQBo9akQQjQguKKAiuIa6Mw21rWbl7kJbQpANN34+CiSF8IKS zlDmuAcAGASQttQ5Ud0TgF7wkrSFdDEwGKXeqrAmHTL2ux+1dTImBSeFAlIuEPYH dcZdhrHcrPnQGcOwrh9oE0DBJRRVyztPgqAZXXKtvraPJQnCmr5UryI31C7t2ZjQ vvtwMXNuYAzmqe9tsWYdEY4zk1cqMLWKjK1a4ePhvknnq+NSolzmv9WYJER1gjxN j5BXKms2RUZjbWql456rP0k2gRxsL2A2ZEnUzxDMgbwQASSEcQzLjpZIjrZWrteM kunUw8Qyq6FHLnmavE/l4g1tY6wPDljw6Y80Yijlr9yYgCEOvaBuKNMpeUoiwNhb WyeebAFDycuguwjpE1Fds+Qb8LgVKyzrXWgHMU75H9+VFRPIShXWgyll77DsJL8s 9Fgt8IVUCC0IyPKERsgkJ7xfWa6K5Icrhlf5jpymIZjGMfhv9G/C86CdAkBwRB9f oD6lHy/CPffzzUPuI1eSiGEv3RXHlJwrs0GWrkDJfoObli2lTXR6olNblhJwGh2y bZ26x4NU88oHUBuizMkmCiL9NK/usMfWQZdlDJ7rfPrLiHjQ+Xdf7+ORCCa35ahE DRGxrF7EpIxMjgq4LEKTlKbvT6AqsAjdw+mhjpoQoE1W6WcebkM= =Q/ui
-----END PGP SIGNATURE-----
Sasha Levin
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 12 -SUBLEVEL = 13 +SUBLEVEL = 14 EXTRAVERSION = NAME = Frozen Wasteland
arch/arm/kernel/setup.c +9 -7
@@ -545,9 +545,11 @@ void notrace cpu_init(void)* In Thumb-2, msr with an immediate value is not allowed. */ #ifdef CONFIG_THUMB2_KERNEL -#define PLC "r" +#define PLC_l "l" +#define PLC_r "r"#else -#define PLC "I" +#define PLC_l "I" +#define PLC_r "I"#endif /*
@@ -569,15 +571,15 @@ void notrace cpu_init(void) "msr cpsr_c, %9" : : "r" (stk), - PLC (PSR_F_BIT | PSR_I_BIT | IRQ_MODE), + PLC_r (PSR_F_BIT | PSR_I_BIT | IRQ_MODE), "I" (offsetof(struct stack, irq[0])), - PLC (PSR_F_BIT | PSR_I_BIT | ABT_MODE), + PLC_r (PSR_F_BIT | PSR_I_BIT | ABT_MODE), "I" (offsetof(struct stack, abt[0])), - PLC (PSR_F_BIT | PSR_I_BIT | UND_MODE), + PLC_r (PSR_F_BIT | PSR_I_BIT | UND_MODE), "I" (offsetof(struct stack, und[0])), - PLC (PSR_F_BIT | PSR_I_BIT | FIQ_MODE), + PLC_r (PSR_F_BIT | PSR_I_BIT | FIQ_MODE), "I" (offsetof(struct stack, fiq[0])), - PLC (PSR_F_BIT | PSR_I_BIT | SVC_MODE) + PLC_l (PSR_F_BIT | PSR_I_BIT | SVC_MODE) : "r14");#endif }
arch/riscv/Makefile +1 -1
@@ -16,7 +16,7 @@ ifeq ($(CONFIG_DYNAMIC_FTRACE),y) CC_FLAGS_FTRACE := -fpatchable-function-entry=8 endif -ifeq ($(CONFIG_64BIT)$(CONFIG_CMODEL_MEDLOW),yy) +ifeq ($(CONFIG_CMODEL_MEDLOW),y) KBUILD_CFLAGS_MODULE += -mcmodel=medany endif
arch/riscv/boot/dts/sifive/fu740-c000.dtsi +1 -1
@@ -272,7 +272,7 @@ cache-size = <2097152>; cache-unified; interrupt-parent = <&plic0>; - interrupts = <19 20 21 22>; + interrupts = <19 21 22 20>; reg = <0x0 0x2010000 0x0 0x1000>; }; gpio: gpio@10060000 {
arch/s390/include/asm/stacktrace.h +11 -7
@@ -91,12 +91,16 @@ struct stack_frame {CALL_ARGS_4 (arg1, arg2, arg3, arg4); \ register unsigned long r4 asm("6") = (unsigned long)(arg5) -#define CALL_FMT_0 "=&d" (r2) : -#define CALL_FMT_1 "+&d" (r2) : -#define CALL_FMT_2 CALL_FMT_1 "d" (r3), -#define CALL_FMT_3 CALL_FMT_2 "d" (r4), -#define CALL_FMT_4 CALL_FMT_3 "d" (r5), -#define CALL_FMT_5 CALL_FMT_4 "d" (r6), +/* +* To keep this simple mark register 2-6 as being changed (volatile) +* by the called function, even though register 6 is saved/nonvolatile. +*/ +#define CALL_FMT_0 "=&d" (r2) +#define CALL_FMT_1 "+&d" (r2) +#define CALL_FMT_2 CALL_FMT_1, "+&d" (r3) +#define CALL_FMT_3 CALL_FMT_2, "+&d" (r4) +#define CALL_FMT_4 CALL_FMT_3, "+&d" (r5) +#define CALL_FMT_5 CALL_FMT_4, "+&d" (r6)#define CALL_CLOBBER_5 "0", "1", "14", "cc", "memory"#define CALL_CLOBBER_4 CALL_CLOBBER_5
@@ -118,7 +122,7 @@ struct stack_frame {" brasl 14,%[_fn]\n" \" la 15,0(%[_prev])\n" \ : [_prev] "=&a" (prev), CALL_FMT_##nr \ -[_stack] " R " (stack), \ +: [_stack] " R " (stack), \ [_bc] " i" (offsetof(struct stack_frame, back_chain)), \ [_frame] " d" (frame), \ [_fn] " X " (fn) : CALL_CLOBBER_##nr); \
arch/s390/kernel/entry.S +1 -0
@@ -418,6 +418,7 @@ ENTRY(\name) xgr %r6,%r6 xgr %r7,%r7 xgr %r10,%r10 + xc __PT_FLAGS(8,%r11),__PT_FLAGS(%r11) mvc __PT_R8(64,%r11),__LC_SAVE_AREA_ASYNC stmg %r8,%r9,__PT_PSW(%r11) tm %r8,0x0001 # coming from user space?
arch/s390/kernel/signal.c +0 -1
@@ -512,7 +512,6 @@ void arch_do_signal_or_restart(struct pt_regs *regs, bool has_signal)/* No handlers present - check for system call restart */ clear_pt_regs_flag (regs,PIF_SYSCALL ); -clear_pt_regs_flag (regs,PIF_SYSCALL_RESTART );if (current->thread.system_call) { regs->int_code = current->thread.system_call;switch (regs->gprs[2 ]) {
arch/s390/kernel/topology.c +9 -3
@@ -66,7 +66,10 @@ static void cpu_group_map(cpumask_t *dst, struct mask_info *info, unsigned int c {static cpumask_t mask; -cpumask_copy (&mask,cpumask_of (cpu)); +cpumask_clear (&mask); +if (!cpu_online (cpu)) + goto out; +cpumask_set_cpu (cpu, &mask);switch (topology_mode) {case TOPOLOGY_MODE_HW :while (info) {
@@ -83,10 +86,10 @@ static void cpu_group_map(cpumask_t *dst, struct mask_info *info, unsigned int cdefault : fallthrough;case TOPOLOGY_MODE_SINGLE : -cpumask_copy (&mask,cpumask_of (cpu));break ; }cpumask_and (&mask, &mask, cpu_online_mask); +out:cpumask_copy (dst, &mask); }
@@ -95,7 +98,10 @@ static void cpu_thread_map(cpumask_t *dst, unsigned int cpu)static cpumask_t mask;int i; -cpumask_copy (&mask,cpumask_of (cpu)); +cpumask_clear (&mask); +if (!cpu_online (cpu)) + goto out; +cpumask_set_cpu (cpu, &mask);if (topology_mode !=TOPOLOGY_MODE_HW ) goto out; cpu -= cpu % (smp_cpu_mtid +1 );
arch/x86/entry/common.c +3 -2
@@ -127,8 +127,8 @@ static noinstr bool __do_fast_syscall_32(struct pt_regs *regs)/* User code screwed up. */ regs->ax = -EFAULT ; -instrumentation_end ();local_irq_disable (); +instrumentation_end ();irqentry_exit_to_user_mode (regs);return false; }
@@ -266,15 +266,16 @@ __visible noinstr void xen_pv_evtchn_do_upcall(struct pt_regs *regs)irqentry_state_t state =irqentry_enter (regs);bool inhcall; +instrumentation_begin ();run_sysvec_on_irqstack_cond (__xen_pv_evtchn_do_upcall, regs); inhcall =get_and_clear_inhcall ();if (inhcall && !WARN_ON_ONCE (state.exit_rcu)) { -instrumentation_begin ();irqentry_exit_cond_resched ();instrumentation_end ();restore_inhcall (inhcall); }else { +instrumentation_end ();irqentry_exit (regs, state); } }
arch/x86/events/core.c +17 -6
@@ -45,9 +45,11 @@#include "perf_event.h" struct x86_pmu x86_pmu__read_mostly ; +static struct pmu pmu; DEFINE_PER_CPU(struct cpu_hw_events, cpu_hw_events) = { .enabled =1 , + .pmu = &pmu, };DEFINE_STATIC_KEY_FALSE (rdpmc_never_available_key);
@@ -380,10 +382,12 @@ int x86_reserve_hardware(void)if (!atomic_inc_not_zero (&pmc_refcount)) {mutex_lock (&pmc_reserve_mutex);if (atomic_read (&pmc_refcount) ==0 ) { -if (!reserve_pmc_hardware ()) +if (!reserve_pmc_hardware ()) { err = -EBUSY ; -else + }else {reserve_ds_buffers (); +reserve_lbr_buffers (); + } }if (!err)atomic_inc (&pmc_refcount);
@@ -724,16 +728,23 @@ void x86_pmu_enable_all(int added) } } -static struct pmu pmu; -static inline int is_x86_event (struct perf_event *event) {return event->pmu == &pmu; } -struct pmu *x86_get_pmu (void ) +struct pmu *x86_get_pmu (unsigned int cpu) { -return &pmu; +struct cpu_hw_events *cpuc = &per_cpu (cpu_hw_events, cpu); + +/* +* All CPUs of the hybrid type have been offline. +* The x86_get_pmu() should not be invoked. +*/ +if (WARN_ON_ONCE (!cpuc->pmu)) +return &pmu; + +return cpuc->pmu; }/* * Event scheduler state:
arch/x86/events/intel/core.c +1 -1
@@ -4879,7 +4879,7 @@ static void update_tfa_sched(void *ignored)* and if so force schedule out for all event types all contexts */ if (test_bit (3 , cpuc->active_mask)) -perf_pmu_resched (x86_get_pmu ()); +perf_pmu_resched (x86_get_pmu (smp_processor_id ())); } static ssize_t show_sysctl_tfa(struct device *cdev,
arch/x86/events/intel/ds.c +2 -2
@@ -2192,7 +2192,7 @@ void __init intel_ds_init(void)PERF_SAMPLE_TIME ; x86_pmu.flags |=PMU_FL_PEBS_ALL ; pebs_qual ="-baseline" ; -x86_get_pmu ()->capabilities |=PERF_PMU_CAP_EXTENDED_REGS ; +x86_get_pmu (smp_processor_id ())->capabilities |=PERF_PMU_CAP_EXTENDED_REGS ; }else {/* Only basic record supported */ x86_pmu.large_pebs_flags &=
@@ -2207,7 +2207,7 @@ void __init intel_ds_init(void)if (x86_pmu.intel_cap.pebs_output_pt_available) {pr_cont ("PEBS-via-PT, " ); -x86_get_pmu ()->capabilities |=PERF_PMU_CAP_AUX_OUTPUT ; +x86_get_pmu (smp_processor_id ())->capabilities |=PERF_PMU_CAP_AUX_OUTPUT ; }break ;
arch/x86/events/intel/lbr.c +26 -10
@@ -658,7 +658,6 @@ static inline bool branch_user_callstack(unsigned br_sel)void intel_pmu_lbr_add (struct perf_event *event) { -struct kmem_cache *kmem_cache = event->pmu->task_ctx_cache;struct cpu_hw_events *cpuc =this_cpu_ptr (&cpu_hw_events);if (!x86_pmu.lbr_nr)
@@ -696,16 +695,11 @@ void intel_pmu_lbr_add(struct perf_event *event)perf_sched_cb_inc (event->ctx->pmu);if (!cpuc->lbr_users++ && !event->total_time_running)intel_pmu_lbr_reset (); - -if (static_cpu_has (X86_FEATURE_ARCH_LBR ) && - kmem_cache && !cpuc->lbr_xsave && - (cpuc->lbr_users != cpuc->lbr_pebs_users)) - cpuc->lbr_xsave =kmem_cache_alloc (kmem_cache,GFP_KERNEL ); }void release_lbr_buffers (void ) { -struct kmem_cache *kmem_cache =x86_get_pmu ()->task_ctx_cache; +struct kmem_cache *kmem_cache;struct cpu_hw_events *cpuc;int cpu;
@@ -714,6 +708,7 @@ void release_lbr_buffers(void)for_each_possible_cpu (cpu) { cpuc =per_cpu_ptr (&cpu_hw_events, cpu); + kmem_cache =x86_get_pmu (cpu)->task_ctx_cache;if (kmem_cache && cpuc->lbr_xsave) {kmem_cache_free (kmem_cache, cpuc->lbr_xsave); cpuc->lbr_xsave =NULL ;
@@ -721,6 +716,27 @@ void release_lbr_buffers(void) } } +void reserve_lbr_buffers (void ) +{ +struct kmem_cache *kmem_cache; +struct cpu_hw_events *cpuc; +int cpu; + +if (!static_cpu_has (X86_FEATURE_ARCH_LBR )) +return ; + +for_each_possible_cpu (cpu) { + cpuc =per_cpu_ptr (&cpu_hw_events, cpu); + kmem_cache =x86_get_pmu (cpu)->task_ctx_cache; +if (!kmem_cache || cpuc->lbr_xsave) +continue ; + + cpuc->lbr_xsave =kmem_cache_alloc_node (kmem_cache, +GFP_KERNEL | __GFP_ZERO, +cpu_to_node (cpu)); + } +} +void intel_pmu_lbr_del (struct perf_event *event) {struct cpu_hw_events *cpuc =this_cpu_ptr (&cpu_hw_events);
@@ -1609,7 +1625,7 @@ void intel_pmu_lbr_init_hsw(void) x86_pmu.lbr_sel_mask =LBR_SEL_MASK ; x86_pmu.lbr_sel_map = hsw_lbr_sel_map; -x86_get_pmu ()->task_ctx_cache =create_lbr_kmem_cache (size,0 ); +x86_get_pmu (smp_processor_id ())->task_ctx_cache =create_lbr_kmem_cache (size,0 );if (lbr_from_signext_quirk_needed ())static_branch_enable (&lbr_from_quirk_key);
@@ -1629,7 +1645,7 @@ __init void intel_pmu_lbr_init_skl(void) x86_pmu.lbr_sel_mask =LBR_SEL_MASK ; x86_pmu.lbr_sel_map = hsw_lbr_sel_map; -x86_get_pmu ()->task_ctx_cache =create_lbr_kmem_cache (size,0 ); +x86_get_pmu (smp_processor_id ())->task_ctx_cache =create_lbr_kmem_cache (size,0 );/* * SW branch filter usage:
@@ -1726,7 +1742,7 @@ static bool is_arch_lbr_xsave_available(void)void __init intel_pmu_arch_lbr_init (void ) { -struct pmu *pmu =x86_get_pmu (); +struct pmu *pmu =x86_get_pmu (smp_processor_id ());union cpuid28_eax eax;union cpuid28_ebx ebx;union cpuid28_ecx ecx;
arch/x86/events/perf_event.h +9 -1
@@ -327,6 +327,8 @@ struct cpu_hw_events {int n_pair;/* Large increment events */ void *kfree_on_online[X86_PERF_KFREE_MAX ]; + +struct pmu *pmu; };#define __EVENT_CONSTRAINT_RANGE (c, e, n, m, w, o, f) { \
@@ -905,7 +907,7 @@ static struct perf_pmu_events_ht_attr event_attr_##v = { \ .event_str_ht = ht, \ } -struct pmu *x86_get_pmu (void ); +struct pmu *x86_get_pmu (unsigned int cpu);extern struct x86_pmu x86_pmu__read_mostly ; static __always_inline struct x86_perf_task_context_opt *task_context_opt(void *ctx)
@@ -1135,6 +1137,8 @@ void reserve_ds_buffers(void);void release_lbr_buffers (void ); +void reserve_lbr_buffers (void ); +extern struct event_constraint bts_constraint;extern struct event_constraint vlbr_constraint;
@@ -1282,6 +1286,10 @@ static inline void release_lbr_buffers(void) { } +static inline void reserve_lbr_buffers (void ) +{ +} +static inline int intel_pmu_init (void ) {return 0 ;
arch/x86/include/asm/fpu/internal.h +8 -22
@@ -204,6 +204,14 @@ static inline void copy_fxregs_to_kernel(struct fpu *fpu) asmvolatile ("fxsaveq %[fx]" : [fx]"=m" (fpu->state.fxsave)); } +static inline void fxsave (struct fxregs_state *fx) +{ +if (IS_ENABLED (CONFIG_X86_32 )) + asmvolatile ("fxsave %[fx]" : [fx]"=m" (*fx)); +else + asmvolatile ("fxsaveq %[fx]" : [fx]"=m" (*fx)); +} +/* These macros all use (%edi)/(%rdi) as the single memory argument. */ #define XSAVE ".byte " REX_PREFIX "0x0f,0xae,0x27"#define XSAVEOPT ".byte " REX_PREFIX "0x0f,0xae,0x37"
@@ -268,28 +276,6 @@ static inline void copy_fxregs_to_kernel(struct fpu *fpu) : "D" (st), "m" (*st), "a" (lmask), "d" (hmask) \ : "memory") -/* -* This function is called only during boot time when x86 caps are not set -* up and alternative can not be used yet. -*/ -static inline void copy_xregs_to_kernel_booting (struct xregs_state *xstate) -{ -u64 mask = xfeatures_mask_all; -u32 lmask = mask; -u32 hmask = mask >>32 ; -int err; - -WARN_ON (system_state !=SYSTEM_BOOTING ); - -if (boot_cpu_has (X86_FEATURE_XSAVES )) -XSTATE_OP (XSAVES , xstate, lmask, hmask, err); -else -XSTATE_OP (XSAVE , xstate, lmask, hmask, err); - -/* We should never fault when copying to a kernel buffer: */ -WARN_ON_FPU (err); -} -/* * This function is called only during boot time when x86 caps are not set * up and alternative can not be used yet.
arch/x86/kernel/fpu/signal.c +8 -18
@@ -221,28 +221,18 @@ sanitize_restored_user_xstate(union fpregs_state *state,if (use_xsave ()) {/* -* Note: we don't need to zero the reserved bits in the -* xstate_header here because we either didn't copy them at all, -* or we checked earlier that they aren't set. +* Clear all feature bits which are not set in +* user_xfeatures and clear all extended features +* for fx_only mode. */ +u64 mask = fx_only ?XFEATURE_MASK_FPSSE : user_xfeatures;/* -* 'user_xfeatures' might have bits clear which are -* set in header->xfeatures. This represents features that -* were in init state prior to a signal delivery, and need -* to be reset back to the init state. Clear any user -* feature bits which are set in the kernel buffer to get -* them back to the init state. -* -* Supervisor state is unchanged by input from userspace. -* Ensure supervisor state bits stay set and supervisor -* state is not modified. +* Supervisor state has to be preserved. The sigframe +* restore can only modify user features, i.e. @mask +* cannot contain them. */ -if (fx_only) - header->xfeatures =XFEATURE_MASK_FPSSE ; -else - header->xfeatures &= user_xfeatures | -xfeatures_mask_supervisor (); + header->xfeatures &= mask |xfeatures_mask_supervisor (); }if (use_fxsr ()) {
arch/x86/kernel/fpu/xstate.c +38 -3
60 lines not on this page · raw message
arch/x86/kvm/svm/sev.c +21 -11
@@ -143,9 +143,25 @@ static void sev_asid_free(int asid)mutex_unlock (&sev_bitmap_lock); } -static void sev_unbind_asid (struct kvm *kvm,unsigned int handle) +static void sev_decommission (unsigned int handle) {struct sev_data_decommission *decommission; + +if (!handle) +return ; + + decommission =kzalloc (sizeof (*decommission),GFP_KERNEL ); +if (!decommission) +return ; + + decommission->handle = handle; +sev_guest_decommission (decommission,NULL ); + +kfree (decommission); +} + +static void sev_unbind_asid (struct kvm *kvm,unsigned int handle) +{struct sev_data_deactivate *data;if (!handle)
@@ -165,15 +181,7 @@ static void sev_unbind_asid(struct kvm *kvm, unsigned int handle)kfree (data); - decommission =kzalloc (sizeof (*decommission),GFP_KERNEL ); -if (!decommission) -return ; - -/* decommission handle */ - decommission->handle = handle; -sev_guest_decommission (decommission,NULL ); - -kfree (decommission); +sev_decommission (handle); }static int sev_guest_init (struct kvm *kvm,struct kvm_sev_cmd *argp)
@@ -303,8 +311,10 @@ static int sev_launch_start(struct kvm *kvm, struct kvm_sev_cmd *argp)/* Bind ASID to this guest */ ret =sev_bind_asid (kvm, start->handle, error); -if (ret) +if (ret) { +sev_decommission (start->handle); goto e_free_session; + }/* return handle to userspace */ params.handle = start->handle;
arch/x86/pci/fixup.c +44 -0
48 lines not on this page · raw message
arch/x86/xen/enlighten_pv.c +2 -0
@@ -592,8 +592,10 @@ DEFINE_IDTENTRY_RAW(xenpv_exc_debug)DEFINE_IDTENTRY_RAW (exc_xen_unknown_trap) {/* This should never happen and there is no way to handle it. */ +instrumentation_begin ();pr_err ("Unknown trap in Xen PV mode." );BUG (); +instrumentation_end (); }#ifdef CONFIG_X86_MCE
certs/Kconfig +17 -0
@@ -83,4 +83,21 @@ config SYSTEM_BLACKLIST_HASH_LIST wrapper to incorporate the list into the kernel. Each <hash> should be a string of hex digits. +config SYSTEM_REVOCATION_LIST + bool "Provide system-wide ring of revocation certificates" + depends on SYSTEM_BLACKLIST_KEYRING + depends on PKCS7_MESSAGE_PARSER=y + help + If set, this allows revocation certificates to be stored in the + blacklist keyring and implements a hook whereby a PKCS#7 message can + be checked to see if it matches such a certificate. + +config SYSTEM_REVOCATION_KEYS + string "X.509 certificates to be preloaded into the system blacklist keyring" + depends on SYSTEM_REVOCATION_LIST + help + If set, this option should be the filename of a PEM-formatted file + containing X.509 certificates to be included in the default blacklist + keyring. + endmenu
certs/Makefile +18 -3
@@ -3,8 +3,9 @@ # Makefile for the linux kernel signature checking certificates. # -obj-$(CONFIG_SYSTEM_TRUSTED_KEYRING) += system_keyring.o system_certificates.o -obj-$(CONFIG_SYSTEM_BLACKLIST_KEYRING) += blacklist.o +obj-$(CONFIG_SYSTEM_TRUSTED_KEYRING) += system_keyring.o system_certificates.o common.o +obj-$(CONFIG_SYSTEM_BLACKLIST_KEYRING) += blacklist.o common.o +obj-$(CONFIG_SYSTEM_REVOCATION_LIST) += revocation_certificates.o ifneq ($(CONFIG_SYSTEM_BLACKLIST_HASH_LIST),"") obj-$(CONFIG_SYSTEM_BLACKLIST_KEYRING) += blacklist_hashes.o else
@@ -29,7 +30,7 @@ $(obj)/x509_certificate_list: scripts/extract-cert $(SYSTEM_TRUSTED_KEYS_SRCPREF $(call if_changed,extract_certs,$(SYSTEM_TRUSTED_KEYS_SRCPREFIX)$(CONFIG_SYSTEM_TRUSTED_KEYS)) endif # CONFIG_SYSTEM_TRUSTED_KEYRING -clean-files := x509_certificate_list .x509.list +clean-files := x509_certificate_list .x509.list x509_revocation_list ifeq ($(CONFIG_MODULE_SIG),y) ###############################################################################
@@ -104,3 +105,17 @@ targets += signing_key.x509 $(obj)/signing_key.x509: scripts/extract-cert $(X509_DEP) FORCE $(call if_changed,extract_certs,$(MODULE_SIG_KEY_SRCPREFIX)$(CONFIG_MODULE_SIG_KEY)) endif # CONFIG_MODULE_SIG + +ifeq ($(CONFIG_SYSTEM_REVOCATION_LIST),y) + +$(eval $(call config_filename,SYSTEM_REVOCATION_KEYS)) + +$(obj)/revocation_certificates.o: $(obj)/x509_revocation_list + +quiet_cmd_extract_certs = EXTRACT_CERTS $(patsubst "%",%,$(2)) + cmd_extract_certs = scripts/extract-cert $(2) $@ + +targets += x509_revocation_list +$(obj)/x509_revocation_list: scripts/extract-cert $(SYSTEM_REVOCATION_KEYS_SRCPREFIX)$(SYSTEM_REVOCATION_KEYS_FILENAME) FORCE + $(call if_changed,extract_certs,$(SYSTEM_REVOCATION_KEYS_SRCPREFIX)$(CONFIG_SYSTEM_REVOCATION_KEYS)) +endif
certs/blacklist.c +64 -0
82 lines not on this page · raw message
certs/blacklist.h +2 -0
@@ -1,3 +1,5 @@#include <linux/kernel.h> +#include <linux/errno.h> +#include <crypto/pkcs7.h> extern const char __initconst *const blacklist_hashes[];
certs/common.c new file +57 -0
57 lines not on this page · raw message
certs/common.h new file +9 -0
@@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +#ifndef _CERT_COMMON_H +#define _CERT_COMMON_H + +int load_certificate_list (const u8 cert_list[],const unsigned long list_size, +const struct key *keyring); + +#endif
certs/revocation_certificates.S new file +21 -0
@@ -0,0 +1,21 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#include <linux/export.h> +#include <linux/init.h> + + __INITRODATA + + .align 8 + .globl revocation_certificate_list +revocation_certificate_list: +__revocation_list_start: + .incbin "certs/x509_revocation_list" +__revocation_list_end: + + .align 8 + .globl revocation_certificate_list_size +revocation_certificate_list_size: +#ifdef CONFIG_64BIT + .quad __revocation_list_end - __revocation_list_start +#else + .long __revocation_list_end - __revocation_list_start +#endif
certs/system_keyring.c +9 -46
75 lines not on this page · raw message
drivers/base/swnode.c +12 -4
@@ -1032,7 +1032,15 @@ int device_add_software_node(struct device *dev, const struct software_node *nod }set_secondary_fwnode (dev, &swnode->fwnode); -software_node_notify (dev,KOBJ_ADD ); + +/* +* If the device has been fully registered by the time this function is +* called, software_node_notify() must be called separately so that the +* symlinks get created and the reference count of the node is kept in +* balance. +*/ +if (device_is_registered (dev)) +software_node_notify (dev,KOBJ_ADD );return 0 ; }
@@ -1052,7 +1060,8 @@ void device_remove_software_node(struct device *dev)if (!swnode)return ; -software_node_notify (dev,KOBJ_REMOVE ); +if (device_is_registered (dev)) +software_node_notify (dev,KOBJ_REMOVE );set_secondary_fwnode (dev,NULL );kobject_put (&swnode->kobj); }
@@ -1106,8 +1115,7 @@ int software_node_notify(struct device *dev, unsigned long action)switch (action) {case KOBJ_ADD : - ret =sysfs_create_link_nowarn (&dev->kobj, &swnode->kobj, -"software_node" ); + ret =sysfs_create_link (&dev->kobj, &swnode->kobj,"software_node" );if (ret)break ;
drivers/dma/Kconfig +1 -0
@@ -690,6 +690,7 @@ config XILINX_ZYNQMP_DMA config XILINX_ZYNQMP_DPDMA tristate "Xilinx DPDMA Engine" + depends on HAS_IOMEM && OF select DMA_ENGINE select DMA_VIRTUAL_CHANNELS help
drivers/dma/idxd/cdev.c +1 -0
@@ -110,6 +110,7 @@ static int idxd_cdev_open(struct inode *inode, struct file *filp) pasid =iommu_sva_get_pasid (sva);if (pasid ==IOMMU_PASID_INVALID ) {iommu_sva_unbind_device (sva); + rc = -EINVAL ; goto failed; }
drivers/dma/mediatek/mtk-uart-apdma.c +14 -13
@@ -131,10 +131,7 @@ static unsigned int mtk_uart_apdma_read(struct mtk_chan *c, unsigned int reg)static void mtk_uart_apdma_desc_free (struct virt_dma_desc *vd) { -struct dma_chan *chan = vd->tx.chan; -struct mtk_chan *c =to_mtk_uart_apdma_chan (chan); - -kfree (c->desc); +kfree (container_of(vd ,struct mtk_uart_apdma_desc ,vd )); }static void mtk_uart_apdma_start_tx (struct mtk_chan *c)
@@ -207,14 +204,9 @@ static void mtk_uart_apdma_start_rx(struct mtk_chan *c)static void mtk_uart_apdma_tx_handler (struct mtk_chan *c) { -struct mtk_uart_apdma_desc *d = c->desc; -mtk_uart_apdma_write (c,VFF_INT_FLAG ,VFF_TX_INT_CLR_B );mtk_uart_apdma_write (c,VFF_INT_EN ,VFF_INT_EN_CLR_B );mtk_uart_apdma_write (c,VFF_EN ,VFF_EN_CLR_B ); - -list_del (&d->vd.node); -vchan_cookie_complete (&d->vd); }static void mtk_uart_apdma_rx_handler (struct mtk_chan *c)
@@ -245,9 +237,17 @@ static void mtk_uart_apdma_rx_handler(struct mtk_chan *c) c->rx_status = d->avail_len - cnt;mtk_uart_apdma_write (c,VFF_RPT , wg); +} -list_del (&d->vd.node); -vchan_cookie_complete (&d->vd); +static void mtk_uart_apdma_chan_complete_handler (struct mtk_chan *c) +{ +struct mtk_uart_apdma_desc *d = c->desc; + +if (d) { +list_del (&d->vd.node); +vchan_cookie_complete (&d->vd); + c->desc =NULL ; + } }static irqreturn_t mtk_uart_apdma_irq_handler (int irq,void *dev_id)
@@ -261,6 +261,7 @@ static irqreturn_t mtk_uart_apdma_irq_handler(int irq, void *dev_id)mtk_uart_apdma_rx_handler (c); else if (c->dir == DMA_MEM_TO_DEV) mtk_uart_apdma_tx_handler(c); +mtk_uart_apdma_chan_complete_handler (c );spin_unlock_irqrestore (&c->vc.lock, flags);return IRQ_HANDLED ;
@@ -348,7 +349,7 @@ static struct dma_async_tx_descriptor *mtk_uart_apdma_prep_slave_sgreturn NULL ;/* Now allocate and setup the descriptor */ - d =kzalloc (sizeof (*d),GFP_ATOMIC ); + d =kzalloc (sizeof (*d),GFP_NOWAIT );if (!d)return NULL ;
@@ -366,7 +367,7 @@ static void mtk_uart_apdma_issue_pending(struct dma_chan *chan)unsigned long flags;spin_lock_irqsave (&c->vc.lock, flags); -if (vchan_issue_pending (&c->vc)) { +if (vchan_issue_pending (&c->vc) && !c->desc) { vd =vchan_next_desc (&c->vc); c->desc =to_mtk_uart_apdma_desc (&vd->tx);
drivers/dma/sh/rcar-dmac.c +1 -1
@@ -1913,7 +1913,7 @@ static int rcar_dmac_probe(struct platform_device *pdev)/* Enable runtime PM and initialize the device. */ pm_runtime_enable (&pdev->dev); - ret =pm_runtime_get_sync (&pdev->dev); + ret =pm_runtime_resume_and_get (&pdev->dev);if (ret <0 ) {dev_err (&pdev->dev,"runtime PM get sync failed (%d)\n" , ret);return ret;
drivers/dma/stm32-mdma.c +2 -2
@@ -1452,7 +1452,7 @@ static int stm32_mdma_alloc_chan_resources(struct dma_chan *c)return -ENOMEM ; } - ret =pm_runtime_get_sync (dmadev->ddev.dev); + ret =pm_runtime_resume_and_get (dmadev->ddev.dev);if (ret <0 )return ret;
@@ -1718,7 +1718,7 @@ static int stm32_mdma_pm_suspend(struct device *dev)u32 ccr, id;int ret; - ret =pm_runtime_get_sync (dev); + ret =pm_runtime_resume_and_get (dev);if (ret <0 )return ret;
drivers/dma/xilinx/xilinx_dpdma.c +5 -2
@@ -113,6 +113,7 @@#define XILINX_DPDMA_CH_VDO 0x020#define XILINX_DPDMA_CH_PYLD_SZ 0x024#define XILINX_DPDMA_CH_DESC_ID 0x028 +#define XILINX_DPDMA_CH_DESC_ID_MASK GENMASK(15, 0)/* DPDMA descriptor fields */ #define XILINX_DPDMA_DESC_CONTROL_PREEMBLE 0xa5
@@ -866,7 +867,8 @@ static void xilinx_dpdma_chan_queue_transfer(struct xilinx_dpdma_chan *chan)* will be used, but it should be enough. */ list_for_each_entry (sw_desc, &desc->descriptors, node) - sw_desc->hw.desc_id = desc->vdesc.tx.cookie; + sw_desc->hw.desc_id = desc->vdesc.tx.cookie + &XILINX_DPDMA_CH_DESC_ID_MASK ; sw_desc =list_first_entry (&desc->descriptors, struct xilinx_dpdma_sw_desc, node);
@@ -1086,7 +1088,8 @@ static void xilinx_dpdma_chan_vsync_irq(struct xilinx_dpdma_chan *chan)if (!chan->running || !pending) goto out; - desc_id =dpdma_read (chan->reg,XILINX_DPDMA_CH_DESC_ID ); + desc_id =dpdma_read (chan->reg,XILINX_DPDMA_CH_DESC_ID ) + &XILINX_DPDMA_CH_DESC_ID_MASK ;/* If the retrigger raced with vsync, retry at the next frame. */ sw_desc = list_first_entry(&pending->descriptors,
drivers/dma/xilinx/zynqmp_dma.c +1 -1
@@ -468,7 +468,7 @@ static int zynqmp_dma_alloc_chan_resources(struct dma_chan *dchan)struct zynqmp_dma_desc_sw *desc;int i, ret; - ret =pm_runtime_get_sync (chan->dev); + ret =pm_runtime_resume_and_get (chan->dev);if (ret <0 )return ret;
drivers/gpio/gpiolib-cdev.c +1 -0
@@ -1880,6 +1880,7 @@ static void gpio_v2_line_info_changed_to_v1(struct gpio_v2_line_info_changed *lic_v2, struct gpioline_info_changed *lic_v1) { + memset(lic_v1, 0, sizeof(*lic_v1));gpio_v2_line_info_to_v1 (&lic_v2->info, &lic_v1->info); lic_v1->timestamp = lic_v2->timestamp_ns; lic_v1->event_type = lic_v2->event_type;
drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c +13 -1
@@ -214,9 +214,21 @@ static int amdgpu_dma_buf_pin(struct dma_buf_attachment *attach) {struct drm_gem_object *obj = attach->dmabuf->priv;struct amdgpu_bo *bo =gem_to_amdgpu_bo (obj); +int r;/* pin buffer into GTT */ -return amdgpu_bo_pin (bo,AMDGPU_GEM_DOMAIN_GTT ); + r =amdgpu_bo_pin (bo,AMDGPU_GEM_DOMAIN_GTT ); +if (r) +return r; + +if (bo->tbo.moving) { + r =dma_fence_wait (bo->tbo.moving, true); +if (r) { +amdgpu_bo_unpin (bo); +return r; + } + } +return 0 ; }/**
drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c +1 -5
@@ -6769,12 +6769,8 @@ static int gfx_v10_0_kiq_init_register(struct amdgpu_ring *ring)if (ring->use_doorbell) {WREG32_SOC15 (GC ,0 , mmCP_MEC_DOORBELL_RANGE_LOWER, (adev->doorbell_index.kiq *2 ) <<2 ); -/* If GC has entered CGPG, ringing doorbell > first page doesn't -* wakeup GC. Enlarge CP_MEC_DOORBELL_RANGE_UPPER to workaround -* this issue. -*/ WREG32_SOC15 (GC ,0 , mmCP_MEC_DOORBELL_RANGE_UPPER, - (adev->doorbell.size -4 )); + (adev->doorbell_index.userqueue_end *2 ) <<2 ); } WREG32_SOC15(GC, 0, mmCP_HQD_PQ_DOORBELL_CONTROL,
drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +1 -5
@@ -3623,12 +3623,8 @@ static int gfx_v9_0_kiq_init_register(struct amdgpu_ring *ring)if (ring->use_doorbell) {WREG32_SOC15 (GC ,0 , mmCP_MEC_DOORBELL_RANGE_LOWER, (adev->doorbell_index.kiq *2 ) <<2 ); -/* If GC has entered CGPG, ringing doorbell > first page doesn't -* wakeup GC. Enlarge CP_MEC_DOORBELL_RANGE_UPPER to workaround -* this issue. -*/ WREG32_SOC15 (GC ,0 , mmCP_MEC_DOORBELL_RANGE_UPPER, - (adev->doorbell.size -4 )); + (adev->doorbell_index.userqueue_end *2 ) <<2 ); } WREG32_SOC15_RLC(GC, 0, mmCP_HQD_PQ_DOORBELL_CONTROL,
drivers/gpu/drm/kmb/kmb_drv.c +1 -0
@@ -137,6 +137,7 @@ static int kmb_hw_init(struct drm_device *drm, unsigned long flags)/* Allocate LCD interrupt resources */ irq_lcd =platform_get_irq (pdev,0 );if (irq_lcd <0 ) { + ret = irq_lcd;drm_err (&kmb->drm,"irq_lcd not found" ); goto setup_fail; }
drivers/gpu/drm/nouveau/nouveau_prime.c +16 -1
@@ -93,7 +93,22 @@ int nouveau_gem_prime_pin(struct drm_gem_object *obj)if (ret)return -EINVAL ; -return 0 ; + ret =ttm_bo_reserve (&nvbo->bo, false, false,NULL ); +if (ret) + goto error; + +if (nvbo->bo.moving) + ret =dma_fence_wait (nvbo->bo.moving, true); + +ttm_bo_unreserve (&nvbo->bo); +if (ret) + goto error; + +return ret; + +error: +nouveau_bo_unpin (nvbo); +return ret; }void nouveau_gem_prime_unpin (struct drm_gem_object *obj)
drivers/gpu/drm/radeon/radeon_prime.c +13 -3
@@ -77,9 +77,19 @@ int radeon_gem_prime_pin(struct drm_gem_object *obj)/* pin buffer into GTT */ ret =radeon_bo_pin (bo,RADEON_GEM_DOMAIN_GTT ,NULL ); -if (likely (ret ==0 )) - bo->prime_shared_count++; - +if (unlikely (ret)) + goto error; + +if (bo->tbo.moving) { + ret =dma_fence_wait (bo->tbo.moving, false); +if (unlikely (ret)) { +radeon_bo_unpin (bo); + goto error; + } + } + + bo->prime_shared_count++; +error:radeon_bo_unreserve (bo);return ret; }
drivers/gpu/drm/vc4/vc4_hdmi.c +34 -10
101 lines not on this page · raw message
drivers/i2c/busses/i2c-i801.c +3 -0
@@ -978,6 +978,9 @@ static s32 i801_access(struct i2c_adapter *adap, u16 addr, } out: +/* Unlock the SMBus device for use by BIOS/ACPI */ +outb_p (SMBHSTSTS_INUSE_STS ,SMBHSTSTS (priv)); +pm_runtime_mark_last_busy (&priv->pci_dev->dev);pm_runtime_put_autosuspend (&priv->pci_dev->dev);mutex_unlock (&priv->acpi_lock);
drivers/i2c/busses/i2c-robotfuzz-osif.c +2 -2
@@ -83,7 +83,7 @@ static int osif_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, } } - ret =osif_usb_read (adapter,OSIFI2C_STOP ,0 ,0 ,NULL ,0 ); + ret =osif_usb_write (adapter,OSIFI2C_STOP ,0 ,0 ,NULL ,0 );if (ret) {dev_err (&adapter->dev,"failure sending STOP\n" );return -EREMOTEIO ;
@@ -153,7 +153,7 @@ static int osif_probe(struct usb_interface *interface,* Set bus frequency. The frequency is: * 120,000,000 / ( 16 + 2 * div * 4^prescale). * Using dev = 52, prescale = 0 give 100KHz */ - ret =osif_usb_read (&priv->adapter,OSIFI2C_SET_BIT_RATE ,52 ,0 , + ret =osif_usb_write (&priv->adapter,OSIFI2C_SET_BIT_RATE ,52 ,0 ,NULL ,0 );if (ret) {dev_err (&interface->dev,"failure sending bit rate" );
drivers/mmc/host/meson-gx-mmc.c +45 -5
80 lines not on this page · raw message
drivers/net/caif/caif_serial.c +1 -0
@@ -350,6 +350,7 @@ static int ldisc_open(struct tty_struct *tty)rtnl_lock (); result =register_netdevice (dev);if (result) { +tty_kref_put (tty);rtnl_unlock ();free_netdev (dev);return -ENODEV ;
drivers/net/ethernet/qlogic/qed/qed_dcbx.c +3 -1
@@ -1266,9 +1266,11 @@ int qed_dcbx_get_config_params(struct qed_hwfn *p_hwfn, p_hwfn->p_dcbx_info->set.ver_num |=DCBX_CONFIG_VERSION_STATIC ; p_hwfn->p_dcbx_info->set.enabled = dcbx_info->operational.enabled; +BUILD_BUG_ON (sizeof (dcbx_info->operational.params) != +sizeof (p_hwfn->p_dcbx_info->set.config.params));memcpy (&p_hwfn->p_dcbx_info->set.config.params, &dcbx_info->operational.params, -sizeof (struct qed_dcbx_admin_params )); +sizeof (p_hwfn->p_dcbx_info->set.config.params)); p_hwfn->p_dcbx_info->set.config.valid = true;memcpy (params, &p_hwfn->p_dcbx_info->set,sizeof (struct qed_dcbx_set ));
drivers/net/ethernet/realtek/r8169_main.c +1 -1
@@ -1673,7 +1673,7 @@ static void rtl8169_get_strings(struct net_device *dev, u32 stringset, u8 *data) {switch (stringset) {case ETH_SS_STATS : -memcpy (data, *rtl8169_gstrings,sizeof (rtl8169_gstrings)); +memcpy (data, rtl8169_gstrings,sizeof (rtl8169_gstrings));break ; } }
drivers/net/ethernet/renesas/sh_eth.c +1 -1
@@ -2287,7 +2287,7 @@ static void sh_eth_get_strings(struct net_device *ndev, u32 stringset, u8 *data) {switch (stringset) {case ETH_SS_STATS : -memcpy (data, *sh_eth_gstrings_stats, +memcpy (data, sh_eth_gstrings_stats,sizeof (sh_eth_gstrings_stats));break ; }
drivers/net/ethernet/xilinx/ll_temac_main.c +18 -1
@@ -774,12 +774,15 @@ static void temac_start_xmit_done(struct net_device *ndev) stat =be32_to_cpu (cur_p->app0);while (stat &STS_CTRL_APP0_CMPLT ) { +/* Make sure that the other fields are read after bd is +* released by dma +*/ +rmb ();dma_unmap_single (ndev->dev.parent,be32_to_cpu (cur_p->phys),be32_to_cpu (cur_p->len),DMA_TO_DEVICE ); skb = (struct sk_buff *)ptr_from_txbd (cur_p);if (skb)dev_consume_skb_irq (skb); - cur_p->app0 =0 ; cur_p->app1 =0 ; cur_p->app2 =0 ; cur_p->app3 =0 ;
@@ -788,6 +791,12 @@ static void temac_start_xmit_done(struct net_device *ndev) ndev->stats.tx_packets++; ndev->stats.tx_bytes +=be32_to_cpu (cur_p->len); +/* app0 must be visible last, as it is used to flag +* availability of the bd +*/ +smp_mb (); + cur_p->app0 =0 ; + lp->tx_bd_ci++;if (lp->tx_bd_ci >= lp->tx_bd_num) lp->tx_bd_ci =0 ;
@@ -814,6 +823,9 @@ static inline int temac_check_tx_bd_space(struct temac_local *lp, int num_frag)if (cur_p->app0)return NETDEV_TX_BUSY ; +/* Make sure to read next bd app0 after this one */ +rmb (); + tail++;if (tail >= lp->tx_bd_num) tail =0 ;
@@ -930,6 +942,11 @@ temac_start_xmit(struct sk_buff *skb, struct net_device *ndev)wmb (); lp->dma_out (lp,TX_TAILDESC_PTR , tail_p);/* DMA start */ +if (temac_check_tx_bd_space (lp,MAX_SKB_FRAGS +1 )) { +netdev_info (ndev,"%s -> netif_stop_queue\n" , __func__); +netif_stop_queue (ndev); + } +return NETDEV_TX_OK ; }
drivers/net/phy/dp83867.c +1 -5
@@ -826,16 +826,12 @@ static int dp83867_phy_reset(struct phy_device *phydev) {int err; - err =phy_write (phydev,DP83867_CTRL ,DP83867_SW_RESET ); + err =phy_write (phydev,DP83867_CTRL ,DP83867_SW_RESTART );if (err <0 )return err;usleep_range (10 ,20 ); -/* After reset FORCE_LINK_GOOD bit is set. Although the -* default value should be unset. Disable FORCE_LINK_GOOD -* for the phy to work properly. -*/ return phy_modify (phydev,MII_DP83867_PHYCTRL ,DP83867_PHYCR_FORCE_LINK_GOOD ,0 ); }
drivers/net/usb/qmi_wwan.c +1 -1
@@ -575,7 +575,7 @@ static int qmi_wwan_rx_fixup(struct usbnet *dev, struct sk_buff *skb)if (info->flags &QMI_WWAN_FLAG_PASS_THROUGH ) { skb->protocol =htons (ETH_P_MAP ); -return (netif_rx (skb) ==NET_RX_SUCCESS ); +return 1 ; }switch (skb->data[0 ] &0xf0 ) {
drivers/net/usb/r8152.c +1 -1
@@ -6078,7 +6078,7 @@ static void rtl8152_get_strings(struct net_device *dev, u32 stringset, u8 *data) {switch (stringset) {case ETH_SS_STATS : -memcpy (data, *rtl8152_gstrings,sizeof (rtl8152_gstrings)); +memcpy (data, rtl8152_gstrings,sizeof (rtl8152_gstrings));break ; } }
drivers/net/wireless/mac80211_hwsim.c +5 -0
@@ -1693,8 +1693,13 @@ static int mac80211_hwsim_start(struct ieee80211_hw *hw)static void mac80211_hwsim_stop (struct ieee80211_hw *hw) {struct mac80211_hwsim_data *data = hw->priv; + data->started = false;hrtimer_cancel (&data->beacon_timer); + +while (!skb_queue_empty (&data->pending)) +ieee80211_free_txskb (hw,skb_dequeue (&data->pending)); +wiphy_dbg (hw->wiphy,"%s\n" , __func__); }
drivers/pci/pci.c +13 -3
@@ -1870,11 +1870,21 @@ static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags)int err;int i, bars =0 ; -if (atomic_inc_return (&dev->enable_cnt) >1 ) { -pci_update_current_state (dev, dev->current_state); -return 0 ;/* already enabled */ +/* +* Power state could be unknown at this point, either due to a fresh +* boot or a device removal call. So get the current power state +* so that things like MSI message writing will behave as expected +* (e.g. if the device really is in D0 at enable time). +*/ +if (dev->pm_cap) { +u16 pmcsr; +pci_read_config_word (dev, dev->pm_cap +PCI_PM_CTRL , &pmcsr); + dev->current_state = (pmcsr &PCI_PM_CTRL_STATE_MASK ); } +if (atomic_inc_return (&dev->enable_cnt) >1 ) +return 0 ;/* already enabled */ + bridge =pci_upstream_bridge (dev);if (bridge)pci_enable_bridge (bridge);
drivers/pinctrl/pinctrl-microchip-sgpio.c +3 -1
@@ -845,8 +845,10 @@ static int microchip_sgpio_probe(struct platform_device *pdev) i =0 ;device_for_each_child_node (dev, fwnode) { ret =microchip_sgpio_register_bank (dev, priv, fwnode, i++); -if (ret) +if (ret) { +fwnode_handle_put (fwnode);return ret; + } }if (priv->in.gpio.ngpio != priv->out.gpio.ngpio) {
drivers/pinctrl/stm32/pinctrl-stm32.c +7 -2
@@ -1229,7 +1229,7 @@ static int stm32_gpiolib_register_bank(struct stm32_pinctrl *pctl,struct device *dev = pctl->dev;struct resource res;int npins =STM32_GPIO_PINS_PER_BANK ; -int bank_nr, err; +int bank_nr, err, i =0 ;if (!IS_ERR (bank->rstc))reset_control_deassert (bank->rstc);
@@ -1251,9 +1251,14 @@ static int stm32_gpiolib_register_bank(struct stm32_pinctrl *pctl,of_property_read_string (np,"st,bank-name" , &bank->gpio_chip.label); -if (!of_parse_phandle_with_fixed_args (np,"gpio-ranges" ,3 ,0 , &args)) { +if (!of_parse_phandle_with_fixed_args (np,"gpio-ranges" ,3 , i, &args)) { bank_nr = args.args[1 ] /STM32_GPIO_PINS_PER_BANK ; bank->gpio_chip.base = args.args[1 ]; + + npins = args.args[2 ]; +while (!of_parse_phandle_with_fixed_args (np,"gpio-ranges" ,3 , + ++i, &args)) + npins += args.args[2 ]; }else { bank_nr = pctl->nbanks; bank->gpio_chip.base = bank_nr *STM32_GPIO_PINS_PER_BANK ;
drivers/scsi/sd.c +18 -4
@@ -1387,6 +1387,22 @@ static void sd_uninit_command(struct scsi_cmnd *SCpnt) } } +static bool sd_need_revalidate (struct block_device *bdev, +struct scsi_disk *sdkp) +{ +if (sdkp->device->removable || sdkp->write_prot) { +if (bdev_check_media_change (bdev)) +return true; + } + +/* +* Force a full rescan after ioctl(BLKRRPART). While the disk state has +* nothing to do with partitions, BLKRRPART is used to force a full +* revalidate after things like a format for historical reasons. +*/ +return test_bit (GD_NEED_PART_SCAN , &bdev->bd_disk->state); +} +/** * sd_open - open a scsi disk device * @bdev: Block device of the scsi disk to open
@@ -1423,10 +1439,8 @@ static int sd_open(struct block_device *bdev, fmode_t mode)if (!scsi_block_when_processing_errors (sdev)) goto error_out; -if (sdev->removable || sdkp->write_prot) { -if (bdev_check_media_change (bdev)) -sd_revalidate_disk (bdev->bd_disk); - } +if (sd_need_revalidate (bdev, sdkp)) +sd_revalidate_disk (bdev->bd_disk);/* * If the drive is empty, just let the open fail.
drivers/spi/spi-nxp-fspi.c +5 -6
@@ -1033,12 +1033,6 @@ static int nxp_fspi_probe(struct platform_device *pdev) goto err_put_ctrl; } -/* Clear potential interrupts */ - reg =fspi_readl (f, f->iobase +FSPI_INTR ); -if (reg) -fspi_writel (f, reg, f->iobase +FSPI_INTR ); - -/* find the resources - controller memory mapped space */ if (is_acpi_node (f->dev->fwnode)) res =platform_get_resource (pdev,IORESOURCE_MEM ,1 );
@@ -1076,6 +1070,11 @@ static int nxp_fspi_probe(struct platform_device *pdev) } } +/* Clear potential interrupts */ + reg =fspi_readl (f, f->iobase +FSPI_INTR ); +if (reg) +fspi_writel (f, reg, f->iobase +FSPI_INTR ); +/* find the irq */ ret =platform_get_irq (pdev,0 );if (ret <0 )
drivers/xen/events/events_base.c +10 -1
@@ -642,6 +642,9 @@ static void xen_irq_lateeoi_locked(struct irq_info *info, bool spurious) } info->eoi_time =0 ; + +/* is_active hasn't been reset yet, do it now. */ +smp_store_release (&info->is_active,0 );do_unmask (info,EVT_MASK_REASON_EOI_PENDING ); }
@@ -811,6 +814,7 @@ static void xen_evtchn_close(evtchn_port_t port)BUG (); } +/* Not called for lateeoi events. */ static void event_handler_exit (struct irq_info *info) {smp_store_release (&info->is_active,0 );
@@ -1883,7 +1887,12 @@ static void lateeoi_ack_dynirq(struct irq_data *data)if (VALID_EVTCHN (evtchn)) {do_mask (info,EVT_MASK_REASON_EOI_PENDING ); -event_handler_exit (info); +/* +* Don't call event_handler_exit(). +* Need to keep is_active non-zero in order to ignore re-raised +* events after cpu affinity changes while a lateeoi is pending. +*/ +clear_evtchn (evtchn); } }
fs/ceph/addr.c +41 -13
73 lines not on this page · raw message
fs/ceph/file.c +3 -0
@@ -578,6 +578,7 @@ static int ceph_finish_async_create(struct inode *dir, struct dentry *dentry,struct ceph_inode_info *ci =ceph_inode (dir);struct inode *inode;struct timespec64 now; +struct ceph_mds_client *mdsc =ceph_sb_to_mdsc (dir->i_sb);struct ceph_vino vino = { .ino = req->r_deleg_ino, .snap =CEPH_NOSNAP };
@@ -615,8 +616,10 @@ static int ceph_finish_async_create(struct inode *dir, struct dentry *dentry,ceph_file_layout_to_legacy (lo, &in.layout); +down_read (&mdsc->snap_rwsem); ret =ceph_fill_inode (inode,NULL , &iinfo,NULL , req->r_session, req->r_fmode,NULL ); +up_read (&mdsc->snap_rwsem);if (ret) {dout ("%s failed to fill inode: %d\n" , __func__, ret);ceph_dir_clear_complete (dir);
fs/ceph/inode.c +2 -0
@@ -762,6 +762,8 @@ int ceph_fill_inode(struct inode *inode, struct page *locked_page,bool new_version = false;bool fill_inline = false; +lockdep_assert_held (&mdsc->snap_rwsem); +dout ("%s %p ino %llx.%llx v %llu had %llu\n" , __func__, inode,ceph_vinop (inode),le64_to_cpu (info->version), ci->i_version);
fs/nilfs2/sysfs.c +1 -0
@@ -1053,6 +1053,7 @@ void nilfs_sysfs_delete_device_group(struct the_nilfs *nilfs)nilfs_sysfs_delete_superblock_group (nilfs);nilfs_sysfs_delete_segctor_group (nilfs);kobject_del (&nilfs->ns_dev_kobj); +kobject_put (&nilfs->ns_dev_kobj);kfree (nilfs->ns_dev_subgroups); }
include/keys/system_keyring.h +15 -0
@@ -31,6 +31,7 @@ extern int restrict_link_by_builtin_and_secondary_trusted(#define restrict_link_by_builtin_and_secondary_trusted restrict_link_by_builtin_trusted#endif +extern struct pkcs7_message *pkcs7;#ifdef CONFIG_SYSTEM_BLACKLIST_KEYRING extern int mark_hash_blacklisted (const char *hash); extern int is_hash_blacklisted(const u8 *hash, size_t hash_len,
@@ -49,6 +50,20 @@ static inline int is_binary_blacklisted(const u8 *hash, size_t hash_len) }#endif +#ifdef CONFIG_SYSTEM_REVOCATION_LIST +extern int add_key_to_revocation_list (const char *data,size_t size); +extern int is_key_on_revocation_list (struct pkcs7_message *pkcs7); +#else +static inline int add_key_to_revocation_list (const char *data,size_t size) +{ +return 0 ; +} +static inline int is_key_on_revocation_list (struct pkcs7_message *pkcs7) +{ +return -ENOKEY ; +} +#endif +#ifdef CONFIG_IMA_BLACKLIST_KEYRING extern struct key *ima_blacklist_keyring;
include/linux/debug_locks.h +2 -0
@@ -27,8 +27,10 @@ extern int debug_locks_off(void);int __ret =0 ; \ \if (!oops_in_progress &&unlikely (c)) { \ +instrumentation_begin (); \if (debug_locks_off () && !debug_locks_silent) \ WARN(1, "DEBUG_LOCKS_WARN_ON(%s)", #c); \ +instrumentation_end (); \ __ret =1 ; \ } \ __ret; \
include/linux/huge_mm.h +7 -1
@@ -289,6 +289,7 @@ struct page *follow_devmap_pud(struct vm_area_struct *vma, unsigned long addr,vm_fault_t do_huge_pmd_numa_page (struct vm_fault *vmf,pmd_t orig_pmd);extern struct page *huge_zero_page; +extern unsigned long huge_zero_pfn;static inline bool is_huge_zero_page (struct page *page) {
@@ -297,7 +298,7 @@ static inline bool is_huge_zero_page(struct page *page)static inline bool is_huge_zero_pmd (pmd_t pmd) { -return is_huge_zero_page (pmd_page (pmd)); +return READ_ONCE (huge_zero_pfn) ==pmd_pfn (pmd) &&pmd_present (pmd); }static inline bool is_huge_zero_pud (pud_t pud)
@@ -443,6 +444,11 @@ static inline bool is_huge_zero_page(struct page *page)return false; } +static inline bool is_huge_zero_pmd (pmd_t pmd) +{ +return false; +} +static inline bool is_huge_zero_pud (pud_t pud) {return false;
include/linux/hugetlb.h +0 -16
@@ -728,17 +728,6 @@ static inline int hstate_index(struct hstate *h)return h - hstates; } -pgoff_t __basepage_index (struct page *page); - -/* Return page->index in PAGE_SIZE units */ -static inline pgoff_t basepage_index (struct page *page) -{ -if (!PageCompound (page)) -return page->index; - -return __basepage_index (page); -} -extern int dissolve_free_huge_page (struct page *page);extern int dissolve_free_huge_pages (unsigned long start_pfn,unsigned long end_pfn);
@@ -969,11 +958,6 @@ static inline int hstate_index(struct hstate *h)return 0 ; } -static inline pgoff_t basepage_index (struct page *page) -{ -return page->index; -} -static inline int dissolve_free_huge_page (struct page *page) {return 0 ;
include/linux/mm.h +3 -0
@@ -1680,6 +1680,7 @@ struct zap_details {struct address_space *check_mapping;/* Check page->mapping if set */ pgoff_t first_index;/* Lowest page->index to unmap */ pgoff_t last_index;/* Highest page->index to unmap */ +struct page *single_page;/* Locked page to be unmapped */ }; struct page *vm_normal_page(struct vm_area_struct *vma, unsigned long addr,
@@ -1727,6 +1728,7 @@ extern vm_fault_t handle_mm_fault(struct vm_area_struct *vma,extern int fixup_user_fault (struct mm_struct *mm,unsigned long address,unsigned int fault_flags,bool *unlocked); +void unmap_mapping_page (struct page *page);void unmap_mapping_pages (struct address_space *mapping,pgoff_t start,pgoff_t nr,bool even_cows); void unmap_mapping_range(struct address_space *mapping,
@@ -1747,6 +1749,7 @@ static inline int fixup_user_fault(struct mm_struct *mm, unsigned long address,BUG ();return -EFAULT ; } +static inline void unmap_mapping_page (struct page *page) { }static inline void unmap_mapping_pages (struct address_space *mapping,pgoff_t start,pgoff_t nr,bool even_cows) { } static inline void unmap_mapping_range(struct address_space *mapping,
include/linux/pagemap.h +7 -6
@@ -501,7 +501,7 @@ static inline struct page *read_mapping_page(struct address_space *mapping, }/* -* Get index of the page with in radix-tree +* Get index of the page within radix-tree (but not for hugetlb pages). * (TODO: remove once hugetlb pages will have ->index in PAGE_SIZE) */ static inline pgoff_t page_to_index (struct page *page)
@@ -520,15 +520,16 @@ static inline pgoff_t page_to_index(struct page *page)return pgoff; } +extern pgoff_t hugetlb_basepage_index (struct page *page); +/* -* Get the offset in PAGE_SIZE. -* (TODO: hugepage should have ->index in PAGE_SIZE) +* Get the offset in PAGE_SIZE (even for hugetlb pages). +* (TODO: hugetlb pages should have ->index in PAGE_SIZE) */ static inline pgoff_t page_to_pgoff (struct page *page) { -if (unlikely (PageHeadHuge (page))) -return page->index <<compound_order (page); - +if (unlikely (PageHuge (page))) +return hugetlb_basepage_index (page);return page_to_index (page); }
include/linux/rmap.h +1 -0
@@ -91,6 +91,7 @@ enum ttu_flags {TTU_SPLIT_HUGE_PMD =0x4 ,/* split huge PMD if any */ TTU_IGNORE_MLOCK =0x8 ,/* ignore mlock */ +TTU_SYNC =0x10 ,/* avoid racy checks with PVMW_SYNC */ TTU_IGNORE_HWPOISON =0x20 ,/* corrupted page is recoverable */ TTU_BATCH_FLUSH = 0x40, /* Batch TLB flushes where possible* and caller guarantees they will
include/net/sock.h +13 -4
@@ -1928,7 +1928,8 @@ static inline u32 net_tx_rndhash(void)static inline void sk_set_txhash (struct sock *sk) { - sk->sk_txhash =net_tx_rndhash (); +/* This pairs with READ_ONCE() in skb_set_hash_from_sk() */ +WRITE_ONCE (sk->sk_txhash,net_tx_rndhash ()); }static inline bool sk_rethink_txhash (struct sock *sk)
@@ -2200,9 +2201,12 @@ static inline void sock_poll_wait(struct file *filp, struct socket *sock,static inline void skb_set_hash_from_sk (struct sk_buff *skb,struct sock *sk) { -if (sk->sk_txhash) { +/* This pairs with WRITE_ONCE() in sk_set_txhash() */ +u32 txhash =READ_ONCE (sk->sk_txhash); + +if (txhash) { skb->l4_hash =1 ; - skb->hash = sk->sk_txhash; + skb->hash = txhash; } }
@@ -2260,8 +2264,13 @@ struct sk_buff *sock_dequeue_err_skb(struct sock *sk);static inline int sock_error (struct sock *sk) {int err; -if (likely (!sk->sk_err)) + +/* Avoid an atomic operation for the common case. +* This is racy since another cpu/thread can change sk_err under us. +*/ +if (likely (data_race (!sk->sk_err)))return 0 ; + err =xchg (&sk->sk_err,0 );return -err; }
kernel/dma/swiotlb.c +7 -1
@@ -724,11 +724,17 @@ void swiotlb_tbl_sync_single(struct device *hwdev, phys_addr_t tlb_addr,int index = (tlb_addr - io_tlb_start) >>IO_TLB_SHIFT ;size_t orig_size = io_tlb_orig_size[index];phys_addr_t orig_addr = io_tlb_orig_addr[index]; +unsigned int tlb_offset;if (orig_addr ==INVALID_PHYS_ADDR )return ; -validate_sync_size_and_truncate (hwdev, orig_size, &size); + tlb_offset = (tlb_addr & (IO_TLB_SIZE -1 )) - +swiotlb_align_offset (hwdev, orig_addr); + + orig_addr += tlb_offset; + +validate_sync_size_and_truncate (hwdev, orig_size - tlb_offset, &size);switch (target) {case SYNC_FOR_CPU :
kernel/futex.c +1 -2
@@ -35,7 +35,6 @@#include <linux/jhash.h> #include <linux/pagemap.h> #include <linux/syscalls.h> -#include <linux/hugetlb.h> #include <linux/freezer.h> #include <linux/memblock.h> #include <linux/fault-inject.h>
@@ -650,7 +649,7 @@ again: key->both.offset |=FUT_OFF_INODE ;/* inode-based key */ key->shared.i_seq =get_inode_sequence_number (inode); - key->shared.pgoff =basepage_index (tail); + key->shared.pgoff =page_to_pgoff (tail);rcu_read_unlock (); }
kernel/kthread.c +51 -26
105 lines not on this page · raw message
kernel/locking/lockdep.c +3 -1
@@ -842,7 +842,7 @@ static int count_matching_names(struct lock_class *new_class) }/* used from NMI context -- must be lockless */ -static __always_inline struct lock_class * +static noinstr struct lock_class *look_up_lock_class (const struct lockdep_map *lock,unsigned int subclass) {struct lockdep_subclass_key *key;
@@ -850,12 +850,14 @@ look_up_lock_class(const struct lockdep_map *lock, unsigned int subclass)struct lock_class *class;if (unlikely (subclass >=MAX_LOCKDEP_SUBCLASSES )) { +instrumentation_begin ();debug_locks_off ();printk (KERN_ERR "BUG: looking up invalid subclass: %u\n" , subclass);printk (KERN_ERR "turning off the locking correctness validator.\n" );dump_stack (); +instrumentation_end ();return NULL ; }
kernel/module.c +9 -5
@@ -266,9 +266,18 @@ static void module_assert_mutex_or_preempt(void)#endif } +#ifdef CONFIG_MODULE_SIG static bool sig_enforce =IS_ENABLED (CONFIG_MODULE_SIG_FORCE );module_param (sig_enforce, bool_enable_only,0644 ); +void set_module_sig_enforced (void ) +{ + sig_enforce = true; +} +#else +#define sig_enforce false +#endif +/* * Export sig_enforce kernel cmdline parameter to allow other subsystems rely * on that instead of directly to CONFIG_MODULE_SIG_FORCE config.
@@ -279,11 +288,6 @@ bool is_module_sig_enforced(void) }EXPORT_SYMBOL (is_module_sig_enforced); -void set_module_sig_enforced (void ) -{ - sig_enforce = true; -} -/* Block module loading/unloading? */ int modules_disabled =0 ;core_param (nomodule, modules_disabled, bint,0 );
kernel/sched/psi.c +26 -10
@@ -965,7 +965,7 @@ void psi_cgroup_free(struct cgroup *cgroup)*/ void cgroup_move_task (struct task_struct *task,struct css_set *to) { -unsigned int task_flags =0 ; +unsigned int task_flags;struct rq_flags rf;struct rq *rq;
@@ -980,15 +980,31 @@ void cgroup_move_task(struct task_struct *task, struct css_set *to) rq =task_rq_lock (task, &rf); -if (task_on_rq_queued (task)) { - task_flags =TSK_RUNNING ; -if (task_current (rq, task)) - task_flags |=TSK_ONCPU ; - }else if (task->in_iowait) - task_flags =TSK_IOWAIT ; - -if (task->in_memstall) - task_flags |=TSK_MEMSTALL ; +/* +* We may race with schedule() dropping the rq lock between +* deactivating prev and switching to next. Because the psi +* updates from the deactivation are deferred to the switch +* callback to save cgroup tree updates, the task's scheduling +* state here is not coherent with its psi state: +* +* schedule() cgroup_move_task() +* rq_lock() +* deactivate_task() +* p->on_rq = 0 +* psi_dequeue() // defers TSK_RUNNING & TSK_IOWAIT updates +* pick_next_task() +* rq_unlock() +* rq_lock() +* psi_task_change() // old cgroup +* task->cgroups = to +* psi_task_change() // new cgroup +* rq_unlock() +* rq_lock() +* psi_sched_switch() // does deferred updates in new cgroup +* +* Don't rely on the scheduling state. Use psi_flags instead. +*/ + task_flags = task->psi_flags;if (task_flags)psi_task_change (task, task_flags,0 );
lib/debug_locks.c +1 -1
@@ -36,7 +36,7 @@ EXPORT_SYMBOL_GPL(debug_locks_silent);/* * Generic 'turn off all lock debugging' function: */ -noinstr int debug_locks_off(void) +int debug_locks_off (void ) {if (debug_locks &&__debug_locks_off ()) {if (!debug_locks_silent) {
mm/huge_memory.c +29 -27
126 lines not on this page · raw message
mm/hugetlb.c +1 -4
@@ -1584,15 +1584,12 @@ struct address_space *hugetlb_page_mapping_lock_write(struct page *hpage)return NULL ; } -pgoff_t __basepage_index (struct page *page) +pgoff_t hugetlb_basepage_index (struct page *page) {struct page *page_head =compound_head (page);pgoff_t index =page_index (page_head);unsigned long compound_idx; -if (!PageHuge (page_head)) -return page_index (page); -if (compound_order (page_head) >=MAX_ORDER ) compound_idx =page_to_pfn (page) -page_to_pfn (page_head);else
mm/internal.h +39 -14
66 lines not on this page · raw message
mm/memory-failure.c +53 -27
229 lines not on this page · raw message
mm/memory.c +41 -0
54 lines not on this page · raw message
mm/migrate.c +1 -0
@@ -322,6 +322,7 @@ void __migration_entry_wait(struct mm_struct *mm, pte_t *ptep, goto out; page =migration_entry_to_page (entry); + page =compound_head (page);/* * Once page cache replacement of page migration started, page_count
mm/page_vma_mapped.c +99 -61
220 lines not on this page · raw message
mm/pgtable-generic.c +2 -3
@@ -135,9 +135,8 @@ pmd_t pmdp_huge_clear_flush(struct vm_area_struct *vma, unsigned long address, {pmd_t pmd;VM_BUG_ON (address & ~HPAGE_PMD_MASK ); -VM_BUG_ON (!pmd_present (*pmdp)); -/* Below assumes pmd_present() is true */ -VM_BUG_ON (!pmd_trans_huge (*pmdp) && !pmd_devmap (*pmdp)); +VM_BUG_ON (pmd_present (*pmdp) && !pmd_trans_huge (*pmdp) && + !pmd_devmap (*pmdp)); pmd =pmdp_huge_get_and_clear (vma->vm_mm, address, pmdp);flush_pmd_tlb_range (vma, address, address +HPAGE_PMD_SIZE );return pmd;
mm/rmap.c +27 -12
@@ -707,7 +707,6 @@ static bool should_defer_flush(struct mm_struct *mm, enum ttu_flags flags)*/ unsigned long page_address_in_vma (struct page *page,struct vm_area_struct *vma) { -unsigned long address;if (PageAnon (page)) {struct anon_vma *page__anon_vma =page_anon_vma (page);/*
@@ -717,15 +716,13 @@ unsigned long page_address_in_vma(struct page *page, struct vm_area_struct *vma)if (!vma->anon_vma || !page__anon_vma || vma->anon_vma->root != page__anon_vma->root)return -EFAULT ; - }else if (page->mapping) { -if (!vma->vm_file || vma->vm_file->f_mapping != page->mapping) -return -EFAULT ; - }else + }else if (!vma->vm_file) {return -EFAULT ; - address =__vma_address (page, vma); -if (unlikely (address < vma->vm_start || address >= vma->vm_end)) + }else if (vma->vm_file->f_mapping !=compound_head (page)->mapping) {return -EFAULT ; -return address; + } + +return vma_address (page, vma); }pmd_t *mm_find_pmd (struct mm_struct *mm,unsigned long address)
@@ -919,7 +916,7 @@ static bool page_mkclean_one(struct page *page, struct vm_area_struct *vma,*/ mmu_notifier_range_init (&range,MMU_NOTIFY_PROTECTION_PAGE ,0 , vma, vma->vm_mm, address, -min (vma->vm_end, address +page_size (page))); +vma_address_end (page, vma));mmu_notifier_invalidate_range_start (&range);while (page_vma_mapped_walk (&pvmw)) {
@@ -1405,6 +1402,15 @@ static bool try_to_unmap_one(struct page *page, struct vm_area_struct *vma,struct mmu_notifier_range range;enum ttu_flags flags = (enum ttu_flags )(long )arg; +/* +* When racing against e.g. zap_pte_range() on another cpu, +* in between its ptep_get_and_clear_full() and page_remove_rmap(), +* try_to_unmap() may return false when it is about to become true, +* if page table locking is skipped: use TTU_SYNC to wait for that. +*/ +if (flags &TTU_SYNC ) + pvmw.flags =PVMW_SYNC ; +/* munlock has nothing to gain from examining un-locked vmas */ if ((flags &TTU_MUNLOCK ) && !(vma->vm_flags &VM_LOCKED ))return true;
@@ -1426,9 +1432,10 @@ static bool try_to_unmap_one(struct page *page, struct vm_area_struct *vma,* Note that the page can not be free in this function as call of * try_to_unmap() must hold a reference on the page. */ + range.end =PageKsm (page) ? + address +PAGE_SIZE :vma_address_end (page, vma);mmu_notifier_range_init (&range,MMU_NOTIFY_CLEAR ,0 , vma, vma->vm_mm, - address, -min (vma->vm_end, address +page_size (page))); + address, range.end);if (PageHuge (page)) {/* * If sharing is possible, start and end will be adjusted
@@ -1777,7 +1784,13 @@ bool try_to_unmap(struct page *page, enum ttu_flags flags)else rmap_walk (page, &rwc); -return !page_mapcount (page) ? true : false; +/* +* When racing against e.g. zap_pte_range() on another cpu, +* in between its ptep_get_and_clear_full() and page_remove_rmap(), +* try_to_unmap() may return false when it is about to become true, +* if page table locking is skipped: use TTU_SYNC to wait for that.
Lines of this file are not shown. View the raw message.
mm/truncate.c +19 -24
43 lines not on this page · raw message
net/packet/af_packet.c +23 -18
41 lines not on this page · raw message
security/integrity/platform_certs/keyring_handler.c +11 -0
Lines of this file are not shown. View the raw message.
security/integrity/platform_certs/load_uefi.c +18 -2
Lines of this file are not shown. View the raw message.
tools/testing/selftests/bpf/test_verifier.c +1 -1
Lines of this file are not shown. View the raw message.
tools/testing/selftests/bpf/verifier/and.c +2 -0
Lines of this file are not shown. View the raw message.
tools/testing/selftests/bpf/verifier/bounds.c +14 -0
Lines of this file are not shown. View the raw message.
tools/testing/selftests/bpf/verifier/dead_code.c +2 -0
Lines of this file are not shown. View the raw message.
tools/testing/selftests/bpf/verifier/jmp32.c +22 -0
Lines of this file are not shown. View the raw message.
tools/testing/selftests/bpf/verifier/jset.c +6 -4
Lines of this file are not shown. View the raw message.
tools/testing/selftests/bpf/verifier/unpriv.c +2 -0
Lines of this file are not shown. View the raw message.
tools/testing/selftests/bpf/verifier/value_ptr_arith.c +4 -3
Lines of this file are not shown. View the raw message.
tools/testing/selftests/kvm/lib/kvm_util.c +1 -1
Lines of this file are not shown. View the raw message.
The rest of this diff is not shown. View the raw message.
Part of the diff is not shown here. View the raw message.