Revision d042035eaf5f9009ad927dc4d3ce848381ccdeed authored by Peter Xu on 25 September 2020, 22:26:00 UTC, committed by Linus Torvalds on 27 September 2020, 18:21:35 UTC
Pinned pages shouldn't be write-protected when fork() happens, because follow up copy-on-write on these pages could cause the pinned pages to be replaced by random newly allocated pages. For huge PMDs, we split the huge pmd if pinning is detected. So that future handling will be done by the PTE level (with our latest changes, each of the small pages will be copied). We can achieve this by let copy_huge_pmd() return -EAGAIN for pinned pages, so that we'll fallthrough in copy_pmd_range() and finally land the next copy_pte_range() call. Huge PUDs will be even more special - so far it does not support anonymous pages. But it can actually be done the same as the huge PMDs even if the split huge PUDs means to erase the PUD entries. It'll guarantee the follow up fault ins will remap the same pages in either parent/child later. This might not be the most efficient way, but it should be easy and clean enough. It should be fine, since we're tackling with a very rare case just to make sure userspaces that pinned some thps will still work even without MADV_DONTFORK and after they fork()ed. Signed-off-by: Peter Xu <peterx@redhat.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent 70e806e
File | Mode | Size |
---|---|---|
842 | ||
crypto | ||
dim | ||
fonts | ||
kunit | ||
livepatch | ||
lz4 | ||
lzo | ||
math | ||
mpi | ||
pldmfw | ||
raid6 | ||
reed_solomon | ||
vdso | ||
xz | ||
zlib_deflate | ||
zlib_dfltcc | ||
zlib_inflate | ||
zstd | ||
.gitignore | -rw-r--r-- | 116 bytes |
Kconfig | -rw-r--r-- | 15.1 KB |
Kconfig.debug | -rw-r--r-- | 78.2 KB |
Kconfig.kasan | -rw-r--r-- | 5.8 KB |
Kconfig.kcsan | -rw-r--r-- | 8.4 KB |
Kconfig.kgdb | -rw-r--r-- | 5.1 KB |
Kconfig.ubsan | -rw-r--r-- | 3.2 KB |
Makefile | -rw-r--r-- | 11.5 KB |
argv_split.c | -rw-r--r-- | 2.1 KB |
ashldi3.c | -rw-r--r-- | 541 bytes |
ashrdi3.c | -rw-r--r-- | 565 bytes |
asn1_decoder.c | -rw-r--r-- | 13.2 KB |
assoc_array.c | -rw-r--r-- | 51.8 KB |
atomic64.c | -rw-r--r-- | 4.5 KB |
atomic64_test.c | -rw-r--r-- | 6.4 KB |
audit.c | -rw-r--r-- | 1.8 KB |
bcd.c | -rw-r--r-- | 297 bytes |
bch.c | -rw-r--r-- | 38.3 KB |
bitmap.c | -rw-r--r-- | 38.1 KB |
bitrev.c | -rw-r--r-- | 1.9 KB |
bootconfig.c | -rw-r--r-- | 19.0 KB |
bsearch.c | -rw-r--r-- | 1.2 KB |
btree.c | -rw-r--r-- | 19.2 KB |
bucket_locks.c | -rw-r--r-- | 1.4 KB |
bug.c | -rw-r--r-- | 5.9 KB |
build_OID_registry | -rwxr-xr-x | 4.5 KB |
bust_spinlocks.c | -rw-r--r-- | 676 bytes |
check_signature.c | -rw-r--r-- | 635 bytes |
checksum.c | -rw-r--r-- | 4.4 KB |
clz_ctz.c | -rw-r--r-- | 1.2 KB |
clz_tab.c | -rw-r--r-- | 891 bytes |
cmdline.c | -rw-r--r-- | 5.1 KB |
cmpdi2.c | -rw-r--r-- | 501 bytes |
compat_audit.c | -rw-r--r-- | 832 bytes |
cpu_rmap.c | -rw-r--r-- | 7.6 KB |
cpumask.c | -rw-r--r-- | 6.8 KB |
crc-ccitt.c | -rw-r--r-- | 5.6 KB |
crc-itu-t.c | -rw-r--r-- | 2.7 KB |
crc-t10dif.c | -rw-r--r-- | 3.2 KB |
crc16.c | -rw-r--r-- | 2.7 KB |
crc32.c | -rw-r--r-- | 9.3 KB |
crc32defs.h | -rw-r--r-- | 1.6 KB |
crc32test.c | -rw-r--r-- | 37.5 KB |
crc4.c | -rw-r--r-- | 1003 bytes |
crc64.c | -rw-r--r-- | 1.8 KB |
crc7.c | -rw-r--r-- | 2.5 KB |
crc8.c | -rw-r--r-- | 2.4 KB |
ctype.c | -rw-r--r-- | 1.4 KB |
debug_info.c | -rw-r--r-- | 777 bytes |
debug_locks.c | -rw-r--r-- | 1.2 KB |
debugobjects.c | -rw-r--r-- | 34.6 KB |
dec_and_lock.c | -rw-r--r-- | 1.2 KB |
decompress.c | -rw-r--r-- | 1.8 KB |
decompress_bunzip2.c | -rw-r--r-- | 23.5 KB |
decompress_inflate.c | -rw-r--r-- | 4.8 KB |
decompress_unlz4.c | -rw-r--r-- | 4.0 KB |
decompress_unlzma.c | -rw-r--r-- | 15.8 KB |
decompress_unlzo.c | -rw-r--r-- | 6.4 KB |
decompress_unxz.c | -rw-r--r-- | 10.9 KB |
decompress_unzstd.c | -rw-r--r-- | 10.0 KB |
devres.c | -rw-r--r-- | 12.3 KB |
digsig.c | -rw-r--r-- | 5.5 KB |
dump_stack.c | -rw-r--r-- | 3.2 KB |
dynamic_debug.c | -rw-r--r-- | 27.8 KB |
dynamic_queue_limits.c | -rw-r--r-- | 4.3 KB |
earlycpio.c | -rw-r--r-- | 3.6 KB |
errname.c | -rw-r--r-- | 3.6 KB |
error-inject.c | -rw-r--r-- | 5.4 KB |
errseq.c | -rw-r--r-- | 6.6 KB |
extable.c | -rw-r--r-- | 3.0 KB |
fault-inject.c | -rw-r--r-- | 5.9 KB |
fdt.c | -rw-r--r-- | 69 bytes |
fdt_addresses.c | -rw-r--r-- | 79 bytes |
fdt_empty_tree.c | -rw-r--r-- | 80 bytes |
fdt_ro.c | -rw-r--r-- | 72 bytes |
fdt_rw.c | -rw-r--r-- | 72 bytes |
fdt_strerror.c | -rw-r--r-- | 78 bytes |
fdt_sw.c | -rw-r--r-- | 72 bytes |
fdt_wip.c | -rw-r--r-- | 73 bytes |
find_bit.c | -rw-r--r-- | 4.5 KB |
find_bit_benchmark.c | -rw-r--r-- | 3.9 KB |
flex_proportions.c | -rw-r--r-- | 6.8 KB |
gen_crc32table.c | -rw-r--r-- | 3.3 KB |
gen_crc64table.c | -rw-r--r-- | 1.4 KB |
genalloc.c | -rw-r--r-- | 26.1 KB |
generic-radix-tree.c | -rw-r--r-- | 5.3 KB |
glob.c | -rw-r--r-- | 3.5 KB |
globtest.c | -rw-r--r-- | 4.2 KB |
hexdump.c | -rw-r--r-- | 7.3 KB |
hweight.c | -rw-r--r-- | 1.9 KB |
idr.c | -rw-r--r-- | 17.3 KB |
inflate.c | -rw-r--r-- | 38.7 KB |
interval_tree.c | -rw-r--r-- | 540 bytes |
interval_tree_test.c | -rw-r--r-- | 3.4 KB |
iomap.c | -rw-r--r-- | 9.1 KB |
iomap_copy.c | -rw-r--r-- | 2.2 KB |
iommu-helper.c | -rw-r--r-- | 755 bytes |
iov_iter.c | -rw-r--r-- | 42.0 KB |
irq_poll.c | -rw-r--r-- | 5.4 KB |
irq_regs.c | -rw-r--r-- | 394 bytes |
is_single_threaded.c | -rw-r--r-- | 1.2 KB |
kasprintf.c | -rw-r--r-- | 1.4 KB |
kfifo.c | -rw-r--r-- | 12.1 KB |
klist.c | -rw-r--r-- | 10.4 KB |
kobject.c | -rw-r--r-- | 28.2 KB |
kobject_uevent.c | -rw-r--r-- | 18.8 KB |
kstrtox.c | -rw-r--r-- | 10.4 KB |
kstrtox.h | -rw-r--r-- | 293 bytes |
libcrc32c.c | -rw-r--r-- | 2.0 KB |
linear_ranges.c | -rw-r--r-- | 7.2 KB |
list-test.c | -rw-r--r-- | 17.4 KB |
list_debug.c | -rw-r--r-- | 1.8 KB |
list_sort.c | -rw-r--r-- | 8.4 KB |
llist.c | -rw-r--r-- | 2.5 KB |
locking-selftest-hardirq.h | -rw-r--r-- | 246 bytes |
locking-selftest-mutex.h | -rw-r--r-- | 159 bytes |
locking-selftest-rlock-hardirq.h | -rw-r--r-- | 74 bytes |
locking-selftest-rlock-softirq.h | -rw-r--r-- | 74 bytes |
locking-selftest-rlock.h | -rw-r--r-- | 197 bytes |
locking-selftest-rsem.h | -rw-r--r-- | 202 bytes |
locking-selftest-rtmutex.h | -rw-r--r-- | 162 bytes |
locking-selftest-softirq.h | -rw-r--r-- | 246 bytes |
locking-selftest-spin-hardirq.h | -rw-r--r-- | 73 bytes |
locking-selftest-spin-softirq.h | -rw-r--r-- | 73 bytes |
locking-selftest-spin.h | -rw-r--r-- | 157 bytes |
locking-selftest-wlock-hardirq.h | -rw-r--r-- | 74 bytes |
locking-selftest-wlock-softirq.h | -rw-r--r-- | 74 bytes |
locking-selftest-wlock.h | -rw-r--r-- | 197 bytes |
locking-selftest-wsem.h | -rw-r--r-- | 202 bytes |
locking-selftest.c | -rw-r--r-- | 43.7 KB |
lockref.c | -rw-r--r-- | 4.5 KB |
logic_pio.c | -rw-r--r-- | 8.4 KB |
lru_cache.c | -rw-r--r-- | 18.8 KB |
lshrdi3.c | -rw-r--r-- | 559 bytes |
memcat_p.c | -rw-r--r-- | 753 bytes |
memory-notifier-error-inject.c | -rw-r--r-- | 1.1 KB |
memregion.c | -rw-r--r-- | 429 bytes |
memweight.c | -rw-r--r-- | 1.0 KB |
muldi3.c | -rw-r--r-- | 1.7 KB |
net_utils.c | -rw-r--r-- | 640 bytes |
netdev-notifier-error-inject.c | -rw-r--r-- | 1.5 KB |
nlattr.c | -rw-r--r-- | 25.5 KB |
nmi_backtrace.c | -rw-r--r-- | 3.0 KB |
nodemask.c | -rw-r--r-- | 653 bytes |
notifier-error-inject.c | -rw-r--r-- | 2.5 KB |
notifier-error-inject.h | -rw-r--r-- | 653 bytes |
objagg.c | -rw-r--r-- | 28.3 KB |
of-reconfig-notifier-error-inject.c | -rw-r--r-- | 1.3 KB |
oid_registry.c | -rw-r--r-- | 3.7 KB |
once.c | -rw-r--r-- | 1.4 KB |
packing.c | -rw-r--r-- | 6.6 KB |
parman.c | -rw-r--r-- | 10.6 KB |
parser.c | -rw-r--r-- | 8.1 KB |
pci_iomap.c | -rw-r--r-- | 4.2 KB |
percpu-refcount.c | -rw-r--r-- | 13.6 KB |
percpu_counter.c | -rw-r--r-- | 6.4 KB |
percpu_test.c | -rw-r--r-- | 3.2 KB |
plist.c | -rw-r--r-- | 5.9 KB |
pm-notifier-error-inject.c | -rw-r--r-- | 1.2 KB |
radix-tree.c | -rw-r--r-- | 43.1 KB |
random32.c | -rw-r--r-- | 12.8 KB |
ratelimit.c | -rw-r--r-- | 1.6 KB |
rbtree.c | -rw-r--r-- | 17.1 KB |
rbtree_test.c | -rw-r--r-- | 9.4 KB |
refcount.c | -rw-r--r-- | 4.8 KB |
rhashtable.c | -rw-r--r-- | 29.5 KB |
sbitmap.c | -rw-r--r-- | 16.3 KB |
scatterlist.c | -rw-r--r-- | 25.2 KB |
seq_buf.c | -rw-r--r-- | 9.9 KB |
sg_pool.c | -rw-r--r-- | 4.2 KB |
sg_split.c | -rw-r--r-- | 5.0 KB |
sha1.c | -rw-r--r-- | 6.3 KB |
show_mem.c | -rw-r--r-- | 1.1 KB |
siphash.c | -rw-r--r-- | 12.0 KB |
smp_processor_id.c | -rw-r--r-- | 1.4 KB |
sort.c | -rw-r--r-- | 8.4 KB |
stackdepot.c | -rw-r--r-- | 9.5 KB |
stmp_device.c | -rw-r--r-- | 1.9 KB |
string.c | -rw-r--r-- | 25.7 KB |
string_helpers.c | -rw-r--r-- | 13.9 KB |
strncpy_from_user.c | -rw-r--r-- | 3.3 KB |
strnlen_user.c | -rw-r--r-- | 3.3 KB |
syscall.c | -rw-r--r-- | 2.5 KB |
test-kstrtox.c | -rw-r--r-- | 17.3 KB |
test-string_helpers.c | -rw-r--r-- | 11.7 KB |
test_bitfield.c | -rw-r--r-- | 4.3 KB |
test_bitmap.c | -rw-r--r-- | 18.6 KB |
test_bitops.c | -rw-r--r-- | 2.5 KB |
test_bits.c | -rw-r--r-- | 1.8 KB |
test_blackhole_dev.c | -rw-r--r-- | 2.5 KB |
test_bpf.c | -rw-r--r-- | 160.5 KB |
test_debug_virtual.c | -rw-r--r-- | 981 bytes |
test_firmware.c | -rw-r--r-- | 24.4 KB |
test_fpu.c | -rw-r--r-- | 2.0 KB |
test_hash.c | -rw-r--r-- | 6.3 KB |
test_hexdump.c | -rw-r--r-- | 6.3 KB |
test_hmm.c | -rw-r--r-- | 26.9 KB |
test_hmm_uapi.h | -rw-r--r-- | 2.3 KB |
test_ida.c | -rw-r--r-- | 4.3 KB |
test_kasan.c | -rw-r--r-- | 18.6 KB |
test_kmod.c | -rw-r--r-- | 29.9 KB |
test_linear_ranges.c | -rw-r--r-- | 7.5 KB |
test_list_sort.c | -rw-r--r-- | 3.3 KB |
test_lockup.c | -rw-r--r-- | 15.8 KB |
test_memcat_p.c | -rw-r--r-- | 2.2 KB |
test_meminit.c | -rw-r--r-- | 9.7 KB |
test_min_heap.c | -rw-r--r-- | 4.3 KB |
test_module.c | -rw-r--r-- | 794 bytes |
test_objagg.c | -rw-r--r-- | 24.6 KB |
test_overflow.c | -rw-r--r-- | 22.3 KB |
test_parman.c | -rw-r--r-- | 11.2 KB |
test_printf.c | -rw-r--r-- | 16.6 KB |
test_rhashtable.c | -rw-r--r-- | 20.0 KB |
test_siphash.c | -rw-r--r-- | 7.5 KB |
test_sort.c | -rw-r--r-- | 870 bytes |
test_stackinit.c | -rw-r--r-- | 11.3 KB |
test_static_key_base.c | -rw-r--r-- | 1.6 KB |
test_static_keys.c | -rw-r--r-- | 5.6 KB |
test_string.c | -rw-r--r-- | 3.8 KB |
test_strscpy.c | -rw-r--r-- | 4.0 KB |
test_sysctl.c | -rw-r--r-- | 3.9 KB |
test_ubsan.c | -rw-r--r-- | 2.4 KB |
test_user_copy.c | -rw-r--r-- | 9.1 KB |
test_uuid.c | -rw-r--r-- | 3.4 KB |
test_vmalloc.c | -rw-r--r-- | 12.0 KB |
test_xarray.c | -rw-r--r-- | 44.5 KB |
textsearch.c | -rw-r--r-- | 9.3 KB |
timerqueue.c | -rw-r--r-- | 2.5 KB |
ts_bm.c | -rw-r--r-- | 5.1 KB |
ts_fsm.c | -rw-r--r-- | 10.4 KB |
ts_kmp.c | -rw-r--r-- | 4.1 KB |
ubsan.c | -rw-r--r-- | 10.5 KB |
ubsan.h | -rw-r--r-- | 1.6 KB |
ucmpdi2.c | -rw-r--r-- | 568 bytes |
ucs2_string.c | -rw-r--r-- | 2.5 KB |
usercopy.c | -rw-r--r-- | 2.1 KB |
uuid.c | -rw-r--r-- | 2.9 KB |
vsprintf.c | -rw-r--r-- | 82.1 KB |
win_minmax.c | -rw-r--r-- | 3.4 KB |
xarray.c | -rw-r--r-- | 53.3 KB |
xxhash.c | -rw-r--r-- | 12.7 KB |
![swh spinner](/static/img/swh-spinner.gif)
Computing file changes ...