* refs/heads/tmp-6328e64:
Revert "scsi: ufs: fix race between clock gating and devfreq scaling work"
Linux 4.9.145
kbuild: allow to use GCC toolchain not in Clang search path
kbuild: fix linker feature test macros when cross compiling with Clang
mac80211: ignore NullFunc frames in the duplicate detection
mac80211: fix reordering of buffered broadcast packets
mac80211: ignore tx status for PS stations in ieee80211_tx_status_ext
mac80211: Clear beacon_int in ieee80211_do_stop
mac80211_hwsim: Timer should be initialized before device registered
kgdboc: fix KASAN global-out-of-bounds bug in param_set_kgdboc_var()
tty: do not set TTY_IO_ERROR flag if console port
tty: serial: 8250_mtk: always resume the device in probe.
staging: rtl8712: Fix possible buffer overrun
cifs: Fix separator when building path from dentry
Staging: lustre: remove two build warnings
vhost/vsock: fix use-after-free in network stack callers
vsock: lookup and setup guest_cid inside vhost_vsock_lock
swiotlb: clean up reporting
sr: pass down correctly sized SCSI sense buffer
xhci: Prevent U1/U2 link pm states if exit latency is too long
dmaengine: cppi41: delete channel from pending list when stop channel
SUNRPC: Fix leak of krb5p encode pages
virtio/s390: fix race in ccw_io_helper()
virtio/s390: avoid race on vcdev->config
ALSA: hda/realtek - Fix speaker output regression on Thinkpad T570
ALSA: pcm: Fix interval evaluation with openmin/max
ALSA: pcm: Call snd_pcm_unlink() conditionally at closing
ALSA: pcm: Fix starvation on down_write_nonblock()
ALSA: hda: Add support for AMD Stoney Ridge
ALSA: usb-audio: Fix UAF decrement if card has no live interfaces in card.c
USB: check usb_get_extra_descriptor for proper size
usb: appledisplay: Add 27" Apple Cinema Display
usb: quirk: add no-LPM quirk on SanDisk Ultra Flair device
ARC: [zebu] Remove CONFIG_INITRAMFS_SOURCE from defconfigs
mm: don't warn about allocations which stall for too long
net: amd: add missing of_node_put()
team: no need to do team_notify_peers or team_mcast_rejoin when disabling port
iommu/vt-d: Use memunmap to free memremap
net: faraday: ftmac100: remove netif_running(netdev) check before disabling interrupts
mtd: rawnand: qcom: Namespace prefix some commands
net/mlx4: Fix UBSAN warning of signed integer overflow
net/mlx4_core: Fix uninitialized variable compilation warning
net/mlx4_core: Zero out lkey field in SW2HW_MPT fw command
qed: Fix reading wrong value in loop condition
qed: Fix PTT leak in qed_drain()
bnx2x: Assign unique DMAE channel number for FW DMAE transactions.
batman-adv: Expand merged fragment buffer for full packet
HID: input: Ignore battery reported by Symbol DS4308
can: rcar_can: Fix erroneous registration
iommu/ipmmu-vmsa: Fix crash on early domain free
brcmutil: really fix decoding channel info for 160 MHz bandwidth
iommu/vt-d: Fix NULL pointer dereference in prq_event_thread()
media: omap3isp: Unregister media device as first
ANDROID: cpufreq: times: add /proc/uid_concurrent_{active,policy}_time
ANDROID: modpost: add an exception for CFI stubs
FROMGIT: modpost: validate symbol names also in find_elf_symbol
Linux 4.9.144
hugetlbfs: fix bug in pgoff overflow checking
xfs: don't fail when converting shortform attr to long form during ATTR_REPLACE
f2fs: fix to do sanity check with cp_pack_start_sum
f2fs: free meta pages if sanity check for ckpt is failed
f2fs: fix to do sanity check with block address in main area v2
f2fs: fix missing up_read
f2fs: fix to do sanity check with block address in main area
f2fs: fix to do sanity check with node footer and iblocks
f2fs: Add sanity_check_inode() function
f2fs: fix to do sanity check with user_block_count
f2fs: fix to do sanity check with secs_per_zone
f2fs: introduce and spread verify_blkaddr
f2fs: clean up with is_valid_blkaddr()
f2fs: enhance sanity_check_raw_super() to avoid potential overflow
f2fs: sanity check on sit entry
f2fs: check blkaddr more accuratly before issue a bio
f2fs: return error during fill_super
f2fs: detect wrong layout
f2fs: fix race condition in between free nid allocator/initializer
f2fs: fix a panic caused by NULL flush_cmd_control
btrfs: tree-checker: Fix misleading group system information
btrfs: tree-checker: Check level for leaves and nodes
btrfs: Check that each block group has corresponding chunk at mount time
btrfs: tree-checker: Detect invalid and empty essential trees
btrfs: tree-checker: Verify block_group_item
btrfs: tree-check: reduce stack consumption in check_dir_item
btrfs: tree-checker: use %zu format string for size_t
btrfs: tree-checker: Add checker for dir item
btrfs: tree-checker: Fix false panic for sanity test
btrfs: tree-checker: Enhance btrfs_check_node output
btrfs: struct-funcs, constify readers
btrfs: Move leaf and node validation checker to tree-checker.c
btrfs: Add checker for EXTENT_CSUM
btrfs: Add sanity check for EXTENT_DATA when reading out leaf
btrfs: Check if item pointer overlaps with the item itself
btrfs: Refactor check_leaf function for later expansion
btrfs: Verify that every chunk has corresponding block group at mount time
btrfs: validate type when reading a chunk
hugetlbfs: check for pgoff value overflow
hugetlbfs: fix offset overflow in hugetlbfs mmap
mm/hugetlb.c: don't call region_abort if region_chg fails
wil6210: missing length check in wmi_set_ie
bpf: Prevent memory disambiguation attack
bpf/verifier: Pass instruction index to check_mem_access() and check_xadd()
bpf/verifier: Add spi variable to check_stack_write()
libceph: check authorizer reply/challenge length before reading
libceph: weaken sizeof check in ceph_x_verify_authorizer_reply()
libceph: implement CEPHX_V2 calculation mode
libceph: add authorizer challenge
libceph: factor out encrypt_authorizer()
libceph: factor out __ceph_x_decrypt()
libceph: factor out __prepare_write_connect()
libceph: store ceph_auth_handshake pointer in ceph_connection
libceph: no need to drop con->mutex for ->get_authorizer()
libceph: drop len argument of *verify_authorizer_reply()
tipc: use destination length for copy string
net: qed: use correct strncpy() size
usb: gadget: dummy: fix nonsensical comparisons
mm: cleancache: fix corruption on missed inode invalidation
reset: remove remaining WARN_ON() in <linux/reset.h>
reset: make device_reset_optional() really optional
reset: add exported __reset_control_get, return NULL if optional
reset: fix optional reset_control_get stubs to return NULL
reset: core: fix reset_control_put
reset: make optional functions really optional
udf: Allow mounting volumes with incorrect identification strings
arc: [devboards] Add support of NFSv3 ACL
ARC: change defconfig defaults to ARCv2
Btrfs: fix use-after-free when dumping free space
btrfs: Always try all copies when reading extent buffers
Input: elan_i2c - add support for ELAN0621 touchpad
Input: elan_i2c - add ACPI ID for Lenovo IdeaPad 330-15ARR
Input: elan_i2c - add ELAN0620 to the ACPI table
Input: matrix_keypad - check for errors from of_get_named_gpio()
Input: xpad - quirk all PDP Xbox One gamepads
drm/mediatek: fix OF sibling-node lookup
svm: Add mutex_lock to protect apic_access_page_done on AMD systems
binder: fix proc->files use-after-free
kgdboc: Fix warning with module build
kgdboc: Fix restrict error
scsi: csiostor: Avoid content leaks and casts
ALSA: trident: Suppress gcc string warning
scsi: scsi_devinfo: cleanly zero-pad devinfo strings
drm: set is_master to 0 upon drm_new_set_master() failure
drm/ast: Fix incorrect free on ioregs
IB/mlx5: Avoid load failure due to unknown link width
mips: fix mips_get_syscall_arg o32 check
MIPS: ralink: Fix mt7620 nd_sd pinmux
uprobes: Fix handle_swbp() vs. unregister() + register() race once more
iser: set sector for ambiguous mr status errors
x86/power/64: Use char arrays for asm function names
kdb: use memmove instead of overlapping memcpy
staging: rts5208: fix gcc-8 logic error warning
scsi: bfa: convert to strlcpy/strlcat
drm: gma500: fix logic error
ip_tunnel: Fix name string concatenate in __ip_tunnel_create()
kernfs: Replace strncpy with memcpy
unifdef: use memcpy instead of strncpy
kobject: Replace strncpy with memcpy
test_hexdump: use memcpy instead of strncpy
disable stringop truncation warnings for now
Kbuild: suppress packed-not-aligned warning for default setting only
kbuild: Fix 4.9.138 mismerge
Linux 4.9.143
kbuild: Set KBUILD_CFLAGS before incl. arch Makefile
efi/libstub: Make file I/O chunking x86-specific
workqueue: avoid clang warning
ARM: trusted_foundations: do not use naked function
bus: arm-cci: remove unnecessary unreachable()
ARM: 8767/1: add support for building ARM kernel with clang
ARM: 8766/1: drop no-thumb-interwork in EABI mode
efi/libstub: arm: support building with clang
misc: mic/scif: fix copy-paste error in scif_create_remote_lookup
Drivers: hv: vmbus: check the creation_status in vmbus_establish_gpadl()
mm: use swp_offset as key in shmem_replace_page()
iio:st_magn: Fix enable device after trigger
Revert "usb: dwc3: gadget: skip Set/Clear Halt when invalid"
usb: core: quirks: add RESET_RESUME quirk for Cherry G230 Stream series
USB: usb-storage: Add new IDs to ums-realtek
btrfs: release metadata before running delayed refs
dmaengine: at_hdmac: fix module unloading
dmaengine: at_hdmac: fix memory leak in at_dma_xlate()
ext2: fix potential use after free
ALSA: sparc: Fix invalid snd_free_pages() at error path
ALSA: control: Fix race between adding and removing a user element
ALSA: ac97: Fix incorrect bit shift at AC97-SPSA control write
ALSA: wss: Fix invalid snd_free_pages() at error path
fs: fix lost error code in dio_complete
perf/x86/intel: Add generic branch tracing check to intel_pmu_has_bts()
perf/x86/intel: Move branch tracing setup to the Intel-specific source file
Btrfs: ensure path name is null terminated at btrfs_control_ioctl
xtensa: fix coprocessor context offset definitions
xtensa: enable coprocessors that are being flushed
KVM: X86: Fix scan ioapic use-before-initialization
kvm: svm: Ensure an IBPB on all affected CPUs when freeing a vmcb
kvm: mmu: Fix race in emulated page table writes
usbnet: ipheth: fix potential recvmsg bug and recvmsg bug 2
s390/qeth: fix length check in SNMP processing
rapidio/rionet: do not free skb before reading its length
net: skb_scrub_packet(): Scrub offload_fwd_mark
Revert "wlcore: Add missing PM call for wlcore_cmd_wait_for_event_or_timeout()"
media: em28xx: Fix use-after-free when disconnecting
mm/khugepaged: collapse_shmem() do not crash on Compound
mm/khugepaged: collapse_shmem() without freezing new_page
mm/khugepaged: minor reorderings in collapse_shmem()
mm/khugepaged: collapse_shmem() remember to clear holes
mm/khugepaged: fix crashes due to misaccounted holes
shmem: introduce shmem_inode_acct_block
shmem: shmem_charge: verify max_block is not exceeded before inode update
mm/khugepaged: collapse_shmem() stop if punched or truncated
mm/huge_memory: fix lockdep complaint on 32-bit i_size_read()
mm/huge_memory: splitting set mapping+index before unfreeze
mm/huge_memory.c: reorder operations in __split_huge_page_tail()
mm/huge_memory: rename freeze_page() to unmap_page()
UPSTREAM: binder: fix race that allows malicious free of live buffer
Linux 4.9.142
ima: re-initialize iint->atomic_flags
ima: re-introduce own integrity cache lock
EVM: Add support for portable signature format
ima: always measure and audit files in policy
Revert "evm: Translate user/group ids relative to s_user_ns when computing HMAC"
net: ieee802154: 6lowpan: fix frag reassembly
s390/mm: Check for valid vma before zapping in gmap_discard
lan78xx: Read MAC address from DT if present
namei: allow restricted O_CREAT of FIFOs and regular files
sched/core: Allow __sched_setscheduler() in interrupts when PI is not used
usb: xhci: fix uninitialized completion when USB3 port got wrong status
tty: wipe buffer if not echoing data
tty: wipe buffer.
include/linux/pfn_t.h: force '~' to be parsed as an unary operator
scsi: ufshcd: release resources if probe fails
scsi: ufs: fix race between clock gating and devfreq scaling work
scsi: ufshcd: Fix race between clk scaling and ungate work
scsi: ufs: fix bugs related to null pointer access and array size
mwifiex: fix p2p device doesn't find in scan problem
mwifiex: Fix NULL pointer dereference in skb_dequeue()
mwifiex: report error to PCIe for suspend failure
mwifiex: prevent register accesses after host is sleeping
cw1200: Don't leak memory if krealloc failes
Input: xpad - add support for Xbox1 PDP Camo series gamepad
Input: xpad - fix GPD Win 2 controller name
Input: xpad - add GPD Win 2 Controller USB IDs
Input: xpad - avoid using __set_bit() for capabilities
Input: xpad - fix some coding style issues
Input: xpad - add PDP device id 0x02a4
Input: xpad - add support for PDP Xbox One controllers
Input: xpad - validate USB endpoint type during probe
Input: xpad - fix PowerA init quirk for some gamepad models
Input: xpad - constify usb_device_id
Input: xpad - sync supported devices with XBCD
Input: xpad - sync supported devices with 360Controller
Input: xpad - add USB IDs for Mad Catz Brawlstick and Razer Sabertooth
Input: xpad - sync supported devices with xboxdrv
Input: xpad - sort supported devices by USB ID
Input: xpad - support some quirky Xbox One pads
Input: xpad - restore LED state after device resume
Input: xpad - fix stuck mode button on Xbox One S pad
Input: xpad - don't depend on endpoint order
Input: xpad - simplify error condition in init_output
Input: xpad - move reporting xbox one home button to common function
Input: xpad - correctly sort vendor id's
Input: xpad - fix Xbox One rumble stopping after 2.5 secs
Input: xpad - add product ID for Xbox One S pad
ath10k: fix kernel panic due to race in accessing arvif list
arm64: remove no-op -p linker flag
net: bcmgenet: fix OF child-node lookup
NFC: nfcmrvl_uart: fix OF child-node lookup
of: add helper to lookup compatible child node
tmpfs: make lseek(SEEK_DATA/SEK_HOLE) return ENXIO with a negative offset
efi/arm: Revert deferred unmap of early memmap mapping
powerpc/numa: Suppress "VPHN is not supported" messages
kdb: Use strscpy with destination buffer size
SUNRPC: Fix a bogus get/put in generic_key_to_expire()
perf/x86/intel/uncore: Add more IMC PCI IDs for KabyLake and CoffeeLake CPUs
powerpc/io: Fix the IO workarounds code to work with Radix
floppy: fix race condition in __floppy_read_block_0()
rtc: pcf2127: fix a kmemleak caused in pcf2127_i2c_gather_write
cpufreq: imx6q: add return value check for voltage scale
KVM: PPC: Move and undef TRACE_INCLUDE_PATH/FILE
pinctrl: meson: fix pinconf bias disable
usb: xhci: Prevent bus suspend if a port connect change or polling state is detected
IB/hfi1: Eliminate races in the SDMA send error path
IB/core: Fix for core panic
can: dev: __can_get_echo_skb(): print error message, if trying to echo non existing skb
can: dev: __can_get_echo_skb(): Don't crash the kernel if can_priv::echo_skb is accessed out of bounds
can: dev: __can_get_echo_skb(): replace struct can_frame by canfd_frame to access frame length
can: dev: can_get_echo_skb(): factor out non sending code to __can_get_echo_skb()
drm/ast: Remove existing framebuffers before loading driver
drm/ast: fixed cursor may disappear sometimes
drm/ast: change resolution may cause screen blurred
mm: don't warn about large allocations for slab
llc: do not use sk_eat_skb()
gfs2: Don't leave s_fs_info pointing to freed memory in init_sbd
sctp: clear the transport of some out_chunk_list chunks in sctp_assoc_rm_peer
bfs: add sanity check at bfs_fill_super()
selinux: Add __GFP_NOWARN to allocation at str_read()
v9fs_dir_readdir: fix double-free on p9stat_read error
tools/power/cpupower: fix compilation with STATIC=true
brcmfmac: fix reporting support for 160 MHz channels
iwlwifi: mvm: fix regulatory domain update when the firmware starts
iwlwifi: mvm: support sta_statistics() even on older firmware
gpio: don't free unallocated ida on gpiochip_add_data_with_key() error path
MAINTAINERS: Add Sasha as a stable branch maintainer
usb: xhci: fix timeout for transition from RExit to U0
usb: dwc3: core: Clean up ULPI device
usb: core: Fix hub port connection events lost
ANDROID: Kbuild, LLVMLinux: allow overriding clang target triple
Revert "ANDROID: Kbuild, LLVMLinux: allow overriding clang target triple"
arch/arm64/crypto/sha1-ce-glue.c fix 4.9.129 merge issue
arch/arm64/crypto/sha2-ce-glue.c: fix 4.9.129 merge issue
ANDROID: sdcardfs: Add option to not link obb
ANDROID: sdcardfs: Add sandbox
Revert "proc: Convert proc_mount to use mount_ns."
xen: Fix 4.9.139 merge resolution
efi/libstub: Fix 4.9.139 merge resolution
Linux 4.9.141
libceph: fall back to sendmsg for slab pages
HID: uhid: forbid UHID_CREATE under KERNEL_DS or elevated privileges
new helper: uaccess_kernel()
ACPI / platform: Add SMB0001 HID to forbidden_id_list
drivers/misc/sgi-gru: fix Spectre v1 vulnerability
USB: misc: appledisplay: add 20" Apple Cinema Display
misc: atmel-ssc: Fix section annotation on atmel_ssc_get_driver_data
usb: quirks: Add delay-init quirk for Corsair K70 LUX RGB
USB: quirks: Add no-lpm quirk for Raydium touchscreens
usb: cdc-acm: add entry for Hiro (Conexant) modem
uio: Fix an Oops on load
media: v4l: event: Add subscription to list before calling "add" operation
Revert "Bluetooth: h5: Fix missing dependency on BT_HCIUART_SERDEV"
Revert "media: videobuf2-core: don't call memop 'finish' when queueing"
btrfs: fix pinned underflow after transaction aborted
btrfs: Ensure btrfs_trim_fs can trim the whole filesystem
btrfs: Enhance btrfs_trim_fs function to handle error better
ACPI / watchdog: Prefer iTCO_wdt always when WDAT table uses RTC SRAM
ACPI / watchdog: Prefer iTCO_wdt on Lenovo Z50-70
gfs2: Put bitmap buffers in put_super
SUNRPC: drop pointless static qualifier in xdr_get_next_encode_buffer()
zram: close udev startup race condition as default groups
qed: Fix blocking/unlimited SPQ entries leak
qed: Fix memory/entry leak in qed_init_sp_request()
lib/raid6: Fix arm64 test build
clk: fixed-factor: fix of_node_get-put imbalance
hwmon: (ibmpowernv) Remove bogus __init annotations
s390/qeth: fix HiperSockets sniffer
netfilter: xt_IDLETIMER: add sysfs filename checking routine
netfilter: ipset: Correct rcu_dereference() call in ip_set_put_comment()
s390/mm: Fix ERROR: "__node_distance" undefined!
netfilter: ipset: actually allow allowable CIDR 0 in hash:net,port,net
s390/vdso: add missing FORCE to build targets
arm64: percpu: Initialize ret in the default case
platform/x86: acerhdf: Add BIOS entry for Gateway LT31 v1.3307
clk: samsung: exynos5420: Enable PERIS clocks for suspend
fs/exofs: fix potential memory leak in mount option parsing
clk: fixed-rate: fix of_node_get-put imbalance
platform/x86: intel_telemetry: report debugfs failure
drm/edid: Add 6 bpc quirk for BOE panel.
um: Give start_idle_thread() a return code
hfsplus: prevent btree data loss on root split
hfs: prevent btree data loss on root split
reiserfs: propagate errors from fill_with_dentries() properly
cifs: don't dereference smb_file_target before null check
Linux 4.9.140
Revert "ipv6: set rt6i_protocol properly in the route when it is installed"
Revert "x86/speculation: Enable cross-hyperthread spectre v2 STIBP mitigation"
Linux 4.9.139
ARM: spectre-v1: mitigate user accesses
ARM: spectre-v1: use get_user() for __get_user()
ARM: use __inttype() in get_user()
ARM: oabi-compat: copy semops using __copy_from_user()
ARM: vfp: use __copy_from_user() when restoring VFP state
ARM: signal: copy registers using __copy_from_user()
ARM: spectre-v1: fix syscall entry
ARM: spectre-v1: add array_index_mask_nospec() implementation
ARM: spectre-v1: add speculation barrier (csdb) macros
ARM: KVM: report support for SMCCC_ARCH_WORKAROUND_1
ARM: KVM: Add SMCCC_ARCH_WORKAROUND_1 fast handling
ARM: spectre-v2: KVM: invalidate icache on guest exit for Brahma B15
ARM: KVM: invalidate icache on guest exit for Cortex-A15
ARM: KVM: invalidate BTB on guest exit for Cortex-A12/A17
ARM: spectre-v2: warn about incorrect context switching functions
ARM: spectre-v2: add firmware based hardening
ARM: spectre-v2: harden user aborts in kernel space
ARM: spectre-v2: add Cortex A8 and A15 validation of the IBE bit
ARM: spectre-v2: harden branch predictor on context switches
ARM: spectre: add Kconfig symbol for CPUs vulnerable to Spectre
ARM: bugs: add support for per-processor bug checking
ARM: bugs: hook processor bug checking into SMP and suspend paths
ARM: bugs: prepare processor bug infrastructure
ARM: add more CPU part numbers for Cortex and Brahma B15 CPUs
arm64: uaccess: suppress spurious clang warning
Kbuild: use -fshort-wchar globally
x86/build: Use cc-option to validate stack alignment parameter
x86/build: Fix stack alignment for CLang
efi/libstub/arm64: Set -fpie when building the EFI stub
efi/libstub: Preserve .debug sections after absolute relocation check
efi/libstub/arm64: Force 'hidden' visibility for section markers
efi/libstub/arm64: Use hidden attribute for struct screen_info reference
x86/boot: #undef memcpy() et al in string.c
crypto: arm64/sha - avoid non-standard inline asm tricks
kbuild: clang: Disable 'address-of-packed-member' warning
x86/build: Specify stack alignment for clang
x86/build: Use __cc-option for boot code compiler options
kbuild: Add __cc-option macro
crypto, x86: aesni - fix token pasting for clang
x86/kbuild: Use cc-option to enable -falign-{jumps/loops}
modules: mark __inittest/__exittest as __maybe_unused
kbuild: Add support to generate LLVM assembly files
kbuild: use -Oz instead of -Os when using clang
kbuild, LLVMLinux: Add -Werror to cc-option to support clang
kbuild: drop -Wno-unknown-warning-option from clang options
kbuild: fix asm-offset generation to work with clang
kbuild: consolidate redundant sed script ASM offset generation
kbuild: Consolidate header generation from ASM offset information
kbuild: clang: add -no-integrated-as to KBUILD_[AC]FLAGS
kbuild: Add better clang cross build support
ipv6: Fix PMTU updates for UDP/raw sockets in presence of VRF
inet: frags: better deal with smp races
usbnet: smsc95xx: disable carrier check while suspending
tg3: Add PHY reset for 5717/5719/5720 in change ring and flow control paths
sctp: not allow to set asoc prsctp_enable by sockopt
net-gro: reset skb->pkt_type in napi_reuse_skb()
ip_tunnel: don't force DF when MTU is locked
flow_dissector: do not dissect l4 ports for fragments
ANDROID: sched/debug: Make Energy Model read-only
Linux 4.9.138
KVM: arm64: Fix caching of host MDCR_EL2 value
drm/i915/execlists: Force write serialisation into context image vs execution
drm/i915/hdmi: Add HDMI 2.0 audio clock recovery N values
drm/dp_mst: Check if primary mstb is null
drm/rockchip: Allow driver to be shutdown on reboot/kexec
mm: migration: fix migration of huge PMD shared pages
hugetlbfs: fix kernel BUG at fs/hugetlbfs/inode.c:444!
lib/ubsan.c: don't mark __ubsan_handle_builtin_unreachable as noreturn
configfs: replace strncpy with memcpy
fuse: fix leaked notify reply
fuse: fix use-after-free in fuse_direct_IO()
rtc: hctosys: Add missing range error reporting
nfsd: COPY and CLONE operations require the saved filehandle to be set
sunrpc: correct the computation for page_ptr when truncating
mount: Prevent MNT_DETACH from disconnecting locked mounts
mount: Don't allow copying MNT_UNBINDABLE|MNT_LOCKED mounts
mount: Retest MNT_LOCKED in do_umount
ext4: fix buffer leak in __ext4_read_dirblock() on error path
ext4: fix buffer leak in ext4_xattr_move_to_block() on error path
ext4: release bs.bh before re-using in ext4_xattr_block_find()
ext4: fix possible leak of s_journal_flag_rwsem in error path
ext4: fix possible leak of sbi->s_group_desc_leak in error path
ext4: avoid possible double brelse() in add_new_gdb() on error path
ext4: fix missing cleanup if ext4_alloc_flex_bg_array() fails while resizing
ext4: avoid buffer leak in ext4_orphan_add() after prior errors
ext4: fix possible inode leak in the retry loop of ext4_resize_fs()
ext4: avoid potential extra brelse in setup_new_flex_group_blocks()
ext4: add missing brelse() add_new_gdb_meta_bg()'s error path
ext4: add missing brelse() in set_flexbg_block_bitmap()'s error path
ext4: add missing brelse() update_backups()'s error path
clockevents/drivers/i8253: Add support for PIT shutdown quirk
Btrfs: fix data corruption due to cloning of eof block
Btrfs: fix cur_offset in the error case for nocow
arch/alpha, termios: implement BOTHER, IBSHIFT and termios2
termios, tty/tty_baudrate.c: fix buffer overrun
of, numa: Validate some distance map rules
mtd: docg3: don't set conflicting BCH_CONST_PARAMS option
netfilter: conntrack: fix calculation of next bucket number in early_drop
mm: thp: relax __GFP_THISNODE for MADV_HUGEPAGE mappings
ocfs2: fix a misuse a of brelse after failing ocfs2_check_dir_entry
vhost/scsi: truncate T10 PI iov_iter to prot_bytes
reset: hisilicon: fix potential NULL pointer dereference
mach64: fix image corruption due to reading accelerator registers
mach64: fix display corruption on big endian machines
Revert "ceph: fix dentry leak in splice_dentry()"
libceph: bump CEPH_MSG_MAX_DATA_LEN
clk: rockchip: Fix static checker warning in rockchip_ddrclk_get_parent call
clk: at91: Fix division by zero in PLL recalc_rate()
clk: s2mps11: Fix matching when built as module and DT node contains compatible
xtensa: fix boot parameters address translation
xtensa: make sure bFLT stack is 16 byte aligned
xtensa: add NOTES section to the linker script
MIPS: Loongson-3: Fix BRIDGE irq delivery problem
MIPS: Loongson-3: Fix CPU UART irq delivery problem
parisc: Fix exported address of os_hpmc handler
parisc: Fix HPMC handler by increasing size to multiple of 16 bytes
parisc: Align os_hpmc_size on word boundary
bna: ethtool: Avoid reading past end of buffer
e1000: fix race condition between e1000_down() and e1000_watchdog
e1000: avoid null pointer dereference on invalid stat type
mm: do not bug_on on incorrect length in __mm_populate()
fuse: set FR_SENT while locked
fuse: fix blocked_waitq wakeup
fuse: Fix use-after-free in fuse_dev_do_write()
fuse: Fix use-after-free in fuse_dev_do_read()
scsi: qla2xxx: shutdown chip if reset fail
scsi: qla2xxx: Fix incorrect port speed being set for FC adapters
cdrom: fix improper type cast, which can leat to information leak.
9p: clear dangling pointers in p9stat_free
9p locks: fix glock.client_id leak in do_lock
powerpc/selftests: Wait all threads to join
media: tvp5150: fix width alignment during set_selection()
sc16is7xx: Fix for multi-channel stall
MIPS/PCI: Call pcie_bus_configure_settings() to set MPS/MRRS
powerpc/boot: Ensure _zimage_start is a weak symbol
MIPS: kexec: Mark CPU offline before disabling local IRQ
media: pci: cx23885: handle adding to list failure
drm/omap: fix memory barrier bug in DMM driver
powerpc/nohash: fix undefined behaviour when testing page size support
ARM: imx_v6_v7_defconfig: Select CONFIG_TMPFS_POSIX_ACL
tty: check name length in tty_find_polling_driver()
powerpc/eeh: Fix possible null deref in eeh_dump_dev_log()
Linux 4.9.137
MD: fix invalid stored role for a disk - try2
btrfs: set max_extent_size properly
Btrfs: fix null pointer dereference on compressed write path error
btrfs: qgroup: Dirty all qgroups before rescan
Btrfs: fix wrong dentries after fsync of file that got its parent replaced
btrfs: make sure we create all new block groups
btrfs: reset max_extent_size on clear in a bitmap
btrfs: wait on caching when putting the bg cache
btrfs: don't attempt to trim devices that don't support it
btrfs: iterate all devices during trim, instead of fs_devices::alloc_list
btrfs: fix error handling in free_log_tree
btrfs: locking: Add extra check in btrfs_init_new_buffer() to avoid deadlock
btrfs: Handle owner mismatch gracefully when walking up tree
soc/tegra: pmc: Fix child-node lookup
arm64: dts: stratix10: Correct System Manager register size
Cramfs: fix abad comparison when wrap-arounds occur
rpmsg: smd: fix memory leak on channel create
arm64: lse: remove -fcall-used-x0 flag
media: em28xx: make v4l2-compliance happier by starting sequence on zero
media: em28xx: fix input name for Terratec AV 350
media: tvp5150: avoid going past array on v4l2_querymenu()
media: em28xx: use a default format if TRY_FMT fails
xen: fix xen_qlock_wait()
kgdboc: Passing ekgdboc to command line causes panic
media: v4l2-tpg: fix kernel oops when enabling HFLIP and OSD
TC: Set DMA masks for devices
MIPS: OCTEON: fix out of bounds array access on CN68XX
powerpc/msi: Fix compile error on mpc83xx
dm ioctl: harden copy_params()'s copy_from_user() from malicious users
lockd: fix access beyond unterminated strings in prints
nfsd: Fix an Oops in free_session()
NFSv4.1: Fix the r/wsize checking
genirq: Fix race on spurious interrupt detection
printk: Fix panic caused by passing log_buf_len to command line
smb3: on kerberos mount if server doesn't specify auth type use krb5
smb3: do not attempt cifs operation in smb3 query info error path
smb3: allow stats which track session and share reconnects to be reset
w1: omap-hdq: fix missing bus unregister at removal
iio: adc: at91: fix wrong channel number in triggered buffer mode
iio: adc: at91: fix acking DRDY irq on simple conversions
iio: adc: imx25-gcq: Fix leak of device_node in mx25_gcq_setup_cfgs()
iio: ad5064: Fix regulator handling
kbuild: fix kernel/bounds.c 'W=1' warning
hugetlbfs: dirty pages as they are added to pagecache
ima: fix showing large 'violations' or 'runtime_measurements_count'
crypto: tcrypt - fix ghash-generic speed test
crypto: lrw - Fix out-of bounds access on counter overflow
signal/GenWQE: Fix sending of SIGKILL
PCI: Add Device IDs for Intel GPU "spurious interrupt" quirk
EDAC, skx_edac: Fix logical channel intermediate decoding
EDAC, {i7core,sb,skx}_edac: Fix uncorrected error counting
HID: hiddev: fix potential Spectre v1
ext4: propagate error from dquot_initialize() in EXT4_IOC_FSSETXATTR
ext4: initialize retries variable in ext4_da_write_inline_data_begin()
gfs2_meta: ->mount() can get NULL dev_name
jbd2: fix use after free in jbd2_log_do_checkpoint()
ASoC: intel: skylake: Add missing break in skl_tplg_get_token()
libnvdimm: Hold reference on parent while scheduling async init
net/ipv4: defensive cipso option parsing
iwlwifi: mvm: check return value of rs_rate_from_ucode_rate()
usbip:vudc: BUG kmalloc-2048 (Not tainted): Poison overwritten
libertas: don't set URB_ZERO_PACKET on IN USB transfer
xen: make xen_qlock_wait() nestable
xen: fix race in xen_qlock_wait()
xen/blkfront: avoid NULL blkfront_info dereference on device removal
tpm: Restore functionality to xen vtpm driver.
xen-swiotlb: use actually allocated size on check physical continuous
ARM: dts: exynos: Mark 1 GHz CPU OPP as suspend OPP on Exynos5250
ARM: dts: exynos: Convert exynos5250.dtsi to opp-v2 bindings
arm: dts: exynos: Add missing cooling device properties for CPUs
ARM: dts: exynos: Remove "cooling-{min|max}-level" for CPU nodes
ALSA: hda: Check the non-cached stream buffers more explicitly
dmaengine: dma-jz4780: Return error if not probed from DT
signal: Always deliver the kernel's SIGKILL and SIGSTOP to a pid namespace init
scsi: lpfc: Correct soft lockup when running mds diagnostics
uio: ensure class is registered before devices
driver/dma/ioat: Call del_timer_sync() without holding prep_lock
usb: chipidea: Prevent unbalanced IRQ disable
crypto: caam - fix implicit casts in endianness helpers
coresight: etb10: Fix handling of perf mode
PCI/MSI: Warn and return error if driver enables MSI/MSI-X twice
MD: fix invalid stored role for a disk
ext4: fix argument checking in EXT4_IOC_MOVE_EXT
usb: gadget: udc: atmel: handle at91sam9rl PMC
VMCI: Resource wildcard match fixed
tpm: suppress transmit cmd error logs when TPM 1.2 is disabled/deactivated
IB/ipoib: Clear IPCB before icmp_send
RDMA/core: Do not expose unsupported counters
scsi: megaraid_sas: fix a missing-check bug
scsi: esp_scsi: Track residual for PIO transfers
cgroup, netclassid: add a preemption point to write_classid
ath10k: schedule hardware restart if WMI command times out
ixgbevf: VF2VF TCP RSS
pinctrl: ssbi-gpio: Fix pm8xxx_pin_config_get() to be compliant
pinctrl: spmi-mpp: Fix pmic_mpp_config_get() to be compliant
pinctrl: qcom: spmi-mpp: Fix drive strength setting
ACPI / LPSS: Add alternative ACPI HIDs for Cherry Trail DMA controllers
kprobes: Return error if we fail to reuse kprobe instead of BUG_ON()
brcmfmac: fix for proper support of 160MHz bandwidth
pinctrl: qcom: spmi-mpp: Fix err handling of pmic_mpp_set_mux
x86: boot: Fix EFI stub alignment
Bluetooth: btbcm: Add entry for BCM4335C0 UART bluetooth
cpufreq: dt: Try freeing static OPPs only if we have added them
x86/olpc: Indicate that legacy PC XO-1 platform should not register RTC
iwlwifi: pcie: avoid empty free RB queue
mmc: sdhci-pci-o2micro: Add quirk for O2 Micro dev 0x8620 rev 0x01
perf strbuf: Match va_{add,copy} with va_end
perf tools: Cleanup trace-event-info 'tdata' leak
perf tools: Free temporary 'sys' string in read_event_files()
hwmon: (pwm-fan) Set fan speed to 0 on suspend
s390/sthyi: Fix machine name validity indication
tun: Consistently configure generic netdev params via rtnetlink
swim: fix cleanup on setup error
ataflop: fix error handling during setup
locking/lockdep: Fix debug_locks off performance problem
i2c: rcar: cleanup DMA for all kinds of failure
selftests: ftrace: Add synthetic event syntax testcase
net: qla3xxx: Remove overflowing shift statement
x86/fpu: Remove second definition of fpu in __fpu__restore_sig()
perf cpu_map: Align cpu map synthesized events properly.
sched/fair: Fix the min_vruntime update logic in dequeue_entity()
sparc64: Make proc_id signed.
sparc: Fix single-pcr perf event counter management.
xfrm: policy: use hlist rcu variants on insert
Revert "perf tools: Fix PMU term format max value calculation"
bpf: do not blindly change rlimit in reuseport net selftest
x86/speculation: Support Enhanced IBRS on future CPUs
x86/corruption-check: Fix panic in memory_corruption_check() when boot option without value is provided
x86/speculation: Enable cross-hyperthread spectre v2 STIBP mitigation
ALSA: ca0106: Disable IZD on SB0570 DAC to fix audio pops
ALSA: hda - Add mic quirk for the Lenovo G50-30 (17aa:3905)
ALSA: hda - Fix headphone pin config for ASUS G751
ALSA: hda - Add quirk for ASUS G751 laptop
parisc: Fix map_pages() to not overwrite existing pte entries
parisc: Fix address in HPMC IVA
ipmi: Fix timer race with module unload
pcmcia: Implement CLKRUN protocol disabling for Ricoh bridges
jffs2: free jffs2_sb_info through jffs2_kill_sb()
hwmon: (pmbus) Fix page count auto-detection.
bcache: fix miss key refill->end in writeback
ANDROID: zram: set comp_len to PAGE_SIZE when page is huge
Linux 4.9.136
posix-timers: Sanitize overrun handling
net: fs_enet: do not call phy_stop() in interrupts
x86/time: Correct the attribute on jiffies' definition
x86/percpu: Fix this_cpu_read()
sched/fair: Fix throttle_list starvation with low CFS quota
Input: elan_i2c - add ACPI ID for Lenovo IdeaPad 330-15IGM
USB: fix the usbfs flag sanitization for control transfers
usb: gadget: storage: Fix Spectre v1 vulnerability
cdc-acm: correct counting of UART states in serial state notification
IB/ucm: Fix Spectre v1 vulnerability
RDMA/ucma: Fix Spectre v1 vulnerability
drm/edid: Add 6 bpc quirk for BOE panel in HP Pavilion 15-n233sl
ptp: fix Spectre v1 vulnerability
cachefiles: fix the race between cachefiles_bury_object() and rmdir(2)
xfs: truncate transaction does not modify the inobt
gpio: mxs: Get rid of external API call
ahci: don't ignore result code of ahci_reset_controller()
crypto: shash - Fix a sleep-in-atomic bug in shash_setkey_unaligned
Revert "x86/mm: Expand static page table for fixmap space"
ip6_tunnel: Fix encapsulation layout
rtnetlink: Disallow FDB configuration for non-Ethernet device
net: fix pskb_trim_rcsum_slow() with odd trim offset
net: drop skb on failure in ip_check_defrag()
bonding: fix length of actor system
ethtool: fix a privilege escalation bug
vhost: Fix Spectre V1 vulnerability
sctp: fix race on sctp_id2asoc
r8169: fix NAPI handling under high load
net: udp: fix handling of CHECKSUM_COMPLETE packets
net: stmmac: Fix stmmac_mdio_reset() when building stmmac as modules
net: socket: fix a missing-check bug
net: sched: gred: pass the right attribute to gred_change_table_def()
net/ipv6: Fix index counter for unicast addresses in in6_dump_addrs
llc: set SOCK_RCU_FREE in llc_sap_add_socket()
ipv6/ndisc: Preserve IPv6 control buffer if protocol error handlers are called
ipv6: mcast: fix a use-after-free in inet6_mc_check
net: bridge: remove ipv6 zero address check in mcast queries
bridge: do not add port to router list when receives query with source 0.0.0.0
perf tools: Disable parallelism for 'make clean'
Revert "netfilter: ipv6: nf_defrag: drop skb dst before queueing"
mtd: spi-nor: Add support for is25wp series chips
fs/fat/fatent.c: add cond_resched() to fat_count_free_clusters()
net: ena: fix NULL dereference due to untimely napi initialization
rxrpc: Only take the rwind and mtu values from latest ACK
rxrpc: Don't check RXRPC_CALL_TX_LAST after calling rxrpc_rotate_tx_window()
ARM: dts: imx53-qsb: disable 1.2GHz OPP
perf tests: Fix indexing when invoking subtests
xhci: Fix USB3 NULL pointer dereference at logical disconnect.
libertas: call into generic suspend code before turning off power
IB/mlx4: Fix an error handling path in 'mlx4_ib_rereg_user_mr()'
x86/paravirt: Fix some warning messages
iio: buffer: fix the function signature to match implementation
nvmet: fix space padding in serial number
bonding: ratelimit failed speed/duplex update warning
enic: do not overwrite error code
xen-netfront: Fix mismatched rtnl_unlock
sparc64: Fix regression in pmdp_invalidate().
xen-netfront: Update features after registering netdev
test_bpf: Fix testing with CONFIG_BPF_JIT_ALWAYS_ON=y on other arches
ALSA: hda - Fix incorrect usage of IS_REACHABLE()
futex: futex_wake_op, do not fail on invalid op
cifs: Use ULL suffix for 64-bit constant
perf/core: Fix locking for children siblings group read
macsec: fix memory leaks when skb_to_sgvec fails
l2tp: remove configurable payload offset
iio: pressure: zpa2326: Remove always-true check which confuses gcc
module: fix DEBUG_SET_MODULE_RONX typo
drm/msm: Fix possible null dereference on failure of get_pages()
Btrfs: incremental send, fix invalid memory access
Revert "IB/ipoib: Update broadcast object if PKey value was changed in index 0"
i40e: avoid NVM acquire deadlock during NVM update
drm: bochs: Don't remove uninitialized fbdev framebuffer
scsi: qla2xxx: Avoid double completion of abort command
IB/mlx5: Avoid passing an invalid QP type to firmware
mm/frame_vector.c: release a semaphore in 'get_vaddr_frames()'
nbd: only set MSG_MORE when we have more to send
IB/rxe: put the pool on allocation failure
IB/ipoib: Fix lockdep issue found on ipoib_ib_dev_heavy_flush
ipv6: fix cleanup ordering for ip6_mr failure
ath10k: convert warning about non-existent OTP board id to debug message
ALSA: hda - No loopback on ALC299 codec
sctp: use right member as the param of list_for_each_entry
net: cdc_ncm: GetNtbFormat endian fix
ocfs2: fix deadlock caused by recursive locking in xattr
qed: Warn PTT usage by wrong hw-function
iio: adc: Revert "axp288: Drop bogus AXP288_ADC_TS_PIN_CTRL register modifications"
rds: ib: Fix missing call to rds_ib_dev_put in rds_ib_setup_qp
staging: wilc1000: Fix problem with wrong vif index
ptr_ring: fix up after recent ptr_ring changes
clk: samsung: Fix m2m scaler clock on Exynos542x
usb: dwc3: omap: remove IRQ_NOAUTOEN used with shared irq
usb: renesas_usbhs: gadget: fix unused-but-set-variable warning
usb: renesas_usbhs: gadget: fix spin_lock_init() for &uep->lock
net/mlx5: Fix health work queue spin lock to IRQ safe
perf probe: Fix probe definition for inlined functions
perf evsel: Fix probing of precise_ip level for default cycles event
net/mlx5: Fix driver load error flow when firmware is stuck
ip6_tunnel: Correct tos value in collect_md mode
net/mlx5e: Fix fixpoint divide exception in mlx5e_am_stats_compare
ufs: we need to sync inode before freeing it
Btrfs: clear EXTENT_DEFRAG bits in finish_ordered_io
net: stmmac: ensure jumbo_frm error return is correctly checked for -ve value
elevator: fix truncation of icq_cache_name
gpu: ipu-v3: Fix CSI selection for VDIC
ARM: 8677/1: boot/compressed: fix decompressor header layout for v7-M
x86/cpu/cyrix: Add alternative Device ID of Geode GX1 SoC
qlcnic: Fix tunnel offload for 82xx adapters
net: ethernet: stmmac: Fix altr_tse_pcs SGMII Initialization
libata: fix error checking in in ata_parse_force_one()
mac80211: fix TX aggregation start/stop callback race
arch/sparc: increase CONFIG_NODES_SHIFT on SPARC64 to 5
ASoC: Intel: Skylake: Fix to parse consecutive string tkns in manifest
reset: hi6220: Set module license so that it can be loaded
ata: sata_rcar: Handle return value of clk_prepare_enable
btrfs: fiemap: Cache and merge fiemap extent before submit it to user
ARM: dts: bcm283x: Reserve first page for firmware
ath10k: fix NAPI enable/disable symmetry for AHB interface
bnxt_en: Don't use rtnl lock to protect link change logic in workqueue.
tipc: fix a race condition of releasing subscriber object
tipc: Fix tipc_sk_reinit handling of -EAGAIN
net/mlx5: Fix command completion after timeout access invalid structure
net: phy: marvell: Limit 88m1101 autoneg errata to 88E1145 as well.
nvme-pci: fix CMB sysfs file removal in reset path
rxe: Fix a sleep-in-atomic bug in post_one_send
orangefs: off by ones in xattr size checks
IB/core: Fix the validations of a multicast LID in attach or detach operations
IB/ipoib: Do not warn if IPoIB debugfs doesn't exist
platform/x86: acer-wmi: setup accelerometer when ACPI device was found
ipv6: set rt6i_protocol properly in the route when it is installed
efi/fb: Correct PCI_STD_RESOURCE_END usage
i2c: bcm2835: Avoid possible NULL ptr dereference
PCI: Disable MSI for HiSilicon Hip06/Hip07 only in Root Port mode
ACPI: sysfs: Make ACPI GPE mask kernel parameter cover all GPEs
igb: Remove superfluous reset to PHY and page 0 selection
f2fs: fix multiple f2fs_add_link() having same name for inline dentry
scsi: aacraid: Fix typo in blink status
MIPS: Handle non word sized instructions when examining frame
MIPS: microMIPS: Fix decoding of swsp16 instruction
mm/memory_hotplug.c: fix overflow in test_pages_in_a_zone()
perf symbols: Fix memory corruption because of zero length symbols
net: cxgb3_main: fix a missing-check bug
declance: Fix continuation with the adapter identification message
net: fec: fix rare tx timeout
perf/x86/intel/uncore: Fix PCI BDF address of M3UPI on SKX
perf/ring_buffer: Prevent concurent ring buffer access
smsc95xx: Check for Wake-on-LAN modes
smsc75xx: Check for Wake-on-LAN modes
r8152: Check for supported Wake-on-LAN Modes
sr9800: Check for supported Wake-on-LAN modes
lan78xx: Check for supported Wake-on-LAN modes
ax88179_178a: Check for supported Wake-on-LAN modes
asix: Check for supported Wake-on-LAN modes
qed: Avoid constant logical operation warning in qed_vf_pf_acquire
qed: Avoid implicit enum conversion in qed_roce_mode_to_flavor
pxa168fb: prepare the clock
Bluetooth: SMP: fix crash in unpairing
mac80211_hwsim: do not omit multicast announce of first added radio
nl80211: Fix possible Spectre-v1 for NL80211_TXRATE_HT
soc: fsl: qe: Fix copy/paste bug in ucc_get_tdm_sync_shift()
soc: fsl: qbman: qman: avoid allocating from non existing gen_pool
net: macb: Clean 64b dma addresses if they are not detected
ARM: dts: BCM63xx: Fix incorrect interrupt specifiers
xfrm: validate template mode
ARM: 8799/1: mm: fix pci_ioremap_io() offset check
mac80211: TDLS: fix skb queue/priority assignment
cfg80211: Address some corner cases in scan result channel updating
mac80211: fix pending queue hang due to TX_DROP
cfg80211: reg: Init wiphy_idx in regulatory_hint_core()
mac80211: Always report TX status
xfrm6: call kfree_skb when skb is toobig
xfrm: Validate address prefix lengths in the xfrm selector.
BACKPORT: arm64: Expose support for optional ARMv8-A features
ANDROID: sdcardfs: Add option to drop unused dentries
UPSTREAM: xfrm: fix ptr_ret.cocci warnings
UPSTREAM: xfrm: Return detailed errors from xfrmi_newlink
UPSTREAM: xfrm: Allow xfrmi if_id to be updated by UPDSA
UPSTREAM: xfrm: Allow Set Mark to be Updated Using UPDSA
BACKPORT: xfrm: Add virtual xfrm interfaces
BACKPORT: xfrm: Add a new lookup key to match xfrm interfaces.
UPSTREAM: flow: Extend flow informations with xfrm interface id.
BACKPORT: xfrm: Extend the output_mark to support input direction and masking.
BACKPORT: xfrm: fix XFRMA_OUTPUT_MARK policy entry
f2fs: guarantee journalled quota data by checkpoint
f2fs: cleanup dirty pages if recover failed
f2fs: fix data corruption issue with hardware encryption
f2fs: fix to recover inode->i_flags of inode block during POR
f2fs: spread f2fs_set_inode_flags()
f2fs: fix to spread clear_cold_data()
Revert "f2fs: fix to clear PG_checked flag in set_page_dirty()"
f2fs: account read IOs and use IO counts for is_idle
f2fs: fix to account IO correctly for cgroup writeback
f2fs: fix to account IO correctly
f2fs: remove request_list check in is_idle()
f2fs: allow to mount, if quota is failed
f2fs: update REQ_TIME in f2fs_cross_rename()
f2fs: do not update REQ_TIME in case of error conditions
f2fs: remove unneeded disable_nat_bits()
f2fs: remove unused sbi->trigger_ssr_threshold
f2fs: shrink sbi->sb_lock coverage in set_file_temperature()
f2fs: fix to recover cold bit of inode block during POR
f2fs: submit cached bio to avoid endless PageWriteback
f2fs: checkpoint disabling
f2fs: clear PageError on the read path
f2fs: allow out-place-update for direct IO in LFS mode
f2fs: refactor ->page_mkwrite() flow
Revert: "f2fs: check last page index in cached bio to decide submission"
f2fs: support superblock checksum
f2fs: add to account skip count of background GC
f2fs: add to account meta IO
f2fs: keep lazytime on remount
f2fs: fix missing up_read
f2fs: return correct errno in f2fs_gc
f2fs: avoid f2fs_bug_on if f2fs_get_meta_page_nofail got EIO
f2fs: mark inode dirty explicitly in recover_inode()
f2fs: fix to recover inode's crtime during POR
f2fs: fix to recover inode's i_gc_failures during POR
f2fs: fix to recover inode's i_flags during POR
f2fs: fix to recover inode's project id during POR
f2fs: update i_size after DIO completion
f2fs: report ENOENT correctly in f2fs_rename
f2fs: fix remount problem of option io_bits
f2fs: fix to recover inode's uid/gid during POR
f2fs: avoid infinite loop in f2fs_alloc_nid
f2fs: add new idle interval timing for discard and gc paths
f2fs: split IO error injection according to RW
f2fs: add SPDX license identifiers
f2fs: surround fault_injection related option parsing using CONFIG_F2FS_FAULT_INJECTION
f2fs: avoid sleeping under spin_lock
f2fs: plug readahead IO in readdir()
f2fs: fix to do sanity check with current segment number
f2fs: fix memory leak of percpu counter in fill_super()
f2fs: fix memory leak of write_io in fill_super()
f2fs: cache NULL when both default_acl and acl are NULL
f2fs: fix to flush all dirty inodes recovered in readonly fs
f2fs: report error if quota off error during umount
f2fs: submit bio after shutdown
f2fs: avoid wrong decrypted data from disk
Revert "f2fs: use printk_ratelimited for f2fs_msg"
f2fs: fix unnecessary periodic wakeup of discard thread when dev is busy
f2fs: fix to avoid NULL pointer dereference on se->discard_map
f2fs: add additional sanity check in f2fs_acl_from_disk()
UPSTREAM: HID: sony: remove redundant check for -ve err
UPSTREAM: HID: sony: Make sure to unregister sensors on failure
UPSTREAM: HID: sony: Make DS4 bt poll interval adjustable
UPSTREAM: HID: sony: Set proper bit flags on DS4 output report
UPSTREAM: HID: sony: DS4 use brighter LED colors
UPSTREAM: HID: sony: Improve navigation controller axis/button mapping
UPSTREAM: HID: sony: Use DS3 MAC address as unique identifier on USB
UPSTREAM: HID: sony: Perform duplicate device check earlier on
UPSTREAM: HID: sony: Expose DS3 motion sensors through separate device
UPSTREAM: HID: sony: Print error on failure to active DS3 / Navigation controllers
UPSTREAM: HID: sony: DS3 comply to Linux gamepad spec
UPSTREAM: HID: sony: Mark DS4 touchpad device as a pointer
UPSTREAM: HID: sony: Support motion sensor calibration on dongle
UPSTREAM: HID: sony: Make work handling more generic
UPSTREAM: HID: sony: Treat the ds4 dongle as a separate device
UPSTREAM: HID: sony: Remove report descriptor fixup for DS4
UPSTREAM: HID: sony: Report hardware timestamp for DS4 sensor values
UPSTREAM: HID: sony: Calibrate DS4 motion sensors
UPSTREAM: HID: sony: Report DS4 motion sensors through a separate device
UPSTREAM: HID: sony: Fix input device leak when connecting a DS4 twice using USB/BT
UPSTREAM: HID: sony: Ignore DS4 dongle reports when no device is connected
UPSTREAM: HID: sony: Use DS4 MAC address as unique identifier on USB
UPSTREAM: HID: sony: Fix error handling bug when touchpad registration fails
UPSTREAM: HID: sony: Comply to Linux gamepad spec for DS4
UPSTREAM: HID: sony: Make the DS4 touchpad a separate device
UPSTREAM: HID: sony: Fix memory issue when connecting device using both Bluetooth and USB
UPSTREAM: HID: sony: Adjust value range for motion sensors
UPSTREAM: HID: sony: Handle multiple touch events input record
UPSTREAM: HID: sony: Send ds4 output reports on output end-point
UPSTREAM: HID: sony: Perform CRC check on bluetooth input packets
UPSTREAM: HID: sony: Adjust HID report size name definitions
UPSTREAM: HID: sony: Fix race condition in sony_probe
Conflicts:
arch/arm/include/asm/cputype.h
drivers/gpu/drm/msm/msm_gem.c
drivers/scsi/ufs/ufshcd.c
drivers/usb/dwc3/core.c
fs/f2fs/data.c
fs/f2fs/f2fs.h
fs/f2fs/segment.c
kernel/sched/core.c
net/xfrm/xfrm_user.c
Change-Id: I33a8fa8d996fb61c9730f4128b50e7716e84c9fe
Signed-off-by: jianzhou <jianzhou@codeaurora.org>
2617 lines
81 KiB
C
2617 lines
81 KiB
C
#ifndef _LINUX_MM_H
|
|
#define _LINUX_MM_H
|
|
|
|
#include <linux/errno.h>
|
|
|
|
#ifdef __KERNEL__
|
|
|
|
#include <linux/mmdebug.h>
|
|
#include <linux/gfp.h>
|
|
#include <linux/bug.h>
|
|
#include <linux/list.h>
|
|
#include <linux/mmzone.h>
|
|
#include <linux/rbtree.h>
|
|
#include <linux/atomic.h>
|
|
#include <linux/debug_locks.h>
|
|
#include <linux/mm_types.h>
|
|
#include <linux/range.h>
|
|
#include <linux/pfn.h>
|
|
#include <linux/percpu-refcount.h>
|
|
#include <linux/bit_spinlock.h>
|
|
#include <linux/shrinker.h>
|
|
#include <linux/resource.h>
|
|
#include <linux/page_ext.h>
|
|
#include <linux/err.h>
|
|
#include <linux/page_ref.h>
|
|
|
|
struct mempolicy;
|
|
struct anon_vma;
|
|
struct anon_vma_chain;
|
|
struct file_ra_state;
|
|
struct user_struct;
|
|
struct writeback_control;
|
|
struct bdi_writeback;
|
|
|
|
#ifndef CONFIG_NEED_MULTIPLE_NODES /* Don't use mapnrs, do it properly */
|
|
extern unsigned long max_mapnr;
|
|
|
|
static inline void set_max_mapnr(unsigned long limit)
|
|
{
|
|
max_mapnr = limit;
|
|
}
|
|
#else
|
|
static inline void set_max_mapnr(unsigned long limit) { }
|
|
#endif
|
|
|
|
extern unsigned long totalram_pages;
|
|
extern void * high_memory;
|
|
extern int page_cluster;
|
|
|
|
#ifdef CONFIG_SYSCTL
|
|
extern int sysctl_legacy_va_layout;
|
|
#else
|
|
#define sysctl_legacy_va_layout 0
|
|
#endif
|
|
|
|
#ifdef CONFIG_HAVE_ARCH_MMAP_RND_BITS
|
|
extern const int mmap_rnd_bits_min;
|
|
extern const int mmap_rnd_bits_max;
|
|
extern int mmap_rnd_bits __read_mostly;
|
|
#endif
|
|
#ifdef CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS
|
|
extern const int mmap_rnd_compat_bits_min;
|
|
extern const int mmap_rnd_compat_bits_max;
|
|
extern int mmap_rnd_compat_bits __read_mostly;
|
|
#endif
|
|
|
|
#include <asm/page.h>
|
|
#include <asm/pgtable.h>
|
|
#include <asm/processor.h>
|
|
|
|
#ifndef __pa_symbol
|
|
#define __pa_symbol(x) __pa(RELOC_HIDE((unsigned long)(x), 0))
|
|
#endif
|
|
|
|
#ifndef page_to_virt
|
|
#define page_to_virt(x) __va(PFN_PHYS(page_to_pfn(x)))
|
|
#endif
|
|
|
|
#ifndef lm_alias
|
|
#define lm_alias(x) __va(__pa_symbol(x))
|
|
#endif
|
|
|
|
/*
|
|
* To prevent common memory management code establishing
|
|
* a zero page mapping on a read fault.
|
|
* This macro should be defined within <asm/pgtable.h>.
|
|
* s390 does this to prevent multiplexing of hardware bits
|
|
* related to the physical page in case of virtualization.
|
|
*/
|
|
#ifndef mm_forbids_zeropage
|
|
#define mm_forbids_zeropage(X) (0)
|
|
#endif
|
|
|
|
/*
|
|
* Default maximum number of active map areas, this limits the number of vmas
|
|
* per mm struct. Users can overwrite this number by sysctl but there is a
|
|
* problem.
|
|
*
|
|
* When a program's coredump is generated as ELF format, a section is created
|
|
* per a vma. In ELF, the number of sections is represented in unsigned short.
|
|
* This means the number of sections should be smaller than 65535 at coredump.
|
|
* Because the kernel adds some informative sections to a image of program at
|
|
* generating coredump, we need some margin. The number of extra sections is
|
|
* 1-3 now and depends on arch. We use "5" as safe margin, here.
|
|
*
|
|
* ELF extended numbering allows more than 65535 sections, so 16-bit bound is
|
|
* not a hard limit any more. Although some userspace tools can be surprised by
|
|
* that.
|
|
*/
|
|
#define MAPCOUNT_ELF_CORE_MARGIN (5)
|
|
#define DEFAULT_MAX_MAP_COUNT (USHRT_MAX - MAPCOUNT_ELF_CORE_MARGIN)
|
|
|
|
extern int sysctl_max_map_count;
|
|
|
|
extern unsigned long sysctl_user_reserve_kbytes;
|
|
extern unsigned long sysctl_admin_reserve_kbytes;
|
|
|
|
extern int sysctl_overcommit_memory;
|
|
extern int sysctl_overcommit_ratio;
|
|
extern unsigned long sysctl_overcommit_kbytes;
|
|
|
|
extern int overcommit_ratio_handler(struct ctl_table *, int, void __user *,
|
|
size_t *, loff_t *);
|
|
extern int overcommit_kbytes_handler(struct ctl_table *, int, void __user *,
|
|
size_t *, loff_t *);
|
|
|
|
#define nth_page(page,n) pfn_to_page(page_to_pfn((page)) + (n))
|
|
|
|
/* to align the pointer to the (next) page boundary */
|
|
#define PAGE_ALIGN(addr) ALIGN(addr, PAGE_SIZE)
|
|
|
|
/* test whether an address (unsigned long or pointer) is aligned to PAGE_SIZE */
|
|
#define PAGE_ALIGNED(addr) IS_ALIGNED((unsigned long)(addr), PAGE_SIZE)
|
|
|
|
/*
|
|
* Linux kernel virtual memory manager primitives.
|
|
* The idea being to have a "virtual" mm in the same way
|
|
* we have a virtual fs - giving a cleaner interface to the
|
|
* mm details, and allowing different kinds of memory mappings
|
|
* (from shared memory to executable loading to arbitrary
|
|
* mmap() functions).
|
|
*/
|
|
|
|
extern struct kmem_cache *vm_area_cachep;
|
|
|
|
#ifndef CONFIG_MMU
|
|
extern struct rb_root nommu_region_tree;
|
|
extern struct rw_semaphore nommu_region_sem;
|
|
|
|
extern unsigned int kobjsize(const void *objp);
|
|
#endif
|
|
|
|
/*
|
|
* vm_flags in vm_area_struct, see mm_types.h.
|
|
* When changing, update also include/trace/events/mmflags.h
|
|
*/
|
|
#define VM_NONE 0x00000000
|
|
|
|
#define VM_READ 0x00000001 /* currently active flags */
|
|
#define VM_WRITE 0x00000002
|
|
#define VM_EXEC 0x00000004
|
|
#define VM_SHARED 0x00000008
|
|
|
|
/* mprotect() hardcodes VM_MAYREAD >> 4 == VM_READ, and so for r/w/x bits. */
|
|
#define VM_MAYREAD 0x00000010 /* limits for mprotect() etc */
|
|
#define VM_MAYWRITE 0x00000020
|
|
#define VM_MAYEXEC 0x00000040
|
|
#define VM_MAYSHARE 0x00000080
|
|
|
|
#define VM_GROWSDOWN 0x00000100 /* general info on the segment */
|
|
#define VM_UFFD_MISSING 0x00000200 /* missing pages tracking */
|
|
#define VM_PFNMAP 0x00000400 /* Page-ranges managed without "struct page", just pure PFN */
|
|
#define VM_DENYWRITE 0x00000800 /* ETXTBSY on write attempts.. */
|
|
#define VM_UFFD_WP 0x00001000 /* wrprotect pages tracking */
|
|
|
|
#define VM_LOCKED 0x00002000
|
|
#define VM_IO 0x00004000 /* Memory mapped I/O or similar */
|
|
|
|
/* Used by sys_madvise() */
|
|
#define VM_SEQ_READ 0x00008000 /* App will access data sequentially */
|
|
#define VM_RAND_READ 0x00010000 /* App will not benefit from clustered reads */
|
|
|
|
#define VM_DONTCOPY 0x00020000 /* Do not copy this vma on fork */
|
|
#define VM_DONTEXPAND 0x00040000 /* Cannot expand with mremap() */
|
|
#define VM_LOCKONFAULT 0x00080000 /* Lock the pages covered when they are faulted in */
|
|
#define VM_ACCOUNT 0x00100000 /* Is a VM accounted object */
|
|
#define VM_NORESERVE 0x00200000 /* should the VM suppress accounting */
|
|
#define VM_HUGETLB 0x00400000 /* Huge TLB Page VM */
|
|
#define VM_ARCH_1 0x01000000 /* Architecture-specific flag */
|
|
#define VM_ARCH_2 0x02000000
|
|
#define VM_DONTDUMP 0x04000000 /* Do not include in the core dump */
|
|
|
|
#ifdef CONFIG_MEM_SOFT_DIRTY
|
|
# define VM_SOFTDIRTY 0x08000000 /* Not soft dirty clean area */
|
|
#else
|
|
# define VM_SOFTDIRTY 0
|
|
#endif
|
|
|
|
#define VM_MIXEDMAP 0x10000000 /* Can contain "struct page" and pure PFN pages */
|
|
#define VM_HUGEPAGE 0x20000000 /* MADV_HUGEPAGE marked this vma */
|
|
#define VM_NOHUGEPAGE 0x40000000 /* MADV_NOHUGEPAGE marked this vma */
|
|
#define VM_MERGEABLE 0x80000000 /* KSM may merge identical pages */
|
|
|
|
#ifdef CONFIG_ARCH_USES_HIGH_VMA_FLAGS
|
|
#define VM_HIGH_ARCH_BIT_0 32 /* bit only usable on 64-bit architectures */
|
|
#define VM_HIGH_ARCH_BIT_1 33 /* bit only usable on 64-bit architectures */
|
|
#define VM_HIGH_ARCH_BIT_2 34 /* bit only usable on 64-bit architectures */
|
|
#define VM_HIGH_ARCH_BIT_3 35 /* bit only usable on 64-bit architectures */
|
|
#define VM_HIGH_ARCH_0 BIT(VM_HIGH_ARCH_BIT_0)
|
|
#define VM_HIGH_ARCH_1 BIT(VM_HIGH_ARCH_BIT_1)
|
|
#define VM_HIGH_ARCH_2 BIT(VM_HIGH_ARCH_BIT_2)
|
|
#define VM_HIGH_ARCH_3 BIT(VM_HIGH_ARCH_BIT_3)
|
|
#endif /* CONFIG_ARCH_USES_HIGH_VMA_FLAGS */
|
|
|
|
#if defined(CONFIG_X86)
|
|
# define VM_PAT VM_ARCH_1 /* PAT reserves whole VMA at once (x86) */
|
|
#if defined (CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS)
|
|
# define VM_PKEY_SHIFT VM_HIGH_ARCH_BIT_0
|
|
# define VM_PKEY_BIT0 VM_HIGH_ARCH_0 /* A protection key is a 4-bit value */
|
|
# define VM_PKEY_BIT1 VM_HIGH_ARCH_1
|
|
# define VM_PKEY_BIT2 VM_HIGH_ARCH_2
|
|
# define VM_PKEY_BIT3 VM_HIGH_ARCH_3
|
|
#endif
|
|
#elif defined(CONFIG_PPC)
|
|
# define VM_SAO VM_ARCH_1 /* Strong Access Ordering (powerpc) */
|
|
#elif defined(CONFIG_PARISC)
|
|
# define VM_GROWSUP VM_ARCH_1
|
|
#elif defined(CONFIG_METAG)
|
|
# define VM_GROWSUP VM_ARCH_1
|
|
#elif defined(CONFIG_IA64)
|
|
# define VM_GROWSUP VM_ARCH_1
|
|
#elif !defined(CONFIG_MMU)
|
|
# define VM_MAPPED_COPY VM_ARCH_1 /* T if mapped copy of data (nommu mmap) */
|
|
#endif
|
|
|
|
#if defined(CONFIG_X86)
|
|
/* MPX specific bounds table or bounds directory */
|
|
# define VM_MPX VM_ARCH_2
|
|
#endif
|
|
|
|
#ifndef VM_GROWSUP
|
|
# define VM_GROWSUP VM_NONE
|
|
#endif
|
|
|
|
/* Bits set in the VMA until the stack is in its final location */
|
|
#define VM_STACK_INCOMPLETE_SETUP (VM_RAND_READ | VM_SEQ_READ)
|
|
|
|
#ifndef VM_STACK_DEFAULT_FLAGS /* arch can override this */
|
|
#define VM_STACK_DEFAULT_FLAGS VM_DATA_DEFAULT_FLAGS
|
|
#endif
|
|
|
|
#ifdef CONFIG_STACK_GROWSUP
|
|
#define VM_STACK VM_GROWSUP
|
|
#else
|
|
#define VM_STACK VM_GROWSDOWN
|
|
#endif
|
|
|
|
#define VM_STACK_FLAGS (VM_STACK | VM_STACK_DEFAULT_FLAGS | VM_ACCOUNT)
|
|
|
|
/*
|
|
* Special vmas that are non-mergable, non-mlock()able.
|
|
* Note: mm/huge_memory.c VM_NO_THP depends on this definition.
|
|
*/
|
|
#define VM_SPECIAL (VM_IO | VM_DONTEXPAND | VM_PFNMAP | VM_MIXEDMAP)
|
|
|
|
/* This mask defines which mm->def_flags a process can inherit its parent */
|
|
#define VM_INIT_DEF_MASK VM_NOHUGEPAGE
|
|
|
|
/* This mask is used to clear all the VMA flags used by mlock */
|
|
#define VM_LOCKED_CLEAR_MASK (~(VM_LOCKED | VM_LOCKONFAULT))
|
|
|
|
#ifdef CONFIG_ARCH_MSM8953_SOC_SETTINGS
|
|
#define MSM8953_TLMM_START_ADDR 0x01000000
|
|
#define MSM8953_TLMM_END_ADDR (0x01300000 - 1)
|
|
#endif
|
|
|
|
/*
|
|
* mapping from the currently active vm_flags protection bits (the
|
|
* low four bits) to a page protection mask..
|
|
*/
|
|
extern pgprot_t protection_map[16];
|
|
|
|
#define FAULT_FLAG_WRITE 0x01 /* Fault was a write access */
|
|
#define FAULT_FLAG_MKWRITE 0x02 /* Fault was mkwrite of existing pte */
|
|
#define FAULT_FLAG_ALLOW_RETRY 0x04 /* Retry fault if blocking */
|
|
#define FAULT_FLAG_RETRY_NOWAIT 0x08 /* Don't drop mmap_sem and wait when retrying */
|
|
#define FAULT_FLAG_KILLABLE 0x10 /* The fault task is in SIGKILL killable region */
|
|
#define FAULT_FLAG_TRIED 0x20 /* Second try */
|
|
#define FAULT_FLAG_USER 0x40 /* The fault originated in userspace */
|
|
#define FAULT_FLAG_REMOTE 0x80 /* faulting for non current tsk/mm */
|
|
#define FAULT_FLAG_INSTRUCTION 0x100 /* The fault was during an instruction fetch */
|
|
/* Speculative fault, not holding mmap_sem */
|
|
#define FAULT_FLAG_SPECULATIVE 0x200
|
|
#define FAULT_FLAG_PREFAULT_OLD 0x400 /* Make faultaround ptes old */
|
|
|
|
/*
|
|
* vm_fault is filled by the the pagefault handler and passed to the vma's
|
|
* ->fault function. The vma's ->fault is responsible for returning a bitmask
|
|
* of VM_FAULT_xxx flags that give details about how the fault was handled.
|
|
*
|
|
* MM layer fills up gfp_mask for page allocations but fault handler might
|
|
* alter it if its implementation requires a different allocation context.
|
|
*
|
|
* pgoff should be used in favour of virtual_address, if possible.
|
|
*/
|
|
struct vm_fault {
|
|
unsigned int flags; /* FAULT_FLAG_xxx flags */
|
|
gfp_t gfp_mask; /* gfp mask to be used for allocations */
|
|
pgoff_t pgoff; /* Logical page offset based on vma */
|
|
void __user *virtual_address; /* Faulting virtual address */
|
|
struct page *cow_page; /* Handler may choose to COW */
|
|
struct page *page; /* ->fault handlers should return a
|
|
* page here, unless VM_FAULT_NOPAGE
|
|
* is set (which is also implied by
|
|
* VM_FAULT_ERROR).
|
|
*/
|
|
void *entry; /* ->fault handler can alternatively
|
|
* return locked DAX entry. In that
|
|
* case handler should return
|
|
* VM_FAULT_DAX_LOCKED and fill in
|
|
* entry here.
|
|
*/
|
|
};
|
|
|
|
/*
|
|
* Page fault context: passes though page fault handler instead of endless list
|
|
* of function arguments.
|
|
*/
|
|
struct fault_env {
|
|
struct vm_area_struct *vma; /* Target VMA */
|
|
unsigned long address; /* Faulting virtual address */
|
|
unsigned long fault_address; /* Saved faulting virtual address */
|
|
unsigned int flags; /* FAULT_FLAG_xxx flags */
|
|
pmd_t *pmd; /* Pointer to pmd entry matching
|
|
* the 'address'
|
|
*/
|
|
pte_t *pte; /* Pointer to pte entry matching
|
|
* the 'address'. NULL if the page
|
|
* table hasn't been allocated.
|
|
*/
|
|
spinlock_t *ptl; /* Page table lock.
|
|
* Protects pte page table if 'pte'
|
|
* is not NULL, otherwise pmd.
|
|
*/
|
|
pgtable_t prealloc_pte; /* Pre-allocated pte page table.
|
|
* vm_ops->map_pages() calls
|
|
* alloc_set_pte() from atomic context.
|
|
* do_fault_around() pre-allocates
|
|
* page table to avoid allocation from
|
|
* atomic context.
|
|
*/
|
|
/*
|
|
* These entries are required when handling speculative page fault.
|
|
* This way the page handling is done using consistent field values.
|
|
*/
|
|
unsigned long vma_flags;
|
|
pgprot_t vma_page_prot;
|
|
#ifdef CONFIG_SPECULATIVE_PAGE_FAULT
|
|
unsigned int sequence;
|
|
pmd_t orig_pmd; /* value of PMD at the time of fault */
|
|
pte_t orig_pte; /* Value of PTE at the time of fault */
|
|
#endif
|
|
};
|
|
|
|
/*
|
|
* These are the virtual MM functions - opening of an area, closing and
|
|
* unmapping it (needed to keep files on disk up-to-date etc), pointer
|
|
* to the functions called when a no-page or a wp-page exception occurs.
|
|
*/
|
|
struct vm_operations_struct {
|
|
void (*open)(struct vm_area_struct * area);
|
|
void (*close)(struct vm_area_struct * area);
|
|
int (*split)(struct vm_area_struct * area, unsigned long addr);
|
|
int (*mremap)(struct vm_area_struct * area);
|
|
int (*fault)(struct vm_area_struct *vma, struct vm_fault *vmf);
|
|
int (*pmd_fault)(struct vm_area_struct *, unsigned long address,
|
|
pmd_t *, unsigned int flags);
|
|
void (*map_pages)(struct fault_env *fe,
|
|
pgoff_t start_pgoff, pgoff_t end_pgoff);
|
|
|
|
/* notification that a previously read-only page is about to become
|
|
* writable, if an error is returned it will cause a SIGBUS */
|
|
int (*page_mkwrite)(struct vm_area_struct *vma, struct vm_fault *vmf);
|
|
|
|
/* same as page_mkwrite when using VM_PFNMAP|VM_MIXEDMAP */
|
|
int (*pfn_mkwrite)(struct vm_area_struct *vma, struct vm_fault *vmf);
|
|
|
|
/* called by access_process_vm when get_user_pages() fails, typically
|
|
* for use by special VMAs that can switch between memory and hardware
|
|
*/
|
|
int (*access)(struct vm_area_struct *vma, unsigned long addr,
|
|
void *buf, int len, int write);
|
|
|
|
/* Called by the /proc/PID/maps code to ask the vma whether it
|
|
* has a special name. Returning non-NULL will also cause this
|
|
* vma to be dumped unconditionally. */
|
|
const char *(*name)(struct vm_area_struct *vma);
|
|
|
|
#ifdef CONFIG_NUMA
|
|
/*
|
|
* set_policy() op must add a reference to any non-NULL @new mempolicy
|
|
* to hold the policy upon return. Caller should pass NULL @new to
|
|
* remove a policy and fall back to surrounding context--i.e. do not
|
|
* install a MPOL_DEFAULT policy, nor the task or system default
|
|
* mempolicy.
|
|
*/
|
|
int (*set_policy)(struct vm_area_struct *vma, struct mempolicy *new);
|
|
|
|
/*
|
|
* get_policy() op must add reference [mpol_get()] to any policy at
|
|
* (vma,addr) marked as MPOL_SHARED. The shared policy infrastructure
|
|
* in mm/mempolicy.c will do this automatically.
|
|
* get_policy() must NOT add a ref if the policy at (vma,addr) is not
|
|
* marked as MPOL_SHARED. vma policies are protected by the mmap_sem.
|
|
* If no [shared/vma] mempolicy exists at the addr, get_policy() op
|
|
* must return NULL--i.e., do not "fallback" to task or system default
|
|
* policy.
|
|
*/
|
|
struct mempolicy *(*get_policy)(struct vm_area_struct *vma,
|
|
unsigned long addr);
|
|
#endif
|
|
/*
|
|
* Called by vm_normal_page() for special PTEs to find the
|
|
* page for @addr. This is useful if the default behavior
|
|
* (using pte_page()) would not find the correct page.
|
|
*/
|
|
struct page *(*find_special_page)(struct vm_area_struct *vma,
|
|
unsigned long addr);
|
|
};
|
|
|
|
struct mmu_gather;
|
|
struct inode;
|
|
|
|
#define page_private(page) ((page)->private)
|
|
#define set_page_private(page, v) ((page)->private = (v))
|
|
|
|
#if !defined(__HAVE_ARCH_PTE_DEVMAP) || !defined(CONFIG_TRANSPARENT_HUGEPAGE)
|
|
static inline int pmd_devmap(pmd_t pmd)
|
|
{
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
/*
|
|
* FIXME: take this include out, include page-flags.h in
|
|
* files which need it (119 of them)
|
|
*/
|
|
#include <linux/page-flags.h>
|
|
#include <linux/huge_mm.h>
|
|
|
|
/*
|
|
* Methods to modify the page usage count.
|
|
*
|
|
* What counts for a page usage:
|
|
* - cache mapping (page->mapping)
|
|
* - private data (page->private)
|
|
* - page mapped in a task's page tables, each mapping
|
|
* is counted separately
|
|
*
|
|
* Also, many kernel routines increase the page count before a critical
|
|
* routine so they can be sure the page doesn't go away from under them.
|
|
*/
|
|
|
|
/*
|
|
* Drop a ref, return true if the refcount fell to zero (the page has no users)
|
|
*/
|
|
static inline int put_page_testzero(struct page *page)
|
|
{
|
|
VM_BUG_ON_PAGE(page_ref_count(page) == 0, page);
|
|
return page_ref_dec_and_test(page);
|
|
}
|
|
|
|
/*
|
|
* Try to grab a ref unless the page has a refcount of zero, return false if
|
|
* that is the case.
|
|
* This can be called when MMU is off so it must not access
|
|
* any of the virtual mappings.
|
|
*/
|
|
static inline int get_page_unless_zero(struct page *page)
|
|
{
|
|
return page_ref_add_unless(page, 1, 0);
|
|
}
|
|
|
|
extern int page_is_ram(unsigned long pfn);
|
|
|
|
enum {
|
|
REGION_INTERSECTS,
|
|
REGION_DISJOINT,
|
|
REGION_MIXED,
|
|
};
|
|
|
|
int region_intersects(resource_size_t offset, size_t size, unsigned long flags,
|
|
unsigned long desc);
|
|
|
|
/* Support for virtually mapped pages */
|
|
struct page *vmalloc_to_page(const void *addr);
|
|
unsigned long vmalloc_to_pfn(const void *addr);
|
|
|
|
/*
|
|
* Determine if an address is within the vmalloc range
|
|
*
|
|
* On nommu, vmalloc/vfree wrap through kmalloc/kfree directly, so there
|
|
* is no special casing required.
|
|
*/
|
|
|
|
#ifdef CONFIG_MMU
|
|
extern int is_vmalloc_addr(const void *x);
|
|
#else
|
|
static inline int is_vmalloc_addr(const void *x)
|
|
{
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_MMU
|
|
extern int is_vmalloc_or_module_addr(const void *x);
|
|
#else
|
|
static inline int is_vmalloc_or_module_addr(const void *x)
|
|
{
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
extern void kvfree(const void *addr);
|
|
|
|
static inline atomic_t *compound_mapcount_ptr(struct page *page)
|
|
{
|
|
return &page[1].compound_mapcount;
|
|
}
|
|
|
|
static inline int compound_mapcount(struct page *page)
|
|
{
|
|
VM_BUG_ON_PAGE(!PageCompound(page), page);
|
|
page = compound_head(page);
|
|
return atomic_read(compound_mapcount_ptr(page)) + 1;
|
|
}
|
|
|
|
/*
|
|
* The atomic page->_mapcount, starts from -1: so that transitions
|
|
* both from it and to it can be tracked, using atomic_inc_and_test
|
|
* and atomic_add_negative(-1).
|
|
*/
|
|
static inline void page_mapcount_reset(struct page *page)
|
|
{
|
|
atomic_set(&(page)->_mapcount, -1);
|
|
}
|
|
|
|
int __page_mapcount(struct page *page);
|
|
|
|
static inline int page_mapcount(struct page *page)
|
|
{
|
|
VM_BUG_ON_PAGE(PageSlab(page), page);
|
|
|
|
if (unlikely(PageCompound(page)))
|
|
return __page_mapcount(page);
|
|
return atomic_read(&page->_mapcount) + 1;
|
|
}
|
|
|
|
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
|
int total_mapcount(struct page *page);
|
|
int page_trans_huge_mapcount(struct page *page, int *total_mapcount);
|
|
#else
|
|
static inline int total_mapcount(struct page *page)
|
|
{
|
|
return page_mapcount(page);
|
|
}
|
|
static inline int page_trans_huge_mapcount(struct page *page,
|
|
int *total_mapcount)
|
|
{
|
|
int mapcount = page_mapcount(page);
|
|
if (total_mapcount)
|
|
*total_mapcount = mapcount;
|
|
return mapcount;
|
|
}
|
|
#endif
|
|
|
|
static inline struct page *virt_to_head_page(const void *x)
|
|
{
|
|
struct page *page = virt_to_page(x);
|
|
|
|
return compound_head(page);
|
|
}
|
|
|
|
void __put_page(struct page *page);
|
|
|
|
void put_pages_list(struct list_head *pages);
|
|
|
|
void split_page(struct page *page, unsigned int order);
|
|
|
|
/*
|
|
* Compound pages have a destructor function. Provide a
|
|
* prototype for that function and accessor functions.
|
|
* These are _only_ valid on the head of a compound page.
|
|
*/
|
|
typedef void compound_page_dtor(struct page *);
|
|
|
|
/* Keep the enum in sync with compound_page_dtors array in mm/page_alloc.c */
|
|
enum compound_dtor_id {
|
|
NULL_COMPOUND_DTOR,
|
|
COMPOUND_PAGE_DTOR,
|
|
#ifdef CONFIG_HUGETLB_PAGE
|
|
HUGETLB_PAGE_DTOR,
|
|
#endif
|
|
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
|
TRANSHUGE_PAGE_DTOR,
|
|
#endif
|
|
NR_COMPOUND_DTORS,
|
|
};
|
|
extern compound_page_dtor * const compound_page_dtors[];
|
|
|
|
static inline void set_compound_page_dtor(struct page *page,
|
|
enum compound_dtor_id compound_dtor)
|
|
{
|
|
VM_BUG_ON_PAGE(compound_dtor >= NR_COMPOUND_DTORS, page);
|
|
page[1].compound_dtor = compound_dtor;
|
|
}
|
|
|
|
static inline compound_page_dtor *get_compound_page_dtor(struct page *page)
|
|
{
|
|
VM_BUG_ON_PAGE(page[1].compound_dtor >= NR_COMPOUND_DTORS, page);
|
|
return compound_page_dtors[page[1].compound_dtor];
|
|
}
|
|
|
|
static inline unsigned int compound_order(struct page *page)
|
|
{
|
|
if (!PageHead(page))
|
|
return 0;
|
|
return page[1].compound_order;
|
|
}
|
|
|
|
static inline void set_compound_order(struct page *page, unsigned int order)
|
|
{
|
|
page[1].compound_order = order;
|
|
}
|
|
|
|
void free_compound_page(struct page *page);
|
|
|
|
#ifdef CONFIG_MMU
|
|
/*
|
|
* Do pte_mkwrite, but only if the vma says VM_WRITE. We do this when
|
|
* servicing faults for write access. In the normal case, do always want
|
|
* pte_mkwrite. But get_user_pages can cause write faults for mappings
|
|
* that do not have writing enabled, when used by access_process_vm.
|
|
*/
|
|
static inline pte_t maybe_mkwrite(pte_t pte, unsigned long vma_flags)
|
|
{
|
|
if (likely(vma_flags & VM_WRITE))
|
|
pte = pte_mkwrite(pte);
|
|
return pte;
|
|
}
|
|
|
|
int alloc_set_pte(struct fault_env *fe, struct mem_cgroup *memcg,
|
|
struct page *page);
|
|
#endif
|
|
|
|
/*
|
|
* Multiple processes may "see" the same page. E.g. for untouched
|
|
* mappings of /dev/null, all processes see the same page full of
|
|
* zeroes, and text pages of executables and shared libraries have
|
|
* only one copy in memory, at most, normally.
|
|
*
|
|
* For the non-reserved pages, page_count(page) denotes a reference count.
|
|
* page_count() == 0 means the page is free. page->lru is then used for
|
|
* freelist management in the buddy allocator.
|
|
* page_count() > 0 means the page has been allocated.
|
|
*
|
|
* Pages are allocated by the slab allocator in order to provide memory
|
|
* to kmalloc and kmem_cache_alloc. In this case, the management of the
|
|
* page, and the fields in 'struct page' are the responsibility of mm/slab.c
|
|
* unless a particular usage is carefully commented. (the responsibility of
|
|
* freeing the kmalloc memory is the caller's, of course).
|
|
*
|
|
* A page may be used by anyone else who does a __get_free_page().
|
|
* In this case, page_count still tracks the references, and should only
|
|
* be used through the normal accessor functions. The top bits of page->flags
|
|
* and page->virtual store page management information, but all other fields
|
|
* are unused and could be used privately, carefully. The management of this
|
|
* page is the responsibility of the one who allocated it, and those who have
|
|
* subsequently been given references to it.
|
|
*
|
|
* The other pages (we may call them "pagecache pages") are completely
|
|
* managed by the Linux memory manager: I/O, buffers, swapping etc.
|
|
* The following discussion applies only to them.
|
|
*
|
|
* A pagecache page contains an opaque `private' member, which belongs to the
|
|
* page's address_space. Usually, this is the address of a circular list of
|
|
* the page's disk buffers. PG_private must be set to tell the VM to call
|
|
* into the filesystem to release these pages.
|
|
*
|
|
* A page may belong to an inode's memory mapping. In this case, page->mapping
|
|
* is the pointer to the inode, and page->index is the file offset of the page,
|
|
* in units of PAGE_SIZE.
|
|
*
|
|
* If pagecache pages are not associated with an inode, they are said to be
|
|
* anonymous pages. These may become associated with the swapcache, and in that
|
|
* case PG_swapcache is set, and page->private is an offset into the swapcache.
|
|
*
|
|
* In either case (swapcache or inode backed), the pagecache itself holds one
|
|
* reference to the page. Setting PG_private should also increment the
|
|
* refcount. The each user mapping also has a reference to the page.
|
|
*
|
|
* The pagecache pages are stored in a per-mapping radix tree, which is
|
|
* rooted at mapping->page_tree, and indexed by offset.
|
|
* Where 2.4 and early 2.6 kernels kept dirty/clean pages in per-address_space
|
|
* lists, we instead now tag pages as dirty/writeback in the radix tree.
|
|
*
|
|
* All pagecache pages may be subject to I/O:
|
|
* - inode pages may need to be read from disk,
|
|
* - inode pages which have been modified and are MAP_SHARED may need
|
|
* to be written back to the inode on disk,
|
|
* - anonymous pages (including MAP_PRIVATE file mappings) which have been
|
|
* modified may need to be swapped out to swap space and (later) to be read
|
|
* back into memory.
|
|
*/
|
|
|
|
/*
|
|
* The zone field is never updated after free_area_init_core()
|
|
* sets it, so none of the operations on it need to be atomic.
|
|
*/
|
|
|
|
/* Page flags: | [SECTION] | [NODE] | ZONE | [LAST_CPUPID] | ... | FLAGS | */
|
|
#define SECTIONS_PGOFF ((sizeof(unsigned long)*8) - SECTIONS_WIDTH)
|
|
#define NODES_PGOFF (SECTIONS_PGOFF - NODES_WIDTH)
|
|
#define ZONES_PGOFF (NODES_PGOFF - ZONES_WIDTH)
|
|
#define LAST_CPUPID_PGOFF (ZONES_PGOFF - LAST_CPUPID_WIDTH)
|
|
|
|
/*
|
|
* Define the bit shifts to access each section. For non-existent
|
|
* sections we define the shift as 0; that plus a 0 mask ensures
|
|
* the compiler will optimise away reference to them.
|
|
*/
|
|
#define SECTIONS_PGSHIFT (SECTIONS_PGOFF * (SECTIONS_WIDTH != 0))
|
|
#define NODES_PGSHIFT (NODES_PGOFF * (NODES_WIDTH != 0))
|
|
#define ZONES_PGSHIFT (ZONES_PGOFF * (ZONES_WIDTH != 0))
|
|
#define LAST_CPUPID_PGSHIFT (LAST_CPUPID_PGOFF * (LAST_CPUPID_WIDTH != 0))
|
|
|
|
/* NODE:ZONE or SECTION:ZONE is used to ID a zone for the buddy allocator */
|
|
#ifdef NODE_NOT_IN_PAGE_FLAGS
|
|
#define ZONEID_SHIFT (SECTIONS_SHIFT + ZONES_SHIFT)
|
|
#define ZONEID_PGOFF ((SECTIONS_PGOFF < ZONES_PGOFF)? \
|
|
SECTIONS_PGOFF : ZONES_PGOFF)
|
|
#else
|
|
#define ZONEID_SHIFT (NODES_SHIFT + ZONES_SHIFT)
|
|
#define ZONEID_PGOFF ((NODES_PGOFF < ZONES_PGOFF)? \
|
|
NODES_PGOFF : ZONES_PGOFF)
|
|
#endif
|
|
|
|
#define ZONEID_PGSHIFT (ZONEID_PGOFF * (ZONEID_SHIFT != 0))
|
|
|
|
#if SECTIONS_WIDTH+NODES_WIDTH+ZONES_WIDTH > BITS_PER_LONG - NR_PAGEFLAGS
|
|
#error SECTIONS_WIDTH+NODES_WIDTH+ZONES_WIDTH > BITS_PER_LONG - NR_PAGEFLAGS
|
|
#endif
|
|
|
|
#define ZONES_MASK ((1UL << ZONES_WIDTH) - 1)
|
|
#define NODES_MASK ((1UL << NODES_WIDTH) - 1)
|
|
#define SECTIONS_MASK ((1UL << SECTIONS_WIDTH) - 1)
|
|
#define LAST_CPUPID_MASK ((1UL << LAST_CPUPID_SHIFT) - 1)
|
|
#define ZONEID_MASK ((1UL << ZONEID_SHIFT) - 1)
|
|
|
|
static inline enum zone_type page_zonenum(const struct page *page)
|
|
{
|
|
return (page->flags >> ZONES_PGSHIFT) & ZONES_MASK;
|
|
}
|
|
|
|
#ifdef CONFIG_ZONE_DEVICE
|
|
void get_zone_device_page(struct page *page);
|
|
void put_zone_device_page(struct page *page);
|
|
static inline bool is_zone_device_page(const struct page *page)
|
|
{
|
|
return page_zonenum(page) == ZONE_DEVICE;
|
|
}
|
|
#else
|
|
static inline void get_zone_device_page(struct page *page)
|
|
{
|
|
}
|
|
static inline void put_zone_device_page(struct page *page)
|
|
{
|
|
}
|
|
static inline bool is_zone_device_page(const struct page *page)
|
|
{
|
|
return false;
|
|
}
|
|
#endif
|
|
|
|
static inline void get_page(struct page *page)
|
|
{
|
|
page = compound_head(page);
|
|
/*
|
|
* Getting a normal page or the head of a compound page
|
|
* requires to already have an elevated page->_refcount.
|
|
*/
|
|
VM_BUG_ON_PAGE(page_ref_count(page) <= 0, page);
|
|
page_ref_inc(page);
|
|
|
|
if (unlikely(is_zone_device_page(page)))
|
|
get_zone_device_page(page);
|
|
}
|
|
|
|
static inline void put_page(struct page *page)
|
|
{
|
|
page = compound_head(page);
|
|
|
|
if (put_page_testzero(page))
|
|
__put_page(page);
|
|
|
|
if (unlikely(is_zone_device_page(page)))
|
|
put_zone_device_page(page);
|
|
}
|
|
|
|
#if defined(CONFIG_SPARSEMEM) && !defined(CONFIG_SPARSEMEM_VMEMMAP)
|
|
#define SECTION_IN_PAGE_FLAGS
|
|
#endif
|
|
|
|
/*
|
|
* The identification function is mainly used by the buddy allocator for
|
|
* determining if two pages could be buddies. We are not really identifying
|
|
* the zone since we could be using the section number id if we do not have
|
|
* node id available in page flags.
|
|
* We only guarantee that it will return the same value for two combinable
|
|
* pages in a zone.
|
|
*/
|
|
static inline int page_zone_id(struct page *page)
|
|
{
|
|
return (page->flags >> ZONEID_PGSHIFT) & ZONEID_MASK;
|
|
}
|
|
|
|
static inline int zone_to_nid(struct zone *zone)
|
|
{
|
|
#ifdef CONFIG_NUMA
|
|
return zone->node;
|
|
#else
|
|
return 0;
|
|
#endif
|
|
}
|
|
|
|
#ifdef NODE_NOT_IN_PAGE_FLAGS
|
|
extern int page_to_nid(const struct page *page);
|
|
#else
|
|
static inline int page_to_nid(const struct page *page)
|
|
{
|
|
return (page->flags >> NODES_PGSHIFT) & NODES_MASK;
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_NUMA_BALANCING
|
|
static inline int cpu_pid_to_cpupid(int cpu, int pid)
|
|
{
|
|
return ((cpu & LAST__CPU_MASK) << LAST__PID_SHIFT) | (pid & LAST__PID_MASK);
|
|
}
|
|
|
|
static inline int cpupid_to_pid(int cpupid)
|
|
{
|
|
return cpupid & LAST__PID_MASK;
|
|
}
|
|
|
|
static inline int cpupid_to_cpu(int cpupid)
|
|
{
|
|
return (cpupid >> LAST__PID_SHIFT) & LAST__CPU_MASK;
|
|
}
|
|
|
|
static inline int cpupid_to_nid(int cpupid)
|
|
{
|
|
return cpu_to_node(cpupid_to_cpu(cpupid));
|
|
}
|
|
|
|
static inline bool cpupid_pid_unset(int cpupid)
|
|
{
|
|
return cpupid_to_pid(cpupid) == (-1 & LAST__PID_MASK);
|
|
}
|
|
|
|
static inline bool cpupid_cpu_unset(int cpupid)
|
|
{
|
|
return cpupid_to_cpu(cpupid) == (-1 & LAST__CPU_MASK);
|
|
}
|
|
|
|
static inline bool __cpupid_match_pid(pid_t task_pid, int cpupid)
|
|
{
|
|
return (task_pid & LAST__PID_MASK) == cpupid_to_pid(cpupid);
|
|
}
|
|
|
|
#define cpupid_match_pid(task, cpupid) __cpupid_match_pid(task->pid, cpupid)
|
|
#ifdef LAST_CPUPID_NOT_IN_PAGE_FLAGS
|
|
static inline int page_cpupid_xchg_last(struct page *page, int cpupid)
|
|
{
|
|
return xchg(&page->_last_cpupid, cpupid & LAST_CPUPID_MASK);
|
|
}
|
|
|
|
static inline int page_cpupid_last(struct page *page)
|
|
{
|
|
return page->_last_cpupid;
|
|
}
|
|
static inline void page_cpupid_reset_last(struct page *page)
|
|
{
|
|
page->_last_cpupid = -1 & LAST_CPUPID_MASK;
|
|
}
|
|
#else
|
|
static inline int page_cpupid_last(struct page *page)
|
|
{
|
|
return (page->flags >> LAST_CPUPID_PGSHIFT) & LAST_CPUPID_MASK;
|
|
}
|
|
|
|
extern int page_cpupid_xchg_last(struct page *page, int cpupid);
|
|
|
|
static inline void page_cpupid_reset_last(struct page *page)
|
|
{
|
|
page->flags |= LAST_CPUPID_MASK << LAST_CPUPID_PGSHIFT;
|
|
}
|
|
#endif /* LAST_CPUPID_NOT_IN_PAGE_FLAGS */
|
|
#else /* !CONFIG_NUMA_BALANCING */
|
|
static inline int page_cpupid_xchg_last(struct page *page, int cpupid)
|
|
{
|
|
return page_to_nid(page); /* XXX */
|
|
}
|
|
|
|
static inline int page_cpupid_last(struct page *page)
|
|
{
|
|
return page_to_nid(page); /* XXX */
|
|
}
|
|
|
|
static inline int cpupid_to_nid(int cpupid)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
static inline int cpupid_to_pid(int cpupid)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
static inline int cpupid_to_cpu(int cpupid)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
static inline int cpu_pid_to_cpupid(int nid, int pid)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
static inline bool cpupid_pid_unset(int cpupid)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
static inline void page_cpupid_reset_last(struct page *page)
|
|
{
|
|
}
|
|
|
|
static inline bool cpupid_match_pid(struct task_struct *task, int cpupid)
|
|
{
|
|
return false;
|
|
}
|
|
#endif /* CONFIG_NUMA_BALANCING */
|
|
|
|
static inline struct zone *page_zone(const struct page *page)
|
|
{
|
|
return &NODE_DATA(page_to_nid(page))->node_zones[page_zonenum(page)];
|
|
}
|
|
|
|
static inline pg_data_t *page_pgdat(const struct page *page)
|
|
{
|
|
return NODE_DATA(page_to_nid(page));
|
|
}
|
|
|
|
#ifdef SECTION_IN_PAGE_FLAGS
|
|
static inline void set_page_section(struct page *page, unsigned long section)
|
|
{
|
|
page->flags &= ~(SECTIONS_MASK << SECTIONS_PGSHIFT);
|
|
page->flags |= (section & SECTIONS_MASK) << SECTIONS_PGSHIFT;
|
|
}
|
|
|
|
static inline unsigned long page_to_section(const struct page *page)
|
|
{
|
|
return (page->flags >> SECTIONS_PGSHIFT) & SECTIONS_MASK;
|
|
}
|
|
#endif
|
|
|
|
static inline void set_page_zone(struct page *page, enum zone_type zone)
|
|
{
|
|
page->flags &= ~(ZONES_MASK << ZONES_PGSHIFT);
|
|
page->flags |= (zone & ZONES_MASK) << ZONES_PGSHIFT;
|
|
}
|
|
|
|
static inline void set_page_node(struct page *page, unsigned long node)
|
|
{
|
|
page->flags &= ~(NODES_MASK << NODES_PGSHIFT);
|
|
page->flags |= (node & NODES_MASK) << NODES_PGSHIFT;
|
|
}
|
|
|
|
static inline void set_page_links(struct page *page, enum zone_type zone,
|
|
unsigned long node, unsigned long pfn)
|
|
{
|
|
set_page_zone(page, zone);
|
|
set_page_node(page, node);
|
|
#ifdef SECTION_IN_PAGE_FLAGS
|
|
set_page_section(page, pfn_to_section_nr(pfn));
|
|
#endif
|
|
}
|
|
|
|
#ifdef CONFIG_MEMCG
|
|
static inline struct mem_cgroup *page_memcg(struct page *page)
|
|
{
|
|
return page->mem_cgroup;
|
|
}
|
|
static inline struct mem_cgroup *page_memcg_rcu(struct page *page)
|
|
{
|
|
WARN_ON_ONCE(!rcu_read_lock_held());
|
|
return READ_ONCE(page->mem_cgroup);
|
|
}
|
|
#else
|
|
static inline struct mem_cgroup *page_memcg(struct page *page)
|
|
{
|
|
return NULL;
|
|
}
|
|
static inline struct mem_cgroup *page_memcg_rcu(struct page *page)
|
|
{
|
|
WARN_ON_ONCE(!rcu_read_lock_held());
|
|
return NULL;
|
|
}
|
|
#endif
|
|
|
|
/*
|
|
* Some inline functions in vmstat.h depend on page_zone()
|
|
*/
|
|
#include <linux/vmstat.h>
|
|
|
|
static __always_inline void *lowmem_page_address(const struct page *page)
|
|
{
|
|
return page_to_virt(page);
|
|
}
|
|
|
|
#if defined(CONFIG_HIGHMEM) && !defined(WANT_PAGE_VIRTUAL)
|
|
#define HASHED_PAGE_VIRTUAL
|
|
#endif
|
|
|
|
#if defined(WANT_PAGE_VIRTUAL)
|
|
static inline void *page_address(const struct page *page)
|
|
{
|
|
return page->virtual;
|
|
}
|
|
static inline void set_page_address(struct page *page, void *address)
|
|
{
|
|
page->virtual = address;
|
|
}
|
|
#define page_address_init() do { } while(0)
|
|
#endif
|
|
|
|
#if defined(HASHED_PAGE_VIRTUAL)
|
|
void *page_address(const struct page *page);
|
|
void set_page_address(struct page *page, void *virtual);
|
|
void page_address_init(void);
|
|
#endif
|
|
|
|
#if !defined(HASHED_PAGE_VIRTUAL) && !defined(WANT_PAGE_VIRTUAL)
|
|
#define page_address(page) lowmem_page_address(page)
|
|
#define set_page_address(page, address) do { } while(0)
|
|
#define page_address_init() do { } while(0)
|
|
#endif
|
|
|
|
extern void *page_rmapping(struct page *page);
|
|
extern struct anon_vma *page_anon_vma(struct page *page);
|
|
extern struct address_space *page_mapping(struct page *page);
|
|
|
|
extern struct address_space *__page_file_mapping(struct page *);
|
|
|
|
static inline
|
|
struct address_space *page_file_mapping(struct page *page)
|
|
{
|
|
if (unlikely(PageSwapCache(page)))
|
|
return __page_file_mapping(page);
|
|
|
|
return page->mapping;
|
|
}
|
|
|
|
extern pgoff_t __page_file_index(struct page *page);
|
|
|
|
/*
|
|
* Return the pagecache index of the passed page. Regular pagecache pages
|
|
* use ->index whereas swapcache pages use swp_offset(->private)
|
|
*/
|
|
static inline pgoff_t page_index(struct page *page)
|
|
{
|
|
if (unlikely(PageSwapCache(page)))
|
|
return __page_file_index(page);
|
|
return page->index;
|
|
}
|
|
|
|
bool page_mapped(struct page *page);
|
|
struct address_space *page_mapping(struct page *page);
|
|
|
|
/*
|
|
* Return true only if the page has been allocated with
|
|
* ALLOC_NO_WATERMARKS and the low watermark was not
|
|
* met implying that the system is under some pressure.
|
|
*/
|
|
static inline bool page_is_pfmemalloc(struct page *page)
|
|
{
|
|
/*
|
|
* Page index cannot be this large so this must be
|
|
* a pfmemalloc page.
|
|
*/
|
|
return page->index == -1UL;
|
|
}
|
|
|
|
/*
|
|
* Only to be called by the page allocator on a freshly allocated
|
|
* page.
|
|
*/
|
|
static inline void set_page_pfmemalloc(struct page *page)
|
|
{
|
|
page->index = -1UL;
|
|
}
|
|
|
|
static inline void clear_page_pfmemalloc(struct page *page)
|
|
{
|
|
page->index = 0;
|
|
}
|
|
|
|
/*
|
|
* Different kinds of faults, as returned by handle_mm_fault().
|
|
* Used to decide whether a process gets delivered SIGBUS or
|
|
* just gets major/minor fault counters bumped up.
|
|
*/
|
|
|
|
#define VM_FAULT_OOM 0x0001
|
|
#define VM_FAULT_SIGBUS 0x0002
|
|
#define VM_FAULT_MAJOR 0x0004
|
|
#define VM_FAULT_WRITE 0x0008 /* Special case for get_user_pages */
|
|
#define VM_FAULT_HWPOISON 0x0010 /* Hit poisoned small page */
|
|
#define VM_FAULT_HWPOISON_LARGE 0x0020 /* Hit poisoned large page. Index encoded in upper bits */
|
|
#define VM_FAULT_SIGSEGV 0x0040
|
|
|
|
#define VM_FAULT_NOPAGE 0x0100 /* ->fault installed the pte, not return page */
|
|
#define VM_FAULT_LOCKED 0x0200 /* ->fault locked the returned page */
|
|
#define VM_FAULT_RETRY 0x0400 /* ->fault blocked, must retry */
|
|
#define VM_FAULT_FALLBACK 0x0800 /* huge page fault failed, fall back to small */
|
|
#define VM_FAULT_DAX_LOCKED 0x1000 /* ->fault has locked DAX entry */
|
|
|
|
#define VM_FAULT_HWPOISON_LARGE_MASK 0xf000 /* encodes hpage index for large hwpoison */
|
|
#define VM_FAULT_PTNOTSAME 0x4000 /* Page table entries have changed */
|
|
|
|
#define VM_FAULT_ERROR (VM_FAULT_OOM | VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV | \
|
|
VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE | \
|
|
VM_FAULT_FALLBACK)
|
|
|
|
/* Encode hstate index for a hwpoisoned large page */
|
|
#define VM_FAULT_SET_HINDEX(x) ((x) << 12)
|
|
#define VM_FAULT_GET_HINDEX(x) (((x) >> 12) & 0xf)
|
|
|
|
/*
|
|
* Can be called by the pagefault handler when it gets a VM_FAULT_OOM.
|
|
*/
|
|
extern void pagefault_out_of_memory(void);
|
|
|
|
#define offset_in_page(p) ((unsigned long)(p) & ~PAGE_MASK)
|
|
|
|
/*
|
|
* Flags passed to show_mem() and show_free_areas() to suppress output in
|
|
* various contexts.
|
|
*/
|
|
#define SHOW_MEM_FILTER_NODES (0x0001u) /* disallowed nodes */
|
|
|
|
extern void show_free_areas(unsigned int flags);
|
|
extern bool skip_free_areas_node(unsigned int flags, int nid);
|
|
|
|
void shmem_set_file(struct vm_area_struct *vma, struct file *file);
|
|
int shmem_zero_setup(struct vm_area_struct *);
|
|
#ifdef CONFIG_SHMEM
|
|
bool shmem_mapping(struct address_space *mapping);
|
|
#else
|
|
static inline bool shmem_mapping(struct address_space *mapping)
|
|
{
|
|
return false;
|
|
}
|
|
#endif
|
|
|
|
extern bool can_do_mlock(void);
|
|
extern int user_shm_lock(size_t, struct user_struct *);
|
|
extern void user_shm_unlock(size_t, struct user_struct *);
|
|
|
|
/*
|
|
* Parameter block passed down to zap_pte_range in exceptional cases.
|
|
*/
|
|
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 *__vm_normal_page(struct vm_area_struct *vma, unsigned long addr,
|
|
pte_t pte, unsigned long vma_flags);
|
|
static inline struct page *vm_normal_page(struct vm_area_struct *vma,
|
|
unsigned long addr, pte_t pte)
|
|
{
|
|
return __vm_normal_page(vma, addr, pte, vma->vm_flags);
|
|
}
|
|
|
|
static inline void INIT_VMA(struct vm_area_struct *vma)
|
|
{
|
|
INIT_LIST_HEAD(&vma->anon_vma_chain);
|
|
#ifdef CONFIG_SPECULATIVE_PAGE_FAULT
|
|
seqcount_init(&vma->vm_sequence);
|
|
atomic_set(&vma->vm_ref_count, 1);
|
|
#endif
|
|
}
|
|
|
|
struct page *vm_normal_page_pmd(struct vm_area_struct *vma, unsigned long addr,
|
|
pmd_t pmd);
|
|
|
|
int zap_vma_ptes(struct vm_area_struct *vma, unsigned long address,
|
|
unsigned long size);
|
|
void zap_page_range(struct vm_area_struct *vma, unsigned long address,
|
|
unsigned long size, struct zap_details *);
|
|
void unmap_vmas(struct mmu_gather *tlb, struct vm_area_struct *start_vma,
|
|
unsigned long start, unsigned long end);
|
|
|
|
/**
|
|
* mm_walk - callbacks for walk_page_range
|
|
* @pmd_entry: if set, called for each non-empty PMD (3rd-level) entry
|
|
* this handler is required to be able to handle
|
|
* pmd_trans_huge() pmds. They may simply choose to
|
|
* split_huge_page() instead of handling it explicitly.
|
|
* @pte_entry: if set, called for each non-empty PTE (4th-level) entry
|
|
* @pte_hole: if set, called for each hole at all levels
|
|
* @hugetlb_entry: if set, called for each hugetlb entry
|
|
* @test_walk: caller specific callback function to determine whether
|
|
* we walk over the current vma or not. Returning 0
|
|
* value means "do page table walk over the current vma,"
|
|
* and a negative one means "abort current page table walk
|
|
* right now." 1 means "skip the current vma."
|
|
* @mm: mm_struct representing the target process of page table walk
|
|
* @vma: vma currently walked (NULL if walking outside vmas)
|
|
* @private: private data for callbacks' usage
|
|
*
|
|
* (see the comment on walk_page_range() for more details)
|
|
*/
|
|
struct mm_walk {
|
|
int (*pmd_entry)(pmd_t *pmd, unsigned long addr,
|
|
unsigned long next, struct mm_walk *walk);
|
|
int (*pte_entry)(pte_t *pte, unsigned long addr,
|
|
unsigned long next, struct mm_walk *walk);
|
|
int (*pte_hole)(unsigned long addr, unsigned long next,
|
|
struct mm_walk *walk);
|
|
int (*hugetlb_entry)(pte_t *pte, unsigned long hmask,
|
|
unsigned long addr, unsigned long next,
|
|
struct mm_walk *walk);
|
|
int (*test_walk)(unsigned long addr, unsigned long next,
|
|
struct mm_walk *walk);
|
|
struct mm_struct *mm;
|
|
struct vm_area_struct *vma;
|
|
void *private;
|
|
};
|
|
|
|
int walk_page_range(unsigned long addr, unsigned long end,
|
|
struct mm_walk *walk);
|
|
int walk_page_vma(struct vm_area_struct *vma, struct mm_walk *walk);
|
|
void free_pgd_range(struct mmu_gather *tlb, unsigned long addr,
|
|
unsigned long end, unsigned long floor, unsigned long ceiling);
|
|
int copy_page_range(struct mm_struct *dst, struct mm_struct *src,
|
|
struct vm_area_struct *vma);
|
|
void unmap_mapping_range(struct address_space *mapping,
|
|
loff_t const holebegin, loff_t const holelen, int even_cows);
|
|
int follow_pfn(struct vm_area_struct *vma, unsigned long address,
|
|
unsigned long *pfn);
|
|
int follow_phys(struct vm_area_struct *vma, unsigned long address,
|
|
unsigned int flags, unsigned long *prot, resource_size_t *phys);
|
|
int generic_access_phys(struct vm_area_struct *vma, unsigned long addr,
|
|
void *buf, int len, int write);
|
|
|
|
static inline void unmap_shared_mapping_range(struct address_space *mapping,
|
|
loff_t const holebegin, loff_t const holelen)
|
|
{
|
|
unmap_mapping_range(mapping, holebegin, holelen, 0);
|
|
}
|
|
|
|
#ifdef CONFIG_SPECULATIVE_PAGE_FAULT
|
|
static inline void vm_write_begin(struct vm_area_struct *vma)
|
|
{
|
|
write_seqcount_begin(&vma->vm_sequence);
|
|
}
|
|
static inline void vm_write_begin_nested(struct vm_area_struct *vma,
|
|
int subclass)
|
|
{
|
|
write_seqcount_begin_nested(&vma->vm_sequence, subclass);
|
|
}
|
|
static inline void vm_write_end(struct vm_area_struct *vma)
|
|
{
|
|
write_seqcount_end(&vma->vm_sequence);
|
|
}
|
|
static inline void vm_raw_write_begin(struct vm_area_struct *vma)
|
|
{
|
|
raw_write_seqcount_begin(&vma->vm_sequence);
|
|
}
|
|
static inline void vm_raw_write_end(struct vm_area_struct *vma)
|
|
{
|
|
raw_write_seqcount_end(&vma->vm_sequence);
|
|
}
|
|
#else
|
|
static inline void vm_write_begin(struct vm_area_struct *vma)
|
|
{
|
|
}
|
|
static inline void vm_write_begin_nested(struct vm_area_struct *vma,
|
|
int subclass)
|
|
{
|
|
}
|
|
static inline void vm_write_end(struct vm_area_struct *vma)
|
|
{
|
|
}
|
|
static inline void vm_raw_write_begin(struct vm_area_struct *vma)
|
|
{
|
|
}
|
|
static inline void vm_raw_write_end(struct vm_area_struct *vma)
|
|
{
|
|
}
|
|
#endif /* CONFIG_SPECULATIVE_PAGE_FAULT */
|
|
|
|
extern void truncate_pagecache(struct inode *inode, loff_t new);
|
|
extern void truncate_setsize(struct inode *inode, loff_t newsize);
|
|
void pagecache_isize_extended(struct inode *inode, loff_t from, loff_t to);
|
|
void truncate_pagecache_range(struct inode *inode, loff_t offset, loff_t end);
|
|
int truncate_inode_page(struct address_space *mapping, struct page *page);
|
|
int generic_error_remove_page(struct address_space *mapping, struct page *page);
|
|
int invalidate_inode_page(struct page *page);
|
|
|
|
#ifdef CONFIG_MMU
|
|
extern int handle_mm_fault(struct vm_area_struct *vma, unsigned long address,
|
|
unsigned int flags);
|
|
|
|
#ifdef CONFIG_SPECULATIVE_PAGE_FAULT
|
|
extern int __handle_speculative_fault(struct mm_struct *mm,
|
|
unsigned long address,
|
|
unsigned int flags,
|
|
struct vm_area_struct **vma);
|
|
static inline int handle_speculative_fault(struct mm_struct *mm,
|
|
unsigned long address,
|
|
unsigned int flags,
|
|
struct vm_area_struct **vma)
|
|
{
|
|
/*
|
|
* Try speculative page fault for multithreaded user space task only.
|
|
*/
|
|
if (!(flags & FAULT_FLAG_USER) || atomic_read(&mm->mm_users) == 1) {
|
|
*vma = NULL;
|
|
return VM_FAULT_RETRY;
|
|
}
|
|
return __handle_speculative_fault(mm, address, flags, vma);
|
|
}
|
|
extern bool can_reuse_spf_vma(struct vm_area_struct *vma,
|
|
unsigned long address);
|
|
#else
|
|
static inline int handle_speculative_fault(struct mm_struct *mm,
|
|
unsigned long address,
|
|
unsigned int flags,
|
|
struct vm_area_struct **vma)
|
|
{
|
|
return VM_FAULT_RETRY;
|
|
}
|
|
static inline bool can_reuse_spf_vma(struct vm_area_struct *vma,
|
|
unsigned long address)
|
|
{
|
|
return false;
|
|
}
|
|
#endif /* CONFIG_SPECULATIVE_PAGE_FAULT */
|
|
|
|
extern int fixup_user_fault(struct task_struct *tsk, struct mm_struct *mm,
|
|
unsigned long address, unsigned int fault_flags,
|
|
bool *unlocked);
|
|
#else
|
|
static inline int handle_mm_fault(struct vm_area_struct *vma,
|
|
unsigned long address, unsigned int flags)
|
|
{
|
|
/* should never happen if there's no MMU */
|
|
BUG();
|
|
return VM_FAULT_SIGBUS;
|
|
}
|
|
static inline int fixup_user_fault(struct task_struct *tsk,
|
|
struct mm_struct *mm, unsigned long address,
|
|
unsigned int fault_flags, bool *unlocked)
|
|
{
|
|
/* should never happen if there's no MMU */
|
|
BUG();
|
|
return -EFAULT;
|
|
}
|
|
#endif
|
|
|
|
extern int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len,
|
|
unsigned int gup_flags);
|
|
extern int access_remote_vm(struct mm_struct *mm, unsigned long addr,
|
|
void *buf, int len, unsigned int gup_flags);
|
|
extern int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm,
|
|
unsigned long addr, void *buf, int len, unsigned int gup_flags);
|
|
|
|
long get_user_pages_remote(struct task_struct *tsk, struct mm_struct *mm,
|
|
unsigned long start, unsigned long nr_pages,
|
|
unsigned int gup_flags, struct page **pages,
|
|
struct vm_area_struct **vmas);
|
|
long get_user_pages(unsigned long start, unsigned long nr_pages,
|
|
unsigned int gup_flags, struct page **pages,
|
|
struct vm_area_struct **vmas);
|
|
long get_user_pages_locked(unsigned long start, unsigned long nr_pages,
|
|
unsigned int gup_flags, struct page **pages, int *locked);
|
|
long __get_user_pages_unlocked(struct task_struct *tsk, struct mm_struct *mm,
|
|
unsigned long start, unsigned long nr_pages,
|
|
struct page **pages, unsigned int gup_flags);
|
|
long get_user_pages_unlocked(unsigned long start, unsigned long nr_pages,
|
|
struct page **pages, unsigned int gup_flags);
|
|
#ifdef CONFIG_FS_DAX
|
|
long get_user_pages_longterm(unsigned long start, unsigned long nr_pages,
|
|
unsigned int gup_flags, struct page **pages,
|
|
struct vm_area_struct **vmas);
|
|
#else
|
|
static inline long get_user_pages_longterm(unsigned long start,
|
|
unsigned long nr_pages, unsigned int gup_flags,
|
|
struct page **pages, struct vm_area_struct **vmas)
|
|
{
|
|
return get_user_pages(start, nr_pages, gup_flags, pages, vmas);
|
|
}
|
|
#endif /* CONFIG_FS_DAX */
|
|
|
|
int get_user_pages_fast(unsigned long start, int nr_pages, int write,
|
|
struct page **pages);
|
|
|
|
/* Container for pinned pfns / pages */
|
|
struct frame_vector {
|
|
unsigned int nr_allocated; /* Number of frames we have space for */
|
|
unsigned int nr_frames; /* Number of frames stored in ptrs array */
|
|
bool got_ref; /* Did we pin pages by getting page ref? */
|
|
bool is_pfns; /* Does array contain pages or pfns? */
|
|
void *ptrs[0]; /* Array of pinned pfns / pages. Use
|
|
* pfns_vector_pages() or pfns_vector_pfns()
|
|
* for access */
|
|
};
|
|
|
|
struct frame_vector *frame_vector_create(unsigned int nr_frames);
|
|
void frame_vector_destroy(struct frame_vector *vec);
|
|
int get_vaddr_frames(unsigned long start, unsigned int nr_pfns,
|
|
unsigned int gup_flags, struct frame_vector *vec);
|
|
void put_vaddr_frames(struct frame_vector *vec);
|
|
int frame_vector_to_pages(struct frame_vector *vec);
|
|
void frame_vector_to_pfns(struct frame_vector *vec);
|
|
|
|
static inline unsigned int frame_vector_count(struct frame_vector *vec)
|
|
{
|
|
return vec->nr_frames;
|
|
}
|
|
|
|
static inline struct page **frame_vector_pages(struct frame_vector *vec)
|
|
{
|
|
if (vec->is_pfns) {
|
|
int err = frame_vector_to_pages(vec);
|
|
|
|
if (err)
|
|
return ERR_PTR(err);
|
|
}
|
|
return (struct page **)(vec->ptrs);
|
|
}
|
|
|
|
static inline unsigned long *frame_vector_pfns(struct frame_vector *vec)
|
|
{
|
|
if (!vec->is_pfns)
|
|
frame_vector_to_pfns(vec);
|
|
return (unsigned long *)(vec->ptrs);
|
|
}
|
|
|
|
struct kvec;
|
|
int get_kernel_pages(const struct kvec *iov, int nr_pages, int write,
|
|
struct page **pages);
|
|
int get_kernel_page(unsigned long start, int write, struct page **pages);
|
|
struct page *get_dump_page(unsigned long addr);
|
|
|
|
extern int try_to_release_page(struct page * page, gfp_t gfp_mask);
|
|
extern void do_invalidatepage(struct page *page, unsigned int offset,
|
|
unsigned int length);
|
|
|
|
int __set_page_dirty_nobuffers(struct page *page);
|
|
int __set_page_dirty_no_writeback(struct page *page);
|
|
int redirty_page_for_writepage(struct writeback_control *wbc,
|
|
struct page *page);
|
|
void account_page_dirtied(struct page *page, struct address_space *mapping);
|
|
void account_page_cleaned(struct page *page, struct address_space *mapping,
|
|
struct bdi_writeback *wb);
|
|
int set_page_dirty(struct page *page);
|
|
int set_page_dirty_lock(struct page *page);
|
|
void cancel_dirty_page(struct page *page);
|
|
int clear_page_dirty_for_io(struct page *page);
|
|
|
|
int get_cmdline(struct task_struct *task, char *buffer, int buflen);
|
|
|
|
static inline bool vma_is_anonymous(struct vm_area_struct *vma)
|
|
{
|
|
return !vma->vm_ops;
|
|
}
|
|
|
|
int vma_is_stack_for_current(struct vm_area_struct *vma);
|
|
|
|
extern unsigned long move_page_tables(struct vm_area_struct *vma,
|
|
unsigned long old_addr, struct vm_area_struct *new_vma,
|
|
unsigned long new_addr, unsigned long len,
|
|
bool need_rmap_locks);
|
|
extern unsigned long change_protection(struct vm_area_struct *vma, unsigned long start,
|
|
unsigned long end, pgprot_t newprot,
|
|
int dirty_accountable, int prot_numa);
|
|
extern int mprotect_fixup(struct vm_area_struct *vma,
|
|
struct vm_area_struct **pprev, unsigned long start,
|
|
unsigned long end, unsigned long newflags);
|
|
|
|
/*
|
|
* doesn't attempt to fault and will return short.
|
|
*/
|
|
int __get_user_pages_fast(unsigned long start, int nr_pages, int write,
|
|
struct page **pages);
|
|
/*
|
|
* per-process(per-mm_struct) statistics.
|
|
*/
|
|
static inline unsigned long get_mm_counter(struct mm_struct *mm, int member)
|
|
{
|
|
long val = atomic_long_read(&mm->rss_stat.count[member]);
|
|
|
|
#ifdef SPLIT_RSS_COUNTING
|
|
/*
|
|
* counter is updated in asynchronous manner and may go to minus.
|
|
* But it's never be expected number for users.
|
|
*/
|
|
if (val < 0)
|
|
val = 0;
|
|
#endif
|
|
return (unsigned long)val;
|
|
}
|
|
|
|
static inline void add_mm_counter(struct mm_struct *mm, int member, long value)
|
|
{
|
|
atomic_long_add(value, &mm->rss_stat.count[member]);
|
|
}
|
|
|
|
static inline void inc_mm_counter(struct mm_struct *mm, int member)
|
|
{
|
|
atomic_long_inc(&mm->rss_stat.count[member]);
|
|
}
|
|
|
|
static inline void dec_mm_counter(struct mm_struct *mm, int member)
|
|
{
|
|
atomic_long_dec(&mm->rss_stat.count[member]);
|
|
}
|
|
|
|
/* Optimized variant when page is already known not to be PageAnon */
|
|
static inline int mm_counter_file(struct page *page)
|
|
{
|
|
if (PageSwapBacked(page))
|
|
return MM_SHMEMPAGES;
|
|
return MM_FILEPAGES;
|
|
}
|
|
|
|
static inline int mm_counter(struct page *page)
|
|
{
|
|
if (PageAnon(page))
|
|
return MM_ANONPAGES;
|
|
return mm_counter_file(page);
|
|
}
|
|
|
|
static inline unsigned long get_mm_rss(struct mm_struct *mm)
|
|
{
|
|
return get_mm_counter(mm, MM_FILEPAGES) +
|
|
get_mm_counter(mm, MM_ANONPAGES) +
|
|
get_mm_counter(mm, MM_SHMEMPAGES);
|
|
}
|
|
|
|
static inline unsigned long get_mm_hiwater_rss(struct mm_struct *mm)
|
|
{
|
|
return max(mm->hiwater_rss, get_mm_rss(mm));
|
|
}
|
|
|
|
static inline unsigned long get_mm_hiwater_vm(struct mm_struct *mm)
|
|
{
|
|
return max(mm->hiwater_vm, mm->total_vm);
|
|
}
|
|
|
|
static inline void update_hiwater_rss(struct mm_struct *mm)
|
|
{
|
|
unsigned long _rss = get_mm_rss(mm);
|
|
|
|
if ((mm)->hiwater_rss < _rss)
|
|
(mm)->hiwater_rss = _rss;
|
|
}
|
|
|
|
static inline void update_hiwater_vm(struct mm_struct *mm)
|
|
{
|
|
if (mm->hiwater_vm < mm->total_vm)
|
|
mm->hiwater_vm = mm->total_vm;
|
|
}
|
|
|
|
static inline void reset_mm_hiwater_rss(struct mm_struct *mm)
|
|
{
|
|
mm->hiwater_rss = get_mm_rss(mm);
|
|
}
|
|
|
|
static inline void setmax_mm_hiwater_rss(unsigned long *maxrss,
|
|
struct mm_struct *mm)
|
|
{
|
|
unsigned long hiwater_rss = get_mm_hiwater_rss(mm);
|
|
|
|
if (*maxrss < hiwater_rss)
|
|
*maxrss = hiwater_rss;
|
|
}
|
|
|
|
#if defined(SPLIT_RSS_COUNTING)
|
|
void sync_mm_rss(struct mm_struct *mm);
|
|
#else
|
|
static inline void sync_mm_rss(struct mm_struct *mm)
|
|
{
|
|
}
|
|
#endif
|
|
|
|
#ifndef __HAVE_ARCH_PTE_DEVMAP
|
|
static inline int pte_devmap(pte_t pte)
|
|
{
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
int vma_wants_writenotify(struct vm_area_struct *vma, pgprot_t vm_page_prot);
|
|
|
|
extern pte_t *__get_locked_pte(struct mm_struct *mm, unsigned long addr,
|
|
spinlock_t **ptl);
|
|
static inline pte_t *get_locked_pte(struct mm_struct *mm, unsigned long addr,
|
|
spinlock_t **ptl)
|
|
{
|
|
pte_t *ptep;
|
|
__cond_lock(*ptl, ptep = __get_locked_pte(mm, addr, ptl));
|
|
return ptep;
|
|
}
|
|
|
|
#ifdef __PAGETABLE_PUD_FOLDED
|
|
static inline int __pud_alloc(struct mm_struct *mm, pgd_t *pgd,
|
|
unsigned long address)
|
|
{
|
|
return 0;
|
|
}
|
|
#else
|
|
int __pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address);
|
|
#endif
|
|
|
|
#if defined(__PAGETABLE_PMD_FOLDED) || !defined(CONFIG_MMU)
|
|
static inline int __pmd_alloc(struct mm_struct *mm, pud_t *pud,
|
|
unsigned long address)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline void mm_nr_pmds_init(struct mm_struct *mm) {}
|
|
|
|
static inline unsigned long mm_nr_pmds(struct mm_struct *mm)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline void mm_inc_nr_pmds(struct mm_struct *mm) {}
|
|
static inline void mm_dec_nr_pmds(struct mm_struct *mm) {}
|
|
|
|
#else
|
|
int __pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address);
|
|
|
|
static inline void mm_nr_pmds_init(struct mm_struct *mm)
|
|
{
|
|
atomic_long_set(&mm->nr_pmds, 0);
|
|
}
|
|
|
|
static inline unsigned long mm_nr_pmds(struct mm_struct *mm)
|
|
{
|
|
return atomic_long_read(&mm->nr_pmds);
|
|
}
|
|
|
|
static inline void mm_inc_nr_pmds(struct mm_struct *mm)
|
|
{
|
|
atomic_long_inc(&mm->nr_pmds);
|
|
}
|
|
|
|
static inline void mm_dec_nr_pmds(struct mm_struct *mm)
|
|
{
|
|
atomic_long_dec(&mm->nr_pmds);
|
|
}
|
|
#endif
|
|
|
|
int __pte_alloc(struct mm_struct *mm, pmd_t *pmd, unsigned long address);
|
|
int __pte_alloc_kernel(pmd_t *pmd, unsigned long address);
|
|
|
|
/*
|
|
* The following ifdef needed to get the 4level-fixup.h header to work.
|
|
* Remove it when 4level-fixup.h has been removed.
|
|
*/
|
|
#if defined(CONFIG_MMU) && !defined(__ARCH_HAS_4LEVEL_HACK)
|
|
static inline pud_t *pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address)
|
|
{
|
|
return (unlikely(pgd_none(*pgd)) && __pud_alloc(mm, pgd, address))?
|
|
NULL: pud_offset(pgd, address);
|
|
}
|
|
|
|
static inline pmd_t *pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address)
|
|
{
|
|
return (unlikely(pud_none(*pud)) && __pmd_alloc(mm, pud, address))?
|
|
NULL: pmd_offset(pud, address);
|
|
}
|
|
#endif /* CONFIG_MMU && !__ARCH_HAS_4LEVEL_HACK */
|
|
|
|
#if USE_SPLIT_PTE_PTLOCKS
|
|
#if ALLOC_SPLIT_PTLOCKS
|
|
void __init ptlock_cache_init(void);
|
|
extern bool ptlock_alloc(struct page *page);
|
|
extern void ptlock_free(struct page *page);
|
|
|
|
static inline spinlock_t *ptlock_ptr(struct page *page)
|
|
{
|
|
return page->ptl;
|
|
}
|
|
#else /* ALLOC_SPLIT_PTLOCKS */
|
|
static inline void ptlock_cache_init(void)
|
|
{
|
|
}
|
|
|
|
static inline bool ptlock_alloc(struct page *page)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
static inline void ptlock_free(struct page *page)
|
|
{
|
|
}
|
|
|
|
static inline spinlock_t *ptlock_ptr(struct page *page)
|
|
{
|
|
return &page->ptl;
|
|
}
|
|
#endif /* ALLOC_SPLIT_PTLOCKS */
|
|
|
|
static inline spinlock_t *pte_lockptr(struct mm_struct *mm, pmd_t *pmd)
|
|
{
|
|
return ptlock_ptr(pmd_page(*pmd));
|
|
}
|
|
|
|
static inline bool ptlock_init(struct page *page)
|
|
{
|
|
/*
|
|
* prep_new_page() initialize page->private (and therefore page->ptl)
|
|
* with 0. Make sure nobody took it in use in between.
|
|
*
|
|
* It can happen if arch try to use slab for page table allocation:
|
|
* slab code uses page->slab_cache, which share storage with page->ptl.
|
|
*/
|
|
VM_BUG_ON_PAGE(*(unsigned long *)&page->ptl, page);
|
|
if (!ptlock_alloc(page))
|
|
return false;
|
|
spin_lock_init(ptlock_ptr(page));
|
|
return true;
|
|
}
|
|
|
|
/* Reset page->mapping so free_pages_check won't complain. */
|
|
static inline void pte_lock_deinit(struct page *page)
|
|
{
|
|
page->mapping = NULL;
|
|
ptlock_free(page);
|
|
}
|
|
|
|
#else /* !USE_SPLIT_PTE_PTLOCKS */
|
|
/*
|
|
* We use mm->page_table_lock to guard all pagetable pages of the mm.
|
|
*/
|
|
static inline spinlock_t *pte_lockptr(struct mm_struct *mm, pmd_t *pmd)
|
|
{
|
|
return &mm->page_table_lock;
|
|
}
|
|
static inline void ptlock_cache_init(void) {}
|
|
static inline bool ptlock_init(struct page *page) { return true; }
|
|
static inline void pte_lock_deinit(struct page *page) {}
|
|
#endif /* USE_SPLIT_PTE_PTLOCKS */
|
|
|
|
static inline void pgtable_init(void)
|
|
{
|
|
ptlock_cache_init();
|
|
pgtable_cache_init();
|
|
}
|
|
|
|
static inline bool pgtable_page_ctor(struct page *page)
|
|
{
|
|
if (!ptlock_init(page))
|
|
return false;
|
|
inc_zone_page_state(page, NR_PAGETABLE);
|
|
return true;
|
|
}
|
|
|
|
static inline void pgtable_page_dtor(struct page *page)
|
|
{
|
|
pte_lock_deinit(page);
|
|
dec_zone_page_state(page, NR_PAGETABLE);
|
|
}
|
|
|
|
#define pte_offset_map_lock(mm, pmd, address, ptlp) \
|
|
({ \
|
|
spinlock_t *__ptl = pte_lockptr(mm, pmd); \
|
|
pte_t *__pte = pte_offset_map(pmd, address); \
|
|
*(ptlp) = __ptl; \
|
|
spin_lock(__ptl); \
|
|
__pte; \
|
|
})
|
|
|
|
#define pte_unmap_unlock(pte, ptl) do { \
|
|
spin_unlock(ptl); \
|
|
pte_unmap(pte); \
|
|
} while (0)
|
|
|
|
#define pte_alloc(mm, pmd, address) \
|
|
(unlikely(pmd_none(*(pmd))) && __pte_alloc(mm, pmd, address))
|
|
|
|
#define pte_alloc_map(mm, pmd, address) \
|
|
(pte_alloc(mm, pmd, address) ? NULL : pte_offset_map(pmd, address))
|
|
|
|
#define pte_alloc_map_lock(mm, pmd, address, ptlp) \
|
|
(pte_alloc(mm, pmd, address) ? \
|
|
NULL : pte_offset_map_lock(mm, pmd, address, ptlp))
|
|
|
|
#define pte_alloc_kernel(pmd, address) \
|
|
((unlikely(pmd_none(*(pmd))) && __pte_alloc_kernel(pmd, address))? \
|
|
NULL: pte_offset_kernel(pmd, address))
|
|
|
|
#if USE_SPLIT_PMD_PTLOCKS
|
|
|
|
static struct page *pmd_to_page(pmd_t *pmd)
|
|
{
|
|
unsigned long mask = ~(PTRS_PER_PMD * sizeof(pmd_t) - 1);
|
|
return virt_to_page((void *)((unsigned long) pmd & mask));
|
|
}
|
|
|
|
static inline spinlock_t *pmd_lockptr(struct mm_struct *mm, pmd_t *pmd)
|
|
{
|
|
return ptlock_ptr(pmd_to_page(pmd));
|
|
}
|
|
|
|
static inline bool pgtable_pmd_page_ctor(struct page *page)
|
|
{
|
|
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
|
page->pmd_huge_pte = NULL;
|
|
#endif
|
|
return ptlock_init(page);
|
|
}
|
|
|
|
static inline void pgtable_pmd_page_dtor(struct page *page)
|
|
{
|
|
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
|
VM_BUG_ON_PAGE(page->pmd_huge_pte, page);
|
|
#endif
|
|
ptlock_free(page);
|
|
}
|
|
|
|
#define pmd_huge_pte(mm, pmd) (pmd_to_page(pmd)->pmd_huge_pte)
|
|
|
|
#else
|
|
|
|
static inline spinlock_t *pmd_lockptr(struct mm_struct *mm, pmd_t *pmd)
|
|
{
|
|
return &mm->page_table_lock;
|
|
}
|
|
|
|
static inline bool pgtable_pmd_page_ctor(struct page *page) { return true; }
|
|
static inline void pgtable_pmd_page_dtor(struct page *page) {}
|
|
|
|
#define pmd_huge_pte(mm, pmd) ((mm)->pmd_huge_pte)
|
|
|
|
#endif
|
|
|
|
static inline spinlock_t *pmd_lock(struct mm_struct *mm, pmd_t *pmd)
|
|
{
|
|
spinlock_t *ptl = pmd_lockptr(mm, pmd);
|
|
spin_lock(ptl);
|
|
return ptl;
|
|
}
|
|
|
|
extern void free_area_init(unsigned long * zones_size);
|
|
extern void free_area_init_node(int nid, unsigned long * zones_size,
|
|
unsigned long zone_start_pfn, unsigned long *zholes_size);
|
|
extern void free_initmem(void);
|
|
|
|
/*
|
|
* Free reserved pages within range [PAGE_ALIGN(start), end & PAGE_MASK)
|
|
* into the buddy system. The freed pages will be poisoned with pattern
|
|
* "poison" if it's within range [0, UCHAR_MAX].
|
|
* Return pages freed into the buddy system.
|
|
*/
|
|
extern unsigned long free_reserved_area(void *start, void *end,
|
|
int poison, char *s);
|
|
|
|
#ifdef CONFIG_HIGHMEM
|
|
/*
|
|
* Free a highmem page into the buddy system, adjusting totalhigh_pages
|
|
* and totalram_pages.
|
|
*/
|
|
extern void free_highmem_page(struct page *page);
|
|
#endif
|
|
|
|
extern void adjust_managed_page_count(struct page *page, long count);
|
|
extern void mem_init_print_info(const char *str);
|
|
|
|
extern void reserve_bootmem_region(phys_addr_t start, phys_addr_t end);
|
|
|
|
/* Free the reserved page into the buddy system, so it gets managed. */
|
|
static inline void __free_reserved_page(struct page *page)
|
|
{
|
|
ClearPageReserved(page);
|
|
init_page_count(page);
|
|
__free_page(page);
|
|
}
|
|
|
|
static inline void free_reserved_page(struct page *page)
|
|
{
|
|
__free_reserved_page(page);
|
|
adjust_managed_page_count(page, 1);
|
|
}
|
|
|
|
static inline void mark_page_reserved(struct page *page)
|
|
{
|
|
SetPageReserved(page);
|
|
adjust_managed_page_count(page, -1);
|
|
}
|
|
|
|
/*
|
|
* Default method to free all the __init memory into the buddy system.
|
|
* The freed pages will be poisoned with pattern "poison" if it's within
|
|
* range [0, UCHAR_MAX].
|
|
* Return pages freed into the buddy system.
|
|
*/
|
|
static inline unsigned long free_initmem_default(int poison)
|
|
{
|
|
extern char __init_begin[], __init_end[];
|
|
|
|
return free_reserved_area(&__init_begin, &__init_end,
|
|
poison, "unused kernel");
|
|
}
|
|
|
|
static inline unsigned long get_num_physpages(void)
|
|
{
|
|
int nid;
|
|
unsigned long phys_pages = 0;
|
|
|
|
for_each_online_node(nid)
|
|
phys_pages += node_present_pages(nid);
|
|
|
|
return phys_pages;
|
|
}
|
|
|
|
#ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP
|
|
/*
|
|
* With CONFIG_HAVE_MEMBLOCK_NODE_MAP set, an architecture may initialise its
|
|
* zones, allocate the backing mem_map and account for memory holes in a more
|
|
* architecture independent manner. This is a substitute for creating the
|
|
* zone_sizes[] and zholes_size[] arrays and passing them to
|
|
* free_area_init_node()
|
|
*
|
|
* An architecture is expected to register range of page frames backed by
|
|
* physical memory with memblock_add[_node]() before calling
|
|
* free_area_init_nodes() passing in the PFN each zone ends at. At a basic
|
|
* usage, an architecture is expected to do something like
|
|
*
|
|
* unsigned long max_zone_pfns[MAX_NR_ZONES] = {max_dma, max_normal_pfn,
|
|
* max_highmem_pfn};
|
|
* for_each_valid_physical_page_range()
|
|
* memblock_add_node(base, size, nid)
|
|
* free_area_init_nodes(max_zone_pfns);
|
|
*
|
|
* free_bootmem_with_active_regions() calls free_bootmem_node() for each
|
|
* registered physical page range. Similarly
|
|
* sparse_memory_present_with_active_regions() calls memory_present() for
|
|
* each range when SPARSEMEM is enabled.
|
|
*
|
|
* See mm/page_alloc.c for more information on each function exposed by
|
|
* CONFIG_HAVE_MEMBLOCK_NODE_MAP.
|
|
*/
|
|
extern void free_area_init_nodes(unsigned long *max_zone_pfn);
|
|
unsigned long node_map_pfn_alignment(void);
|
|
unsigned long __absent_pages_in_range(int nid, unsigned long start_pfn,
|
|
unsigned long end_pfn);
|
|
extern unsigned long absent_pages_in_range(unsigned long start_pfn,
|
|
unsigned long end_pfn);
|
|
extern void get_pfn_range_for_nid(unsigned int nid,
|
|
unsigned long *start_pfn, unsigned long *end_pfn);
|
|
extern unsigned long find_min_pfn_with_active_regions(void);
|
|
extern void free_bootmem_with_active_regions(int nid,
|
|
unsigned long max_low_pfn);
|
|
extern void sparse_memory_present_with_active_regions(int nid);
|
|
|
|
#endif /* CONFIG_HAVE_MEMBLOCK_NODE_MAP */
|
|
|
|
#if !defined(CONFIG_HAVE_MEMBLOCK_NODE_MAP) && \
|
|
!defined(CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID)
|
|
static inline int __early_pfn_to_nid(unsigned long pfn,
|
|
struct mminit_pfnnid_cache *state)
|
|
{
|
|
return 0;
|
|
}
|
|
#else
|
|
/* please see mm/page_alloc.c */
|
|
extern int __meminit early_pfn_to_nid(unsigned long pfn);
|
|
/* there is a per-arch backend function. */
|
|
extern int __meminit __early_pfn_to_nid(unsigned long pfn,
|
|
struct mminit_pfnnid_cache *state);
|
|
#endif
|
|
|
|
extern void set_dma_reserve(unsigned long new_dma_reserve);
|
|
extern void memmap_init_zone(unsigned long, int, unsigned long,
|
|
unsigned long, enum memmap_context);
|
|
extern void setup_per_zone_wmarks(void);
|
|
extern int __meminit init_per_zone_wmark_min(void);
|
|
extern void mem_init(void);
|
|
extern void __init mmap_init(void);
|
|
extern void show_mem(unsigned int flags);
|
|
extern long si_mem_available(void);
|
|
extern void si_meminfo(struct sysinfo * val);
|
|
extern void si_meminfo_node(struct sysinfo *val, int nid);
|
|
#ifdef __HAVE_ARCH_RESERVED_KERNEL_PAGES
|
|
extern unsigned long arch_reserved_kernel_pages(void);
|
|
#endif
|
|
|
|
extern __printf(2, 3)
|
|
void warn_alloc(gfp_t gfp_mask, const char *fmt, ...);
|
|
|
|
extern void setup_per_cpu_pageset(void);
|
|
|
|
extern void zone_pcp_update(struct zone *zone);
|
|
extern void zone_pcp_reset(struct zone *zone);
|
|
|
|
/* page_alloc.c */
|
|
extern int min_free_kbytes;
|
|
extern int watermark_scale_factor;
|
|
extern int extra_free_kbytes;
|
|
|
|
/* nommu.c */
|
|
extern atomic_long_t mmap_pages_allocated;
|
|
extern int nommu_shrink_inode_mappings(struct inode *, size_t, size_t);
|
|
|
|
/* interval_tree.c */
|
|
void vma_interval_tree_insert(struct vm_area_struct *node,
|
|
struct rb_root *root);
|
|
void vma_interval_tree_insert_after(struct vm_area_struct *node,
|
|
struct vm_area_struct *prev,
|
|
struct rb_root *root);
|
|
void vma_interval_tree_remove(struct vm_area_struct *node,
|
|
struct rb_root *root);
|
|
struct vm_area_struct *vma_interval_tree_iter_first(struct rb_root *root,
|
|
unsigned long start, unsigned long last);
|
|
struct vm_area_struct *vma_interval_tree_iter_next(struct vm_area_struct *node,
|
|
unsigned long start, unsigned long last);
|
|
|
|
#define vma_interval_tree_foreach(vma, root, start, last) \
|
|
for (vma = vma_interval_tree_iter_first(root, start, last); \
|
|
vma; vma = vma_interval_tree_iter_next(vma, start, last))
|
|
|
|
void anon_vma_interval_tree_insert(struct anon_vma_chain *node,
|
|
struct rb_root *root);
|
|
void anon_vma_interval_tree_remove(struct anon_vma_chain *node,
|
|
struct rb_root *root);
|
|
struct anon_vma_chain *anon_vma_interval_tree_iter_first(
|
|
struct rb_root *root, unsigned long start, unsigned long last);
|
|
struct anon_vma_chain *anon_vma_interval_tree_iter_next(
|
|
struct anon_vma_chain *node, unsigned long start, unsigned long last);
|
|
#ifdef CONFIG_DEBUG_VM_RB
|
|
void anon_vma_interval_tree_verify(struct anon_vma_chain *node);
|
|
#endif
|
|
|
|
#define anon_vma_interval_tree_foreach(avc, root, start, last) \
|
|
for (avc = anon_vma_interval_tree_iter_first(root, start, last); \
|
|
avc; avc = anon_vma_interval_tree_iter_next(avc, start, last))
|
|
|
|
/* mmap.c */
|
|
extern int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin);
|
|
extern int __vma_adjust(struct vm_area_struct *vma, unsigned long start,
|
|
unsigned long end, pgoff_t pgoff, struct vm_area_struct *insert,
|
|
struct vm_area_struct *expand, bool keep_locked);
|
|
static inline int vma_adjust(struct vm_area_struct *vma, unsigned long start,
|
|
unsigned long end, pgoff_t pgoff, struct vm_area_struct *insert)
|
|
{
|
|
return __vma_adjust(vma, start, end, pgoff, insert, NULL, false);
|
|
}
|
|
|
|
extern struct vm_area_struct *__vma_merge(struct mm_struct *mm,
|
|
struct vm_area_struct *prev, unsigned long addr, unsigned long end,
|
|
unsigned long vm_flags, struct anon_vma *anon, struct file *file,
|
|
pgoff_t pgoff, struct mempolicy *mpol, struct vm_userfaultfd_ctx uff,
|
|
const char __user *user, bool keep_locked);
|
|
|
|
static inline struct vm_area_struct *vma_merge(struct mm_struct *mm,
|
|
struct vm_area_struct *prev, unsigned long addr, unsigned long end,
|
|
unsigned long vm_flags, struct anon_vma *anon, struct file *file,
|
|
pgoff_t off, struct mempolicy *pol, struct vm_userfaultfd_ctx uff,
|
|
const char __user *user)
|
|
{
|
|
return __vma_merge(mm, prev, addr, end, vm_flags, anon, file, off,
|
|
pol, uff, user, false);
|
|
}
|
|
|
|
extern struct anon_vma *find_mergeable_anon_vma(struct vm_area_struct *);
|
|
extern int split_vma(struct mm_struct *,
|
|
struct vm_area_struct *, unsigned long addr, int new_below);
|
|
extern int insert_vm_struct(struct mm_struct *, struct vm_area_struct *);
|
|
extern void __vma_link_rb(struct mm_struct *, struct vm_area_struct *,
|
|
struct rb_node **, struct rb_node *);
|
|
extern void unlink_file_vma(struct vm_area_struct *);
|
|
extern struct vm_area_struct *copy_vma(struct vm_area_struct **,
|
|
unsigned long addr, unsigned long len, pgoff_t pgoff,
|
|
bool *need_rmap_locks);
|
|
extern void exit_mmap(struct mm_struct *);
|
|
|
|
static inline int check_data_rlimit(unsigned long rlim,
|
|
unsigned long new,
|
|
unsigned long start,
|
|
unsigned long end_data,
|
|
unsigned long start_data)
|
|
{
|
|
if (rlim < RLIM_INFINITY) {
|
|
if (((new - start) + (end_data - start_data)) > rlim)
|
|
return -ENOSPC;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
extern int mm_take_all_locks(struct mm_struct *mm);
|
|
extern void mm_drop_all_locks(struct mm_struct *mm);
|
|
|
|
extern void set_mm_exe_file(struct mm_struct *mm, struct file *new_exe_file);
|
|
extern struct file *get_mm_exe_file(struct mm_struct *mm);
|
|
extern struct file *get_task_exe_file(struct task_struct *task);
|
|
|
|
extern bool may_expand_vm(struct mm_struct *, vm_flags_t, unsigned long npages);
|
|
extern void vm_stat_account(struct mm_struct *, vm_flags_t, long npages);
|
|
|
|
extern bool vma_is_special_mapping(const struct vm_area_struct *vma,
|
|
const struct vm_special_mapping *sm);
|
|
extern struct vm_area_struct *_install_special_mapping(struct mm_struct *mm,
|
|
unsigned long addr, unsigned long len,
|
|
unsigned long flags,
|
|
const struct vm_special_mapping *spec);
|
|
/* This is an obsolete alternative to _install_special_mapping. */
|
|
extern int install_special_mapping(struct mm_struct *mm,
|
|
unsigned long addr, unsigned long len,
|
|
unsigned long flags, struct page **pages);
|
|
|
|
extern unsigned long get_unmapped_area(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
|
|
|
|
extern unsigned long mmap_region(struct file *file, unsigned long addr,
|
|
unsigned long len, vm_flags_t vm_flags, unsigned long pgoff);
|
|
extern unsigned long do_mmap(struct file *file, unsigned long addr,
|
|
unsigned long len, unsigned long prot, unsigned long flags,
|
|
vm_flags_t vm_flags, unsigned long pgoff, unsigned long *populate);
|
|
extern int do_munmap(struct mm_struct *, unsigned long, size_t);
|
|
|
|
static inline unsigned long
|
|
do_mmap_pgoff(struct file *file, unsigned long addr,
|
|
unsigned long len, unsigned long prot, unsigned long flags,
|
|
unsigned long pgoff, unsigned long *populate)
|
|
{
|
|
return do_mmap(file, addr, len, prot, flags, 0, pgoff, populate);
|
|
}
|
|
|
|
#ifdef CONFIG_MMU
|
|
extern int __mm_populate(unsigned long addr, unsigned long len,
|
|
int ignore_errors);
|
|
static inline void mm_populate(unsigned long addr, unsigned long len)
|
|
{
|
|
/* Ignore errors */
|
|
(void) __mm_populate(addr, len, 1);
|
|
}
|
|
#else
|
|
static inline void mm_populate(unsigned long addr, unsigned long len) {}
|
|
#endif
|
|
|
|
/* These take the mm semaphore themselves */
|
|
extern int __must_check vm_brk(unsigned long, unsigned long);
|
|
extern int vm_munmap(unsigned long, size_t);
|
|
extern unsigned long __must_check vm_mmap(struct file *, unsigned long,
|
|
unsigned long, unsigned long,
|
|
unsigned long, unsigned long);
|
|
|
|
struct vm_unmapped_area_info {
|
|
#define VM_UNMAPPED_AREA_TOPDOWN 1
|
|
unsigned long flags;
|
|
unsigned long length;
|
|
unsigned long low_limit;
|
|
unsigned long high_limit;
|
|
unsigned long align_mask;
|
|
unsigned long align_offset;
|
|
};
|
|
|
|
extern unsigned long unmapped_area(struct vm_unmapped_area_info *info);
|
|
extern unsigned long unmapped_area_topdown(struct vm_unmapped_area_info *info);
|
|
|
|
/*
|
|
* Search for an unmapped address range.
|
|
*
|
|
* We are looking for a range that:
|
|
* - does not intersect with any VMA;
|
|
* - is contained within the [low_limit, high_limit) interval;
|
|
* - is at least the desired size.
|
|
* - satisfies (begin_addr & align_mask) == (align_offset & align_mask)
|
|
*/
|
|
static inline unsigned long
|
|
vm_unmapped_area(struct vm_unmapped_area_info *info)
|
|
{
|
|
if (info->flags & VM_UNMAPPED_AREA_TOPDOWN)
|
|
return unmapped_area_topdown(info);
|
|
else
|
|
return unmapped_area(info);
|
|
}
|
|
|
|
/* truncate.c */
|
|
extern void truncate_inode_pages(struct address_space *, loff_t);
|
|
extern void truncate_inode_pages_range(struct address_space *,
|
|
loff_t lstart, loff_t lend);
|
|
extern void truncate_inode_pages_final(struct address_space *);
|
|
|
|
/* generic vm_area_ops exported for stackable file systems */
|
|
extern int filemap_fault(struct vm_area_struct *, struct vm_fault *);
|
|
extern void filemap_map_pages(struct fault_env *fe,
|
|
pgoff_t start_pgoff, pgoff_t end_pgoff);
|
|
extern int filemap_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf);
|
|
|
|
/* mm/page-writeback.c */
|
|
int write_one_page(struct page *page, int wait);
|
|
void task_dirty_inc(struct task_struct *tsk);
|
|
|
|
/* readahead.c */
|
|
#define VM_MAX_READAHEAD 512 /* kbytes */
|
|
#define VM_MIN_READAHEAD 16 /* kbytes (includes current page) */
|
|
|
|
int force_page_cache_readahead(struct address_space *mapping, struct file *filp,
|
|
pgoff_t offset, unsigned long nr_to_read);
|
|
|
|
void page_cache_sync_readahead(struct address_space *mapping,
|
|
struct file_ra_state *ra,
|
|
struct file *filp,
|
|
pgoff_t offset,
|
|
unsigned long size);
|
|
|
|
void page_cache_async_readahead(struct address_space *mapping,
|
|
struct file_ra_state *ra,
|
|
struct file *filp,
|
|
struct page *pg,
|
|
pgoff_t offset,
|
|
unsigned long size);
|
|
|
|
extern unsigned long stack_guard_gap;
|
|
/* Generic expand stack which grows the stack according to GROWS{UP,DOWN} */
|
|
extern int expand_stack(struct vm_area_struct *vma, unsigned long address);
|
|
|
|
/* CONFIG_STACK_GROWSUP still needs to to grow downwards at some places */
|
|
extern int expand_downwards(struct vm_area_struct *vma,
|
|
unsigned long address);
|
|
#if VM_GROWSUP
|
|
extern int expand_upwards(struct vm_area_struct *vma, unsigned long address);
|
|
#else
|
|
#define expand_upwards(vma, address) (0)
|
|
#endif
|
|
|
|
/* Look up the first VMA which satisfies addr < vm_end, NULL if none. */
|
|
extern struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long addr);
|
|
extern struct vm_area_struct * find_vma_prev(struct mm_struct * mm, unsigned long addr,
|
|
struct vm_area_struct **pprev);
|
|
|
|
/* Look up the first VMA which intersects the interval start_addr..end_addr-1,
|
|
NULL if none. Assume start_addr < end_addr. */
|
|
static inline struct vm_area_struct * find_vma_intersection(struct mm_struct * mm, unsigned long start_addr, unsigned long end_addr)
|
|
{
|
|
struct vm_area_struct * vma = find_vma(mm,start_addr);
|
|
|
|
if (vma && end_addr <= vma->vm_start)
|
|
vma = NULL;
|
|
return vma;
|
|
}
|
|
|
|
static inline unsigned long vm_start_gap(struct vm_area_struct *vma)
|
|
{
|
|
unsigned long vm_start = vma->vm_start;
|
|
|
|
if (vma->vm_flags & VM_GROWSDOWN) {
|
|
vm_start -= stack_guard_gap;
|
|
if (vm_start > vma->vm_start)
|
|
vm_start = 0;
|
|
}
|
|
return vm_start;
|
|
}
|
|
|
|
static inline unsigned long vm_end_gap(struct vm_area_struct *vma)
|
|
{
|
|
unsigned long vm_end = vma->vm_end;
|
|
|
|
if (vma->vm_flags & VM_GROWSUP) {
|
|
vm_end += stack_guard_gap;
|
|
if (vm_end < vma->vm_end)
|
|
vm_end = -PAGE_SIZE;
|
|
}
|
|
return vm_end;
|
|
}
|
|
|
|
static inline unsigned long vma_pages(struct vm_area_struct *vma)
|
|
{
|
|
return (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
|
|
}
|
|
|
|
/* Look up the first VMA which exactly match the interval vm_start ... vm_end */
|
|
static inline struct vm_area_struct *find_exact_vma(struct mm_struct *mm,
|
|
unsigned long vm_start, unsigned long vm_end)
|
|
{
|
|
struct vm_area_struct *vma = find_vma(mm, vm_start);
|
|
|
|
if (vma && (vma->vm_start != vm_start || vma->vm_end != vm_end))
|
|
vma = NULL;
|
|
|
|
return vma;
|
|
}
|
|
|
|
static inline bool range_in_vma(struct vm_area_struct *vma,
|
|
unsigned long start, unsigned long end)
|
|
{
|
|
return (vma && vma->vm_start <= start && end <= vma->vm_end);
|
|
}
|
|
|
|
#ifdef CONFIG_MMU
|
|
pgprot_t vm_get_page_prot(unsigned long vm_flags);
|
|
void vma_set_page_prot(struct vm_area_struct *vma);
|
|
#else
|
|
static inline pgprot_t vm_get_page_prot(unsigned long vm_flags)
|
|
{
|
|
return __pgprot(0);
|
|
}
|
|
static inline void vma_set_page_prot(struct vm_area_struct *vma)
|
|
{
|
|
vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_NUMA_BALANCING
|
|
unsigned long change_prot_numa(struct vm_area_struct *vma,
|
|
unsigned long start, unsigned long end);
|
|
#endif
|
|
|
|
struct vm_area_struct *find_extend_vma(struct mm_struct *, unsigned long addr);
|
|
int remap_pfn_range(struct vm_area_struct *, unsigned long addr,
|
|
unsigned long pfn, unsigned long size, pgprot_t);
|
|
int vm_insert_page(struct vm_area_struct *, unsigned long addr, struct page *);
|
|
int vm_insert_pfn(struct vm_area_struct *vma, unsigned long addr,
|
|
unsigned long pfn);
|
|
int vm_insert_pfn_prot(struct vm_area_struct *vma, unsigned long addr,
|
|
unsigned long pfn, pgprot_t pgprot);
|
|
int vm_insert_mixed(struct vm_area_struct *vma, unsigned long addr,
|
|
pfn_t pfn);
|
|
int vm_iomap_memory(struct vm_area_struct *vma, phys_addr_t start, unsigned long len);
|
|
|
|
|
|
struct page *follow_page_mask(struct vm_area_struct *vma,
|
|
unsigned long address, unsigned int foll_flags,
|
|
unsigned int *page_mask);
|
|
|
|
static inline struct page *follow_page(struct vm_area_struct *vma,
|
|
unsigned long address, unsigned int foll_flags)
|
|
{
|
|
unsigned int unused_page_mask;
|
|
return follow_page_mask(vma, address, foll_flags, &unused_page_mask);
|
|
}
|
|
|
|
#define FOLL_WRITE 0x01 /* check pte is writable */
|
|
#define FOLL_TOUCH 0x02 /* mark page accessed */
|
|
#define FOLL_GET 0x04 /* do get_page on page */
|
|
#define FOLL_DUMP 0x08 /* give error on hole if it would be zero */
|
|
#define FOLL_FORCE 0x10 /* get_user_pages read/write w/o permission */
|
|
#define FOLL_NOWAIT 0x20 /* if a disk transfer is needed, start the IO
|
|
* and return without waiting upon it */
|
|
#define FOLL_POPULATE 0x40 /* fault in page */
|
|
#define FOLL_SPLIT 0x80 /* don't return transhuge pages, split them */
|
|
#define FOLL_HWPOISON 0x100 /* check page is hwpoisoned */
|
|
#define FOLL_NUMA 0x200 /* force NUMA hinting page fault */
|
|
#define FOLL_MIGRATION 0x400 /* wait for page to replace migration entry */
|
|
#define FOLL_TRIED 0x800 /* a retry, previous pass started an IO */
|
|
#define FOLL_MLOCK 0x1000 /* lock present pages */
|
|
#define FOLL_REMOTE 0x2000 /* we are working on non-current tsk/mm */
|
|
#define FOLL_COW 0x4000 /* internal GUP flag */
|
|
#define FOLL_ANON 0x8000 /* don't do file mappings */
|
|
|
|
typedef int (*pte_fn_t)(pte_t *pte, pgtable_t token, unsigned long addr,
|
|
void *data);
|
|
extern int apply_to_page_range(struct mm_struct *mm, unsigned long address,
|
|
unsigned long size, pte_fn_t fn, void *data);
|
|
|
|
|
|
#ifdef CONFIG_PAGE_POISONING
|
|
extern bool page_poisoning_enabled(void);
|
|
extern void kernel_poison_pages(struct page *page, int numpages, int enable);
|
|
extern bool page_is_poisoned(struct page *page);
|
|
#else
|
|
static inline bool page_poisoning_enabled(void) { return false; }
|
|
static inline void kernel_poison_pages(struct page *page, int numpages,
|
|
int enable) { }
|
|
static inline bool page_is_poisoned(struct page *page) { return false; }
|
|
#endif
|
|
|
|
#ifdef CONFIG_DEBUG_PAGEALLOC
|
|
extern bool _debug_pagealloc_enabled;
|
|
extern void __kernel_map_pages(struct page *page, int numpages, int enable);
|
|
|
|
static inline bool debug_pagealloc_enabled(void)
|
|
{
|
|
return _debug_pagealloc_enabled;
|
|
}
|
|
|
|
static inline void
|
|
kernel_map_pages(struct page *page, int numpages, int enable)
|
|
{
|
|
if (!debug_pagealloc_enabled())
|
|
return;
|
|
|
|
__kernel_map_pages(page, numpages, enable);
|
|
}
|
|
#ifdef CONFIG_HIBERNATION
|
|
extern bool kernel_page_present(struct page *page);
|
|
#endif /* CONFIG_HIBERNATION */
|
|
#else /* CONFIG_DEBUG_PAGEALLOC */
|
|
static inline void
|
|
kernel_map_pages(struct page *page, int numpages, int enable) {}
|
|
#ifdef CONFIG_HIBERNATION
|
|
static inline bool kernel_page_present(struct page *page) { return true; }
|
|
#endif /* CONFIG_HIBERNATION */
|
|
static inline bool debug_pagealloc_enabled(void)
|
|
{
|
|
return false;
|
|
}
|
|
#endif /* CONFIG_DEBUG_PAGEALLOC */
|
|
|
|
#ifdef __HAVE_ARCH_GATE_AREA
|
|
extern struct vm_area_struct *get_gate_vma(struct mm_struct *mm);
|
|
extern int in_gate_area_no_mm(unsigned long addr);
|
|
extern int in_gate_area(struct mm_struct *mm, unsigned long addr);
|
|
#else
|
|
static inline struct vm_area_struct *get_gate_vma(struct mm_struct *mm)
|
|
{
|
|
return NULL;
|
|
}
|
|
static inline int in_gate_area_no_mm(unsigned long addr) { return 0; }
|
|
static inline int in_gate_area(struct mm_struct *mm, unsigned long addr)
|
|
{
|
|
return 0;
|
|
}
|
|
#endif /* __HAVE_ARCH_GATE_AREA */
|
|
|
|
extern bool process_shares_mm(struct task_struct *p, struct mm_struct *mm);
|
|
|
|
#ifdef CONFIG_SYSCTL
|
|
extern int sysctl_drop_caches;
|
|
int drop_caches_sysctl_handler(struct ctl_table *, int,
|
|
void __user *, size_t *, loff_t *);
|
|
#endif
|
|
|
|
void drop_slab(void);
|
|
void drop_slab_node(int nid);
|
|
|
|
#ifndef CONFIG_MMU
|
|
#define randomize_va_space 0
|
|
#else
|
|
extern int randomize_va_space;
|
|
#endif
|
|
|
|
const char * arch_vma_name(struct vm_area_struct *vma);
|
|
void print_vma_addr(char *prefix, unsigned long rip);
|
|
|
|
void sparse_mem_maps_populate_node(struct page **map_map,
|
|
unsigned long pnum_begin,
|
|
unsigned long pnum_end,
|
|
unsigned long map_count,
|
|
int nodeid);
|
|
|
|
struct page *sparse_mem_map_populate(unsigned long pnum, int nid);
|
|
pgd_t *vmemmap_pgd_populate(unsigned long addr, int node);
|
|
pud_t *vmemmap_pud_populate(pgd_t *pgd, unsigned long addr, int node);
|
|
pmd_t *vmemmap_pmd_populate(pud_t *pud, unsigned long addr, int node);
|
|
pte_t *vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, int node);
|
|
void *vmemmap_alloc_block(unsigned long size, int node);
|
|
struct vmem_altmap;
|
|
void *__vmemmap_alloc_block_buf(unsigned long size, int node,
|
|
struct vmem_altmap *altmap);
|
|
static inline void *vmemmap_alloc_block_buf(unsigned long size, int node)
|
|
{
|
|
return __vmemmap_alloc_block_buf(size, node, NULL);
|
|
}
|
|
|
|
void vmemmap_verify(pte_t *, int, unsigned long, unsigned long);
|
|
int vmemmap_populate_basepages(unsigned long start, unsigned long end,
|
|
int node);
|
|
int vmemmap_populate(unsigned long start, unsigned long end, int node);
|
|
void vmemmap_populate_print_last(void);
|
|
#ifdef CONFIG_MEMORY_HOTPLUG
|
|
void vmemmap_free(unsigned long start, unsigned long end);
|
|
#endif
|
|
void register_page_bootmem_memmap(unsigned long section_nr, struct page *map,
|
|
unsigned long size);
|
|
|
|
enum mf_flags {
|
|
MF_COUNT_INCREASED = 1 << 0,
|
|
MF_ACTION_REQUIRED = 1 << 1,
|
|
MF_MUST_KILL = 1 << 2,
|
|
MF_SOFT_OFFLINE = 1 << 3,
|
|
};
|
|
extern int memory_failure(unsigned long pfn, int trapno, int flags);
|
|
extern void memory_failure_queue(unsigned long pfn, int trapno, int flags);
|
|
extern int unpoison_memory(unsigned long pfn);
|
|
extern int get_hwpoison_page(struct page *page);
|
|
#define put_hwpoison_page(page) put_page(page)
|
|
extern int sysctl_memory_failure_early_kill;
|
|
extern int sysctl_memory_failure_recovery;
|
|
extern void shake_page(struct page *p, int access);
|
|
extern atomic_long_t num_poisoned_pages;
|
|
extern int soft_offline_page(struct page *page, int flags);
|
|
|
|
|
|
/*
|
|
* Error handlers for various types of pages.
|
|
*/
|
|
enum mf_result {
|
|
MF_IGNORED, /* Error: cannot be handled */
|
|
MF_FAILED, /* Error: handling failed */
|
|
MF_DELAYED, /* Will be handled later */
|
|
MF_RECOVERED, /* Successfully recovered */
|
|
};
|
|
|
|
enum mf_action_page_type {
|
|
MF_MSG_KERNEL,
|
|
MF_MSG_KERNEL_HIGH_ORDER,
|
|
MF_MSG_SLAB,
|
|
MF_MSG_DIFFERENT_COMPOUND,
|
|
MF_MSG_POISONED_HUGE,
|
|
MF_MSG_HUGE,
|
|
MF_MSG_FREE_HUGE,
|
|
MF_MSG_UNMAP_FAILED,
|
|
MF_MSG_DIRTY_SWAPCACHE,
|
|
MF_MSG_CLEAN_SWAPCACHE,
|
|
MF_MSG_DIRTY_MLOCKED_LRU,
|
|
MF_MSG_CLEAN_MLOCKED_LRU,
|
|
MF_MSG_DIRTY_UNEVICTABLE_LRU,
|
|
MF_MSG_CLEAN_UNEVICTABLE_LRU,
|
|
MF_MSG_DIRTY_LRU,
|
|
MF_MSG_CLEAN_LRU,
|
|
MF_MSG_TRUNCATED_LRU,
|
|
MF_MSG_BUDDY,
|
|
MF_MSG_BUDDY_2ND,
|
|
MF_MSG_UNKNOWN,
|
|
};
|
|
|
|
#if defined(CONFIG_TRANSPARENT_HUGEPAGE) || defined(CONFIG_HUGETLBFS)
|
|
extern void clear_huge_page(struct page *page,
|
|
unsigned long addr,
|
|
unsigned int pages_per_huge_page);
|
|
extern void copy_user_huge_page(struct page *dst, struct page *src,
|
|
unsigned long addr, struct vm_area_struct *vma,
|
|
unsigned int pages_per_huge_page);
|
|
#endif /* CONFIG_TRANSPARENT_HUGEPAGE || CONFIG_HUGETLBFS */
|
|
|
|
extern struct page_ext_operations debug_guardpage_ops;
|
|
|
|
#ifdef CONFIG_DEBUG_PAGEALLOC
|
|
extern unsigned int _debug_guardpage_minorder;
|
|
extern bool _debug_guardpage_enabled;
|
|
|
|
static inline unsigned int debug_guardpage_minorder(void)
|
|
{
|
|
return _debug_guardpage_minorder;
|
|
}
|
|
|
|
static inline bool debug_guardpage_enabled(void)
|
|
{
|
|
return _debug_guardpage_enabled;
|
|
}
|
|
|
|
static inline bool page_is_guard(struct page *page)
|
|
{
|
|
struct page_ext *page_ext;
|
|
|
|
if (!debug_guardpage_enabled())
|
|
return false;
|
|
|
|
page_ext = lookup_page_ext(page);
|
|
if (unlikely(!page_ext))
|
|
return false;
|
|
|
|
return test_bit(PAGE_EXT_DEBUG_GUARD, &page_ext->flags);
|
|
}
|
|
#else
|
|
static inline unsigned int debug_guardpage_minorder(void) { return 0; }
|
|
static inline bool debug_guardpage_enabled(void) { return false; }
|
|
static inline bool page_is_guard(struct page *page) { return false; }
|
|
#endif /* CONFIG_DEBUG_PAGEALLOC */
|
|
|
|
#if MAX_NUMNODES > 1
|
|
void __init setup_nr_node_ids(void);
|
|
#else
|
|
static inline void setup_nr_node_ids(void) {}
|
|
#endif
|
|
|
|
extern int want_old_faultaround_pte;
|
|
|
|
#ifdef CONFIG_PROCESS_RECLAIM
|
|
struct reclaim_param {
|
|
struct vm_area_struct *vma;
|
|
/* Number of pages scanned */
|
|
int nr_scanned;
|
|
/* max pages to reclaim */
|
|
int nr_to_reclaim;
|
|
/* pages reclaimed */
|
|
int nr_reclaimed;
|
|
};
|
|
extern struct reclaim_param reclaim_task_anon(struct task_struct *task,
|
|
int nr_to_reclaim);
|
|
#endif
|
|
|
|
#endif /* __KERNEL__ */
|
|
#endif /* _LINUX_MM_H */
|