mirror of https://github.com/torvalds/linux.git
- Do not make a clean PTE dirty in pte_mkwrite()
The Arm architecture, for backwards compatibility reasons (ARMv8.0
before in-hardware dirty bit management - DBM), uses the PTE_RDONLY
bit to mean !dirty while the PTE_WRITE bit means DBM enabled. The
arm64 pte_mkwrite() simply clears the PTE_RDONLY bit and this
inadvertently makes the PTE pte_hw_dirty(). Most places making a PTE
writable also invoke pte_mkdirty() but do_swap_page() does not and we
end up with dirty, freshly swapped in, writeable pages.
- Do not warn if the destination page is already MTE-tagged in
copy_highpage()
In the majority of the cases, a destination page copied into is
freshly allocated without the PG_mte_tagged flag set. However, the
folio migration may be restarted if __folio_migrate_mapping() failed,
triggering the benign WARN_ON_ONCE().
-----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEE5RElWfyWxS+3PLO2a9axLQDIXvEFAmj6bJwACgkQa9axLQDI
XvF/Kg//TumWHlM3o07ol2yhK+EXUTMW8DNwzGwKAqPKl19iElZ+F3yVSfgXOxAi
hjZk9qIPGNokKulKX0drJahuhaXVW30ynh9EX6xPhXN6+faqCv8JR7zSABvMXm9E
FYmqEz678RNkIrfSn0uJw6kF3Dakn6IrZbarD2WRWg9kcwQIZCHfdxbiSbuBKQ+m
oXk5pjndTjuKujMWAhZbmuWGPNc1EfzulwhgpARgQNUxtvToLR/aS+TLykGKXPTL
GieHWR3/AiN1Jhwvsp4ElxLvnM1cau/QhnMX9kCAUjwRfnPBUa+jt/OPziO7s9Gh
NeImrwdtSBi/B5a7GaozZwsyeTAahrmSpaTjzQOrw3jr+Scn7seXtRJMFwYBiXNv
7GGDKsNXc6qmmrdC1Epqvzk6EDFpv2SPkeXIUJVxxaM7qpkhTgxnScqZzaYYmTu+
0CPKMmVtRfHr4GJqkhFcfHQMEHtxpOsA803t4w5iIgVQQQciEcHM7v21h5PWBIqO
vZydWITX/cGk2rwXtfZ4EATG1fl8jt1gwUD6FSUz73gBueLD1DHBhS3AkRCptdeR
AraXxdxdUZAH/7k1k0WOzBCoVBmbT8yjyTdKLH7KlHVaHIQDp+dmcR9mj1VoF5VP
sQXl9pG/WqrIz7pBBWEW83eeSlDK0mD7R9n8k9yHpsEy/ditFXI=
=3tTN
-----END PGP SIGNATURE-----
Merge tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux
Pull arm64 fixes from Catalin Marinas:
- Do not make a clean PTE dirty in pte_mkwrite()
The Arm architecture, for backwards compatibility reasons (ARMv8.0
before in-hardware dirty bit management - DBM), uses the PTE_RDONLY
bit to mean !dirty while the PTE_WRITE bit means DBM enabled. The
arm64 pte_mkwrite() simply clears the PTE_RDONLY bit and this
inadvertently makes the PTE pte_hw_dirty(). Most places making a PTE
writable also invoke pte_mkdirty() but do_swap_page() does not and we
end up with dirty, freshly swapped in, writeable pages.
- Do not warn if the destination page is already MTE-tagged in
copy_highpage()
In the majority of the cases, a destination page copied into is
freshly allocated without the PG_mte_tagged flag set. However, the
folio migration may be restarted if __folio_migrate_mapping() failed,
triggering the benign WARN_ON_ONCE().
* tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux:
arm64: mte: Do not warn if the page is already tagged in copy_highpage()
arm64, mm: avoid always making PTE dirty in pte_mkwrite()
|
||
|---|---|---|
| .. | ||
| stacktrace | ||
| vdso | ||
| xen | ||
| Kbuild | ||
| acenv.h | ||
| acpi.h | ||
| alternative-macros.h | ||
| alternative.h | ||
| apple_m1_pmu.h | ||
| arch_gicv3.h | ||
| arch_timer.h | ||
| archrandom.h | ||
| arm-cci.h | ||
| arm_dsu_pmu.h | ||
| arm_pmuv3.h | ||
| asm-bug.h | ||
| asm-extable.h | ||
| asm-offsets.h | ||
| asm-prototypes.h | ||
| asm-uaccess.h | ||
| asm_pointer_auth.h | ||
| assembler.h | ||
| atomic.h | ||
| atomic_ll_sc.h | ||
| atomic_lse.h | ||
| barrier.h | ||
| bitops.h | ||
| bitrev.h | ||
| boot.h | ||
| brk-imm.h | ||
| bug.h | ||
| cache.h | ||
| cacheflush.h | ||
| cfi.h | ||
| checksum.h | ||
| clocksource.h | ||
| cmpxchg.h | ||
| compat.h | ||
| compiler.h | ||
| cpu.h | ||
| cpu_ops.h | ||
| cpucaps.h | ||
| cpufeature.h | ||
| cpuidle.h | ||
| cputype.h | ||
| crash_reserve.h | ||
| current.h | ||
| daifflags.h | ||
| dcc.h | ||
| debug-monitors.h | ||
| device.h | ||
| dmi.h | ||
| efi.h | ||
| el2_setup.h | ||
| elf.h | ||
| entry-common.h | ||
| esr.h | ||
| exception.h | ||
| exec.h | ||
| extable.h | ||
| fixmap.h | ||
| fpsimd.h | ||
| fpsimdmacros.h | ||
| fpu.h | ||
| ftrace.h | ||
| futex.h | ||
| gcs.h | ||
| gpr-num.h | ||
| hardirq.h | ||
| hugetlb.h | ||
| hw_breakpoint.h | ||
| hwcap.h | ||
| hyp_image.h | ||
| hypervisor.h | ||
| image.h | ||
| insn-def.h | ||
| insn.h | ||
| io.h | ||
| irq.h | ||
| irq_work.h | ||
| irqflags.h | ||
| jump_label.h | ||
| kasan.h | ||
| kernel-pgtable.h | ||
| kexec.h | ||
| kfence.h | ||
| kgdb.h | ||
| kprobes.h | ||
| kvm_arm.h | ||
| kvm_asm.h | ||
| kvm_emulate.h | ||
| kvm_host.h | ||
| kvm_hyp.h | ||
| kvm_mmu.h | ||
| kvm_mte.h | ||
| kvm_nested.h | ||
| kvm_pgtable.h | ||
| kvm_pkvm.h | ||
| kvm_ptrauth.h | ||
| kvm_types.h | ||
| linkage.h | ||
| lse.h | ||
| mem_encrypt.h | ||
| memory.h | ||
| mman.h | ||
| mmu.h | ||
| mmu_context.h | ||
| module.h | ||
| module.lds.h | ||
| mshyperv.h | ||
| mte-def.h | ||
| mte-kasan.h | ||
| mte.h | ||
| neon-intrinsics.h | ||
| neon.h | ||
| numa.h | ||
| page-def.h | ||
| page.h | ||
| paravirt.h | ||
| paravirt_api_clock.h | ||
| pci.h | ||
| percpu.h | ||
| perf_event.h | ||
| pgalloc.h | ||
| pgtable-hwdef.h | ||
| pgtable-prot.h | ||
| pgtable-types.h | ||
| pgtable.h | ||
| pkeys.h | ||
| pointer_auth.h | ||
| por.h | ||
| preempt.h | ||
| probes.h | ||
| proc-fns.h | ||
| processor.h | ||
| ptdump.h | ||
| ptrace.h | ||
| pvclock-abi.h | ||
| rqspinlock.h | ||
| rsi.h | ||
| rsi_cmds.h | ||
| rsi_smc.h | ||
| runtime-const.h | ||
| rwonce.h | ||
| scs.h | ||
| sdei.h | ||
| seccomp.h | ||
| sections.h | ||
| semihost.h | ||
| set_memory.h | ||
| setup.h | ||
| shmparam.h | ||
| signal.h | ||
| signal32.h | ||
| simd.h | ||
| smp.h | ||
| smp_plat.h | ||
| sparsemem.h | ||
| spectre.h | ||
| spinlock.h | ||
| spinlock_types.h | ||
| stack_pointer.h | ||
| stackprotector.h | ||
| stacktrace.h | ||
| stage2_pgtable.h | ||
| stat.h | ||
| string.h | ||
| suspend.h | ||
| sync_bitops.h | ||
| syscall.h | ||
| syscall_wrapper.h | ||
| sysreg.h | ||
| system_misc.h | ||
| text-patching.h | ||
| thread_info.h | ||
| timex.h | ||
| tlb.h | ||
| tlbbatch.h | ||
| tlbflush.h | ||
| topology.h | ||
| trans_pgd.h | ||
| traps.h | ||
| uaccess.h | ||
| unistd.h | ||
| unistd32.h | ||
| uprobes.h | ||
| vdso.h | ||
| vectors.h | ||
| vermagic.h | ||
| virt.h | ||
| vmalloc.h | ||
| vmap_stack.h | ||
| vncr_mapping.h | ||
| word-at-a-time.h | ||
| xor.h | ||