* v4.4-16.09-android-tmp: unsafe_[get|put]_user: change interface to use a error target label usercopy: remove page-spanning test for now usercopy: fix overlap check for kernel text mm/slub: support left redzone Linux 4.4.21 lib/mpi: mpi_write_sgl(): fix skipping of leading zero limbs regulator: anatop: allow regulator to be in bypass mode hwrng: exynos - Disable runtime PM on probe failure cpufreq: Fix GOV_LIMITS handling for the userspace governor metag: Fix atomic_*_return inline asm constraints scsi: fix upper bounds check of sense key in scsi_sense_key_string() ALSA: timer: fix NULL pointer dereference on memory allocation failure ALSA: timer: fix division by zero after SNDRV_TIMER_IOCTL_CONTINUE ALSA: timer: fix NULL pointer dereference in read()/ioctl() race ALSA: hda - Enable subwoofer on Dell Inspiron 7559 ALSA: hda - Add headset mic quirk for Dell Inspiron 5468 ALSA: rawmidi: Fix possible deadlock with virmidi registration ALSA: fireworks: accessing to user space outside spinlock ALSA: firewire-tascam: accessing to user space outside spinlock ALSA: usb-audio: Add sample rate inquiry quirk for B850V3 CP2114 crypto: caam - fix IV loading for authenc (giv)decryption uprobes: Fix the memcg accounting x86/apic: Do not init irq remapping if ioapic is disabled vhost/scsi: fix reuse of &vq->iov[out] in response bcache: RESERVE_PRIO is too small by one when prio_buckets() is a power of two. ubifs: Fix assertion in layout_in_gaps() ovl: fix workdir creation ovl: listxattr: use strnlen() ovl: remove posix_acl_default from workdir ovl: don't copy up opaqueness wrappers for ->i_mutex access lustre: remove unused declaration timekeeping: Avoid taking lock in NMI path with CONFIG_DEBUG_TIMEKEEPING timekeeping: Cap array access in timekeeping_debug xfs: fix superblock inprogress check ASoC: atmel_ssc_dai: Don't unconditionally reset SSC on stream startup drm/msm: fix use of copy_from_user() while holding spinlock drm: Reject page_flip for !DRIVER_MODESET drm/radeon: fix radeon_move_blit on 32bit systems s390/sclp_ctl: fix potential information leak with /dev/sclp rds: fix an infoleak in rds_inc_info_copy powerpc/tm: Avoid SLB faults in treclaim/trecheckpoint when RI=0 nvme: Call pci_disable_device on the error path. cgroup: reduce read locked section of cgroup_threadgroup_rwsem during fork block: make sure a big bio is split into at most 256 bvecs block: Fix race triggered by blk_set_queue_dying() ext4: avoid modifying checksum fields directly during checksum verification ext4: avoid deadlock when expanding inode size ext4: properly align shifted xattrs when expanding inodes ext4: fix xattr shifting when expanding inodes part 2 ext4: fix xattr shifting when expanding inodes ext4: validate that metadata blocks do not overlap superblock net: Use ns_capable_noaudit() when determining net sysctl permissions kernel: Add noaudit variant of ns_capable() KEYS: Fix ASN.1 indefinite length object parsing drivers:hv: Lock access to hyperv_mmio resource tree cxlflash: Move to exponential back-off when cmd_room is not available netfilter: x_tables: check for size overflow drm/amdgpu/cz: enable/disable vce dpm even if vce pg is disabled cred: Reject inodes with invalid ids in set_create_file_as() fs: Check for invalid i_uid in may_follow_link() IB/IPoIB: Do not set skb truesize since using one linearskb udp: properly support MSG_PEEK with truncated buffers crypto: nx-842 - Mask XERS0 bit in return value cxlflash: Fix to avoid virtual LUN failover failure cxlflash: Fix to escalate LINK_RESET also on port 1 tipc: fix nl compat regression for link statistics tipc: fix an infoleak in tipc_nl_compat_link_dump netfilter: x_tables: check for size overflow Bluetooth: Add support for Intel Bluetooth device 8265 [8087:0a2b] drm/i915: Check VBT for port presence in addition to the strap on VLV/CHV drm/i915: Only ignore eDP ports that are connected Input: xpad - move pending clear to the correct location net: thunderx: Fix link status reporting x86/hyperv: Avoid reporting bogus NMI status for Gen2 instances crypto: vmx - IV size failing on skcipher API tda10071: Fix dependency to REGMAP_I2C crypto: vmx - Fix ABI detection crypto: vmx - comply with ABIs that specify vrsave as reserved. HID: core: prevent out-of-bound readings lpfc: Fix DMA faults observed upon plugging loopback connector block: fix blk_rq_get_max_sectors for driver private requests irqchip/gicv3-its: numa: Enable workaround for Cavium thunderx erratum 23144 clocksource: Allow unregistering the watchdog btrfs: Continue write in case of can_not_nocow blk-mq: End unstarted requests on dying queue cxlflash: Fix to resolve dead-lock during EEH recovery drm/radeon/mst: fix regression in lane/link handling. ecryptfs: fix handling of directory opening ALSA: hda: add AMD Polaris-10/11 AZ PCI IDs with proper driver caps drm: Balance error path for GEM handle allocation ntp: Fix ADJ_SETOFFSET being used w/ ADJ_NANO time: Verify time values in adjtimex ADJ_SETOFFSET to avoid overflow Input: xpad - correctly handle concurrent LED and FF requests net: thunderx: Fix receive packet stats net: thunderx: Fix for multiqset not configured upon interface toggle perf/x86/cqm: Fix CQM memory leak and notifier leak perf/x86/cqm: Fix CQM handling of grouping events into a cache_group s390/crypto: provide correct file mode at device register. proc: revert /proc/<pid>/maps [stack:TID] annotation intel_idle: Support for Intel Xeon Phi Processor x200 Product Family cxlflash: Fix to avoid unnecessary scan with internal LUNs Drivers: hv: vmbus: don't manipulate with clocksources on crash Drivers: hv: vmbus: avoid scheduling in interrupt context in vmbus_initiate_unload() Drivers: hv: vmbus: avoid infinite loop in init_vp_index() arcmsr: fixes not release allocated resource arcmsr: fixed getting wrong configuration data s390/pci_dma: fix DMA table corruption with > 4 TB main memory net/mlx5e: Don't modify CQ before it was created net/mlx5e: Don't try to modify CQ moderation if it is not supported mmc: sdhci: Do not BUG on invalid vdd UVC: Add support for R200 depth camera sched/numa: Fix use-after-free bug in the task_numa_compare ALSA: hda - add codec support for Kabylake display audio codec drm/i915: Fix hpd live status bits for g4x tipc: fix nullptr crash during subscription cancel arm64: Add workaround for Cavium erratum 27456 net: thunderx: Fix for Qset error due to CQ full drm/radeon: fix dp link rate selection (v2) drm/amdgpu: fix dp link rate selection (v2) qla2xxx: Use ATIO type to send correct tmr response mmc: sdhci: 64-bit DMA actually has 4-byte alignment drm/atomic: Do not unset crtc when an encoder is stolen drm/i915/skl: Add missing SKL ids drm/i915/bxt: update list of PCIIDs hrtimer: Catch illegal clockids i40e/i40evf: Fix RSS rx-flow-hash configuration through ethtool mpt3sas: Fix for Asynchronous completion of timedout IO and task abort of timedout IO. mpt3sas: A correction in unmap_resources net: cavium: liquidio: fix check for in progress flag arm64: KVM: Configure TCR_EL2.PS at runtime irqchip/gic-v3: Make sure read from ICC_IAR1_EL1 is visible on redestributor pwm: lpc32xx: fix and simplify duty cycle and period calculations pwm: lpc32xx: correct number of PWM channels from 2 to 1 pwm: fsl-ftm: Fix clock enable/disable when using PM megaraid_sas: Add an i/o barrier megaraid_sas: Fix SMAP issue megaraid_sas: Do not allow PCI access during OCR s390/cio: update measurement characteristics s390/cio: ensure consistent measurement state s390/cio: fix measurement characteristics memleak qeth: initialize net_device with carrier off lpfc: Fix external loopback failure. lpfc: Fix mbox reuse in PLOGI completion lpfc: Fix RDP Speed reporting. lpfc: Fix crash in fcp command completion path. lpfc: Fix driver crash when module parameter lpfc_fcp_io_channel set to 16 lpfc: Fix RegLogin failed error seen on Lancer FC during port bounce lpfc: Fix the FLOGI discovery logic to comply with T11 standards lpfc: Fix FCF Infinite loop in lpfc_sli4_fcf_rr_next_index_get. cxl: Enable PCI device ID for future IBM CXL adapter cxl: fix build for GCC 4.6.x cxlflash: Enable device id for future IBM CXL adapter cxlflash: Resolve oops in wait_port_offline cxlflash: Fix to resolve cmd leak after host reset cxl: Fix DSI misses when the context owning task exits cxl: Fix possible idr warning when contexts are released Drivers: hv: vmbus: fix rescind-offer handling for device without a driver Drivers: hv: vmbus: serialize process_chn_event() and vmbus_close_internal() Drivers: hv: vss: run only on supported host versions drivers/hv: cleanup synic msrs if vmbus connect failed Drivers: hv: util: catch allocation errors tools: hv: report ENOSPC errors in hv_fcopy_daemon Drivers: hv: utils: run polling callback always in interrupt context Drivers: hv: util: Increase the timeout for util services lightnvm: fix missing grown bad block type lightnvm: fix locking and mempool in rrpc_lun_gc lightnvm: unlock rq and free ppa_list on submission fail lightnvm: add check after mempool allocation lightnvm: fix incorrect nr_free_blocks stat lightnvm: fix bio submission issue cxlflash: a couple off by one bugs fm10k: Cleanup exception handling for mailbox interrupt fm10k: Cleanup MSI-X interrupts in case of failure fm10k: reinitialize queuing scheme after calling init_hw fm10k: always check init_hw for errors fm10k: reset max_queues on init_hw_vf failure fm10k: Fix handling of NAPI budget when multiple queues are enabled per vector fm10k: Correct MTU for jumbo frames fm10k: do not assume VF always has 1 queue clk: xgene: Fix divider with non-zero shift value e1000e: fix division by zero on jumbo MTUs e1000: fix data race between tx_ring->next_to_clean ixgbe: Fix handling of NAPI budget when multiple queues are enabled per vector igb: fix NULL derefs due to skipped SR-IOV enabling igb: use the correct i210 register for EEMNGCTL igb: don't unmap NULL hw_addr i40e: Fix Rx hash reported to the stack by our driver i40e: clean whole mac filter list i40evf: check rings before freeing resources i40e: don't add zero MAC filter i40e: properly delete VF MAC filters i40e: Fix memory leaks, sideband filter programming i40e: fix: do not sleep in netdev_ops i40e/i40evf: Fix RS bit update in Tx path and disable force WB workaround i40evf: handle many MAC filters correctly i40e: Workaround fix for mss < 256 issue UPSTREAM: audit: fix a double fetch in audit_log_single_execve_arg() UPSTREAM: ARM: 8494/1: mm: Enable PXN when running non-LPAE kernel on LPAE processor FIXUP: sched/tune: update accouting before CPU capacity FIXUP: sched/tune: add fixes missing from a previous patch arm: Fix #if/#ifdef typo in topology.c arm: Fix build error "conflicting types for 'scale_cpu_capacity'" sched/walt: use do_div instead of division operator DEBUG: cpufreq: fix cpu_capacity tracing build for non-smp systems sched/walt: include missing header for arm_timer_read_counter() cpufreq: Kconfig: Fixup incorrect selection by CPU_FREQ_DEFAULT_GOV_SCHED sched/fair: Avoid redundant idle_cpu() call in update_sg_lb_stats() FIXUP: sched: scheduler-driven cpu frequency selection sched/rt: Add Kconfig option to enable panicking for RT throttling sched/rt: print RT tasks when RT throttling is activated UPSTREAM: sched: Fix a race between __kthread_bind() and sched_setaffinity() sched/fair: Favor higher cpus only for boosted tasks vmstat: make vmstat_updater deferrable again and shut down on idle sched/fair: call OPP update when going idle after migration sched/cpufreq_sched: fix thermal capping events sched/fair: Picking cpus with low OPPs for tasks that prefer idle CPUs FIXUP: sched/tune: do initialization as a postcore_initicall DEBUG: sched: add tracepoint for RD overutilized sched/tune: Introducing a new schedtune attribute prefer_idle sched: use util instead of capacity to select busy cpu arch_timer: add error handling when the MPM global timer is cleared FIXUP: sched: Fix double-release of spinlock in move_queued_task FIXUP: sched/fair: Fix hang during suspend in sched_group_energy FIXUP: sched: fix SchedFreq integration for both PELT and WALT sched: EAS: Avoid causing spikes to max-freq unnecessarily FIXUP: sched: fix set_cfs_cpu_capacity when WALT is in use sched/walt: Accounting for number of irqs pending on each core sched: Introduce Window Assisted Load Tracking (WALT) sched/tune: fix PB and PC cuts indexes definition sched/fair: optimize idle cpu selection for boosted tasks FIXUP: sched/tune: fix accounting for runnable tasks sched/tune: use a single initialisation function sched/{fair,tune}: simplify fair.c code FIXUP: sched/tune: fix payoff calculation for boost region sched/tune: Add support for negative boost values FIX: sched/tune: move schedtune_nornalize_energy into fair.c FIX: sched/tune: update usage of boosted task utilisation on CPU selection sched/fair: add tunable to set initial task load sched/fair: add tunable to force selection at cpu granularity sched: EAS: take cstate into account when selecting idle core sched/cpufreq_sched: Consolidated update FIXUP: sched: fix build for non-SMP target DEBUG: sched/tune: add tracepoint on P-E space filtering DEBUG: sched/tune: add tracepoint for energy_diff() values DEBUG: sched/tune: add tracepoint for task boost signal arm: topology: Define TC2 energy and provide it to the scheduler CHROMIUM: sched: update the average of nr_running DEBUG: schedtune: add tracepoint for schedtune_tasks_update() values DEBUG: schedtune: add tracepoint for CPU boost signal DEBUG: schedtune: add tracepoint for SchedTune configuration update DEBUG: sched: add energy procfs interface DEBUG: sched,cpufreq: add cpu_capacity change tracepoint DEBUG: sched: add tracepoint for CPU load/util signals DEBUG: sched: add tracepoint for task load/util signals DEBUG: sched: add tracepoint for cpu/freq scale invariance sched/fair: filter energy_diff() based on energy_payoff value sched/tune: add support to compute normalized energy sched/fair: keep track of energy/capacity variations sched/fair: add boosted task utilization sched/{fair,tune}: track RUNNABLE tasks impact on per CPU boost value sched/tune: compute and keep track of per CPU boost value sched/tune: add initial support for CGroups based boosting sched/fair: add boosted CPU usage sched/fair: add function to convert boost value into "margin" sched/tune: add sysctl interface to define a boost value sched/tune: add detailed documentation fixup! sched/fair: jump to max OPP when crossing UP threshold fixup! sched: scheduler-driven cpu frequency selection sched: rt scheduler sets capacity requirement sched: deadline: use deadline bandwidth in scale_rt_capacity sched: remove call of sched_avg_update from sched_rt_avg_update sched/cpufreq_sched: add trace events sched/fair: jump to max OPP when crossing UP threshold sched/fair: cpufreq_sched triggers for load balancing sched/{core,fair}: trigger OPP change request on fork() sched/fair: add triggers for OPP change requests sched: scheduler-driven cpu frequency selection cpufreq: introduce cpufreq_driver_is_slow sched: Consider misfit tasks when load-balancing sched: Add group_misfit_task load-balance type sched: Add per-cpu max capacity to sched_group_capacity sched: Do eas idle balance regardless of the rq avg idle value arm64: Enable max freq invariant scheduler load-tracking and capacity support arm: Enable max freq invariant scheduler load-tracking and capacity support sched: Update max cpu capacity in case of max frequency constraints cpufreq: Max freq invariant scheduler load-tracking and cpu capacity support arm64, topology: Updates to use DT bindings for EAS costing data sched: Support for extracting EAS energy costs from DT Documentation: DT bindings for energy model cost data required by EAS sched: Disable energy-unfriendly nohz kicks sched: Consider a not over-utilized energy-aware system as balanced sched: Energy-aware wake-up task placement sched: Determine the current sched_group idle-state sched, cpuidle: Track cpuidle state index in the scheduler sched: Add over-utilization/tipping point indicator sched: Estimate energy impact of scheduling decisions sched: Extend sched_group_energy to test load-balancing decisions sched: Calculate energy consumption of sched_group sched: Highest energy aware balancing sched_domain level pointer sched: Relocated cpu_util() and change return type sched: Compute cpu capacity available at current frequency arm64: Cpu invariant scheduler load-tracking and capacity support arm: Cpu invariant scheduler load-tracking and capacity support sched: Introduce SD_SHARE_CAP_STATES sched_domain flag sched: Initialize energy data structures sched: Introduce energy data structures sched: Make energy awareness a sched feature sched: Documentation for scheduler energy cost model sched: Prevent unnecessary active balance of single task in sched group sched: Enable idle balance to pull single task towards cpu with higher capacity sched: Consider spare cpu capacity at task wake-up sched: Add cpu capacity awareness to wakeup balancing sched: Store system-wide maximum cpu capacity in root domain arm: Update arch_scale_cpu_capacity() to reflect change to define arm64: Enable frequency invariant scheduler load-tracking support arm: Enable frequency invariant scheduler load-tracking support cpufreq: Frequency invariant scheduler load-tracking support sched/fair: Fix new task's load avg removed from source CPU in wake_up_new_task() FROMLIST: pstore: drop pmsg bounce buffer UPSTREAM: usercopy: remove page-spanning test for now UPSTREAM: usercopy: force check_object_size() inline BACKPORT: usercopy: fold builtin_const check into inline function UPSTREAM: x86/uaccess: force copy_*_user() to be inlined UPSTREAM: HID: core: prevent out-of-bound readings Android: Fix build breakages. UPSTREAM: tty: Prevent ldisc drivers from re-using stale tty fields UPSTREAM: netfilter: nfnetlink: correctly validate length of batch messages cpuset: Make cpusets restore on hotplug UPSTREAM: mm/slub: support left redzone UPSTREAM: Make the hardened user-copy code depend on having a hardened allocator Android: MMC/UFS IO Latency Histograms. UPSTREAM: usercopy: fix overlap check for kernel text UPSTREAM: usercopy: avoid potentially undefined behavior in pointer math UPSTREAM: unsafe_[get|put]_user: change interface to use a error target label BACKPORT: arm64: mm: fix location of _etext BACKPORT: ARM: 8583/1: mm: fix location of _etext BACKPORT: Don't show empty tag stats for unprivileged uids UPSTREAM: tcp: fix use after free in tcp_xmit_retransmit_queue() ANDROID: base-cfg: drop SECCOMP_FILTER config UPSTREAM: [media] xc2028: unlock on error in xc2028_set_config() UPSTREAM: [media] xc2028: avoid use after free ANDROID: base-cfg: enable SECCOMP config ANDROID: rcu_sync: Export rcu_sync_lockdep_assert RFC: FROMLIST: cgroup: reduce read locked section of cgroup_threadgroup_rwsem during fork RFC: FROMLIST: cgroup: avoid synchronize_sched() in __cgroup_procs_write() RFC: FROMLIST: locking/percpu-rwsem: Optimize readers and reduce global impact net: ipv6: Fix ping to link-local addresses. ipv6: fix endianness error in icmpv6_err ANDROID: dm: android-verity: Allow android-verity to be compiled as an independent module backporting: a brief introduce of backported feautures on 4.4 Linux 4.4.20 sysfs: correctly handle read offset on PREALLOC attrs hwmon: (iio_hwmon) fix memory leak in name attribute ALSA: line6: Fix POD sysfs attributes segfault ALSA: line6: Give up on the lock while URBs are released. ALSA: line6: Remove double line6_pcm_release() after failed acquire. ACPI / SRAT: fix SRAT parsing order with both LAPIC and X2APIC present ACPI / sysfs: fix error code in get_status() ACPI / drivers: replace acpi_probe_lock spinlock with mutex ACPI / drivers: fix typo in ACPI_DECLARE_PROBE_ENTRY macro staging: comedi: ni_mio_common: fix wrong insn_write handler staging: comedi: ni_mio_common: fix AO inttrig backwards compatibility staging: comedi: comedi_test: fix timer race conditions staging: comedi: daqboard2000: bug fix board type matching code USB: serial: option: add WeTelecom 0x6802 and 0x6803 products USB: serial: option: add WeTelecom WM-D200 USB: serial: mos7840: fix non-atomic allocation in write path USB: serial: mos7720: fix non-atomic allocation in write path USB: fix typo in wMaxPacketSize validation usb: chipidea: udc: don't touch DP when controller is in host mode USB: avoid left shift by -1 dmaengine: usb-dmac: check CHCR.DE bit in usb_dmac_isr_channel() crypto: qat - fix aes-xts key sizes crypto: nx - off by one bug in nx_of_update_msc() Input: i8042 - set up shared ps2_cmd_mutex for AUX ports Input: i8042 - break load dependency between atkbd/psmouse and i8042 Input: tegra-kbc - fix inverted reset logic btrfs: properly track when rescan worker is running btrfs: waiting on qgroup rescan should not always be interruptible fs/seq_file: fix out-of-bounds read gpio: Fix OF build problem on UM usb: renesas_usbhs: gadget: fix return value check in usbhs_mod_gadget_probe() megaraid_sas: Fix probing cards without io port mpt3sas: Fix resume on WarpDrive flash cards cdc-acm: fix wrong pipe type on rx interrupt xfers i2c: cros-ec-tunnel: Fix usage of cros_ec_cmd_xfer() mfd: cros_ec: Add cros_ec_cmd_xfer_status() helper aacraid: Check size values after double-fetch from user ARC: Elide redundant setup of DMA callbacks ARC: Call trace_hardirqs_on() before enabling irqs ARC: use correct offset in pt_regs for saving/restoring user mode r25 ARC: build: Better way to detect ISA compatible toolchain drm/i915: fix aliasing_ppgtt leak drm/amdgpu: record error code when ring test failed drm/amd/amdgpu: sdma resume fail during S4 on CI drm/amdgpu: skip TV/CV in display parsing drm/amdgpu: avoid a possible array overflow drm/amdgpu: fix amdgpu_move_blit on 32bit systems drm/amdgpu: Change GART offset to 64-bit iio: fix sched WARNING "do not call blocking ops when !TASK_RUNNING" sched/nohz: Fix affine unpinned timers mess sched/cputime: Fix NO_HZ_FULL getrusage() monotonicity regression of: fix reference counting in of_graph_get_endpoint_by_regs arm64: dts: rockchip: add reset saradc node for rk3368 SoCs mac80211: fix purging multicast PS buffer queue s390/dasd: fix hanging device after clear subchannel EDAC: Increment correct counter in edac_inc_ue_error() pinctrl/amd: Remove the default de-bounce time iommu/arm-smmu: Don't BUG() if we find aborting STEs with disable_bypass iommu/arm-smmu: Fix CMDQ error handling iommu/dma: Don't put uninitialised IOVA domains xhci: Make sure xhci handles USB_SPEED_SUPER_PLUS devices. USB: serial: ftdi_sio: add PIDs for Ivium Technologies devices USB: serial: ftdi_sio: add device ID for WICED USB UART dev board USB: serial: option: add support for Telit LE920A4 USB: serial: option: add D-Link DWM-156/A3 USB: serial: fix memleak in driver-registration error path xhci: don't dereference a xhci member after removing xhci usb: xhci: Fix panic if disconnect xhci: always handle "Command Ring Stopped" events usb/gadget: fix gadgetfs aio support. usb: gadget: fsl_qe_udc: off by one in setup_received_handle() USB: validate wMaxPacketValue entries in endpoint descriptors usb: renesas_usbhs: Use dmac only if the pipe type is bulk usb: renesas_usbhs: clear the BRDYSTS in usbhsg_ep_enable() USB: hub: change the locking in hub_activate USB: hub: fix up early-exit pathway in hub_activate usb: hub: Fix unbalanced reference count/memory leak/deadlocks usb: define USB_SPEED_SUPER_PLUS speed for SuperSpeedPlus USB3.1 devices usb: dwc3: gadget: increment request->actual once usb: dwc3: pci: add Intel Kabylake PCI ID usb: misc: usbtest: add fix for driver hang usb: ehci: change order of register cleanup during shutdown crypto: caam - defer aead_set_sh_desc in case of zero authsize crypto: caam - fix echainiv(authenc) encrypt shared descriptor crypto: caam - fix non-hmac hashes genirq/msi: Make sure PCI MSIs are activated early genirq/msi: Remove unused MSI_FLAG_IDENTITY_MAP um: Don't discard .text.exit section ACPI / CPPC: Prevent cpc_desc_ptr points to the invalid data ACPI: CPPC: Return error if _CPC is invalid on a CPU mmc: sdhci-acpi: Reduce Baytrail eMMC/SD/SDIO hangs PCI: Limit config space size for Netronome NFP4000 PCI: Add Netronome NFP4000 PF device ID PCI: Limit config space size for Netronome NFP6000 family PCI: Add Netronome vendor and device IDs PCI: Support PCIe devices with short cfg_size NVMe: Don't unmap controller registers on reset ALSA: hda - Manage power well properly for resume libnvdimm, nd_blk: mask off reserved status bits perf intel-pt: Fix occasional decoding errors when tracing system-wide vfio/pci: Fix NULL pointer oops in error interrupt setup handling virtio: fix memory leak in virtqueue_add() parisc: Fix order of EREFUSED define in errno.h arm64: Define AT_VECTOR_SIZE_ARCH for ARCH_DLINFO ALSA: usb-audio: Add quirk for ELP HD USB Camera ALSA: usb-audio: Add a sample rate quirk for Creative Live! Cam Socialize HD (VF0610) powerpc/eeh: eeh_pci_enable(): fix checking of post-request state SUNRPC: allow for upcalls for same uid but different gss service SUNRPC: Handle EADDRNOTAVAIL on connection failures tools/testing/nvdimm: fix SIGTERM vs hotplug crash uprobes/x86: Fix RIP-relative handling of EVEX-encoded instructions x86/mm: Disable preemption during CR3 read+write hugetlb: fix nr_pmds accounting with shared page tables mm: SLUB hardened usercopy support mm: SLAB hardened usercopy support s390/uaccess: Enable hardened usercopy sparc/uaccess: Enable hardened usercopy powerpc/uaccess: Enable hardened usercopy ia64/uaccess: Enable hardened usercopy arm64/uaccess: Enable hardened usercopy ARM: uaccess: Enable hardened usercopy x86/uaccess: Enable hardened usercopy x86: remove more uaccess_32.h complexity x86: remove pointless uaccess_32.h complexity x86: fix SMAP in 32-bit environments Use the new batched user accesses in generic user string handling Add 'unsafe' user access functions for batched accesses x86: reorganize SMAP handling in user space accesses mm: Hardened usercopy mm: Implement stack frame object validation mm: Add is_migrate_cma_page Linux 4.4.19 Documentation/module-signing.txt: Note need for version info if reusing a key module: Invalidate signatures on force-loaded modules dm flakey: error READ bios during the down_interval rtc: s3c: Add s3c_rtc_{enable/disable}_clk in s3c_rtc_setfreq() lpfc: fix oops in lpfc_sli4_scmd_to_wqidx_distr() from lpfc_send_taskmgmt() ACPI / EC: Work around method reentrancy limit in ACPICA for _Qxx x86/platform/intel_mid_pci: Rework IRQ0 workaround PCI: Mark Atheros AR9485 and QCA9882 to avoid bus reset MIPS: hpet: Increase HPET_MIN_PROG_DELTA and decrease HPET_MIN_CYCLES MIPS: Don't register r4k sched clock when CPUFREQ enabled MIPS: mm: Fix definition of R6 cache instruction SUNRPC: Don't allocate a full sockaddr_storage for tracing Input: elan_i2c - properly wake up touchpad on ASUS laptops target: Fix ordered task CHECK_CONDITION early exception handling target: Fix max_unmap_lba_count calc overflow target: Fix race between iscsi-target connection shutdown + ABORT_TASK target: Fix missing complete during ABORT_TASK + CMD_T_FABRIC_STOP target: Fix ordered task target_setup_cmd_from_cdb exception hang iscsi-target: Fix panic when adding second TCP connection to iSCSI session ubi: Fix race condition between ubi device creation and udev ubi: Fix early logging ubi: Make volume resize power cut aware of: fix memory leak related to safe_name() IB/mlx4: Fix memory leak if QP creation failed IB/mlx4: Fix error flow when sending mads under SRIOV IB/mlx4: Fix the SQ size of an RC QP IB/IWPM: Fix a potential skb leak IB/IPoIB: Don't update neigh validity for unresolved entries IB/SA: Use correct free function IB/mlx5: Return PORT_ERR in Active to Initializing tranisition IB/mlx5: Fix post send fence logic IB/mlx5: Fix entries check in mlx5_ib_resize_cq IB/mlx5: Fix returned values of query QP IB/mlx5: Fix entries checks in mlx5_ib_create_cq IB/mlx5: Fix MODIFY_QP command input structure ALSA: hda - Fix headset mic detection problem for two dell machines ALSA: hda: add AMD Bonaire AZ PCI ID with proper driver caps ALSA: hda/realtek - Can't adjust speaker's volume on a Dell AIO ALSA: hda: Fix krealloc() with __GFP_ZERO usage mm/hugetlb: avoid soft lockup in set_max_huge_pages() mtd: nand: fix bug writing 1 byte less than page size block: fix bdi vs gendisk lifetime mismatch block: add missing group association in bio-cloning functions metag: Fix __cmpxchg_u32 asm constraint for CMP ftrace/recordmcount: Work around for addition of metag magic but not relocations balloon: check the number of available pages in leak balloon drm/i915/dp: Revert "drm/i915/dp: fall back to 18 bpp when sink capability is unknown" drm/i915: Never fully mask the the EI up rps interrupt on SNB/IVB drm/edid: Add 6 bpc quirk for display AEO model 0. drm: Restore double clflush on the last partial cacheline drm/nouveau/fbcon: fix font width not divisible by 8 drm/nouveau/gr/nv3x: fix instobj write offsets in gr setup drm/nouveau: check for supported chipset before booting fbdev off the hw drm/radeon: support backlight control for UNIPHY3 drm/radeon: fix firmware info version checks drm/radeon: Poll for both connect/disconnect on analog connectors drm/radeon: add a delay after ATPX dGPU power off drm/amdgpu/gmc7: add missing mullins case drm/amdgpu: fix firmware info version checks drm/amdgpu: Disable RPM helpers while reprobing connectors on resume drm/amdgpu: support backlight control for UNIPHY3 drm/amdgpu: Poll for both connect/disconnect on analog connectors drm/amdgpu: add a delay after ATPX dGPU power off w1:omap_hdq: fix regression netlabel: add address family checks to netlbl_{sock,req}_delattr() ARM: dts: sunxi: Add a startup delay for fixed regulator enabled phys audit: fix a double fetch in audit_log_single_execve_arg() iommu/amd: Update Alias-DTE in update_device_table() iommu/amd: Init unity mappings only for dma_ops domains iommu/amd: Handle IOMMU_DOMAIN_DMA in ops->domain_free call-back iommu/vt-d: Return error code in domain_context_mapping_one() iommu/exynos: Suppress unbinding to prevent system failure drm/i915: Don't complain about lack of ACPI video bios nfsd: don't return an unhashed lock stateid after taking mutex nfsd: Fix race between FREE_STATEID and LOCK nfs: don't create zero-length requests MIPS: KVM: Propagate kseg0/mapped tlb fault errors MIPS: KVM: Fix gfn range check in kseg0 tlb faults MIPS: KVM: Add missing gfn range check MIPS: KVM: Fix mapped fault broken commpage handling random: add interrupt callback to VMBus IRQ handler random: print a warning for the first ten uninitialized random users random: initialize the non-blocking pool via add_hwgenerator_randomness() CIFS: Fix a possible invalid memory access in smb2_query_symlink() cifs: fix crash due to race in hmac(md5) handling cifs: Check for existing directory when opening file with O_CREAT fs/cifs: make share unaccessible at root level mountable jbd2: make journal y2038 safe ARC: mm: don't loose PTE_SPECIAL in pte_modify() remoteproc: Fix potential race condition in rproc_add ovl: disallow overlayfs as upperdir HID: uhid: fix timeout when probe races with IO EDAC: Correct channel count limit Bluetooth: Fix l2cap_sock_setsockopt() with optname BT_RCVMTU spi: pxa2xx: Clear all RFT bits in reset_sccr1() on Intel Quark i2c: efm32: fix a failure path in efm32_i2c_probe() s5p-mfc: Add release callback for memory region devs s5p-mfc: Set device name for reserved memory region devs hp-wmi: Fix wifi cannot be hard-unblocked dm: set DMF_SUSPENDED* _before_ clearing DMF_NOFLUSH_SUSPENDING sur40: fix occasional oopses on device close sur40: lower poll interval to fix occasional FPS drops to ~56 FPS Fix RC5 decoding with Fintek CIR chipset vb2: core: Skip planes array verification if pb is NULL videobuf2-v4l2: Verify planes array in buffer dequeueing media: dvb_ringbuffer: Add memory barriers media: usbtv: prevent access to free'd resources mfd: qcom_rpm: Parametrize also ack selector size mfd: qcom_rpm: Fix offset error for msm8660 intel_pstate: Fix MSR_CONFIG_TDP_x addressing in core_get_max_pstate() s390/cio: allow to reset channel measurement block KVM: nVMX: Fix memory corruption when using VMCS shadowing KVM: VMX: handle PML full VMEXIT that occurs during event delivery KVM: MTRR: fix kvm_mtrr_check_gfn_range_consistency page fault KVM: PPC: Book3S HV: Save/restore TM state in H_CEDE KVM: PPC: Book3S HV: Pull out TM state save/restore into separate procedures arm64: mm: avoid fdt_check_header() before the FDT is fully mapped arm64: dts: rockchip: fixes the gic400 2nd region size for rk3368 pinctrl: cherryview: prevent concurrent access to GPIO controllers Bluetooth: hci_intel: Fix null gpio desc pointer dereference gpio: intel-mid: Remove potentially harmful code gpio: pca953x: Fix NBANK calculation for PCA9536 tty/serial: atmel: fix RS485 half duplex with DMA serial: samsung: Fix ERR pointer dereference on deferred probe tty: serial: msm: Don't read off end of tx fifo arm64: Fix incorrect per-cpu usage for boot CPU arm64: debug: unmask PSTATE.D earlier arm64: kernel: Save and restore UAO and addr_limit on exception entry USB: usbfs: fix potential infoleak in devio usb: renesas_usbhs: fix NULL pointer dereference in xfer_work() USB: serial: option: add support for Telit LE910 PID 0x1206 usb: dwc3: fix for the isoc transfer EP_BUSY flag usb: quirks: Add no-lpm quirk for Elan usb: renesas_usbhs: protect the CFIFOSEL setting in usbhsg_ep_enable() usb: f_fs: off by one bug in _ffs_func_bind() usb: gadget: avoid exposing kernel stack UPSTREAM: usb: gadget: configfs: add mutex lock before unregister gadget ANDROID: dm-verity: adopt changes made to dm callbacks UPSTREAM: ecryptfs: fix handling of directory opening ANDROID: net: core: fix UID-based routing ANDROID: net: fib: remove duplicate assignment FROMLIST: proc: Fix timerslack_ns CAP_SYS_NICE check when adjusting self ANDROID: dm verity fec: pack the fec_header structure ANDROID: dm: android-verity: Verify header before fetching table ANDROID: dm: allow adb disable-verity only in userdebug ANDROID: dm: mount as linear target if eng build ANDROID: dm: use default verity public key ANDROID: dm: fix signature verification flag ANDROID: dm: use name_to_dev_t ANDROID: dm: rename dm-linear methods for dm-android-verity ANDROID: dm: Minor cleanup ANDROID: dm: Mounting root as linear device when verity disabled ANDROID: dm-android-verity: Rebase on top of 4.1 ANDROID: dm: Add android verity target ANDROID: dm: fix dm_substitute_devices() ANDROID: dm: Rebase on top of 4.1 CHROMIUM: dm: boot time specification of dm= Implement memory_state_time, used by qcom,cpubw Revert "panic: Add board ID to panic output" usb: gadget: f_accessory: remove duplicate endpoint alloc BACKPORT: brcmfmac: defer DPC processing during probe FROMLIST: proc: Add LSM hook checks to /proc/<tid>/timerslack_ns FROMLIST: proc: Relax /proc/<tid>/timerslack_ns capability requirements UPSTREAM: ppp: defer netns reference release for ppp channel cpuset: Add allow_attach hook for cpusets on android. UPSTREAM: KEYS: Fix ASN.1 indefinite length object parsing ANDROID: sdcardfs: fix itnull.cocci warnings android-recommended.cfg: enable fstack-protector-strong Linux 4.4.18 mm: memcontrol: fix memcg id ref counter on swap charge move mm: memcontrol: fix swap counter leak on swapout from offline cgroup mm: memcontrol: fix cgroup creation failure after many small jobs ext4: fix reference counting bug on block allocation error ext4: short-cut orphan cleanup on error ext4: validate s_reserved_gdt_blocks on mount ext4: don't call ext4_should_journal_data() on the journal inode ext4: fix deadlock during page writeback ext4: check for extents that wrap around crypto: scatterwalk - Fix test in scatterwalk_done crypto: gcm - Filter out async ghash if necessary fs/dcache.c: avoid soft-lockup in dput() fuse: fix wrong assignment of ->flags in fuse_send_init() fuse: fuse_flush must check mapping->flags for errors fuse: fsync() did not return IO errors sysv, ipc: fix security-layer leaking block: fix use-after-free in seq file x86/syscalls/64: Add compat_sys_keyctl for 32-bit userspace drm/i915: Pretend cursor is always on for ILK-style WM calculations (v2) x86/mm/pat: Fix BUG_ON() in mmap_mem() on QEMU/i386 x86/pat: Document the PAT initialization sequence x86/xen, pat: Remove PAT table init code from Xen x86/mtrr: Fix PAT init handling when MTRR is disabled x86/mtrr: Fix Xorg crashes in Qemu sessions x86/mm/pat: Replace cpu_has_pat with boot_cpu_has() x86/mm/pat: Add pat_disable() interface x86/mm/pat: Add support of non-default PAT MSR setting devpts: clean up interface to pty drivers random: strengthen input validation for RNDADDTOENTCNT apparmor: fix ref count leak when profile sha1 hash is read Revert "s390/kdump: Clear subchannel ID to signal non-CCW/SCSI IPL" KEYS: 64-bit MIPS needs to use compat_sys_keyctl for 32-bit userspace arm: oabi compat: add missing access checks cdc_ncm: do not call usbnet_link_change from cdc_ncm_bind i2c: i801: Allow ACPI SystemIO OpRegion to conflict with PCI BAR x86/mm/32: Enable full randomization on i386 and X86_32 HID: sony: do not bail out when the sixaxis refuses the output report PNP: Add Broadwell to Intel MCH size workaround PNP: Add Haswell-ULT to Intel MCH size workaround scsi: ignore errors from scsi_dh_add_device() ipath: Restrict use of the write() interface tcp: consider recv buf for the initial window scale qed: Fix setting/clearing bit in completion bitmap net/irda: fix NULL pointer dereference on memory allocation failure net: bgmac: Fix infinite loop in bgmac_dma_tx_add() bonding: set carrier off for devices created through netlink ipv4: reject RTNH_F_DEAD and RTNH_F_LINKDOWN from user space tcp: enable per-socket rate limiting of all 'challenge acks' tcp: make challenge acks less predictable arm64: relocatable: suppress R_AARCH64_ABS64 relocations in vmlinux arm64: vmlinux.lds: make __rela_offset and __dynsym_offset ABSOLUTE Linux 4.4.17 vfs: fix deadlock in file_remove_privs() on overlayfs intel_th: Fix a deadlock in modprobing intel_th: pci: Add Kaby Lake PCH-H support net: mvneta: set real interrupt per packet for tx_done libceph: apply new_state before new_up_client on incrementals libata: LITE-ON CX1-JB256-HP needs lower max_sectors i2c: mux: reg: wrong condition checked for of_address_to_resource return value posix_cpu_timer: Exit early when process has been reaped media: fix airspy usb probe error path ipr: Clear interrupt on croc/crocodile when running with LSI SCSI: fix new bug in scsi_dev_info_list string matching RDS: fix rds_tcp_init() error path can: fix oops caused by wrong rtnl dellink usage can: fix handling of unmodifiable configuration options fix can: c_can: Update D_CAN TX and RX functions to 32 bit - fix Altera Cyclone access can: at91_can: RX queue could get stuck at high bus load perf/x86: fix PEBS issues on Intel Atom/Core2 ovl: handle ATTR_KILL* sched/fair: Fix effective_load() to consistently use smoothed load mmc: block: fix packed command header endianness block: fix use-after-free in sys_ioprio_get() qeth: delete napi struct when removing a qeth device platform/chrome: cros_ec_dev - double fetch bug in ioctl clk: rockchip: initialize flags of clk_init_data in mmc-phase clock spi: sun4i: fix FIFO limit spi: sunxi: fix transfer timeout namespace: update event counter when umounting a deleted dentry 9p: use file_dentry() ext4: verify extent header depth ecryptfs: don't allow mmap when the lower fs doesn't support it Revert "ecryptfs: forbid opening files without mmap handler" locks: use file_inode() power_supply: power_supply_read_temp only if use_cnt > 0 cgroup: set css->id to -1 during init pinctrl: imx: Do not treat a PIN without MUX register as an error pinctrl: single: Fix missing flush of posted write for a wakeirq pvclock: Add CPU barriers to get correct version value Input: tsc200x - report proper input_dev name Input: xpad - validate USB endpoint count during probe Input: wacom_w8001 - w8001_MAX_LENGTH should be 13 Input: xpad - fix oops when attaching an unknown Xbox One gamepad Input: elantech - add more IC body types to the list Input: vmmouse - remove port reservation ALSA: timer: Fix leak in events via snd_timer_user_tinterrupt ALSA: timer: Fix leak in events via snd_timer_user_ccallback ALSA: timer: Fix leak in SNDRV_TIMER_IOCTL_PARAMS xenbus: don't bail early from xenbus_dev_request_and_reply() xenbus: don't BUG() on user mode induced condition xen/pciback: Fix conf_space read/write overlap check. ARC: unwind: ensure that .debug_frame is generated (vs. .eh_frame) arc: unwind: warn only once if DW2_UNWIND is disabled kernel/sysrq, watchdog, sched/core: Reset watchdog on all CPUs while processing sysrq-w pps: do not crash when failed to register vmlinux.lds: account for destructor sections mm, meminit: ensure node is online before checking whether pages are uninitialised mm, meminit: always return a valid node from early_pfn_to_nid mm, compaction: prevent VM_BUG_ON when terminating freeing scanner fs/nilfs2: fix potential underflow in call to crc32_le mm, compaction: abort free scanner if split fails mm, sl[au]b: add __GFP_ATOMIC to the GFP reclaim mask dmaengine: at_xdmac: double FIFO flush needed to compute residue dmaengine: at_xdmac: fix residue corruption dmaengine: at_xdmac: align descriptors on 64 bits x86/quirks: Add early quirk to reset Apple AirPort card x86/quirks: Reintroduce scanning of secondary buses x86/quirks: Apply nvidia_bugs quirk only on root bus USB: OHCI: Don't mark EDs as ED_OPER if scheduling fails Conflicts: arch/arm/kernel/topology.c arch/arm64/include/asm/arch_gicv3.h arch/arm64/kernel/topology.c block/bio.c drivers/cpufreq/Kconfig drivers/md/Makefile drivers/media/dvb-core/dvb_ringbuffer.c drivers/media/tuners/tuner-xc2028.c drivers/misc/Kconfig drivers/misc/Makefile drivers/mmc/core/host.c drivers/scsi/ufs/ufshcd.c drivers/scsi/ufs/ufshcd.h drivers/usb/dwc3/gadget.c drivers/usb/gadget/configfs.c fs/ecryptfs/file.c include/linux/mmc/core.h include/linux/mmc/host.h include/linux/mmzone.h include/linux/sched.h include/linux/sched/sysctl.h include/trace/events/power.h include/trace/events/sched.h init/Kconfig kernel/cpuset.c kernel/exit.c kernel/sched/Makefile kernel/sched/core.c kernel/sched/cputime.c kernel/sched/fair.c kernel/sched/features.h kernel/sched/rt.c kernel/sched/sched.h kernel/sched/stop_task.c kernel/sched/tune.c lib/Kconfig.debug mm/Makefile mm/vmstat.c Change-Id: I243a43231ca56a6362076fa6301827e1b0493be5 Signed-off-by: Runmin Wang <runminw@codeaurora.org>
1240 lines
38 KiB
C
1240 lines
38 KiB
C
#ifndef _LINUX_MMZONE_H
|
|
#define _LINUX_MMZONE_H
|
|
|
|
#ifndef __ASSEMBLY__
|
|
#ifndef __GENERATING_BOUNDS_H
|
|
|
|
#include <linux/spinlock.h>
|
|
#include <linux/list.h>
|
|
#include <linux/wait.h>
|
|
#include <linux/bitops.h>
|
|
#include <linux/cache.h>
|
|
#include <linux/threads.h>
|
|
#include <linux/numa.h>
|
|
#include <linux/init.h>
|
|
#include <linux/seqlock.h>
|
|
#include <linux/nodemask.h>
|
|
#include <linux/pageblock-flags.h>
|
|
#include <linux/page-flags-layout.h>
|
|
#include <linux/atomic.h>
|
|
#include <asm/page.h>
|
|
|
|
/* Free memory management - zoned buddy allocator. */
|
|
#ifndef CONFIG_FORCE_MAX_ZONEORDER
|
|
#define MAX_ORDER 11
|
|
#else
|
|
#define MAX_ORDER CONFIG_FORCE_MAX_ZONEORDER
|
|
#endif
|
|
#define MAX_ORDER_NR_PAGES (1 << (MAX_ORDER - 1))
|
|
|
|
/*
|
|
* PAGE_ALLOC_COSTLY_ORDER is the order at which allocations are deemed
|
|
* costly to service. That is between allocation orders which should
|
|
* coalesce naturally under reasonable reclaim pressure and those which
|
|
* will not.
|
|
*/
|
|
#define PAGE_ALLOC_COSTLY_ORDER 3
|
|
|
|
enum {
|
|
MIGRATE_UNMOVABLE,
|
|
MIGRATE_MOVABLE,
|
|
MIGRATE_RECLAIMABLE,
|
|
#ifdef CONFIG_CMA
|
|
/*
|
|
* MIGRATE_CMA migration type is designed to mimic the way
|
|
* ZONE_MOVABLE works. Only movable pages can be allocated
|
|
* from MIGRATE_CMA pageblocks and page allocator never
|
|
* implicitly change migration type of MIGRATE_CMA pageblock.
|
|
*
|
|
* The way to use it is to change migratetype of a range of
|
|
* pageblocks to MIGRATE_CMA which can be done by
|
|
* __free_pageblock_cma() function. What is important though
|
|
* is that a range of pageblocks must be aligned to
|
|
* MAX_ORDER_NR_PAGES should biggest page be bigger then
|
|
* a single pageblock.
|
|
*/
|
|
MIGRATE_CMA,
|
|
#endif
|
|
MIGRATE_PCPTYPES, /* the number of types on the pcp lists */
|
|
MIGRATE_HIGHATOMIC = MIGRATE_PCPTYPES,
|
|
#ifdef CONFIG_MEMORY_ISOLATION
|
|
MIGRATE_ISOLATE, /* can't allocate from here */
|
|
#endif
|
|
MIGRATE_TYPES
|
|
};
|
|
|
|
/*
|
|
* Returns a list which contains the migrate types on to which
|
|
* an allocation falls back when the free list for the migrate
|
|
* type mtype is depleted.
|
|
* The end of the list is delimited by the type MIGRATE_TYPES.
|
|
*/
|
|
extern int *get_migratetype_fallbacks(int mtype);
|
|
|
|
#ifdef CONFIG_CMA
|
|
bool is_cma_pageblock(struct page *page);
|
|
# define is_migrate_cma(migratetype) unlikely((migratetype) == MIGRATE_CMA)
|
|
# define get_cma_migrate_type() MIGRATE_CMA
|
|
# define is_migrate_cma_page(_page) (get_pageblock_migratetype(_page) == MIGRATE_CMA)
|
|
#else
|
|
# define is_cma_pageblock(page) false
|
|
# define is_migrate_cma(migratetype) false
|
|
# define get_cma_migrate_type() MIGRATE_MOVABLE
|
|
# define is_migrate_cma_page(_page) false
|
|
#endif
|
|
|
|
#define for_each_migratetype_order(order, type) \
|
|
for (order = 0; order < MAX_ORDER; order++) \
|
|
for (type = 0; type < MIGRATE_TYPES; type++)
|
|
|
|
extern int page_group_by_mobility_disabled;
|
|
|
|
#define NR_MIGRATETYPE_BITS (PB_migrate_end - PB_migrate + 1)
|
|
#define MIGRATETYPE_MASK ((1UL << NR_MIGRATETYPE_BITS) - 1)
|
|
|
|
#define get_pageblock_migratetype(page) \
|
|
get_pfnblock_flags_mask(page, page_to_pfn(page), \
|
|
PB_migrate_end, MIGRATETYPE_MASK)
|
|
|
|
static inline int get_pfnblock_migratetype(struct page *page, unsigned long pfn)
|
|
{
|
|
BUILD_BUG_ON(PB_migrate_end - PB_migrate != 2);
|
|
return get_pfnblock_flags_mask(page, pfn, PB_migrate_end,
|
|
MIGRATETYPE_MASK);
|
|
}
|
|
|
|
struct free_area {
|
|
struct list_head free_list[MIGRATE_TYPES];
|
|
unsigned long nr_free;
|
|
};
|
|
|
|
struct pglist_data;
|
|
|
|
/*
|
|
* zone->lock and zone->lru_lock are two of the hottest locks in the kernel.
|
|
* So add a wild amount of padding here to ensure that they fall into separate
|
|
* cachelines. There are very few zone structures in the machine, so space
|
|
* consumption is not a concern here.
|
|
*/
|
|
#if defined(CONFIG_SMP)
|
|
struct zone_padding {
|
|
char x[0];
|
|
} ____cacheline_internodealigned_in_smp;
|
|
#define ZONE_PADDING(name) struct zone_padding name;
|
|
#else
|
|
#define ZONE_PADDING(name)
|
|
#endif
|
|
|
|
enum zone_stat_item {
|
|
/* First 128 byte cacheline (assuming 64 bit words) */
|
|
NR_FREE_PAGES,
|
|
NR_ALLOC_BATCH,
|
|
NR_LRU_BASE,
|
|
NR_INACTIVE_ANON = NR_LRU_BASE, /* must match order of LRU_[IN]ACTIVE */
|
|
NR_ACTIVE_ANON, /* " " " " " */
|
|
NR_INACTIVE_FILE, /* " " " " " */
|
|
NR_ACTIVE_FILE, /* " " " " " */
|
|
NR_UNEVICTABLE, /* " " " " " */
|
|
NR_MLOCK, /* mlock()ed pages found and moved off LRU */
|
|
NR_ANON_PAGES, /* Mapped anonymous pages */
|
|
NR_FILE_MAPPED, /* pagecache pages mapped into pagetables.
|
|
only modified from process context */
|
|
NR_FILE_PAGES,
|
|
NR_FILE_DIRTY,
|
|
NR_WRITEBACK,
|
|
NR_SLAB_RECLAIMABLE,
|
|
NR_SLAB_UNRECLAIMABLE,
|
|
NR_PAGETABLE, /* used for pagetables */
|
|
NR_KERNEL_STACK,
|
|
/* Second 128 byte cacheline */
|
|
NR_UNSTABLE_NFS, /* NFS unstable pages */
|
|
NR_BOUNCE,
|
|
NR_VMSCAN_WRITE,
|
|
NR_VMSCAN_IMMEDIATE, /* Prioritise for reclaim when writeback ends */
|
|
NR_WRITEBACK_TEMP, /* Writeback using temporary buffers */
|
|
NR_ISOLATED_ANON, /* Temporary isolated pages from anon lru */
|
|
NR_ISOLATED_FILE, /* Temporary isolated pages from file lru */
|
|
NR_SHMEM, /* shmem pages (included tmpfs/GEM pages) */
|
|
NR_DIRTIED, /* page dirtyings since bootup */
|
|
NR_WRITTEN, /* page writings since bootup */
|
|
NR_PAGES_SCANNED, /* pages scanned since last reclaim */
|
|
#ifdef CONFIG_NUMA
|
|
NUMA_HIT, /* allocated in intended node */
|
|
NUMA_MISS, /* allocated in non intended node */
|
|
NUMA_FOREIGN, /* was intended here, hit elsewhere */
|
|
NUMA_INTERLEAVE_HIT, /* interleaver preferred this zone */
|
|
NUMA_LOCAL, /* allocation from local node */
|
|
NUMA_OTHER, /* allocation from other node */
|
|
#endif
|
|
WORKINGSET_REFAULT,
|
|
WORKINGSET_ACTIVATE,
|
|
WORKINGSET_NODERECLAIM,
|
|
NR_ANON_TRANSPARENT_HUGEPAGES,
|
|
NR_FREE_CMA_PAGES,
|
|
NR_SWAPCACHE,
|
|
NR_VM_ZONE_STAT_ITEMS };
|
|
|
|
/*
|
|
* We do arithmetic on the LRU lists in various places in the code,
|
|
* so it is important to keep the active lists LRU_ACTIVE higher in
|
|
* the array than the corresponding inactive lists, and to keep
|
|
* the *_FILE lists LRU_FILE higher than the corresponding _ANON lists.
|
|
*
|
|
* This has to be kept in sync with the statistics in zone_stat_item
|
|
* above and the descriptions in vmstat_text in mm/vmstat.c
|
|
*/
|
|
#define LRU_BASE 0
|
|
#define LRU_ACTIVE 1
|
|
#define LRU_FILE 2
|
|
|
|
enum lru_list {
|
|
LRU_INACTIVE_ANON = LRU_BASE,
|
|
LRU_ACTIVE_ANON = LRU_BASE + LRU_ACTIVE,
|
|
LRU_INACTIVE_FILE = LRU_BASE + LRU_FILE,
|
|
LRU_ACTIVE_FILE = LRU_BASE + LRU_FILE + LRU_ACTIVE,
|
|
LRU_UNEVICTABLE,
|
|
NR_LRU_LISTS
|
|
};
|
|
|
|
#define for_each_lru(lru) for (lru = 0; lru < NR_LRU_LISTS; lru++)
|
|
|
|
#define for_each_evictable_lru(lru) for (lru = 0; lru <= LRU_ACTIVE_FILE; lru++)
|
|
|
|
static inline int is_file_lru(enum lru_list lru)
|
|
{
|
|
return (lru == LRU_INACTIVE_FILE || lru == LRU_ACTIVE_FILE);
|
|
}
|
|
|
|
static inline int is_active_lru(enum lru_list lru)
|
|
{
|
|
return (lru == LRU_ACTIVE_ANON || lru == LRU_ACTIVE_FILE);
|
|
}
|
|
|
|
static inline int is_unevictable_lru(enum lru_list lru)
|
|
{
|
|
return (lru == LRU_UNEVICTABLE);
|
|
}
|
|
|
|
struct zone_reclaim_stat {
|
|
/*
|
|
* The pageout code in vmscan.c keeps track of how many of the
|
|
* mem/swap backed and file backed pages are referenced.
|
|
* The higher the rotated/scanned ratio, the more valuable
|
|
* that cache is.
|
|
*
|
|
* The anon LRU stats live in [0], file LRU stats in [1]
|
|
*/
|
|
unsigned long recent_rotated[2];
|
|
unsigned long recent_scanned[2];
|
|
};
|
|
|
|
struct lruvec {
|
|
struct list_head lists[NR_LRU_LISTS];
|
|
struct zone_reclaim_stat reclaim_stat;
|
|
#ifdef CONFIG_MEMCG
|
|
struct zone *zone;
|
|
#endif
|
|
};
|
|
|
|
/* Mask used at gathering information at once (see memcontrol.c) */
|
|
#define LRU_ALL_FILE (BIT(LRU_INACTIVE_FILE) | BIT(LRU_ACTIVE_FILE))
|
|
#define LRU_ALL_ANON (BIT(LRU_INACTIVE_ANON) | BIT(LRU_ACTIVE_ANON))
|
|
#define LRU_ALL ((1 << NR_LRU_LISTS) - 1)
|
|
|
|
/* Isolate clean file */
|
|
#define ISOLATE_CLEAN ((__force isolate_mode_t)0x1)
|
|
/* Isolate unmapped file */
|
|
#define ISOLATE_UNMAPPED ((__force isolate_mode_t)0x2)
|
|
/* Isolate for asynchronous migration */
|
|
#define ISOLATE_ASYNC_MIGRATE ((__force isolate_mode_t)0x4)
|
|
/* Isolate unevictable pages */
|
|
#define ISOLATE_UNEVICTABLE ((__force isolate_mode_t)0x8)
|
|
|
|
/* LRU Isolation modes. */
|
|
typedef unsigned __bitwise__ isolate_mode_t;
|
|
|
|
enum zone_watermarks {
|
|
WMARK_MIN,
|
|
WMARK_LOW,
|
|
WMARK_HIGH,
|
|
NR_WMARK
|
|
};
|
|
|
|
#define min_wmark_pages(z) (z->watermark[WMARK_MIN])
|
|
#define low_wmark_pages(z) (z->watermark[WMARK_LOW])
|
|
#define high_wmark_pages(z) (z->watermark[WMARK_HIGH])
|
|
|
|
struct per_cpu_pages {
|
|
int count; /* number of pages in the list */
|
|
int high; /* high watermark, emptying needed */
|
|
int batch; /* chunk size for buddy add/remove */
|
|
|
|
/* Lists of pages, one per migrate type stored on the pcp-lists */
|
|
struct list_head lists[MIGRATE_PCPTYPES];
|
|
};
|
|
|
|
struct per_cpu_pageset {
|
|
struct per_cpu_pages pcp;
|
|
#ifdef CONFIG_NUMA
|
|
s8 expire;
|
|
#endif
|
|
#ifdef CONFIG_SMP
|
|
s8 stat_threshold;
|
|
s8 vm_stat_diff[NR_VM_ZONE_STAT_ITEMS];
|
|
#endif
|
|
};
|
|
|
|
#endif /* !__GENERATING_BOUNDS.H */
|
|
|
|
enum zone_type {
|
|
#ifdef CONFIG_ZONE_DMA
|
|
/*
|
|
* ZONE_DMA is used when there are devices that are not able
|
|
* to do DMA to all of addressable memory (ZONE_NORMAL). Then we
|
|
* carve out the portion of memory that is needed for these devices.
|
|
* The range is arch specific.
|
|
*
|
|
* Some examples
|
|
*
|
|
* Architecture Limit
|
|
* ---------------------------
|
|
* parisc, ia64, sparc <4G
|
|
* s390 <2G
|
|
* arm Various
|
|
* alpha Unlimited or 0-16MB.
|
|
*
|
|
* i386, x86_64 and multiple other arches
|
|
* <16M.
|
|
*/
|
|
ZONE_DMA,
|
|
#endif
|
|
#ifdef CONFIG_ZONE_DMA32
|
|
/*
|
|
* x86_64 needs two ZONE_DMAs because it supports devices that are
|
|
* only able to do DMA to the lower 16M but also 32 bit devices that
|
|
* can only do DMA areas below 4G.
|
|
*/
|
|
ZONE_DMA32,
|
|
#endif
|
|
/*
|
|
* Normal addressable memory is in ZONE_NORMAL. DMA operations can be
|
|
* performed on pages in ZONE_NORMAL if the DMA devices support
|
|
* transfers to all addressable memory.
|
|
*/
|
|
ZONE_NORMAL,
|
|
#ifdef CONFIG_HIGHMEM
|
|
/*
|
|
* A memory area that is only addressable by the kernel through
|
|
* mapping portions into its own address space. This is for example
|
|
* used by i386 to allow the kernel to address the memory beyond
|
|
* 900MB. The kernel will set up special mappings (page
|
|
* table entries on i386) for each page that the kernel needs to
|
|
* access.
|
|
*/
|
|
ZONE_HIGHMEM,
|
|
#endif
|
|
ZONE_MOVABLE,
|
|
#ifdef CONFIG_ZONE_DEVICE
|
|
ZONE_DEVICE,
|
|
#endif
|
|
__MAX_NR_ZONES
|
|
|
|
};
|
|
|
|
#ifndef __GENERATING_BOUNDS_H
|
|
|
|
struct zone {
|
|
/* Read-mostly fields */
|
|
|
|
/* zone watermarks, access with *_wmark_pages(zone) macros */
|
|
unsigned long watermark[NR_WMARK];
|
|
|
|
unsigned long nr_reserved_highatomic;
|
|
|
|
/*
|
|
* We don't know if the memory that we're going to allocate will be
|
|
* freeable or/and it will be released eventually, so to avoid totally
|
|
* wasting several GB of ram we must reserve some of the lower zone
|
|
* memory (otherwise we risk to run OOM on the lower zones despite
|
|
* there being tons of freeable ram on the higher zones). This array is
|
|
* recalculated at runtime if the sysctl_lowmem_reserve_ratio sysctl
|
|
* changes.
|
|
*/
|
|
long lowmem_reserve[MAX_NR_ZONES];
|
|
|
|
#ifdef CONFIG_NUMA
|
|
int node;
|
|
#endif
|
|
|
|
/*
|
|
* The target ratio of ACTIVE_ANON to INACTIVE_ANON pages on
|
|
* this zone's LRU. Maintained by the pageout code.
|
|
*/
|
|
unsigned int inactive_ratio;
|
|
|
|
struct pglist_data *zone_pgdat;
|
|
struct per_cpu_pageset __percpu *pageset;
|
|
|
|
/*
|
|
* This is a per-zone reserve of pages that should not be
|
|
* considered dirtyable memory.
|
|
*/
|
|
unsigned long dirty_balance_reserve;
|
|
#ifdef CONFIG_CMA
|
|
bool cma_alloc;
|
|
#endif
|
|
|
|
#ifndef CONFIG_SPARSEMEM
|
|
/*
|
|
* Flags for a pageblock_nr_pages block. See pageblock-flags.h.
|
|
* In SPARSEMEM, this map is stored in struct mem_section
|
|
*/
|
|
unsigned long *pageblock_flags;
|
|
#endif /* CONFIG_SPARSEMEM */
|
|
|
|
#ifdef CONFIG_NUMA
|
|
/*
|
|
* zone reclaim becomes active if more unmapped pages exist.
|
|
*/
|
|
unsigned long min_unmapped_pages;
|
|
unsigned long min_slab_pages;
|
|
#endif /* CONFIG_NUMA */
|
|
|
|
/* zone_start_pfn == zone_start_paddr >> PAGE_SHIFT */
|
|
unsigned long zone_start_pfn;
|
|
|
|
/*
|
|
* spanned_pages is the total pages spanned by the zone, including
|
|
* holes, which is calculated as:
|
|
* spanned_pages = zone_end_pfn - zone_start_pfn;
|
|
*
|
|
* present_pages is physical pages existing within the zone, which
|
|
* is calculated as:
|
|
* present_pages = spanned_pages - absent_pages(pages in holes);
|
|
*
|
|
* managed_pages is present pages managed by the buddy system, which
|
|
* is calculated as (reserved_pages includes pages allocated by the
|
|
* bootmem allocator):
|
|
* managed_pages = present_pages - reserved_pages;
|
|
*
|
|
* So present_pages may be used by memory hotplug or memory power
|
|
* management logic to figure out unmanaged pages by checking
|
|
* (present_pages - managed_pages). And managed_pages should be used
|
|
* by page allocator and vm scanner to calculate all kinds of watermarks
|
|
* and thresholds.
|
|
*
|
|
* Locking rules:
|
|
*
|
|
* zone_start_pfn and spanned_pages are protected by span_seqlock.
|
|
* It is a seqlock because it has to be read outside of zone->lock,
|
|
* and it is done in the main allocator path. But, it is written
|
|
* quite infrequently.
|
|
*
|
|
* The span_seq lock is declared along with zone->lock because it is
|
|
* frequently read in proximity to zone->lock. It's good to
|
|
* give them a chance of being in the same cacheline.
|
|
*
|
|
* Write access to present_pages at runtime should be protected by
|
|
* mem_hotplug_begin/end(). Any reader who can't tolerant drift of
|
|
* present_pages should get_online_mems() to get a stable value.
|
|
*
|
|
* Read access to managed_pages should be safe because it's unsigned
|
|
* long. Write access to zone->managed_pages and totalram_pages are
|
|
* protected by managed_page_count_lock at runtime. Idealy only
|
|
* adjust_managed_page_count() should be used instead of directly
|
|
* touching zone->managed_pages and totalram_pages.
|
|
*/
|
|
unsigned long managed_pages;
|
|
unsigned long spanned_pages;
|
|
unsigned long present_pages;
|
|
|
|
const char *name;
|
|
|
|
#ifdef CONFIG_MEMORY_ISOLATION
|
|
/*
|
|
* Number of isolated pageblock. It is used to solve incorrect
|
|
* freepage counting problem due to racy retrieving migratetype
|
|
* of pageblock. Protected by zone->lock.
|
|
*/
|
|
unsigned long nr_isolate_pageblock;
|
|
#endif
|
|
|
|
#ifdef CONFIG_MEMORY_HOTPLUG
|
|
/* see spanned/present_pages for more description */
|
|
seqlock_t span_seqlock;
|
|
#endif
|
|
|
|
/*
|
|
* wait_table -- the array holding the hash table
|
|
* wait_table_hash_nr_entries -- the size of the hash table array
|
|
* wait_table_bits -- wait_table_size == (1 << wait_table_bits)
|
|
*
|
|
* The purpose of all these is to keep track of the people
|
|
* waiting for a page to become available and make them
|
|
* runnable again when possible. The trouble is that this
|
|
* consumes a lot of space, especially when so few things
|
|
* wait on pages at a given time. So instead of using
|
|
* per-page waitqueues, we use a waitqueue hash table.
|
|
*
|
|
* The bucket discipline is to sleep on the same queue when
|
|
* colliding and wake all in that wait queue when removing.
|
|
* When something wakes, it must check to be sure its page is
|
|
* truly available, a la thundering herd. The cost of a
|
|
* collision is great, but given the expected load of the
|
|
* table, they should be so rare as to be outweighed by the
|
|
* benefits from the saved space.
|
|
*
|
|
* __wait_on_page_locked() and unlock_page() in mm/filemap.c, are the
|
|
* primary users of these fields, and in mm/page_alloc.c
|
|
* free_area_init_core() performs the initialization of them.
|
|
*/
|
|
wait_queue_head_t *wait_table;
|
|
unsigned long wait_table_hash_nr_entries;
|
|
unsigned long wait_table_bits;
|
|
|
|
ZONE_PADDING(_pad1_)
|
|
/* free areas of different sizes */
|
|
struct free_area free_area[MAX_ORDER];
|
|
|
|
/* zone flags, see below */
|
|
unsigned long flags;
|
|
|
|
/* Write-intensive fields used from the page allocator */
|
|
spinlock_t lock;
|
|
|
|
ZONE_PADDING(_pad2_)
|
|
|
|
/* Write-intensive fields used by page reclaim */
|
|
|
|
/* Fields commonly accessed by the page reclaim scanner */
|
|
spinlock_t lru_lock;
|
|
struct lruvec lruvec;
|
|
|
|
/* Evictions & activations on the inactive file list */
|
|
atomic_long_t inactive_age;
|
|
|
|
/*
|
|
* When free pages are below this point, additional steps are taken
|
|
* when reading the number of free pages to avoid per-cpu counter
|
|
* drift allowing watermarks to be breached
|
|
*/
|
|
unsigned long percpu_drift_mark;
|
|
|
|
#if defined CONFIG_COMPACTION || defined CONFIG_CMA
|
|
/* pfn where compaction free scanner should start */
|
|
unsigned long compact_cached_free_pfn;
|
|
/* pfn where async and sync compaction migration scanner should start */
|
|
unsigned long compact_cached_migrate_pfn[2];
|
|
#endif
|
|
|
|
#ifdef CONFIG_COMPACTION
|
|
/*
|
|
* On compaction failure, 1<<compact_defer_shift compactions
|
|
* are skipped before trying again. The number attempted since
|
|
* last failure is tracked with compact_considered.
|
|
*/
|
|
unsigned int compact_considered;
|
|
unsigned int compact_defer_shift;
|
|
int compact_order_failed;
|
|
#endif
|
|
|
|
#if defined CONFIG_COMPACTION || defined CONFIG_CMA
|
|
/* Set to true when the PG_migrate_skip bits should be cleared */
|
|
bool compact_blockskip_flush;
|
|
#endif
|
|
|
|
ZONE_PADDING(_pad3_)
|
|
/* Zone statistics */
|
|
atomic_long_t vm_stat[NR_VM_ZONE_STAT_ITEMS];
|
|
} ____cacheline_internodealigned_in_smp;
|
|
|
|
enum zone_flags {
|
|
ZONE_RECLAIM_LOCKED, /* prevents concurrent reclaim */
|
|
ZONE_OOM_LOCKED, /* zone is in OOM killer zonelist */
|
|
ZONE_CONGESTED, /* zone has many dirty pages backed by
|
|
* a congested BDI
|
|
*/
|
|
ZONE_DIRTY, /* reclaim scanning has recently found
|
|
* many dirty file pages at the tail
|
|
* of the LRU.
|
|
*/
|
|
ZONE_WRITEBACK, /* reclaim scanning has recently found
|
|
* many pages under writeback
|
|
*/
|
|
ZONE_FAIR_DEPLETED, /* fair zone policy batch depleted */
|
|
};
|
|
|
|
static inline unsigned long zone_end_pfn(const struct zone *zone)
|
|
{
|
|
return zone->zone_start_pfn + zone->spanned_pages;
|
|
}
|
|
|
|
static inline bool zone_spans_pfn(const struct zone *zone, unsigned long pfn)
|
|
{
|
|
return zone->zone_start_pfn <= pfn && pfn < zone_end_pfn(zone);
|
|
}
|
|
|
|
static inline bool zone_is_initialized(struct zone *zone)
|
|
{
|
|
return !!zone->wait_table;
|
|
}
|
|
|
|
static inline bool zone_is_empty(struct zone *zone)
|
|
{
|
|
return zone->spanned_pages == 0;
|
|
}
|
|
|
|
/*
|
|
* The "priority" of VM scanning is how much of the queues we will scan in one
|
|
* go. A value of 12 for DEF_PRIORITY implies that we will scan 1/4096th of the
|
|
* queues ("queue_length >> 12") during an aging round.
|
|
*/
|
|
#define DEF_PRIORITY 12
|
|
|
|
/* Maximum number of zones on a zonelist */
|
|
#define MAX_ZONES_PER_ZONELIST (MAX_NUMNODES * MAX_NR_ZONES)
|
|
|
|
#ifdef CONFIG_NUMA
|
|
|
|
/*
|
|
* The NUMA zonelists are doubled because we need zonelists that restrict the
|
|
* allocations to a single node for __GFP_THISNODE.
|
|
*
|
|
* [0] : Zonelist with fallback
|
|
* [1] : No fallback (__GFP_THISNODE)
|
|
*/
|
|
#define MAX_ZONELISTS 2
|
|
#else
|
|
#define MAX_ZONELISTS 1
|
|
#endif
|
|
|
|
/*
|
|
* This struct contains information about a zone in a zonelist. It is stored
|
|
* here to avoid dereferences into large structures and lookups of tables
|
|
*/
|
|
struct zoneref {
|
|
struct zone *zone; /* Pointer to actual zone */
|
|
int zone_idx; /* zone_idx(zoneref->zone) */
|
|
};
|
|
|
|
/*
|
|
* One allocation request operates on a zonelist. A zonelist
|
|
* is a list of zones, the first one is the 'goal' of the
|
|
* allocation, the other zones are fallback zones, in decreasing
|
|
* priority.
|
|
*
|
|
* To speed the reading of the zonelist, the zonerefs contain the zone index
|
|
* of the entry being read. Helper functions to access information given
|
|
* a struct zoneref are
|
|
*
|
|
* zonelist_zone() - Return the struct zone * for an entry in _zonerefs
|
|
* zonelist_zone_idx() - Return the index of the zone for an entry
|
|
* zonelist_node_idx() - Return the index of the node for an entry
|
|
*/
|
|
struct zonelist {
|
|
struct zoneref _zonerefs[MAX_ZONES_PER_ZONELIST + 1];
|
|
};
|
|
|
|
#ifndef CONFIG_DISCONTIGMEM
|
|
/* The array of struct pages - for discontigmem use pgdat->lmem_map */
|
|
extern struct page *mem_map;
|
|
#endif
|
|
|
|
/*
|
|
* The pg_data_t structure is used in machines with CONFIG_DISCONTIGMEM
|
|
* (mostly NUMA machines?) to denote a higher-level memory zone than the
|
|
* zone denotes.
|
|
*
|
|
* On NUMA machines, each NUMA node would have a pg_data_t to describe
|
|
* it's memory layout.
|
|
*
|
|
* Memory statistics and page replacement data structures are maintained on a
|
|
* per-zone basis.
|
|
*/
|
|
struct bootmem_data;
|
|
typedef struct pglist_data {
|
|
struct zone node_zones[MAX_NR_ZONES];
|
|
struct zonelist node_zonelists[MAX_ZONELISTS];
|
|
int nr_zones;
|
|
#ifdef CONFIG_FLAT_NODE_MEM_MAP /* means !SPARSEMEM */
|
|
struct page *node_mem_map;
|
|
#ifdef CONFIG_PAGE_EXTENSION
|
|
struct page_ext *node_page_ext;
|
|
#endif
|
|
#endif
|
|
#ifndef CONFIG_NO_BOOTMEM
|
|
struct bootmem_data *bdata;
|
|
#endif
|
|
#ifdef CONFIG_MEMORY_HOTPLUG
|
|
/*
|
|
* Must be held any time you expect node_start_pfn, node_present_pages
|
|
* or node_spanned_pages stay constant. Holding this will also
|
|
* guarantee that any pfn_valid() stays that way.
|
|
*
|
|
* pgdat_resize_lock() and pgdat_resize_unlock() are provided to
|
|
* manipulate node_size_lock without checking for CONFIG_MEMORY_HOTPLUG.
|
|
*
|
|
* Nests above zone->lock and zone->span_seqlock
|
|
*/
|
|
spinlock_t node_size_lock;
|
|
#endif
|
|
unsigned long node_start_pfn;
|
|
unsigned long node_present_pages; /* total number of physical pages */
|
|
unsigned long node_spanned_pages; /* total size of physical page
|
|
range, including holes */
|
|
int node_id;
|
|
wait_queue_head_t kswapd_wait;
|
|
wait_queue_head_t pfmemalloc_wait;
|
|
struct task_struct *kswapd; /* Protected by
|
|
mem_hotplug_begin/end() */
|
|
int kswapd_max_order;
|
|
enum zone_type classzone_idx;
|
|
#ifdef CONFIG_NUMA_BALANCING
|
|
/* Lock serializing the migrate rate limiting window */
|
|
spinlock_t numabalancing_migrate_lock;
|
|
|
|
/* Rate limiting time interval */
|
|
unsigned long numabalancing_migrate_next_window;
|
|
|
|
/* Number of pages migrated during the rate limiting time interval */
|
|
unsigned long numabalancing_migrate_nr_pages;
|
|
#endif
|
|
|
|
#ifdef CONFIG_DEFERRED_STRUCT_PAGE_INIT
|
|
/*
|
|
* If memory initialisation on large machines is deferred then this
|
|
* is the first PFN that needs to be initialised.
|
|
*/
|
|
unsigned long first_deferred_pfn;
|
|
#endif /* CONFIG_DEFERRED_STRUCT_PAGE_INIT */
|
|
} pg_data_t;
|
|
|
|
#define node_present_pages(nid) (NODE_DATA(nid)->node_present_pages)
|
|
#define node_spanned_pages(nid) (NODE_DATA(nid)->node_spanned_pages)
|
|
#ifdef CONFIG_FLAT_NODE_MEM_MAP
|
|
#define pgdat_page_nr(pgdat, pagenr) ((pgdat)->node_mem_map + (pagenr))
|
|
#else
|
|
#define pgdat_page_nr(pgdat, pagenr) pfn_to_page((pgdat)->node_start_pfn + (pagenr))
|
|
#endif
|
|
#define nid_page_nr(nid, pagenr) pgdat_page_nr(NODE_DATA(nid),(pagenr))
|
|
|
|
#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
|
|
#define node_end_pfn(nid) pgdat_end_pfn(NODE_DATA(nid))
|
|
|
|
static inline unsigned long pgdat_end_pfn(pg_data_t *pgdat)
|
|
{
|
|
return pgdat->node_start_pfn + pgdat->node_spanned_pages;
|
|
}
|
|
|
|
static inline bool pgdat_is_empty(pg_data_t *pgdat)
|
|
{
|
|
return !pgdat->node_start_pfn && !pgdat->node_spanned_pages;
|
|
}
|
|
|
|
static inline int zone_id(const struct zone *zone)
|
|
{
|
|
struct pglist_data *pgdat = zone->zone_pgdat;
|
|
|
|
return zone - pgdat->node_zones;
|
|
}
|
|
|
|
#ifdef CONFIG_ZONE_DEVICE
|
|
static inline bool is_dev_zone(const struct zone *zone)
|
|
{
|
|
return zone_id(zone) == ZONE_DEVICE;
|
|
}
|
|
#else
|
|
static inline bool is_dev_zone(const struct zone *zone)
|
|
{
|
|
return false;
|
|
}
|
|
#endif
|
|
|
|
#include <linux/memory_hotplug.h>
|
|
|
|
extern struct mutex zonelists_mutex;
|
|
void build_all_zonelists(pg_data_t *pgdat, struct zone *zone);
|
|
void wakeup_kswapd(struct zone *zone, int order, enum zone_type classzone_idx);
|
|
bool zone_watermark_ok(struct zone *z, unsigned int order,
|
|
unsigned long mark, int classzone_idx, int alloc_flags);
|
|
bool zone_watermark_ok_safe(struct zone *z, unsigned int order,
|
|
unsigned long mark, int classzone_idx);
|
|
enum memmap_context {
|
|
MEMMAP_EARLY,
|
|
MEMMAP_HOTPLUG,
|
|
};
|
|
extern int init_currently_empty_zone(struct zone *zone, unsigned long start_pfn,
|
|
unsigned long size);
|
|
|
|
extern void lruvec_init(struct lruvec *lruvec);
|
|
|
|
static inline struct zone *lruvec_zone(struct lruvec *lruvec)
|
|
{
|
|
#ifdef CONFIG_MEMCG
|
|
return lruvec->zone;
|
|
#else
|
|
return container_of(lruvec, struct zone, lruvec);
|
|
#endif
|
|
}
|
|
|
|
#ifdef CONFIG_HAVE_MEMORY_PRESENT
|
|
void memory_present(int nid, unsigned long start, unsigned long end);
|
|
#else
|
|
static inline void memory_present(int nid, unsigned long start, unsigned long end) {}
|
|
#endif
|
|
|
|
#ifdef CONFIG_HAVE_MEMORYLESS_NODES
|
|
int local_memory_node(int node_id);
|
|
#else
|
|
static inline int local_memory_node(int node_id) { return node_id; };
|
|
#endif
|
|
|
|
#ifdef CONFIG_NEED_NODE_MEMMAP_SIZE
|
|
unsigned long __init node_memmap_size_bytes(int, unsigned long, unsigned long);
|
|
#endif
|
|
|
|
/*
|
|
* zone_idx() returns 0 for the ZONE_DMA zone, 1 for the ZONE_NORMAL zone, etc.
|
|
*/
|
|
#define zone_idx(zone) ((zone) - (zone)->zone_pgdat->node_zones)
|
|
|
|
static inline int populated_zone(struct zone *zone)
|
|
{
|
|
return (!!zone->present_pages);
|
|
}
|
|
|
|
extern int movable_zone;
|
|
|
|
#ifdef CONFIG_HIGHMEM
|
|
static inline int zone_movable_is_highmem(void)
|
|
{
|
|
#ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP
|
|
return movable_zone == ZONE_HIGHMEM;
|
|
#else
|
|
return (ZONE_MOVABLE - 1) == ZONE_HIGHMEM;
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
static inline int is_highmem_idx(enum zone_type idx)
|
|
{
|
|
#ifdef CONFIG_HIGHMEM
|
|
return (idx == ZONE_HIGHMEM ||
|
|
(idx == ZONE_MOVABLE && zone_movable_is_highmem()));
|
|
#else
|
|
return 0;
|
|
#endif
|
|
}
|
|
|
|
/**
|
|
* is_highmem - helper function to quickly check if a struct zone is a
|
|
* highmem zone or not. This is an attempt to keep references
|
|
* to ZONE_{DMA/NORMAL/HIGHMEM/etc} in general code to a minimum.
|
|
* @zone - pointer to struct zone variable
|
|
*/
|
|
static inline int is_highmem(struct zone *zone)
|
|
{
|
|
#ifdef CONFIG_HIGHMEM
|
|
int zone_off = (char *)zone - (char *)zone->zone_pgdat->node_zones;
|
|
return zone_off == ZONE_HIGHMEM * sizeof(*zone) ||
|
|
(zone_off == ZONE_MOVABLE * sizeof(*zone) &&
|
|
zone_movable_is_highmem());
|
|
#else
|
|
return 0;
|
|
#endif
|
|
}
|
|
|
|
/* These two functions are used to setup the per zone pages min values */
|
|
struct ctl_table;
|
|
int min_free_kbytes_sysctl_handler(struct ctl_table *, int,
|
|
void __user *, size_t *, loff_t *);
|
|
extern int sysctl_lowmem_reserve_ratio[MAX_NR_ZONES-1];
|
|
int lowmem_reserve_ratio_sysctl_handler(struct ctl_table *, int,
|
|
void __user *, size_t *, loff_t *);
|
|
int percpu_pagelist_fraction_sysctl_handler(struct ctl_table *, int,
|
|
void __user *, size_t *, loff_t *);
|
|
int sysctl_min_unmapped_ratio_sysctl_handler(struct ctl_table *, int,
|
|
void __user *, size_t *, loff_t *);
|
|
int sysctl_min_slab_ratio_sysctl_handler(struct ctl_table *, int,
|
|
void __user *, size_t *, loff_t *);
|
|
|
|
extern int numa_zonelist_order_handler(struct ctl_table *, int,
|
|
void __user *, size_t *, loff_t *);
|
|
extern char numa_zonelist_order[];
|
|
#define NUMA_ZONELIST_ORDER_LEN 16 /* string buffer size */
|
|
|
|
#ifndef CONFIG_NEED_MULTIPLE_NODES
|
|
|
|
extern struct pglist_data contig_page_data;
|
|
#define NODE_DATA(nid) (&contig_page_data)
|
|
#define NODE_MEM_MAP(nid) mem_map
|
|
|
|
#else /* CONFIG_NEED_MULTIPLE_NODES */
|
|
|
|
#include <asm/mmzone.h>
|
|
|
|
#endif /* !CONFIG_NEED_MULTIPLE_NODES */
|
|
|
|
extern struct pglist_data *first_online_pgdat(void);
|
|
extern struct pglist_data *next_online_pgdat(struct pglist_data *pgdat);
|
|
extern struct zone *next_zone(struct zone *zone);
|
|
|
|
/**
|
|
* for_each_online_pgdat - helper macro to iterate over all online nodes
|
|
* @pgdat - pointer to a pg_data_t variable
|
|
*/
|
|
#define for_each_online_pgdat(pgdat) \
|
|
for (pgdat = first_online_pgdat(); \
|
|
pgdat; \
|
|
pgdat = next_online_pgdat(pgdat))
|
|
/**
|
|
* for_each_zone - helper macro to iterate over all memory zones
|
|
* @zone - pointer to struct zone variable
|
|
*
|
|
* The user only needs to declare the zone variable, for_each_zone
|
|
* fills it in.
|
|
*/
|
|
#define for_each_zone(zone) \
|
|
for (zone = (first_online_pgdat())->node_zones; \
|
|
zone; \
|
|
zone = next_zone(zone))
|
|
|
|
#define for_each_populated_zone(zone) \
|
|
for (zone = (first_online_pgdat())->node_zones; \
|
|
zone; \
|
|
zone = next_zone(zone)) \
|
|
if (!populated_zone(zone)) \
|
|
; /* do nothing */ \
|
|
else
|
|
|
|
static inline struct zone *zonelist_zone(struct zoneref *zoneref)
|
|
{
|
|
return zoneref->zone;
|
|
}
|
|
|
|
static inline int zonelist_zone_idx(struct zoneref *zoneref)
|
|
{
|
|
return zoneref->zone_idx;
|
|
}
|
|
|
|
static inline int zonelist_node_idx(struct zoneref *zoneref)
|
|
{
|
|
#ifdef CONFIG_NUMA
|
|
/* zone_to_nid not available in this context */
|
|
return zoneref->zone->node;
|
|
#else
|
|
return 0;
|
|
#endif /* CONFIG_NUMA */
|
|
}
|
|
|
|
/**
|
|
* next_zones_zonelist - Returns the next zone at or below highest_zoneidx within the allowed nodemask using a cursor within a zonelist as a starting point
|
|
* @z - The cursor used as a starting point for the search
|
|
* @highest_zoneidx - The zone index of the highest zone to return
|
|
* @nodes - An optional nodemask to filter the zonelist with
|
|
*
|
|
* This function returns the next zone at or below a given zone index that is
|
|
* within the allowed nodemask using a cursor as the starting point for the
|
|
* search. The zoneref returned is a cursor that represents the current zone
|
|
* being examined. It should be advanced by one before calling
|
|
* next_zones_zonelist again.
|
|
*/
|
|
struct zoneref *next_zones_zonelist(struct zoneref *z,
|
|
enum zone_type highest_zoneidx,
|
|
nodemask_t *nodes);
|
|
|
|
/**
|
|
* first_zones_zonelist - Returns the first zone at or below highest_zoneidx within the allowed nodemask in a zonelist
|
|
* @zonelist - The zonelist to search for a suitable zone
|
|
* @highest_zoneidx - The zone index of the highest zone to return
|
|
* @nodes - An optional nodemask to filter the zonelist with
|
|
* @zone - The first suitable zone found is returned via this parameter
|
|
*
|
|
* This function returns the first zone at or below a given zone index that is
|
|
* within the allowed nodemask. The zoneref returned is a cursor that can be
|
|
* used to iterate the zonelist with next_zones_zonelist by advancing it by
|
|
* one before calling.
|
|
*/
|
|
static inline struct zoneref *first_zones_zonelist(struct zonelist *zonelist,
|
|
enum zone_type highest_zoneidx,
|
|
nodemask_t *nodes,
|
|
struct zone **zone)
|
|
{
|
|
struct zoneref *z = next_zones_zonelist(zonelist->_zonerefs,
|
|
highest_zoneidx, nodes);
|
|
*zone = zonelist_zone(z);
|
|
return z;
|
|
}
|
|
|
|
/**
|
|
* for_each_zone_zonelist_nodemask - helper macro to iterate over valid zones in a zonelist at or below a given zone index and within a nodemask
|
|
* @zone - The current zone in the iterator
|
|
* @z - The current pointer within zonelist->zones being iterated
|
|
* @zlist - The zonelist being iterated
|
|
* @highidx - The zone index of the highest zone to return
|
|
* @nodemask - Nodemask allowed by the allocator
|
|
*
|
|
* This iterator iterates though all zones at or below a given zone index and
|
|
* within a given nodemask
|
|
*/
|
|
#define for_each_zone_zonelist_nodemask(zone, z, zlist, highidx, nodemask) \
|
|
for (z = first_zones_zonelist(zlist, highidx, nodemask, &zone); \
|
|
zone; \
|
|
z = next_zones_zonelist(++z, highidx, nodemask), \
|
|
zone = zonelist_zone(z)) \
|
|
|
|
/**
|
|
* for_each_zone_zonelist - helper macro to iterate over valid zones in a zonelist at or below a given zone index
|
|
* @zone - The current zone in the iterator
|
|
* @z - The current pointer within zonelist->zones being iterated
|
|
* @zlist - The zonelist being iterated
|
|
* @highidx - The zone index of the highest zone to return
|
|
*
|
|
* This iterator iterates though all zones at or below a given zone index.
|
|
*/
|
|
#define for_each_zone_zonelist(zone, z, zlist, highidx) \
|
|
for_each_zone_zonelist_nodemask(zone, z, zlist, highidx, NULL)
|
|
|
|
#ifdef CONFIG_SPARSEMEM
|
|
#include <asm/sparsemem.h>
|
|
#endif
|
|
|
|
#if !defined(CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID) && \
|
|
!defined(CONFIG_HAVE_MEMBLOCK_NODE_MAP)
|
|
static inline unsigned long early_pfn_to_nid(unsigned long pfn)
|
|
{
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_FLATMEM
|
|
#define pfn_to_nid(pfn) (0)
|
|
#endif
|
|
|
|
#ifdef CONFIG_SPARSEMEM
|
|
|
|
/*
|
|
* SECTION_SHIFT #bits space required to store a section #
|
|
*
|
|
* PA_SECTION_SHIFT physical address to/from section number
|
|
* PFN_SECTION_SHIFT pfn to/from section number
|
|
*/
|
|
#define PA_SECTION_SHIFT (SECTION_SIZE_BITS)
|
|
#define PFN_SECTION_SHIFT (SECTION_SIZE_BITS - PAGE_SHIFT)
|
|
|
|
#define NR_MEM_SECTIONS (1UL << SECTIONS_SHIFT)
|
|
|
|
#define PAGES_PER_SECTION (1UL << PFN_SECTION_SHIFT)
|
|
#define PAGE_SECTION_MASK (~(PAGES_PER_SECTION-1))
|
|
|
|
#define SECTION_BLOCKFLAGS_BITS \
|
|
((1UL << (PFN_SECTION_SHIFT - pageblock_order)) * NR_PAGEBLOCK_BITS)
|
|
|
|
#if (MAX_ORDER - 1 + PAGE_SHIFT) > SECTION_SIZE_BITS
|
|
#error Allocator MAX_ORDER exceeds SECTION_SIZE
|
|
#endif
|
|
|
|
#define pfn_to_section_nr(pfn) ((pfn) >> PFN_SECTION_SHIFT)
|
|
#define section_nr_to_pfn(sec) ((sec) << PFN_SECTION_SHIFT)
|
|
|
|
#define SECTION_ALIGN_UP(pfn) (((pfn) + PAGES_PER_SECTION - 1) & PAGE_SECTION_MASK)
|
|
#define SECTION_ALIGN_DOWN(pfn) ((pfn) & PAGE_SECTION_MASK)
|
|
|
|
struct page;
|
|
struct page_ext;
|
|
struct mem_section {
|
|
/*
|
|
* This is, logically, a pointer to an array of struct
|
|
* pages. However, it is stored with some other magic.
|
|
* (see sparse.c::sparse_init_one_section())
|
|
*
|
|
* Additionally during early boot we encode node id of
|
|
* the location of the section here to guide allocation.
|
|
* (see sparse.c::memory_present())
|
|
*
|
|
* Making it a UL at least makes someone do a cast
|
|
* before using it wrong.
|
|
*/
|
|
unsigned long section_mem_map;
|
|
|
|
/* See declaration of similar field in struct zone */
|
|
unsigned long *pageblock_flags;
|
|
#ifdef CONFIG_PAGE_EXTENSION
|
|
/*
|
|
* If !SPARSEMEM, pgdat doesn't have page_ext pointer. We use
|
|
* section. (see page_ext.h about this.)
|
|
*/
|
|
struct page_ext *page_ext;
|
|
unsigned long pad;
|
|
#endif
|
|
/*
|
|
* WARNING: mem_section must be a power-of-2 in size for the
|
|
* calculation and use of SECTION_ROOT_MASK to make sense.
|
|
*/
|
|
};
|
|
|
|
#ifdef CONFIG_SPARSEMEM_EXTREME
|
|
#define SECTIONS_PER_ROOT (PAGE_SIZE / sizeof (struct mem_section))
|
|
#else
|
|
#define SECTIONS_PER_ROOT 1
|
|
#endif
|
|
|
|
#define SECTION_NR_TO_ROOT(sec) ((sec) / SECTIONS_PER_ROOT)
|
|
#define NR_SECTION_ROOTS DIV_ROUND_UP(NR_MEM_SECTIONS, SECTIONS_PER_ROOT)
|
|
#define SECTION_ROOT_MASK (SECTIONS_PER_ROOT - 1)
|
|
|
|
#ifdef CONFIG_SPARSEMEM_EXTREME
|
|
extern struct mem_section *mem_section[NR_SECTION_ROOTS];
|
|
#else
|
|
extern struct mem_section mem_section[NR_SECTION_ROOTS][SECTIONS_PER_ROOT];
|
|
#endif
|
|
|
|
static inline struct mem_section *__nr_to_section(unsigned long nr)
|
|
{
|
|
if (!mem_section[SECTION_NR_TO_ROOT(nr)])
|
|
return NULL;
|
|
return &mem_section[SECTION_NR_TO_ROOT(nr)][nr & SECTION_ROOT_MASK];
|
|
}
|
|
extern int __section_nr(struct mem_section* ms);
|
|
extern unsigned long usemap_size(void);
|
|
|
|
/*
|
|
* We use the lower bits of the mem_map pointer to store
|
|
* a little bit of information. There should be at least
|
|
* 3 bits here due to 32-bit alignment.
|
|
*/
|
|
#define SECTION_MARKED_PRESENT (1UL<<0)
|
|
#define SECTION_HAS_MEM_MAP (1UL<<1)
|
|
#define SECTION_MAP_LAST_BIT (1UL<<2)
|
|
#define SECTION_MAP_MASK (~(SECTION_MAP_LAST_BIT-1))
|
|
#define SECTION_NID_SHIFT 2
|
|
|
|
static inline struct page *__section_mem_map_addr(struct mem_section *section)
|
|
{
|
|
unsigned long map = section->section_mem_map;
|
|
map &= SECTION_MAP_MASK;
|
|
return (struct page *)map;
|
|
}
|
|
|
|
static inline int present_section(struct mem_section *section)
|
|
{
|
|
return (section && (section->section_mem_map & SECTION_MARKED_PRESENT));
|
|
}
|
|
|
|
static inline int present_section_nr(unsigned long nr)
|
|
{
|
|
return present_section(__nr_to_section(nr));
|
|
}
|
|
|
|
static inline int valid_section(struct mem_section *section)
|
|
{
|
|
return (section && (section->section_mem_map & SECTION_HAS_MEM_MAP));
|
|
}
|
|
|
|
static inline int valid_section_nr(unsigned long nr)
|
|
{
|
|
return valid_section(__nr_to_section(nr));
|
|
}
|
|
|
|
static inline struct mem_section *__pfn_to_section(unsigned long pfn)
|
|
{
|
|
return __nr_to_section(pfn_to_section_nr(pfn));
|
|
}
|
|
|
|
#ifndef CONFIG_HAVE_ARCH_PFN_VALID
|
|
static inline int pfn_valid(unsigned long pfn)
|
|
{
|
|
if (pfn_to_section_nr(pfn) >= NR_MEM_SECTIONS)
|
|
return 0;
|
|
return valid_section(__nr_to_section(pfn_to_section_nr(pfn)));
|
|
}
|
|
#endif
|
|
|
|
static inline int pfn_present(unsigned long pfn)
|
|
{
|
|
if (pfn_to_section_nr(pfn) >= NR_MEM_SECTIONS)
|
|
return 0;
|
|
return present_section(__nr_to_section(pfn_to_section_nr(pfn)));
|
|
}
|
|
|
|
/*
|
|
* These are _only_ used during initialisation, therefore they
|
|
* can use __initdata ... They could have names to indicate
|
|
* this restriction.
|
|
*/
|
|
#ifdef CONFIG_NUMA
|
|
#define pfn_to_nid(pfn) \
|
|
({ \
|
|
unsigned long __pfn_to_nid_pfn = (pfn); \
|
|
page_to_nid(pfn_to_page(__pfn_to_nid_pfn)); \
|
|
})
|
|
#else
|
|
#define pfn_to_nid(pfn) (0)
|
|
#endif
|
|
|
|
#define early_pfn_valid(pfn) pfn_valid(pfn)
|
|
void sparse_init(void);
|
|
#else
|
|
#define sparse_init() do {} while (0)
|
|
#define sparse_index_init(_sec, _nid) do {} while (0)
|
|
#endif /* CONFIG_SPARSEMEM */
|
|
|
|
/*
|
|
* During memory init memblocks map pfns to nids. The search is expensive and
|
|
* this caches recent lookups. The implementation of __early_pfn_to_nid
|
|
* may treat start/end as pfns or sections.
|
|
*/
|
|
struct mminit_pfnnid_cache {
|
|
unsigned long last_start;
|
|
unsigned long last_end;
|
|
int last_nid;
|
|
};
|
|
|
|
#ifndef early_pfn_valid
|
|
#define early_pfn_valid(pfn) (1)
|
|
#endif
|
|
|
|
void memory_present(int nid, unsigned long start, unsigned long end);
|
|
unsigned long __init node_memmap_size_bytes(int, unsigned long, unsigned long);
|
|
|
|
/*
|
|
* If it is possible to have holes within a MAX_ORDER_NR_PAGES, then we
|
|
* need to check pfn validility within that MAX_ORDER_NR_PAGES block.
|
|
* pfn_valid_within() should be used in this case; we optimise this away
|
|
* when we have no holes within a MAX_ORDER_NR_PAGES block.
|
|
*/
|
|
#ifdef CONFIG_HOLES_IN_ZONE
|
|
#define pfn_valid_within(pfn) pfn_valid(pfn)
|
|
#else
|
|
#define pfn_valid_within(pfn) (1)
|
|
#endif
|
|
|
|
#ifdef CONFIG_ARCH_HAS_HOLES_MEMORYMODEL
|
|
/*
|
|
* pfn_valid() is meant to be able to tell if a given PFN has valid memmap
|
|
* associated with it or not. In FLATMEM, it is expected that holes always
|
|
* have valid memmap as long as there is valid PFNs either side of the hole.
|
|
* In SPARSEMEM, it is assumed that a valid section has a memmap for the
|
|
* entire section.
|
|
*
|
|
* However, an ARM, and maybe other embedded architectures in the future
|
|
* free memmap backing holes to save memory on the assumption the memmap is
|
|
* never used. The page_zone linkages are then broken even though pfn_valid()
|
|
* returns true. A walker of the full memmap must then do this additional
|
|
* check to ensure the memmap they are looking at is sane by making sure
|
|
* the zone and PFN linkages are still valid. This is expensive, but walkers
|
|
* of the full memmap are extremely rare.
|
|
*/
|
|
int memmap_valid_within(unsigned long pfn,
|
|
struct page *page, struct zone *zone);
|
|
#else
|
|
static inline int memmap_valid_within(unsigned long pfn,
|
|
struct page *page, struct zone *zone)
|
|
{
|
|
return 1;
|
|
}
|
|
#endif /* CONFIG_ARCH_HAS_HOLES_MEMORYMODEL */
|
|
|
|
#endif /* !__GENERATING_BOUNDS.H */
|
|
#endif /* !__ASSEMBLY__ */
|
|
#endif /* _LINUX_MMZONE_H */
|