/* Copyright (c) 2016-2017, 2019-2020, The Linux Foundation. All rights reserved.
* Copyright ( c ) 2023 Qualcomm Innovation Center , Inc . All rights reserved .
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 and
* only version 2 as published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
*/
# include <linux/vmalloc.h>
# include <asm/cacheflush.h>
# include <linux/slab.h>
# include <linux/highmem.h>
# include <linux/version.h>
# include "kgsl.h"
# include "kgsl_device.h"
# include "kgsl_pool.h"
# define KGSL_MAX_POOLS 4
# define KGSL_MAX_POOL_ORDER 8
# define KGSL_MAX_RESERVED_PAGES 4096
/**
* struct kgsl_page_pool - Structure to hold information for the pool
* @ pool_order : Page order describing the size of the page
* @ page_count : Number of pages currently present in the pool
* @ reserved_pages : Number of pages reserved at init for the pool
* @ allocation_allowed : Tells if reserved pool gets exhausted , can we allocate
* from system memory
* @ list_lock : Spinlock for page list in the pool
* @ page_list : List of pages held / reserved in this pool
*/
struct kgsl_page_pool {
unsigned int pool_order ;
int page_count ;
unsigned int reserved_pages ;
bool allocation_allowed ;
spinlock_t list_lock ;
struct list_head page_list ;
} ;
static struct kgsl_page_pool kgsl_pools [ KGSL_MAX_POOLS ] ;
static int kgsl_num_pools ;
static int kgsl_pool_max_pages ;
/* Returns KGSL pool corresponding to input page order*/
static struct kgsl_page_pool *
_kgsl_get_pool_from_order ( unsigned int order )
{
int i ;
for ( i = 0 ; i < kgsl_num_pools ; i + + ) {
if ( kgsl_pools [ i ] . pool_order = = order )
return & kgsl_pools [ i ] ;
}
return NULL ;
}
/* Map the page into kernel and zero it out */
static void
_kgsl_pool_zero_page ( struct page * p , unsigned int pool_order )
{
int i ;
for ( i = 0 ; i < ( 1 < < pool_order ) ; i + + ) {
struct page * page = nth_page ( p , i ) ;
void * addr = kmap_atomic ( page ) ;
memset ( addr , 0 , PAGE_SIZE ) ;
dmac_flush_range ( addr , addr + PAGE_SIZE ) ;
kunmap_atomic ( addr ) ;
}
}
/* Add a page to specified pool */
static void
_kgsl_pool_add_page ( struct kgsl_page_pool * pool , struct page * p )
{
/*
* Sanity check to make sure we don ' t re - pool a page that
* somebody else has a reference to .
*/
if ( WARN_ON_ONCE ( unlikely ( page_count ( p ) > 1 ) ) ) {
__free_pages ( p , pool - > pool_order ) ;
return ;
}
_kgsl_pool_zero_page ( p , pool - > pool_order ) ;
spin_lock ( & pool - > list_lock ) ;
list_add_tail ( & p - > lru , & pool - > page_list ) ;
pool - > page_count + + ;
spin_unlock ( & pool - > list_lock ) ;
Merge android-4.14.159 (f960b38) into msm-4.14
* refs/heads/tmp-f960b38:
Linux 4.14.159
of: unittest: fix memory leak in attach_node_and_children
raid5: need to set STRIPE_HANDLE for batch head
gpiolib: acpi: Add Terra Pad 1061 to the run_edge_events_on_boot_blacklist
kernel/module.c: wakeup processes in module_wq on module unload
gfs2: fix glock reference problem in gfs2_trans_remove_revoke
net/mlx5e: Fix SFF 8472 eeprom length
sunrpc: fix crash when cache_head become valid before update
workqueue: Fix missing kfree(rescuer) in destroy_workqueue()
blk-mq: make sure that line break can be printed
mfd: rk808: Fix RK818 ID template
ext4: fix a bug in ext4_wait_for_tail_page_commit
mm/shmem.c: cast the type of unmap_start to u64
firmware: qcom: scm: Ensure 'a0' status code is treated as signed
ext4: work around deleting a file with i_nlink == 0 safely
powerpc: Fix vDSO clock_getres()
powerpc: Avoid clang warnings around setjmp and longjmp
ath10k: fix fw crash by moving chip reset after napi disabled
media: vimc: fix component match compare
mlxsw: spectrum_router: Refresh nexthop neighbour when it becomes dead
power: supply: cpcap-battery: Fix signed counter sample register
x86/MCE/AMD: Carve out the MC4_MISC thresholding quirk
x86/MCE/AMD: Turn off MC4_MISC thresholding on all family 0x15 models
e100: Fix passing zero to 'PTR_ERR' warning in e100_load_ucode_wait
drbd: Change drbd_request_detach_interruptible's return type to int
scsi: lpfc: Correct code setting non existent bits in sli4 ABORT WQE
scsi: lpfc: Cap NPIV vports to 256
omap: pdata-quirks: remove openpandora quirks for mmc3 and wl1251
phy: renesas: rcar-gen3-usb2: Fix sysfs interface of "role"
iio: adis16480: Add debugfs_reg_access entry
xhci: make sure interrupts are restored to correct state
xhci: Fix memory leak in xhci_add_in_port()
scsi: qla2xxx: Fix message indicating vectors used by driver
scsi: qla2xxx: Always check the qla2x00_wait_for_hba_online() return value
scsi: qla2xxx: Fix qla24xx_process_bidir_cmd()
scsi: qla2xxx: Fix session lookup in qlt_abort_work()
scsi: qla2xxx: Fix DMA unmap leak
scsi: zfcp: trace channel log even for FCP command responses
block: fix single range discard merge
reiserfs: fix extended attributes on the root directory
ext4: Fix credit estimate for final inode freeing
quota: fix livelock in dquot_writeback_dquots
ext2: check err when partial != NULL
quota: Check that quota is not dirty before release
video/hdmi: Fix AVI bar unpack
powerpc/xive: Skip ioremap() of ESB pages for LSI interrupts
powerpc: Allow flush_icache_range to work across ranges >4GB
powerpc/xive: Prevent page fault issues in the machine crash handler
powerpc: Allow 64bit VDSO __kernel_sync_dicache to work across ranges >4GB
ppdev: fix PPGETTIME/PPSETTIME ioctls
ARM: dts: omap3-tao3530: Fix incorrect MMC card detection GPIO polarity
mmc: host: omap_hsmmc: add code for special init of wl1251 to get rid of pandora_wl1251_init_card
pinctrl: samsung: Fix device node refcount leaks in S3C64xx wakeup controller init
pinctrl: samsung: Fix device node refcount leaks in init code
pinctrl: samsung: Fix device node refcount leaks in S3C24xx wakeup controller init
pinctrl: samsung: Add of_node_put() before return in error path
ACPI: PM: Avoid attaching ACPI PM domain to certain devices
ACPI: bus: Fix NULL pointer check in acpi_bus_get_private_data()
ACPI: OSL: only free map once in osl.c
cpufreq: powernv: fix stack bloat and hard limit on number of CPUs
PM / devfreq: Lock devfreq in trans_stat_show
intel_th: pci: Add Tiger Lake CPU support
intel_th: pci: Add Ice Lake CPU support
intel_th: Fix a double put_device() in error path
cpuidle: Do not unset the driver if it is there already
media: cec.h: CEC_OP_REC_FLAG_ values were swapped
media: radio: wl1273: fix interrupt masking on release
media: bdisp: fix memleak on release
s390/mm: properly clear _PAGE_NOEXEC bit when it is not supported
ar5523: check NULL before memcpy() in ar5523_cmd()
cgroup: pids: use atomic64_t for pids->limit
blk-mq: avoid sysfs buffer overflow with too many CPU cores
ASoC: Jack: Fix NULL pointer dereference in snd_soc_jack_report
workqueue: Fix pwq ref leak in rescuer_thread()
workqueue: Fix spurious sanity check failures in destroy_workqueue()
dm zoned: reduce overhead of backing device checks
hwrng: omap - Fix RNG wait loop timeout
watchdog: aspeed: Fix clock behaviour for ast2600
md/raid0: Fix an error message in raid0_make_request()
ALSA: hda - Fix pending unsol events at shutdown
ovl: relax WARN_ON() on rename to self
lib: raid6: fix awk build warnings
rtlwifi: rtl8192de: Fix missing enable interrupt flag
rtlwifi: rtl8192de: Fix missing callback that tests for hw release of buffer
rtlwifi: rtl8192de: Fix missing code to retrieve RX buffer address
btrfs: record all roots for rename exchange on a subvol
Btrfs: send, skip backreference walking for extents with many references
btrfs: Remove btrfs_bio::flags member
Btrfs: fix negative subv_writers counter and data space leak after buffered write
btrfs: use refcount_inc_not_zero in kill_all_nodes
btrfs: check page->mapping when loading free space cache
usb: dwc3: ep0: Clear started flag on completion
virtio-balloon: fix managed page counts when migrating pages between zones
mtd: spear_smi: Fix Write Burst mode
tpm: add check after commands attribs tab allocation
usb: mon: Fix a deadlock in usbmon between mmap and read
usb: core: urb: fix URB structure initialization function
USB: adutux: fix interface sanity check
USB: serial: io_edgeport: fix epic endpoint lookup
USB: idmouse: fix interface sanity checks
USB: atm: ueagle-atm: add missing endpoint check
iio: humidity: hdc100x: fix IIO_HUMIDITYRELATIVE channel reporting
ARM: dts: pandora-common: define wl1251 as child node of mmc3
xhci: handle some XHCI_TRUST_TX_LENGTH quirks cases as default behaviour.
xhci: Increase STS_HALT timeout in xhci_suspend()
usb: xhci: only set D3hot for pci device
staging: gigaset: add endpoint-type sanity check
staging: gigaset: fix illegal free on probe errors
staging: gigaset: fix general protection fault on probe
staging: rtl8712: fix interface sanity check
staging: rtl8188eu: fix interface sanity check
usb: Allow USB device to be warm reset in suspended state
USB: documentation: flags on usb-storage versus UAS
USB: uas: heed CAPACITY_HEURISTICS
USB: uas: honor flag to avoid CAPACITY16
media: venus: remove invalid compat_ioctl32 handler
scsi: qla2xxx: Fix driver unload hang
usb: gadget: pch_udc: fix use after free
usb: gadget: configfs: Fix missing spin_lock_init()
appletalk: Set error code if register_snap_client failed
appletalk: Fix potential NULL pointer dereference in unregister_snap_client
KVM: x86: fix out-of-bounds write in KVM_GET_EMULATED_CPUID (CVE-2019-19332)
ASoC: rsnd: fixup MIX kctrl registration
binder: Handle start==NULL in binder_update_page_range()
thermal: Fix deadlock in thermal thermal_zone_device_check
iomap: Fix pipe page leakage during splicing
RDMA/qib: Validate ->show()/store() callbacks before calling them
spi: atmel: Fix CS high support
crypto: user - fix memory leak in crypto_report
crypto: ecdh - fix big endian bug in ECC library
crypto: ccp - fix uninitialized list head
crypto: af_alg - cast ki_complete ternary op to int
crypto: crypto4xx - fix double-free in crypto4xx_destroy_sdr
KVM: x86: fix presentation of TSX feature in ARCH_CAPABILITIES
KVM: x86: do not modify masked bits of shared MSRs
KVM: arm/arm64: vgic: Don't rely on the wrong pending table
drm/i810: Prevent underflow in ioctl
jbd2: Fix possible overflow in jbd2_log_space_left()
kernfs: fix ino wrap-around detection
can: slcan: Fix use-after-free Read in slcan_open
tty: vt: keyboard: reject invalid keycodes
CIFS: Fix SMB2 oplock break processing
CIFS: Fix NULL-pointer dereference in smb2_push_mandatory_locks
x86/PCI: Avoid AMD FCH XHCI USB PME# from D0 defect
Input: Fix memory leak in psxpad_spi_probe
coresight: etm4x: Fix input validation for sysfs.
Input: goodix - add upside-down quirk for Teclast X89 tablet
Input: synaptics-rmi4 - don't increment rmiaddr for SMBus transfers
Input: synaptics-rmi4 - re-enable IRQs in f34v7_do_reflash
Input: synaptics - switch another X1 Carbon 6 to RMI/SMbus
ALSA: hda - Add mute led support for HP ProBook 645 G4
ALSA: pcm: oss: Avoid potential buffer overflows
ALSA: hda/realtek - Dell headphone has noise on unmute for ALC236
fuse: verify attributes
fuse: verify nlink
sched/fair: Scale bandwidth quota and period without losing quota/period ratio precision
tcp: exit if nothing to retransmit on RTO timeout
net: aquantia: fix RSS table and key sizes
media: vimc: fix start stream when link is disabled
ARM: dts: sunxi: Fix PMU compatible strings
usb: mtu3: fix dbginfo in qmu_tx_zlp_error_handler
mlx4: Use snprintf instead of complicated strcpy
IB/hfi1: Close VNIC sdma_progress sleep window
IB/hfi1: Ignore LNI errors before DC8051 transitions to Polling state
mlxsw: spectrum_router: Relax GRE decap matching check
firmware: qcom: scm: fix compilation error when disabled
media: stkwebcam: Bugfix for wrong return values
tty: Don't block on IO when ldisc change is pending
nfsd: Return EPERM, not EACCES, in some SETATTR cases
MIPS: OCTEON: cvmx_pko_mem_debug8: use oldest forward compatible definition
clk: renesas: r8a77995: Correct parent clock of DU
powerpc/math-emu: Update macros from GCC
pstore/ram: Avoid NULL deref in ftrace merging failure path
net/mlx4_core: Fix return codes of unsupported operations
dlm: fix invalid cluster name warning
ARM: dts: realview: Fix some more duplicate regulator nodes
clk: sunxi-ng: h3/h5: Fix CSI_MCLK parent
ARM: dts: pxa: clean up USB controller nodes
mtd: fix mtd_oobavail() incoherent returned value
kbuild: fix single target build for external module
modpost: skip ELF local symbols during section mismatch check
tcp: fix SNMP TCP timeout under-estimation
tcp: fix SNMP under-estimation on failed retransmission
tcp: fix off-by-one bug on aborting window-probing socket
ARM: dts: realview-pbx: Fix duplicate regulator nodes
ARM: dts: mmp2: fix the gpio interrupt cell number
net/x25: fix null_x25_address handling
net/x25: fix called/calling length calculation in x25_parse_address_block
arm64: dts: meson-gxl-khadas-vim: fix GPIO lines names
arm64: dts: meson-gxbb-odroidc2: fix GPIO lines names
arm64: dts: meson-gxbb-nanopi-k2: fix GPIO lines names
arm64: dts: meson-gxl-libretech-cc: fix GPIO lines names
ARM: OMAP1/2: fix SoC name printing
ASoC: au8540: use 64-bit arithmetic instead of 32-bit
nfsd: fix a warning in __cld_pipe_upcall()
ARM: debug: enable UART1 for socfpga Cyclone5
dlm: NULL check before kmem_cache_destroy is not needed
ARM: dts: sun8i: v3s: Change pinctrl nodes to avoid warning
ARM: dts: sun5i: a10s: Fix HDMI output DTC warning
ASoC: rsnd: tidyup registering method for rsnd_kctrl_new()
lockd: fix decoding of TEST results
i2c: imx: don't print error message on probe defer
serial: imx: fix error handling in console_setup
altera-stapl: check for a null key before strcasecmp'ing it
dma-mapping: fix return type of dma_set_max_seg_size()
sparc: Correct ctx->saw_frame_pointer logic.
f2fs: fix to allow node segment for GC by ioctl path
ARM: dts: rockchip: Assign the proper GPIO clocks for rv1108
ARM: dts: rockchip: Fix the PMU interrupt number for rv1108
f2fs: change segment to section in f2fs_ioc_gc_range
f2fs: fix count of seg_freed to make sec_freed correct
ACPI: fix acpi_find_child_device() invocation in acpi_preset_companion()
usb: dwc3: don't log probe deferrals; but do log other error codes
usb: dwc3: debugfs: Properly print/set link state for HS
dmaengine: dw-dmac: implement dma protection control setting
dmaengine: coh901318: Remove unused variable
dmaengine: coh901318: Fix a double-lock bug
media: cec: report Vendor ID after initialization
media: pulse8-cec: return 0 when invalidating the logical address
ARM: dts: exynos: Use Samsung SoC specific compatible for DWC2 module
rtc: dt-binding: abx80x: fix resistance scale
rtc: max8997: Fix the returned value in case of error in 'max8997_rtc_read_alarm()'
math-emu/soft-fp.h: (_FP_ROUND_ZERO) cast 0 to void to fix warning
net/smc: use after free fix in smc_wr_tx_put_slot()
MIPS: OCTEON: octeon-platform: fix typing
iomap: sub-block dio needs to zeroout beyond EOF
net-next/hinic:fix a bug in set mac address
regulator: Fix return value of _set_load() stub
clk: rockchip: fix ID of 8ch clock of I2S1 for rk3328
clk: rockchip: fix I2S1 clock gate register for rk3328
mm/vmstat.c: fix NUMA statistics updates
Staging: iio: adt7316: Fix i2c data reading, set the data field
pinctrl: qcom: ssbi-gpio: fix gpio-hog related boot issues
crypto: bcm - fix normal/non key hash algorithm failure
crypto: ecc - check for invalid values in the key verification test
scsi: zfcp: drop default switch case which might paper over missing case
net: dsa: mv88e6xxx: Work around mv886e6161 SERDES missing MII_PHYSID2
MIPS: SiByte: Enable ZONE_DMA32 for LittleSur
dlm: fix missing idr_destroy for recover_idr
ARM: dts: rockchip: Fix rk3288-rock2 vcc_flash name
clk: rockchip: fix rk3188 sclk_mac_lbtest parameter ordering
clk: rockchip: fix rk3188 sclk_smc gate data
i40e: don't restart nway if autoneg not supported
rtc: s3c-rtc: Avoid using broken ALMYEAR register
net: ethernet: ti: cpts: correct debug for expired txq skb
extcon: max8997: Fix lack of path setting in USB device mode
dlm: fix possible call to kfree() for non-initialized pointer
clk: sunxi-ng: a64: Fix gate bit of DSI DPHY
net/mlx5: Release resource on error flow
ARM: 8813/1: Make aligned 2-byte getuser()/putuser() atomic on ARMv6+
iwlwifi: mvm: Send non offchannel traffic via AP sta
iwlwifi: mvm: synchronize TID queue removal
cxgb4vf: fix memleak in mac_hlist initialization
serial: core: Allow processing sysrq at port unlock time
i2c: core: fix use after free in of_i2c_notify
net: ep93xx_eth: fix mismatch of request_mem_region in remove
rsxx: add missed destroy_workqueue calls in remove
ALSA: pcm: Fix stream lock usage in snd_pcm_period_elapsed()
sched/core: Avoid spurious lock dependencies
Input: cyttsp4_core - fix use after free bug
xfrm: release device reference for invalid state
NFC: nxp-nci: Fix NULL pointer dereference after I2C communication error
audit_get_nd(): don't unlock parent too early
exportfs_decode_fh(): negative pinned may become positive without the parent locked
iwlwifi: pcie: don't consider IV len in A-MSDU
RDMA/hns: Correct the value of HNS_ROCE_HEM_CHUNK_LEN
autofs: fix a leak in autofs_expire_indirect()
serial: ifx6x60: add missed pm_runtime_disable
serial: serial_core: Perform NULL checks for break_ctl ops
serial: pl011: Fix DMA ->flush_buffer()
tty: serial: msm_serial: Fix flow control
tty: serial: fsl_lpuart: use the sg count from dma_map_sg
usb: gadget: u_serial: add missing port entry locking
arm64: tegra: Fix 'active-low' warning for Jetson TX1 regulator
rsi: release skb if rsi_prepare_beacon fails
ANDROID: staging: android: ion: Fix build when CONFIG_ION_SYSTEM_HEAP=n
ANDROID: staging: android: ion: Expose total heap and pool sizes via sysfs
UPSTREAM: include/linux/slab.h: fix sparse warning in kmalloc_type()
UPSTREAM: mm, slab: shorten kmalloc cache names for large sizes
UPSTREAM: mm, proc: add KReclaimable to /proc/meminfo
BACKPORT: mm: rename and change semantics of nr_indirectly_reclaimable_bytes
UPSTREAM: dcache: allocate external names from reclaimable kmalloc caches
BACKPORT: mm, slab/slub: introduce kmalloc-reclaimable caches
UPSTREAM: mm, slab: combine kmalloc_caches and kmalloc_dma_caches
ANDROID: kbuild: disable SCS by default in allmodconfig
ANDROID: arm64: cuttlefish_defconfig: enable LTO, CFI, and SCS
BACKPORT: FROMLIST: arm64: implement Shadow Call Stack
FROMLIST: arm64: disable SCS for hypervisor code
BACKPORT: FROMLIST: arm64: vdso: disable Shadow Call Stack
FROMLIST: arm64: preserve x18 when CPU is suspended
FROMLIST: arm64: reserve x18 from general allocation with SCS
FROMLIST: arm64: disable function graph tracing with SCS
FROMLIST: scs: add support for stack usage debugging
FROMLIST: scs: add accounting
FROMLIST: add support for Clang's Shadow Call Stack (SCS)
FROMLIST: arm64: kernel: avoid x18 in __cpu_soft_restart
FROMLIST: arm64: kvm: stop treating register x18 as caller save
FROMLIST: arm64/lib: copy_page: avoid x18 register in assembler code
FROMLIST: arm64: mm: avoid x18 in idmap_kpti_install_ng_mappings
ANDROID: use non-canonical CFI jump tables
ANDROID: arm64: add __nocfi to __apply_alternatives
ANDROID: arm64: add __pa_function
ANDROID: arm64: allow ThinLTO to be selected
ANDROID: soc/tegra: disable ARCH_TEGRA_210_SOC with LTO
FROMLIST: arm64: fix alternatives with LLVM's integrated assembler
ANDROID: irqchip/gic-v3: rename gic_of_init to work around a ThinLTO+CFI bug
ANDROID: kbuild: limit LTO inlining
ANDROID: kbuild: merge module sections with LTO
ANDROID: init: ensure initcall ordering with LTO
Revert "ANDROID: HACK: init: ensure initcall ordering with LTO"
ANDROID: add support for ThinLTO
ANDROID: Switch to LLD
ANDROID: clang: update to 10.0.1
ANDROID: arm64: add atomic_ll_sc.o to obj-y if using lld
ANDROID: enable ARM64_ERRATUM_843419 by default with LTO_CLANG
ANDROID: kbuild: allow lld to be used with CONFIG_LTO_CLANG
ANDROID: Makefile: set -Qunused-arguments sooner
BACKPORT: FROMLIST: Makefile: lld: tell clang to use lld
BACKPORT: FROMLIST: Makefile: lld: set -O2 linker flag when linking with LLD
ANDROID: scripts/Kbuild: add ld-name support for ld.lld
UPSTREAM: bpf: permit multiple bpf attachments for a single perf event
UPSTREAM: bpf: use the same condition in perf event set/free bpf handler
UPSTREAM: bpf: multi program support for cgroup+bpf
BACKPORT: serdev: make synchronous write return bytes written
UPSTREAM: gnss: serial: fix synchronous write timeout
UPSTREAM: gnss: fix potential error pointer dereference
BACKPORT: gnss: add receiver type support
UPSTREAM: dt-bindings: add generic gnss binding
UPSTREAM: gnss: add generic serial driver
ANDROID: cuttlefish_defconfig: Enable CONFIG_SERIAL_DEV_BUS
ANDROID: cuttlefish_defconfig: Enable CONFIG_GNSS
BACKPORT: gnss: add GNSS receiver subsystem
UPSTREAM: arm64: Validate tagged addresses in access_ok() called from kernel threads
BACKPORT: ARM: 8905/1: Emit __gnu_mcount_nc when using Clang 10.0.0 or newer
fs/lock: skip lock owner pid translation in case we are in init_pid_ns
f2fs: stop GC when the victim becomes fully valid
f2fs: expose main_blkaddr in sysfs
f2fs: choose hardlimit when softlimit is larger than hardlimit in f2fs_statfs_project()
f2fs: Fix deadlock in f2fs_gc() context during atomic files handling
f2fs: show f2fs instance in printk_ratelimited
f2fs: fix potential overflow
f2fs: fix to update dir's i_pino during cross_rename
f2fs: support aligned pinned file
f2fs: avoid kernel panic on corruption test
f2fs: fix wrong description in document
f2fs: cache global IPU bio
f2fs: fix to avoid memory leakage in f2fs_listxattr
f2fs: check total_segments from devices in raw_super
f2fs: update multi-dev metadata in resize_fs
f2fs: mark recovery flag correctly in read_raw_super_block()
f2fs: fix to update time in lazytime mode
vfs: don't allow writes to swap files
mm: set S_SWAPFILE on blockdev swap devices
Conflicts:
drivers/Makefile
drivers/staging/android/ion/ion.c
drivers/staging/android/ion/ion.h
drivers/staging/android/ion/ion_page_pool.c
drivers/usb/dwc3/core.c
drivers/usb/dwc3/debugfs.c
drivers/usb/dwc3/ep0.c
fs/f2fs/data.c
include/linux/mmzone.h
mm/vmstat.c
Discarded below patches, as usb patches not applicable and block patch
causing stability issues:
usb: dwc3: ep0: Clear started flag on completion
usb: dwc3: don't log probe deferrals; but do log other error codes
block: fix single range discard merge
Fixed build errors in below files:
drivers/gpu/msm/kgsl_pool.c
drivers/staging/android/ion/ion_page_pool.c
kernel/taskstats.c
Fixed bootup issue in:
arch/arm64/mm/proc.s
Change-Id: I0a16824c251c14c63af78f9cfd9ede5e82c427fc
Signed-off-by: Srinivasarao P <spathi@codeaurora.org>
Signed-off-by: Blagovest Kolenichev <bkolenichev@codeaurora.org>
5 years ago
mod_node_page_state ( page_pgdat ( p ) , NR_KERNEL_MISC_RECLAIMABLE ,
( 1 < < pool - > pool_order ) ) ;
}
/* Returns a page from specified pool */
static struct page *
_kgsl_pool_get_page ( struct kgsl_page_pool * pool )
{
struct page * p = NULL ;
spin_lock ( & pool - > list_lock ) ;
if ( pool - > page_count ) {
p = list_first_entry ( & pool - > page_list , struct page , lru ) ;
pool - > page_count - - ;
list_del ( & p - > lru ) ;
}
spin_unlock ( & pool - > list_lock ) ;
if ( p ! = NULL )
mod_node_page_state ( page_pgdat ( p ) ,
Merge android-4.14.159 (f960b38) into msm-4.14
* refs/heads/tmp-f960b38:
Linux 4.14.159
of: unittest: fix memory leak in attach_node_and_children
raid5: need to set STRIPE_HANDLE for batch head
gpiolib: acpi: Add Terra Pad 1061 to the run_edge_events_on_boot_blacklist
kernel/module.c: wakeup processes in module_wq on module unload
gfs2: fix glock reference problem in gfs2_trans_remove_revoke
net/mlx5e: Fix SFF 8472 eeprom length
sunrpc: fix crash when cache_head become valid before update
workqueue: Fix missing kfree(rescuer) in destroy_workqueue()
blk-mq: make sure that line break can be printed
mfd: rk808: Fix RK818 ID template
ext4: fix a bug in ext4_wait_for_tail_page_commit
mm/shmem.c: cast the type of unmap_start to u64
firmware: qcom: scm: Ensure 'a0' status code is treated as signed
ext4: work around deleting a file with i_nlink == 0 safely
powerpc: Fix vDSO clock_getres()
powerpc: Avoid clang warnings around setjmp and longjmp
ath10k: fix fw crash by moving chip reset after napi disabled
media: vimc: fix component match compare
mlxsw: spectrum_router: Refresh nexthop neighbour when it becomes dead
power: supply: cpcap-battery: Fix signed counter sample register
x86/MCE/AMD: Carve out the MC4_MISC thresholding quirk
x86/MCE/AMD: Turn off MC4_MISC thresholding on all family 0x15 models
e100: Fix passing zero to 'PTR_ERR' warning in e100_load_ucode_wait
drbd: Change drbd_request_detach_interruptible's return type to int
scsi: lpfc: Correct code setting non existent bits in sli4 ABORT WQE
scsi: lpfc: Cap NPIV vports to 256
omap: pdata-quirks: remove openpandora quirks for mmc3 and wl1251
phy: renesas: rcar-gen3-usb2: Fix sysfs interface of "role"
iio: adis16480: Add debugfs_reg_access entry
xhci: make sure interrupts are restored to correct state
xhci: Fix memory leak in xhci_add_in_port()
scsi: qla2xxx: Fix message indicating vectors used by driver
scsi: qla2xxx: Always check the qla2x00_wait_for_hba_online() return value
scsi: qla2xxx: Fix qla24xx_process_bidir_cmd()
scsi: qla2xxx: Fix session lookup in qlt_abort_work()
scsi: qla2xxx: Fix DMA unmap leak
scsi: zfcp: trace channel log even for FCP command responses
block: fix single range discard merge
reiserfs: fix extended attributes on the root directory
ext4: Fix credit estimate for final inode freeing
quota: fix livelock in dquot_writeback_dquots
ext2: check err when partial != NULL
quota: Check that quota is not dirty before release
video/hdmi: Fix AVI bar unpack
powerpc/xive: Skip ioremap() of ESB pages for LSI interrupts
powerpc: Allow flush_icache_range to work across ranges >4GB
powerpc/xive: Prevent page fault issues in the machine crash handler
powerpc: Allow 64bit VDSO __kernel_sync_dicache to work across ranges >4GB
ppdev: fix PPGETTIME/PPSETTIME ioctls
ARM: dts: omap3-tao3530: Fix incorrect MMC card detection GPIO polarity
mmc: host: omap_hsmmc: add code for special init of wl1251 to get rid of pandora_wl1251_init_card
pinctrl: samsung: Fix device node refcount leaks in S3C64xx wakeup controller init
pinctrl: samsung: Fix device node refcount leaks in init code
pinctrl: samsung: Fix device node refcount leaks in S3C24xx wakeup controller init
pinctrl: samsung: Add of_node_put() before return in error path
ACPI: PM: Avoid attaching ACPI PM domain to certain devices
ACPI: bus: Fix NULL pointer check in acpi_bus_get_private_data()
ACPI: OSL: only free map once in osl.c
cpufreq: powernv: fix stack bloat and hard limit on number of CPUs
PM / devfreq: Lock devfreq in trans_stat_show
intel_th: pci: Add Tiger Lake CPU support
intel_th: pci: Add Ice Lake CPU support
intel_th: Fix a double put_device() in error path
cpuidle: Do not unset the driver if it is there already
media: cec.h: CEC_OP_REC_FLAG_ values were swapped
media: radio: wl1273: fix interrupt masking on release
media: bdisp: fix memleak on release
s390/mm: properly clear _PAGE_NOEXEC bit when it is not supported
ar5523: check NULL before memcpy() in ar5523_cmd()
cgroup: pids: use atomic64_t for pids->limit
blk-mq: avoid sysfs buffer overflow with too many CPU cores
ASoC: Jack: Fix NULL pointer dereference in snd_soc_jack_report
workqueue: Fix pwq ref leak in rescuer_thread()
workqueue: Fix spurious sanity check failures in destroy_workqueue()
dm zoned: reduce overhead of backing device checks
hwrng: omap - Fix RNG wait loop timeout
watchdog: aspeed: Fix clock behaviour for ast2600
md/raid0: Fix an error message in raid0_make_request()
ALSA: hda - Fix pending unsol events at shutdown
ovl: relax WARN_ON() on rename to self
lib: raid6: fix awk build warnings
rtlwifi: rtl8192de: Fix missing enable interrupt flag
rtlwifi: rtl8192de: Fix missing callback that tests for hw release of buffer
rtlwifi: rtl8192de: Fix missing code to retrieve RX buffer address
btrfs: record all roots for rename exchange on a subvol
Btrfs: send, skip backreference walking for extents with many references
btrfs: Remove btrfs_bio::flags member
Btrfs: fix negative subv_writers counter and data space leak after buffered write
btrfs: use refcount_inc_not_zero in kill_all_nodes
btrfs: check page->mapping when loading free space cache
usb: dwc3: ep0: Clear started flag on completion
virtio-balloon: fix managed page counts when migrating pages between zones
mtd: spear_smi: Fix Write Burst mode
tpm: add check after commands attribs tab allocation
usb: mon: Fix a deadlock in usbmon between mmap and read
usb: core: urb: fix URB structure initialization function
USB: adutux: fix interface sanity check
USB: serial: io_edgeport: fix epic endpoint lookup
USB: idmouse: fix interface sanity checks
USB: atm: ueagle-atm: add missing endpoint check
iio: humidity: hdc100x: fix IIO_HUMIDITYRELATIVE channel reporting
ARM: dts: pandora-common: define wl1251 as child node of mmc3
xhci: handle some XHCI_TRUST_TX_LENGTH quirks cases as default behaviour.
xhci: Increase STS_HALT timeout in xhci_suspend()
usb: xhci: only set D3hot for pci device
staging: gigaset: add endpoint-type sanity check
staging: gigaset: fix illegal free on probe errors
staging: gigaset: fix general protection fault on probe
staging: rtl8712: fix interface sanity check
staging: rtl8188eu: fix interface sanity check
usb: Allow USB device to be warm reset in suspended state
USB: documentation: flags on usb-storage versus UAS
USB: uas: heed CAPACITY_HEURISTICS
USB: uas: honor flag to avoid CAPACITY16
media: venus: remove invalid compat_ioctl32 handler
scsi: qla2xxx: Fix driver unload hang
usb: gadget: pch_udc: fix use after free
usb: gadget: configfs: Fix missing spin_lock_init()
appletalk: Set error code if register_snap_client failed
appletalk: Fix potential NULL pointer dereference in unregister_snap_client
KVM: x86: fix out-of-bounds write in KVM_GET_EMULATED_CPUID (CVE-2019-19332)
ASoC: rsnd: fixup MIX kctrl registration
binder: Handle start==NULL in binder_update_page_range()
thermal: Fix deadlock in thermal thermal_zone_device_check
iomap: Fix pipe page leakage during splicing
RDMA/qib: Validate ->show()/store() callbacks before calling them
spi: atmel: Fix CS high support
crypto: user - fix memory leak in crypto_report
crypto: ecdh - fix big endian bug in ECC library
crypto: ccp - fix uninitialized list head
crypto: af_alg - cast ki_complete ternary op to int
crypto: crypto4xx - fix double-free in crypto4xx_destroy_sdr
KVM: x86: fix presentation of TSX feature in ARCH_CAPABILITIES
KVM: x86: do not modify masked bits of shared MSRs
KVM: arm/arm64: vgic: Don't rely on the wrong pending table
drm/i810: Prevent underflow in ioctl
jbd2: Fix possible overflow in jbd2_log_space_left()
kernfs: fix ino wrap-around detection
can: slcan: Fix use-after-free Read in slcan_open
tty: vt: keyboard: reject invalid keycodes
CIFS: Fix SMB2 oplock break processing
CIFS: Fix NULL-pointer dereference in smb2_push_mandatory_locks
x86/PCI: Avoid AMD FCH XHCI USB PME# from D0 defect
Input: Fix memory leak in psxpad_spi_probe
coresight: etm4x: Fix input validation for sysfs.
Input: goodix - add upside-down quirk for Teclast X89 tablet
Input: synaptics-rmi4 - don't increment rmiaddr for SMBus transfers
Input: synaptics-rmi4 - re-enable IRQs in f34v7_do_reflash
Input: synaptics - switch another X1 Carbon 6 to RMI/SMbus
ALSA: hda - Add mute led support for HP ProBook 645 G4
ALSA: pcm: oss: Avoid potential buffer overflows
ALSA: hda/realtek - Dell headphone has noise on unmute for ALC236
fuse: verify attributes
fuse: verify nlink
sched/fair: Scale bandwidth quota and period without losing quota/period ratio precision
tcp: exit if nothing to retransmit on RTO timeout
net: aquantia: fix RSS table and key sizes
media: vimc: fix start stream when link is disabled
ARM: dts: sunxi: Fix PMU compatible strings
usb: mtu3: fix dbginfo in qmu_tx_zlp_error_handler
mlx4: Use snprintf instead of complicated strcpy
IB/hfi1: Close VNIC sdma_progress sleep window
IB/hfi1: Ignore LNI errors before DC8051 transitions to Polling state
mlxsw: spectrum_router: Relax GRE decap matching check
firmware: qcom: scm: fix compilation error when disabled
media: stkwebcam: Bugfix for wrong return values
tty: Don't block on IO when ldisc change is pending
nfsd: Return EPERM, not EACCES, in some SETATTR cases
MIPS: OCTEON: cvmx_pko_mem_debug8: use oldest forward compatible definition
clk: renesas: r8a77995: Correct parent clock of DU
powerpc/math-emu: Update macros from GCC
pstore/ram: Avoid NULL deref in ftrace merging failure path
net/mlx4_core: Fix return codes of unsupported operations
dlm: fix invalid cluster name warning
ARM: dts: realview: Fix some more duplicate regulator nodes
clk: sunxi-ng: h3/h5: Fix CSI_MCLK parent
ARM: dts: pxa: clean up USB controller nodes
mtd: fix mtd_oobavail() incoherent returned value
kbuild: fix single target build for external module
modpost: skip ELF local symbols during section mismatch check
tcp: fix SNMP TCP timeout under-estimation
tcp: fix SNMP under-estimation on failed retransmission
tcp: fix off-by-one bug on aborting window-probing socket
ARM: dts: realview-pbx: Fix duplicate regulator nodes
ARM: dts: mmp2: fix the gpio interrupt cell number
net/x25: fix null_x25_address handling
net/x25: fix called/calling length calculation in x25_parse_address_block
arm64: dts: meson-gxl-khadas-vim: fix GPIO lines names
arm64: dts: meson-gxbb-odroidc2: fix GPIO lines names
arm64: dts: meson-gxbb-nanopi-k2: fix GPIO lines names
arm64: dts: meson-gxl-libretech-cc: fix GPIO lines names
ARM: OMAP1/2: fix SoC name printing
ASoC: au8540: use 64-bit arithmetic instead of 32-bit
nfsd: fix a warning in __cld_pipe_upcall()
ARM: debug: enable UART1 for socfpga Cyclone5
dlm: NULL check before kmem_cache_destroy is not needed
ARM: dts: sun8i: v3s: Change pinctrl nodes to avoid warning
ARM: dts: sun5i: a10s: Fix HDMI output DTC warning
ASoC: rsnd: tidyup registering method for rsnd_kctrl_new()
lockd: fix decoding of TEST results
i2c: imx: don't print error message on probe defer
serial: imx: fix error handling in console_setup
altera-stapl: check for a null key before strcasecmp'ing it
dma-mapping: fix return type of dma_set_max_seg_size()
sparc: Correct ctx->saw_frame_pointer logic.
f2fs: fix to allow node segment for GC by ioctl path
ARM: dts: rockchip: Assign the proper GPIO clocks for rv1108
ARM: dts: rockchip: Fix the PMU interrupt number for rv1108
f2fs: change segment to section in f2fs_ioc_gc_range
f2fs: fix count of seg_freed to make sec_freed correct
ACPI: fix acpi_find_child_device() invocation in acpi_preset_companion()
usb: dwc3: don't log probe deferrals; but do log other error codes
usb: dwc3: debugfs: Properly print/set link state for HS
dmaengine: dw-dmac: implement dma protection control setting
dmaengine: coh901318: Remove unused variable
dmaengine: coh901318: Fix a double-lock bug
media: cec: report Vendor ID after initialization
media: pulse8-cec: return 0 when invalidating the logical address
ARM: dts: exynos: Use Samsung SoC specific compatible for DWC2 module
rtc: dt-binding: abx80x: fix resistance scale
rtc: max8997: Fix the returned value in case of error in 'max8997_rtc_read_alarm()'
math-emu/soft-fp.h: (_FP_ROUND_ZERO) cast 0 to void to fix warning
net/smc: use after free fix in smc_wr_tx_put_slot()
MIPS: OCTEON: octeon-platform: fix typing
iomap: sub-block dio needs to zeroout beyond EOF
net-next/hinic:fix a bug in set mac address
regulator: Fix return value of _set_load() stub
clk: rockchip: fix ID of 8ch clock of I2S1 for rk3328
clk: rockchip: fix I2S1 clock gate register for rk3328
mm/vmstat.c: fix NUMA statistics updates
Staging: iio: adt7316: Fix i2c data reading, set the data field
pinctrl: qcom: ssbi-gpio: fix gpio-hog related boot issues
crypto: bcm - fix normal/non key hash algorithm failure
crypto: ecc - check for invalid values in the key verification test
scsi: zfcp: drop default switch case which might paper over missing case
net: dsa: mv88e6xxx: Work around mv886e6161 SERDES missing MII_PHYSID2
MIPS: SiByte: Enable ZONE_DMA32 for LittleSur
dlm: fix missing idr_destroy for recover_idr
ARM: dts: rockchip: Fix rk3288-rock2 vcc_flash name
clk: rockchip: fix rk3188 sclk_mac_lbtest parameter ordering
clk: rockchip: fix rk3188 sclk_smc gate data
i40e: don't restart nway if autoneg not supported
rtc: s3c-rtc: Avoid using broken ALMYEAR register
net: ethernet: ti: cpts: correct debug for expired txq skb
extcon: max8997: Fix lack of path setting in USB device mode
dlm: fix possible call to kfree() for non-initialized pointer
clk: sunxi-ng: a64: Fix gate bit of DSI DPHY
net/mlx5: Release resource on error flow
ARM: 8813/1: Make aligned 2-byte getuser()/putuser() atomic on ARMv6+
iwlwifi: mvm: Send non offchannel traffic via AP sta
iwlwifi: mvm: synchronize TID queue removal
cxgb4vf: fix memleak in mac_hlist initialization
serial: core: Allow processing sysrq at port unlock time
i2c: core: fix use after free in of_i2c_notify
net: ep93xx_eth: fix mismatch of request_mem_region in remove
rsxx: add missed destroy_workqueue calls in remove
ALSA: pcm: Fix stream lock usage in snd_pcm_period_elapsed()
sched/core: Avoid spurious lock dependencies
Input: cyttsp4_core - fix use after free bug
xfrm: release device reference for invalid state
NFC: nxp-nci: Fix NULL pointer dereference after I2C communication error
audit_get_nd(): don't unlock parent too early
exportfs_decode_fh(): negative pinned may become positive without the parent locked
iwlwifi: pcie: don't consider IV len in A-MSDU
RDMA/hns: Correct the value of HNS_ROCE_HEM_CHUNK_LEN
autofs: fix a leak in autofs_expire_indirect()
serial: ifx6x60: add missed pm_runtime_disable
serial: serial_core: Perform NULL checks for break_ctl ops
serial: pl011: Fix DMA ->flush_buffer()
tty: serial: msm_serial: Fix flow control
tty: serial: fsl_lpuart: use the sg count from dma_map_sg
usb: gadget: u_serial: add missing port entry locking
arm64: tegra: Fix 'active-low' warning for Jetson TX1 regulator
rsi: release skb if rsi_prepare_beacon fails
ANDROID: staging: android: ion: Fix build when CONFIG_ION_SYSTEM_HEAP=n
ANDROID: staging: android: ion: Expose total heap and pool sizes via sysfs
UPSTREAM: include/linux/slab.h: fix sparse warning in kmalloc_type()
UPSTREAM: mm, slab: shorten kmalloc cache names for large sizes
UPSTREAM: mm, proc: add KReclaimable to /proc/meminfo
BACKPORT: mm: rename and change semantics of nr_indirectly_reclaimable_bytes
UPSTREAM: dcache: allocate external names from reclaimable kmalloc caches
BACKPORT: mm, slab/slub: introduce kmalloc-reclaimable caches
UPSTREAM: mm, slab: combine kmalloc_caches and kmalloc_dma_caches
ANDROID: kbuild: disable SCS by default in allmodconfig
ANDROID: arm64: cuttlefish_defconfig: enable LTO, CFI, and SCS
BACKPORT: FROMLIST: arm64: implement Shadow Call Stack
FROMLIST: arm64: disable SCS for hypervisor code
BACKPORT: FROMLIST: arm64: vdso: disable Shadow Call Stack
FROMLIST: arm64: preserve x18 when CPU is suspended
FROMLIST: arm64: reserve x18 from general allocation with SCS
FROMLIST: arm64: disable function graph tracing with SCS
FROMLIST: scs: add support for stack usage debugging
FROMLIST: scs: add accounting
FROMLIST: add support for Clang's Shadow Call Stack (SCS)
FROMLIST: arm64: kernel: avoid x18 in __cpu_soft_restart
FROMLIST: arm64: kvm: stop treating register x18 as caller save
FROMLIST: arm64/lib: copy_page: avoid x18 register in assembler code
FROMLIST: arm64: mm: avoid x18 in idmap_kpti_install_ng_mappings
ANDROID: use non-canonical CFI jump tables
ANDROID: arm64: add __nocfi to __apply_alternatives
ANDROID: arm64: add __pa_function
ANDROID: arm64: allow ThinLTO to be selected
ANDROID: soc/tegra: disable ARCH_TEGRA_210_SOC with LTO
FROMLIST: arm64: fix alternatives with LLVM's integrated assembler
ANDROID: irqchip/gic-v3: rename gic_of_init to work around a ThinLTO+CFI bug
ANDROID: kbuild: limit LTO inlining
ANDROID: kbuild: merge module sections with LTO
ANDROID: init: ensure initcall ordering with LTO
Revert "ANDROID: HACK: init: ensure initcall ordering with LTO"
ANDROID: add support for ThinLTO
ANDROID: Switch to LLD
ANDROID: clang: update to 10.0.1
ANDROID: arm64: add atomic_ll_sc.o to obj-y if using lld
ANDROID: enable ARM64_ERRATUM_843419 by default with LTO_CLANG
ANDROID: kbuild: allow lld to be used with CONFIG_LTO_CLANG
ANDROID: Makefile: set -Qunused-arguments sooner
BACKPORT: FROMLIST: Makefile: lld: tell clang to use lld
BACKPORT: FROMLIST: Makefile: lld: set -O2 linker flag when linking with LLD
ANDROID: scripts/Kbuild: add ld-name support for ld.lld
UPSTREAM: bpf: permit multiple bpf attachments for a single perf event
UPSTREAM: bpf: use the same condition in perf event set/free bpf handler
UPSTREAM: bpf: multi program support for cgroup+bpf
BACKPORT: serdev: make synchronous write return bytes written
UPSTREAM: gnss: serial: fix synchronous write timeout
UPSTREAM: gnss: fix potential error pointer dereference
BACKPORT: gnss: add receiver type support
UPSTREAM: dt-bindings: add generic gnss binding
UPSTREAM: gnss: add generic serial driver
ANDROID: cuttlefish_defconfig: Enable CONFIG_SERIAL_DEV_BUS
ANDROID: cuttlefish_defconfig: Enable CONFIG_GNSS
BACKPORT: gnss: add GNSS receiver subsystem
UPSTREAM: arm64: Validate tagged addresses in access_ok() called from kernel threads
BACKPORT: ARM: 8905/1: Emit __gnu_mcount_nc when using Clang 10.0.0 or newer
fs/lock: skip lock owner pid translation in case we are in init_pid_ns
f2fs: stop GC when the victim becomes fully valid
f2fs: expose main_blkaddr in sysfs
f2fs: choose hardlimit when softlimit is larger than hardlimit in f2fs_statfs_project()
f2fs: Fix deadlock in f2fs_gc() context during atomic files handling
f2fs: show f2fs instance in printk_ratelimited
f2fs: fix potential overflow
f2fs: fix to update dir's i_pino during cross_rename
f2fs: support aligned pinned file
f2fs: avoid kernel panic on corruption test
f2fs: fix wrong description in document
f2fs: cache global IPU bio
f2fs: fix to avoid memory leakage in f2fs_listxattr
f2fs: check total_segments from devices in raw_super
f2fs: update multi-dev metadata in resize_fs
f2fs: mark recovery flag correctly in read_raw_super_block()
f2fs: fix to update time in lazytime mode
vfs: don't allow writes to swap files
mm: set S_SWAPFILE on blockdev swap devices
Conflicts:
drivers/Makefile
drivers/staging/android/ion/ion.c
drivers/staging/android/ion/ion.h
drivers/staging/android/ion/ion_page_pool.c
drivers/usb/dwc3/core.c
drivers/usb/dwc3/debugfs.c
drivers/usb/dwc3/ep0.c
fs/f2fs/data.c
include/linux/mmzone.h
mm/vmstat.c
Discarded below patches, as usb patches not applicable and block patch
causing stability issues:
usb: dwc3: ep0: Clear started flag on completion
usb: dwc3: don't log probe deferrals; but do log other error codes
block: fix single range discard merge
Fixed build errors in below files:
drivers/gpu/msm/kgsl_pool.c
drivers/staging/android/ion/ion_page_pool.c
kernel/taskstats.c
Fixed bootup issue in:
arch/arm64/mm/proc.s
Change-Id: I0a16824c251c14c63af78f9cfd9ede5e82c427fc
Signed-off-by: Srinivasarao P <spathi@codeaurora.org>
Signed-off-by: Blagovest Kolenichev <bkolenichev@codeaurora.org>
5 years ago
NR_KERNEL_MISC_RECLAIMABLE ,
- ( 1 < < pool - > pool_order ) ) ;
return p ;
}
/* Returns the number of pages in specified pool */
static int
kgsl_pool_size ( struct kgsl_page_pool * kgsl_pool )
{
int size ;
spin_lock ( & kgsl_pool - > list_lock ) ;
size = kgsl_pool - > page_count * ( 1 < < kgsl_pool - > pool_order ) ;
spin_unlock ( & kgsl_pool - > list_lock ) ;
return size ;
}
/* Returns the number of pages in all kgsl page pools */
static int kgsl_pool_size_total ( void )
{
int i ;
int total = 0 ;
for ( i = 0 ; i < kgsl_num_pools ; i + + )
total + = kgsl_pool_size ( & kgsl_pools [ i ] ) ;
return total ;
}
/*
* This will shrink the specified pool by num_pages or its pool_size ,
* whichever is smaller .
*/
static unsigned int
_kgsl_pool_shrink ( struct kgsl_page_pool * pool , int num_pages )
{
int j ;
unsigned int pcount = 0 ;
if ( pool = = NULL | | num_pages < = 0 )
return pcount ;
for ( j = 0 ; j < num_pages > > pool - > pool_order ; j + + ) {
struct page * page = _kgsl_pool_get_page ( pool ) ;
if ( page ! = NULL ) {
__free_pages ( page , pool - > pool_order ) ;
pcount + = ( 1 < < pool - > pool_order ) ;
} else {
/* Break as this pool is empty */
break ;
}
}
return pcount ;
}
/*
* This function reduces the total pool size
* to number of pages specified by target_pages .
*
* If target_pages are greater than current pool size
* nothing needs to be done otherwise remove
* ( current_pool_size - target_pages ) pages from pool
* starting from higher order pool .
*/
static unsigned long
kgsl_pool_reduce ( unsigned int target_pages , bool exit )
{
int total_pages = 0 ;
int i ;
int nr_removed ;
struct kgsl_page_pool * pool ;
unsigned long pcount = 0 ;
total_pages = kgsl_pool_size_total ( ) ;
for ( i = ( kgsl_num_pools - 1 ) ; i > = 0 ; i - - ) {
pool = & kgsl_pools [ i ] ;
/*
* Only reduce the pool sizes for pools which are allowed to
* allocate memory unless we are at close , in which case the
* reserved memory for all pools needs to be freed
*/
if ( ! pool - > allocation_allowed & & ! exit )
continue ;
total_pages - = pcount ;
nr_removed = total_pages - target_pages ;
if ( nr_removed < = 0 )
return pcount ;
/* Round up to integral number of pages in this pool */
nr_removed = ALIGN ( nr_removed , 1 < < pool - > pool_order ) ;
/* Remove nr_removed pages from this pool*/
pcount + = _kgsl_pool_shrink ( pool , nr_removed ) ;
}
return pcount ;
}
/**
* kgsl_pool_free_sgt ( ) - Free scatter - gather list
* @ sgt : pointer of the sg list
*
* Free the sg list by collapsing any physical adjacent pages .
* Pages are added back to the pool , if pool has sufficient space
* otherwise they are given back to system .
*/
void kgsl_pool_free_sgt ( struct sg_table * sgt )
{
int i ;
struct scatterlist * sg ;
for_each_sg ( sgt - > sgl , sg , sgt - > nents , i ) {
/*
* sg_alloc_table_from_pages ( ) will collapse any physically
* adjacent pages into a single scatterlist entry . We cannot
* just call __free_pages ( ) on the entire set since we cannot
* ensure that the size is a whole order . Instead , free each
* page or compound page group individually .
*/
struct page * p = sg_page ( sg ) , * next ;
unsigned int count ;
unsigned int j = 0 ;
while ( j < ( sg - > length / PAGE_SIZE ) ) {
count = 1 < < compound_order ( p ) ;
next = nth_page ( p , count ) ;
kgsl_pool_free_page ( p ) ;
p = next ;
j + = count ;
}
}
}
/**
* kgsl_pool_free_pages ( ) - Free pages in the pages array
* @ pages : pointer of the pages array
*
* Free the pages by collapsing any physical adjacent pages .
* Pages are added back to the pool , if pool has sufficient space
* otherwise they are given back to system .
*/
void kgsl_pool_free_pages ( struct page * * pages , unsigned int pcount )
{
int i ;
if ( pages = = NULL | | pcount = = 0 )
return ;
if ( WARN ( ! kern_addr_valid ( ( unsigned long ) pages ) ,
" Address of pages=%pK is not valid \n " , pages ) )
return ;
for ( i = 0 ; i < pcount ; ) {
/*
* Free each page or compound page group individually .
*/
struct page * p = pages [ i ] ;
if ( WARN ( ! kern_addr_valid ( ( unsigned long ) p ) ,
" Address of page=%pK is not valid \n " , p ) )
return ;
i + = 1 < < compound_order ( p ) ;
kgsl_pool_free_page ( p ) ;
}
}
static int kgsl_pool_idx_lookup ( unsigned int order )
{
int i ;
for ( i = 0 ; i < kgsl_num_pools ; i + + )
if ( order = = kgsl_pools [ i ] . pool_order )
return i ;
return - ENOMEM ;
}
static int kgsl_pool_get_retry_order ( unsigned int order )
{
int i ;
for ( i = kgsl_num_pools - 1 ; i > 0 ; i - - )
if ( order > = kgsl_pools [ i ] . pool_order )
return kgsl_pools [ i ] . pool_order ;
return 0 ;
}
/**
* kgsl_pool_alloc_page ( ) - Allocate a page of requested size
* @ page_size : Size of the page to be allocated
* @ pages : pointer to hold list of pages , should be big enough to hold
* requested page
* @ len : Length of array pages .
*
* Return total page count on success and negative value on failure
*/
int kgsl_pool_alloc_page ( int * page_size , struct page * * pages ,
unsigned int pages_len , unsigned int * align )
{
int j ;
int pcount = 0 ;
struct kgsl_page_pool * pool ;
struct page * page = NULL ;
struct page * p = NULL ;
int order = get_order ( * page_size ) ;
int pool_idx ;
size_t size = 0 ;
if ( ( pages = = NULL ) | | pages_len < ( * page_size > > PAGE_SHIFT ) )
return - EINVAL ;
/* If the pool is not configured get pages from the system */
if ( ! kgsl_num_pools ) {
gfp_t gfp_mask = kgsl_gfp_mask ( order ) ;
page = alloc_pages ( gfp_mask , order ) ;
if ( page = = NULL ) {
/* Retry with lower order pages */
if ( order > 0 ) {
size = PAGE_SIZE < < - - order ;
goto eagain ;
} else
return - ENOMEM ;
}
_kgsl_pool_zero_page ( page , order ) ;
goto done ;
}
pool = _kgsl_get_pool_from_order ( order ) ;
if ( pool = = NULL ) {
/* Retry with lower order pages */
if ( order > 0 ) {
size = PAGE_SIZE < < kgsl_pool_get_retry_order ( order ) ;
goto eagain ;
} else {
/*
* Fall back to direct allocation in case
* pool with zero order is not present
*/
gfp_t gfp_mask = kgsl_gfp_mask ( order ) ;
page = alloc_pages ( gfp_mask , order ) ;
if ( page = = NULL )
return - ENOMEM ;
_kgsl_pool_zero_page ( page , order ) ;
goto done ;
}
}
pool_idx = kgsl_pool_idx_lookup ( order ) ;
page = _kgsl_pool_get_page ( pool ) ;
/* Allocate a new page if not allocated from pool */
if ( page = = NULL ) {
gfp_t gfp_mask = kgsl_gfp_mask ( order ) ;
/* Only allocate non-reserved memory for certain pools */
if ( ! pool - > allocation_allowed & & pool_idx > 0 ) {
size = PAGE_SIZE < <
kgsl_pools [ pool_idx - 1 ] . pool_order ;
goto eagain ;
}
page = alloc_pages ( gfp_mask , order ) ;
if ( ! page ) {
if ( pool_idx > 0 ) {
/* Retry with lower order pages */
size = PAGE_SIZE < <
kgsl_pools [ pool_idx - 1 ] . pool_order ;
goto eagain ;
} else
return - ENOMEM ;
}
_kgsl_pool_zero_page ( page , order ) ;
}
done :
for ( j = 0 ; j < ( * page_size > > PAGE_SHIFT ) ; j + + ) {
p = nth_page ( page , j ) ;
pages [ pcount ] = p ;
pcount + + ;
}
mod_node_page_state ( page_pgdat ( page ) , NR_UNRECLAIMABLE_PAGES ,
( 1 < < order ) ) ;
return pcount ;
eagain :
* page_size = kgsl_get_page_size ( size ,
ilog2 ( size ) ) ;
* align = ilog2 ( * page_size ) ;
return - EAGAIN ;
}
void kgsl_pool_free_page ( struct page * page )
{
struct kgsl_page_pool * pool ;
int page_order ;
if ( page = = NULL )
return ;
page_order = compound_order ( page ) ;
mod_node_page_state ( page_pgdat ( page ) , NR_UNRECLAIMABLE_PAGES ,
- ( 1 < < page_order ) ) ;
if ( ! kgsl_pool_max_pages | |
( kgsl_pool_size_total ( ) < kgsl_pool_max_pages ) ) {
pool = _kgsl_get_pool_from_order ( page_order ) ;
if ( pool ! = NULL ) {
_kgsl_pool_add_page ( pool , page ) ;
return ;
}
}
/* Give back to system as not added to pool */
__free_pages ( page , page_order ) ;
}
/*
* Return true if the pool of specified page size is supported
* or no pools are supported otherwise return false .
*/
bool kgsl_pool_avaialable ( int page_size )
{
int i ;
if ( ! kgsl_num_pools )
return true ;
for ( i = 0 ; i < kgsl_num_pools ; i + + )
if ( ilog2 ( page_size > > PAGE_SHIFT ) = = kgsl_pools [ i ] . pool_order )
return true ;
return false ;
}
static void kgsl_pool_reserve_pages ( void )
{
int i , j ;
for ( i = 0 ; i < kgsl_num_pools ; i + + ) {
struct page * page ;
for ( j = 0 ; j < kgsl_pools [ i ] . reserved_pages ; j + + ) {
int order = kgsl_pools [ i ] . pool_order ;
gfp_t gfp_mask = kgsl_gfp_mask ( order ) ;
page = alloc_pages ( gfp_mask , order ) ;
if ( page ! = NULL )
_kgsl_pool_add_page ( & kgsl_pools [ i ] , page ) ;
}
}
}
/* Functions for the shrinker */
static unsigned long
kgsl_pool_shrink_scan_objects ( struct shrinker * shrinker ,
struct shrink_control * sc )
{
/* nr represents number of pages to be removed*/
int nr = sc - > nr_to_scan ;
int total_pages = kgsl_pool_size_total ( ) ;
/* Target pages represents new pool size */
int target_pages = ( nr > total_pages ) ? 0 : ( total_pages - nr ) ;
/* Reduce pool size to target_pages */
return kgsl_pool_reduce ( target_pages , false ) ;
}
static unsigned long
kgsl_pool_shrink_count_objects ( struct shrinker * shrinker ,
struct shrink_control * sc )
{
/* Return total pool size as everything in pool can be freed */
return kgsl_pool_size_total ( ) ;
}
/* Shrinker callback data*/
static struct shrinker kgsl_pool_shrinker = {
. count_objects = kgsl_pool_shrink_count_objects ,
. scan_objects = kgsl_pool_shrink_scan_objects ,
. seeks = DEFAULT_SEEKS ,
. batch = 0 ,
} ;
static void kgsl_pool_config ( unsigned int order , unsigned int reserved_pages ,
bool allocation_allowed )
{
# ifdef CONFIG_ALLOC_BUFFERS_IN_4K_CHUNKS
if ( order > 0 ) {
pr_info ( " %s: Pool order:%d not supprted.!! \n " , __func__ , order ) ;
return ;
}
# endif
if ( ( order > KGSL_MAX_POOL_ORDER ) | |
( reserved_pages > KGSL_MAX_RESERVED_PAGES ) )
return ;
kgsl_pools [ kgsl_num_pools ] . pool_order = order ;
kgsl_pools [ kgsl_num_pools ] . reserved_pages = reserved_pages ;
kgsl_pools [ kgsl_num_pools ] . allocation_allowed = allocation_allowed ;
spin_lock_init ( & kgsl_pools [ kgsl_num_pools ] . list_lock ) ;
INIT_LIST_HEAD ( & kgsl_pools [ kgsl_num_pools ] . page_list ) ;
kgsl_num_pools + + ;
}
static void kgsl_of_parse_mempools ( struct device_node * node )
{
struct device_node * child ;
unsigned int page_size , reserved_pages = 0 ;
bool allocation_allowed ;
for_each_child_of_node ( node , child ) {
unsigned int index ;
if ( of_property_read_u32 ( child , " reg " , & index ) )
return ;
if ( index > = KGSL_MAX_POOLS )
continue ;
if ( of_property_read_u32 ( child , " qcom,mempool-page-size " ,
& page_size ) )
return ;
of_property_read_u32 ( child , " qcom,mempool-reserved " ,
& reserved_pages ) ;
allocation_allowed = of_property_read_bool ( child ,
" qcom,mempool-allocate " ) ;
kgsl_pool_config ( ilog2 ( page_size > > PAGE_SHIFT ) , reserved_pages ,
allocation_allowed ) ;
}
}
static void kgsl_of_get_mempools ( struct device_node * parent )
{
struct device_node * node ;
node = of_find_compatible_node ( parent , NULL , " qcom,gpu-mempools " ) ;
if ( node ! = NULL ) {
/* Get Max pages limit for mempool */
of_property_read_u32 ( node , " qcom,mempool-max-pages " ,
& kgsl_pool_max_pages ) ;
kgsl_of_parse_mempools ( node ) ;
}
}
void kgsl_init_page_pools ( struct platform_device * pdev )
{
/* Get GPU mempools data and configure pools */
kgsl_of_get_mempools ( pdev - > dev . of_node ) ;
/* Reserve the appropriate number of pages for each pool */
kgsl_pool_reserve_pages ( ) ;
/* Initialize shrinker */
register_shrinker ( & kgsl_pool_shrinker ) ;
}
void kgsl_exit_page_pools ( void )
{
/* Release all pages in pools, if any.*/
kgsl_pool_reduce ( 0 , true ) ;
/* Unregister shrinker */
unregister_shrinker ( & kgsl_pool_shrinker ) ;
}