Commit Graph

975027 Commits

Author SHA1 Message Date
Quentin Perret
d8eb170aa9 FROMLIST: KVM: arm64: Elevate hypervisor mappings creation at EL2
Previous commits have introduced infrastructure to enable the EL2 code
to manage its own stage 1 mappings. However, this was preliminary work,
and none of it is currently in use.

Put all of this together by elevating the mapping creation at EL2 when
memory protection is enabled. In this case, the host kernel running
at EL1 still creates _temporary_ EL2 mappings, only used while
initializing the hypervisor, but frees them right after.

As such, all calls to create_hyp_mappings() after kvm init has finished
turn into hypercalls, as the host now has no 'legal' way to modify the
hypevisor page tables directly.

Acked-by: Will Deacon <will@kernel.org>
Signed-off-by: Quentin Perret <qperret@google.com>
Link: https://lore.kernel.org/r/20210315143536.214621-19-qperret@google.com
Bug: 178098380
Change-Id: I0c93c298bc16fc913c6e0faf51c395aa0215c444
2021-03-17 18:48:50 +00:00
Quentin Perret
ae1ed8a984 FROMLIST: KVM: arm64: Prepare the creation of s1 mappings at EL2
When memory protection is enabled, the EL2 code needs the ability to
create and manage its own page-table. To do so, introduce a new set of
hypercalls to bootstrap a memory management system at EL2.

This leads to the following boot flow in nVHE Protected mode:

 1. the host allocates memory for the hypervisor very early on, using
    the memblock API;

 2. the host creates a set of stage 1 page-table for EL2, installs the
    EL2 vectors, and issues the __pkvm_init hypercall;

 3. during __pkvm_init, the hypervisor re-creates its stage 1 page-table
    and stores it in the memory pool provided by the host;

 4. the hypervisor then extends its stage 1 mappings to include a
    vmemmap in the EL2 VA space, hence allowing to use the buddy
    allocator introduced in a previous patch;

 5. the hypervisor jumps back in the idmap page, switches from the
    host-provided page-table to the new one, and wraps up its
    initialization by enabling the new allocator, before returning to
    the host.

 6. the host can free the now unused page-table created for EL2, and
    will now need to issue hypercalls to make changes to the EL2 stage 1
    mappings instead of modifying them directly.

Note that for the sake of simplifying the review, this patch focuses on
the hypervisor side of things. In other words, this only implements the
new hypercalls, but does not make use of them from the host yet. The
host-side changes will follow in a subsequent patch.

Credits to Will for __pkvm_init_switch_pgd.

Acked-by: Will Deacon <will@kernel.org>
Co-authored-by: Will Deacon <will@kernel.org>
Signed-off-by: Will Deacon <will@kernel.org>
Signed-off-by: Quentin Perret <qperret@google.com>
Link: https://lore.kernel.org/r/20210315143536.214621-18-qperret@google.com
Bug: 178098380
Change-Id: I039096f049ad3fa083f56e19fb66ea09645d749a
2021-03-17 18:48:50 +00:00
Quentin Perret
364f0639db FROMLIST: arm64: asm: Provide set_sctlr_el2 macro
We will soon need to turn the EL2 stage 1 MMU on and off in nVHE
protected mode, so refactor the set_sctlr_el1 macro to make it usable
for that purpose.

Acked-by: Will Deacon <will@kernel.org>
Suggested-by: Will Deacon <will@kernel.org>
Signed-off-by: Quentin Perret <qperret@google.com>
Link: https://lore.kernel.org/r/20210315143536.214621-17-qperret@google.com
Bug: 178098380
Change-Id: Ia1ae2a0e20ac1572da220572b3ca6bd3eaecca46
2021-03-17 18:48:49 +00:00
Quentin Perret
ca52b29511 FROMLIST: KVM: arm64: Factor out vector address calculation
In order to re-map the guest vectors at EL2 when pKVM is enabled,
refactor __kvm_vector_slot2idx() and kvm_init_vector_slot() to move all
the address calculation logic in a static inline function.

Acked-by: Will Deacon <will@kernel.org>
Signed-off-by: Quentin Perret <qperret@google.com>
Link: https://lore.kernel.org/r/20210315143536.214621-16-qperret@google.com
Bug: 178098380
Change-Id: I52442e4b873cb881b2306dc2aacd3060812f5520
2021-03-17 18:48:49 +00:00
Quentin Perret
a1180dd384 FROMLIST: KVM: arm64: Provide __flush_dcache_area at EL2
We will need to do cache maintenance at EL2 soon, so compile a copy of
__flush_dcache_area at EL2, and provide a copy of arm64_ftr_reg_ctrel0
as it is needed by the read_ctr macro.

Signed-off-by: Quentin Perret <qperret@google.com>
Link: https://lore.kernel.org/r/20210315143536.214621-15-qperret@google.com
Bug: 178098380
Change-Id: Icdf042dc83a4486b615514a9bd6e27af0859ce75
2021-03-17 18:48:49 +00:00
Quentin Perret
37b5552dfb FROMLIST: KVM: arm64: Enable access to sanitized CPU features at EL2
Introduce the infrastructure in KVM enabling to copy CPU feature
registers into EL2-owned data-structures, to allow reading sanitised
values directly at EL2 in nVHE.

Given that only a subset of these features are being read by the
hypervisor, the ones that need to be copied are to be listed under
<asm/kvm_cpufeature.h> together with the name of the nVHE variable that
will hold the copy. This introduces only the infrastructure enabling
this copy. The first users will follow shortly.

Signed-off-by: Quentin Perret <qperret@google.com>
Link: https://lore.kernel.org/r/20210315143536.214621-14-qperret@google.com
Bug: 178098380
Change-Id: I20b08439434b1f6f1c48230b60ce113063c0757f
2021-03-17 18:48:49 +00:00
Quentin Perret
75fba96057 FROMLIST: KVM: arm64: Introduce a Hyp buddy page allocator
When memory protection is enabled, the hyp code will require a basic
form of memory management in order to allocate and free memory pages at
EL2. This is needed for various use-cases, including the creation of hyp
mappings or the allocation of stage 2 page tables.

To address these use-case, introduce a simple memory allocator in the
hyp code. The allocator is designed as a conventional 'buddy allocator',
working with a page granularity. It allows to allocate and free
physically contiguous pages from memory 'pools', with a guaranteed order
alignment in the PA space. Each page in a memory pool is associated
with a struct hyp_page which holds the page's metadata, including its
refcount, as well as its current order, hence mimicking the kernel's
buddy system in the GFP infrastructure. The hyp_page metadata are made
accessible through a hyp_vmemmap, following the concept of
SPARSE_VMEMMAP in the kernel.

Acked-by: Will Deacon <will@kernel.org>
Signed-off-by: Quentin Perret <qperret@google.com>
Link: https://lore.kernel.org/r/20210315143536.214621-13-qperret@google.com
Bug: 178098380
Change-Id: Id06e90de959a4e23df6d62f9072eab954f5b783f
2021-03-17 18:48:49 +00:00
Quentin Perret
f6e834486a FROMLIST: KVM: arm64: Stub CONFIG_DEBUG_LIST at Hyp
In order to use the kernel list library at EL2, introduce stubs for the
CONFIG_DEBUG_LIST out-of-lines calls.

Acked-by: Will Deacon <will@kernel.org>
Signed-off-by: Quentin Perret <qperret@google.com>
Link: https://lore.kernel.org/r/20210315143536.214621-12-qperret@google.com
Bug: 178098380
Change-Id: I41c92ac2b350593cd7ac2ac4017b7695d0d042c6
2021-03-17 18:48:49 +00:00
Quentin Perret
01253f8e2c FROMLIST: KVM: arm64: Introduce an early Hyp page allocator
With nVHE, the host currently creates all stage 1 hypervisor mappings at
EL1 during boot, installs them at EL2, and extends them as required
(e.g. when creating a new VM). But in a world where the host is no
longer trusted, it cannot have full control over the code mapped in the
hypervisor.

In preparation for enabling the hypervisor to create its own stage 1
mappings during boot, introduce an early page allocator, with minimal
functionality. This allocator is designed to be used only during early
bootstrap of the hyp code when memory protection is enabled, which will
then switch to using a full-fledged page allocator after init.

Acked-by: Will Deacon <will@kernel.org>
Signed-off-by: Quentin Perret <qperret@google.com>
Link: https://lore.kernel.org/r/20210315143536.214621-11-qperret@google.com
Bug: 178098380
Change-Id: Ibe4c77634a293565171dc22b196065699a2a1f06
2021-03-17 18:48:49 +00:00
Quentin Perret
a3aad4cf4a FROMLIST: KVM: arm64: Allow using kvm_nvhe_sym() in hyp code
In order to allow the usage of code shared by the host and the hyp in
static inline library functions, allow the usage of kvm_nvhe_sym() at
EL2 by defaulting to the raw symbol name.

Acked-by: Will Deacon <will@kernel.org>
Signed-off-by: Quentin Perret <qperret@google.com>
Link: https://lore.kernel.org/r/20210315143536.214621-10-qperret@google.com
Bug: 178098380
Change-Id: If82eb4fadb95772646d2215028dbb70a05a6a671
2021-03-17 18:48:49 +00:00
Quentin Perret
81181250ba FROMLIST: KVM: arm64: Make kvm_call_hyp() a function call at Hyp
kvm_call_hyp() has some logic to issue a function call or a hypercall
depending on the EL at which the kernel is running. However, all the
code compiled under __KVM_NVHE_HYPERVISOR__ is guaranteed to only run
at EL2 which allows us to simplify.

Add ifdefery to kvm_host.h to simplify kvm_call_hyp() in .hyp.text.

Acked-by: Will Deacon <will@kernel.org>
Signed-off-by: Quentin Perret <qperret@google.com>
Link: https://lore.kernel.org/r/20210315143536.214621-9-qperret@google.com
Bug: 178098380
Change-Id: I8bfe2e5f8febeb7f9e75cfe60e18f24af7b9797c
2021-03-17 18:48:48 +00:00
Quentin Perret
542dace0bc FROMLIST: KVM: arm64: Introduce a BSS section for use at Hyp
Currently, the hyp code cannot make full use of a bss, as the kernel
section is mapped read-only.

While this mapping could simply be changed to read-write, it would
intermingle even more the hyp and kernel state than they currently are.
Instead, introduce a __hyp_bss section, that uses reserved pages, and
create the appropriate RW hyp mappings during KVM init.

Acked-by: Will Deacon <will@kernel.org>
Signed-off-by: Quentin Perret <qperret@google.com>
Link: https://lore.kernel.org/r/20210315143536.214621-8-qperret@google.com
Bug: 178098380
Change-Id: Iec51e75deebf8db9feb7358a7c6e4892c2624c5d
2021-03-17 18:48:48 +00:00
Quentin Perret
4a4beb1005 FROMLIST: KVM: arm64: Factor memory allocation out of pgtable.c
In preparation for enabling the creation of page-tables at EL2, factor
all memory allocation out of the page-table code, hence making it
re-usable with any compatible memory allocator.

No functional changes intended.

Acked-by: Will Deacon <will@kernel.org>
Signed-off-by: Quentin Perret <qperret@google.com>
Link: https://lore.kernel.org/r/20210315143536.214621-7-qperret@google.com
Bug: 178098380
Change-Id: Ic72f50d58498435d3490931a3e1d695cd19d3b9d
2021-03-17 18:48:48 +00:00
Quentin Perret
620bb5f9c9 FROMLIST: KVM: arm64: Avoid free_page() in page-table allocator
Currently, the KVM page-table allocator uses a mix of put_page() and
free_page() calls depending on the context even though page-allocation
is always achieved using variants of __get_free_page().

Make the code consistent by using put_page() throughout, and reduce the
memory management API surface used by the page-table code. This will
ease factoring out page-allocation from pgtable.c, which is a
pre-requisite to creating page-tables at EL2.

Acked-by: Will Deacon <will@kernel.org>
Signed-off-by: Quentin Perret <qperret@google.com>
Link: https://lore.kernel.org/r/20210315143536.214621-6-qperret@google.com
Bug: 178098380
Change-Id: I998e88dd31decc7dd1141af9dbda5e60c8370baa
2021-03-17 18:48:48 +00:00
Quentin Perret
c758e8e4b1 FROMLIST: KVM: arm64: Initialize kvm_nvhe_init_params early
Move the initialization of kvm_nvhe_init_params in a dedicated function
that is run early, and only once during KVM init, rather than every time
the KVM vectors are set and reset.

This also opens the opportunity for the hypervisor to change the init
structs during boot, hence simplifying the replacement of host-provided
page-table by the one the hypervisor will create for itself.

Acked-by: Will Deacon <will@kernel.org>
Signed-off-by: Quentin Perret <qperret@google.com>
Link: https://lore.kernel.org/r/20210315143536.214621-5-qperret@google.com
Bug: 178098380
Change-Id: I83ee2ac4889ce39f8d02da1d9682f813713a1540
2021-03-17 18:48:48 +00:00
Will Deacon
ce5e848201 FROMLIST: arm64: kvm: Add standalone ticket spinlock implementation for use at hyp
We will soon need to synchronise multiple CPUs in the hyp text at EL2.
The qspinlock-based locking used by the host is overkill for this purpose
and relies on the kernel's "percpu" implementation for the MCS nodes.

Implement a simple ticket locking scheme based heavily on the code removed
by commit c11090474d ("arm64: locking: Replace ticket lock implementation
with qspinlock").

Signed-off-by: Will Deacon <will@kernel.org>
Signed-off-by: Quentin Perret <qperret@google.com>
Link: https://lore.kernel.org/r/20210315143536.214621-4-qperret@google.com
Bug: 178098380
Change-Id: Iecc108a89c71689ba281bf3e15dd0b1015595f1a
2021-03-17 18:48:48 +00:00
Will Deacon
9833905e2d FROMLIST: KVM: arm64: Link position-independent string routines into .hyp.text
Pull clear_page(), copy_page(), memcpy() and memset() into the nVHE hyp
code and ensure that we always execute the '__pi_' entry point on the
offchance that it changes in future.

[ qperret: Commit title nits and added linker script alias ]

Signed-off-by: Will Deacon <will@kernel.org>
Signed-off-by: Quentin Perret <qperret@google.com>
Link: https://lore.kernel.org/r/20210315143536.214621-3-qperret@google.com
Bug: 178098380
Change-Id: Ie4a82f71d87f3151f8d5e1054b0fd1f8ed44d583
2021-03-17 18:48:48 +00:00
Will Deacon
0f63237470 FROMLIST: arm64: lib: Annotate {clear, copy}_page() as position-independent
clear_page() and copy_page() are suitable for use outside of the kernel
address space, so annotate them as position-independent code.

Signed-off-by: Will Deacon <will@kernel.org>
Signed-off-by: Quentin Perret <qperret@google.com>
Link: https://lore.kernel.org/r/20210315143536.214621-2-qperret@google.com
Bug: 178098380
Change-Id: Ib81de230f40e6fe14f6f9db4ae1368fe93f46f02
2021-03-17 18:48:47 +00:00
Quentin Perret
edab6a7245 Revert "ANDROID: sched: cpufreq_schedutil: add sugov tracepoints"
This reverts commit 4d1055d3d8.

Change-Id: Ia4d8cc63cf79fcbbad7496be044370240977258b
Signed-off-by: Quentin Perret <qperret@google.com>
2021-03-17 17:40:41 +00:00
Quentin Perret
187306ab1a ANDROID: Partial revert of 06881e01b5 ("ANDROID: sched: Add vendor hooks for override sugov behavior")
Remove the set_sugov_sched_attr hook which is no longer needed with a
modular governor. The IOWait hook must stay, however.

Bug: 171598214
Signed-off-by: Quentin Perret <qperret@google.com>
Change-Id: Ie68df673bc78ca76c90ba1e6c32ecaa4bba10c89
2021-03-17 17:40:35 +00:00
Quentin Perret
b542f4c389 Revert "ANDROID: sched: Add vendor hooks for skipping sugov update"
This reverts commit 846bf8e8cb.

Signed-off-by: Quentin Perret <qperret@google.com>
Change-Id: Ib8b7721c2a37393a85108f4c8aee920f68044f0c
2021-03-17 17:40:28 +00:00
Quentin Perret
27d6dac0df Revert "ANDROID: sched: cpufreq_schedutil: move sugov traces to sched"
This reverts commit a68d66b29e.

Signed-off-by: Quentin Perret <qperret@google.com>
Change-Id: Ic8be3d2484d38b9c2f62d518980dcfef8cdb2c87
2021-03-17 17:40:20 +00:00
davidchao
cc574f0d36 ANDROID: thermal: Add logic for filter on-die tz genl event.
Add logic in enable_thermal_genl_check to avoid
thermal-hal being woken up all the time by on-die sensor.

When the temperature of the on-die sensor thermal_zone updates,
the thermal_zone_device_update() will be called to handle thermal
and then the netlink events will be sent
through thermal_notify_tz_trip_().
But there is currently no way to filter thermal_zone
in the thermal_netlink, so many netlink events will be sent
in a short amount of time. Because the on-die sensors
are very sensitive. Their temperature may jump up and down
quickly in a few ms.

Bug: 170682696
Test: boot and thermal-hal can receive thermal genl events from kernel
Change-Id: Idb3f4b07a2a2740c01d8785910878bfe6edc832d
Signed-off-by: davidchao <davidchao@google.com>
2021-03-16 23:42:07 +00:00
Eric Biggers
6c6fac8f39 ANDROID: mmc: support hardware that takes key directly
Currently when an MMC host driver declares crypto support, the MMC core
passes a keyslot and 32-bit DUN down to the driver in each request.

This is enough for the "standard" eMMC v5.2 crypto (cqhci-crypto).
However some SoCs don't follow this standard.  They don't have keyslots
but rather take keys directly, and they support longer DUNs.

To allow such hardware to be supported, modify the MMC core to pass a
pointer to the bio_crypt_ctx along with each request, replacing the
crypto_enabled and data_unit_num fields.  This way is more flexible.

Also update cqhci-crypto accordingly to keep it working.

(Not being sent upstream yet because this isn't really useful by itself;
it would need support for hardware that needs it to be upstreamed too.)

Bug: 180886435
Bug: 182283899
Change-Id: I8faf3135f570ca3f2798cf812b4245a5df5515ba
Signed-off-by: Eric Biggers <ebiggers@google.com>
2021-03-16 21:57:16 +00:00
Minchan Kim
e4636b47ef UPSTREAM: zram: fix broken page writeback
commit 0d8359620d ("zram: support page writeback") introduced two
problems.  It overwrites writeback_store's return value as kstrtol's
return value, which makes return value zero so user could see zero as
return value of write syscall even though it wrote data successfully.

It also breaks index value in the loop in that it doesn't increase the
index any longer.  It means it can write only first starting block index
so user couldn't write all idle pages in the zram so lose memory saving
chance.

This patch fixes those issues.

Link: https://lkml.kernel.org/r/20210312173949.2197662-2-minchan@kernel.org
Fixes: 0d8359620d9b("zram: support page writeback")
Signed-off-by: Minchan Kim <minchan@kernel.org>
Reported-by: Amos Bianchi <amosbianchi@google.com>
Cc: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Cc: John Dias <joaodias@google.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
(cherry picked from commit 2766f18216)

Bug: 182850185
Signed-off-by: Amos Bianchi <amosbianchi@google.com>
Change-Id: I9836b6350727dc4fffc1cc939647235781f0a4ee
2021-03-16 18:51:46 +00:00
Minchan Kim
542d1937ba UPSTREAM: zram: fix return value on writeback_store
writeback_store's return value is overwritten by submit_bio_wait's return
value.  Thus, writeback_store will return zero since there was no IO
error.  In the end, write syscall from userspace will see the zero as
return value, which could make the process stall to keep trying the write
until it will succeed.

Link: https://lkml.kernel.org/r/20210312173949.2197662-1-minchan@kernel.org
Fixes: 3b82a051c101("drivers/block/zram/zram_drv.c: fix error return codes not being returned in writeback_store")
Signed-off-by: Minchan Kim <minchan@kernel.org>
Cc: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Cc: Colin Ian King <colin.king@canonical.com>
Cc: John Dias <joaodias@google.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
(cherry picked from commit 57e0076e65)

Bug: 182850185
Signed-off-by: Amos Bianchi <amosbianchi@google.com>
Change-Id: I7cbef91b62584826192b7ebdb434675a549a9801
2021-03-16 18:51:38 +00:00
Rick Yiu
475aea007d ANDROID: sched: Add vendor hook for util_est_update
Vendor may have its own estimated utilization.

Bug: 170508405
Signed-off-by: Rick Yiu <rickyiu@google.com>
Change-Id: I6055907de75ace4586c3ad854d40f42e3bf40147
2021-03-16 12:49:49 +00:00
Ram Chandrasekar
89ea2f1eca ANDROID: GKI: Enable DTPM framework
Enable DTPM framework, so that userspace daemons can control the max
power cap for a device.

Bug: 182396925
Change-Id: I7a1bdb658289843af8f4bb6824b424eb76b32143
Signed-off-by: Ram Chandrasekar <quic_rkumbako@quicinc.com>
2021-03-16 09:21:48 +00:00
Siddharth Gupta
a3a580961b ANDROID: GKI: Add remoteproc framework symbols to symbol list
This change adds the symbols that allow subsystems to collect minidumps.

Bug: 180426943
Change-Id: Idfda557600606aeca0c912ca0b3cedab8ff7c23e
Signed-off-by: Siddharth Gupta <quic_sidgup@quicinc.com>
2021-03-16 09:21:22 +00:00
xieliujie
53e8099784 ANDROID: vendor_hooks: Add hooks for scheduler
Add hooks to support oem's scheduler feature.

Bug: 182441701
Signed-off-by: xieliujie <xieliujie@oppo.com>
Change-Id: I31023844b20923bed1ca216831e7a2431e9ab0c9
2021-03-16 09:08:22 +00:00
Daiyue Zhang
7e2c33ac0e FROMGIT: configfs: fix a use-after-free in __configfs_open_file
Commit b0841eefd9 ("configfs: provide exclusion between IO and removals")
uses ->frag_dead to mark the fragment state, thus no bothering with extra
refcount on config_item when opening a file. The configfs_get_config_item
was removed in __configfs_open_file, but not with config_item_put. So the
refcount on config_item will lost its balance, causing use-after-free
issues in some occasions like this:

Test:
1. Mount configfs on /config with read-only items:
drwxrwx--- 289 root   root            0 2021-04-01 11:55 /config
drwxr-xr-x   2 root   root            0 2021-04-01 11:54 /config/a
--w--w--w-   1 root   root         4096 2021-04-01 11:53 /config/a/1.txt
......

2. Then run:
for file in /config
do
echo $file
grep -R 'key' $file
done

3. __configfs_open_file will be called in parallel, the first one
got called will do:
if (file->f_mode & FMODE_READ) {
	if (!(inode->i_mode & S_IRUGO))
		goto out_put_module;
			config_item_put(buffer->item);
				kref_put()
					package_details_release()
						kfree()

the other one will run into use-after-free issues like this:
BUG: KASAN: use-after-free in __configfs_open_file+0x1bc/0x3b0
Read of size 8 at addr fffffff155f02480 by task grep/13096
CPU: 0 PID: 13096 Comm: grep VIP: 00 Tainted: G        W       4.14.116-kasan #1
TGID: 13096 Comm: grep
Call trace:
dump_stack+0x118/0x160
kasan_report+0x22c/0x294
__asan_load8+0x80/0x88
__configfs_open_file+0x1bc/0x3b0
configfs_open_file+0x28/0x34
do_dentry_open+0x2cc/0x5c0
vfs_open+0x80/0xe0
path_openat+0xd8c/0x2988
do_filp_open+0x1c4/0x2fc
do_sys_open+0x23c/0x404
SyS_openat+0x38/0x48

Allocated by task 2138:
kasan_kmalloc+0xe0/0x1ac
kmem_cache_alloc_trace+0x334/0x394
packages_make_item+0x4c/0x180
configfs_mkdir+0x358/0x740
vfs_mkdir2+0x1bc/0x2e8
SyS_mkdirat+0x154/0x23c
el0_svc_naked+0x34/0x38

Freed by task 13096:
kasan_slab_free+0xb8/0x194
kfree+0x13c/0x910
package_details_release+0x524/0x56c
kref_put+0xc4/0x104
config_item_put+0x24/0x34
__configfs_open_file+0x35c/0x3b0
configfs_open_file+0x28/0x34
do_dentry_open+0x2cc/0x5c0
vfs_open+0x80/0xe0
path_openat+0xd8c/0x2988
do_filp_open+0x1c4/0x2fc
do_sys_open+0x23c/0x404
SyS_openat+0x38/0x48
el0_svc_naked+0x34/0x38

To fix this issue, remove the config_item_put in
__configfs_open_file to balance the refcount of config_item.

Fixes: b0841eefd9 ("configfs: provide exclusion between IO and removals")
Signed-off-by: Daiyue Zhang <zhangdaiyue1@huawei.com>
Signed-off-by: Yi Chen <chenyi77@huawei.com>
Signed-off-by: Ge Qiu <qiuge@huawei.com>
Reviewed-by: Chao Yu <yuchao0@huawei.com>
Acked-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Bug: 174049066
(cherry picked from commit 14fbbc8297
 git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master)
Cc: Daniel Rosenberg <drosen@google.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Change-Id: I745711ed546c1be97360670b77aedfb929bffcec
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
2021-03-16 05:59:39 +00:00
Choonghoon Park
7656aa0f48 ANDROID: lib/plist.c: Export plist-related APIs
Export plist_add(), plist_del() and plist_requeue() for vendor modules.

Bug: 180865128

Signed-off-by: Choonghoon Park <choong.park@samsung.com>
Change-Id: I0b6fd9becd04428d998c2ce031804bec6ff87be5
2021-03-16 01:19:21 +00:00
Kuan-Ying Lee
4d63efb9ae ANDROID: module: Add vendor hook
Add vendor hook for module init, so we can get memory type and
use it to do memory type check for architecture
dependent page table setting.

Bug: 181639260

Signed-off-by: Kuan-Ying Lee <Kuan-Ying.Lee@mediatek.com>
Change-Id: I95b70d7a57994f2548fddfb2290d4c9136f58785
2021-03-15 15:39:00 +00:00
Kuan-Ying Lee
2ff446fc4d ANDROID: bpf: Add vendor hook
Add vendor hook for bpf, so we can get memory type and
use it to do memory type check for architecture
dependent page table setting.

Bug: 181639260

Signed-off-by: Kuan-Ying Lee <Kuan-Ying.Lee@mediatek.com>
Change-Id: Icac325a040fb88c7f6b04b2409029b623bd8515f
2021-03-15 15:38:19 +00:00
Kuan-Ying Lee
dccee128b7 ANDROID: kernel: Add vendor hook in creds
Add vendor hook for creds, so we get the cred information
to monitor cred lifetime.

Bug: 181639260

Signed-off-by: Kuan-Ying Lee <Kuan-Ying.Lee@mediatek.com>
Change-Id: I8f254464e07f9c88336995152479ce91deb13c75
2021-03-15 15:37:57 +00:00
Kuan-Ying Lee
0a3b407463 ANDROID: security: selinux: Add vendor hook in avc
Add vendor hook for avc, so we can get avc_node information
to monitor avc lifetime.

Bug: 181639260

Signed-off-by: Kuan-Ying Lee <Kuan-Ying.Lee@mediatek.com>
Change-Id: Idbebeca926c2cb407264f2872b032e1f18462697
2021-03-15 15:37:18 +00:00
Marc Zyngier
a128ec2b2e UPSTREAM: KVM: arm64: Fix exclusive limit for IPA size
When registering a memslot, we check the size and location of that
memslot against the IPA size to ensure that we can provide guest
access to the whole of the memory.

Unfortunately, this check rejects memslot that end-up at the exact
limit of the addressing capability for a given IPA size. For example,
it refuses the creation of a 2GB memslot at 0x8000000 with a 32bit
IPA space.

Fix it by relaxing the check to accept a memslot reaching the
limit of the IPA space.

Fixes: c3058d5da2 ("arm/arm64: KVM: Ensure memslots are within KVM_PHYS_SIZE")
Reviewed-by: Eric Auger <eric.auger@redhat.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Cc: stable@vger.kernel.org
Reviewed-by: Andrew Jones <drjones@redhat.com>
Link: https://lore.kernel.org/r/20210311100016.3830038-3-maz@kernel.org
(cherry picked from commit 262b003d05)
Signed-off-by: Will Deacon <willdeacon@google.com>
Bug: 178098380
Test: atest VirtualizationHostTestCases on an EL2-enabled device
Change-Id: I82fcfb372b375c2e35997fdc4b33dbd33f056887
2021-03-15 10:47:51 +00:00
Marc Zyngier
ac821b6257 UPSTREAM: KVM: arm64: Reject VM creation when the default IPA size is unsupported
KVM/arm64 has forever used a 40bit default IPA space, partially
due to its 32bit heritage (where the only choice is 40bit).

However, there are implementations in the wild that have a *cough*
much smaller *cough* IPA space, which leads to a misprogramming of
VTCR_EL2, and a guest that is stuck on its first memory access
if userspace dares to ask for the default IPA setting (which most
VMMs do).

Instead, blundly reject the creation of such VM, as we can't
satisfy the requirements from userspace (with a one-off warning).
Also clarify the boot warning, and document that the VM creation
will fail when an unsupported IPA size is provided.

Although this is an ABI change, it doesn't really change much
for userspace:

- the guest couldn't run before this change, but no error was
  returned. At least userspace knows what is happening.

- a memory slot that was accepted because it did fit the default
  IPA space now doesn't even get a chance to be registered.

The other thing that is left doing is to convince userspace to
actually use the IPA space setting instead of relying on the
antiquated default.

Fixes: 233a7cb235 ("kvm: arm64: Allow tuning the physical address size for VM")
Signed-off-by: Marc Zyngier <maz@kernel.org>
Cc: stable@vger.kernel.org
Reviewed-by: Andrew Jones <drjones@redhat.com>
Reviewed-by: Eric Auger <eric.auger@redhat.com>
Link: https://lore.kernel.org/r/20210311100016.3830038-2-maz@kernel.org
(cherry picked from commit 7d717558dd)
Signed-off-by: Will Deacon <willdeacon@google.com>
Bug: 178098380
Test: atest VirtualizationHostTestCases on an EL2-enabled device
Change-Id: I36332fbe5606affd151976a6354f3e9c45fc214a
2021-03-15 10:47:05 +00:00
Greg Kroah-Hartman
d2eb8b0028 ANDROID: GKI: add android_kabi.h
This header file is to be used for various macros to help make keeping
the kernel ABI "stable" during an "ABI Freeze" period.

They are to be used both before the freeze (to anticipate places where
there will be changes), and after the freeze (to keep the abi stable for
structures where there were changes due to LTS or other changes to the
kernel tree.)

Strongly based on rh_kabi.h from Red Hat's RHEL kernel tree.

This adds support for "real" padding and the ability to replace fields
with other fields.

But, note that ABI changes will still be caught by libabigail at this
point in time, work on that is still ongoing.  When that is completed,
all that will be needed is to modify the _ANDROID_KABI_RESERVE() macro
in this file.  No other file changes should be needed.

Bug: 151154716
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Change-Id: I77038cc251c819c3ed22a9cb8843b185416b6727
2021-03-15 07:47:37 +00:00
Marco Elver
45021f7679 UPSTREAM: MAINTAINERS: add entry for KFENCE
Add entry for KFENCE maintainers.

Link: https://lkml.kernel.org/r/20201103175841.3495947-10-elver@google.com
Signed-off-by: Alexander Potapenko <glider@google.com>
Signed-off-by: Marco Elver <elver@google.com>
Reviewed-by: Dmitry Vyukov <dvyukov@google.com>
Reviewed-by: SeongJae Park <sjpark@amazon.de>
Co-developed-by: Alexander Potapenko <glider@google.com>
Cc: Andrey Konovalov <andreyknvl@google.com>
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Christopher Lameter <cl@linux.com>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: David Rientjes <rientjes@google.com>
Cc: Eric Dumazet <edumazet@google.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Hillf Danton <hdanton@sina.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jann Horn <jannh@google.com>
Cc: Joern Engel <joern@purestorage.com>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Cc: Kees Cook <keescook@chromium.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Paul E. McKenney <paulmck@kernel.org>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: Will Deacon <will@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Bug: 180086542
Bug: 177201604
(cherry picked from commit 0825c1d57f)
Signed-off-by: Alexander Potapenko <glider@google.com>
Change-Id: I65e4b38dbc3105a1dea096c1f5cf69955fd6a7a2
2021-03-14 08:17:04 +00:00
Giuliano Procida
90d03f6fcf ANDROID: Clang LTO: Comment on symbol visibility workaround
This commit leaves a TODO in the code so we can more easily keep track
of the workaround.

Bug: 182572011
Fixes: be409db652 ("ANDROID: Clang LTO: Only set -fvisibility=hidden for x86")
Signed-off-by: Giuliano Procida <gprocida@google.com>
Change-Id: I0277a8c0704e5caf8885884ec4e3642ebe03667f
2021-03-13 12:38:32 +00:00
Minchan Kim
169ddec367 FROMLIST: mm: fs: Invalidate BH LRU during page migration
Pages containing buffer_heads that are in one of the per-CPU
buffer_head LRU caches will be pinned and thus cannot be migrated.
This can prevent CMA allocations from succeeding, which are often used
on platforms with co-processors (such as a DSP) that can only use
physically contiguous memory. It can also prevent memory
hot-unplugging from succeeding, which involves migrating at least
MIN_MEMORY_BLOCK_SIZE bytes of memory, which ranges from 8 MiB to 1
GiB based on the architecture in use.

Correspondingly, invalidate the BH LRU caches before a migration
starts and stop any buffer_head from being cached in the LRU caches,
until migration has finished.

Bug: 180018981
Link: https://lore.kernel.org/linux-mm/20210310161429.399432-3-minchan@kernel.org/
Signed-off-by: Chris Goldsworthy <cgoldswo@codeaurora.org>
Signed-off-by: Minchan Kim <minchan@kernel.org>
Signed-off-by: Minchan Kim <minchan@google.com>
Change-Id: I7ac085c2ec14a81c3c4d7b65a7eeedb0cfba4ea6
2021-03-12 12:35:53 -08:00
Minchan Kim
3039d8580c BACKPORT: FROMLIST: mm: disable LRU pagevec during the migration temporarily
LRU pagevec holds refcount of pages until the pagevec are drained.
It could prevent migration since the refcount of the page is greater
than the expection in migration logic. To mitigate the issue,
callers of migrate_pages drains LRU pagevec via migrate_prep or
lru_add_drain_all before migrate_pages call.

However, it's not enough because pages coming into pagevec after the
draining call still could stay at the pagevec so it could keep
preventing page migration. Since some callers of migrate_pages have
retrial logic with LRU draining, the page would migrate at next trail
but it is still fragile in that it doesn't close the fundamental race
between upcoming LRU pages into pagvec and migration so the migration
failure could cause contiguous memory allocation failure in the end.

To close the race, this patch disables lru caches(i.e, pagevec)
during ongoing migration until migrate is done.

Since it's really hard to reproduce, I measured how many times
migrate_pages retried with force mode(it is about a fallback to a
sync migration) with below debug code.

int migrate_pages(struct list_head *from, new_page_t get_new_page,
			..
			..

if (rc && reason == MR_CONTIG_RANGE && pass > 2) {
       printk(KERN_ERR, "pfn 0x%lx reason %d\n", page_to_pfn(page), rc);
       dump_page(page, "fail to migrate");
}

The test was repeating android apps launching with cma allocation
in background every five seconds. Total cma allocation count was
about 500 during the testing. With this patch, the dump_page count
was reduced from 400 to 30.

The new interface is also useful for memory hotplug which currently
drains lru pcp caches after each migration failure. This is rather
suboptimal as it has to disrupt others running during the operation.
With the new interface the operation happens only once. This is also in
line with pcp allocator cache which are disabled for the offlining as
well.

Bug: 180018981
Link: https://lore.kernel.org/linux-mm/20210310161429.399432-2-minchan@kernel.org/
[minchan: Resolved conflict in mm/memory_hotplug.c, mm/swap.c]
Signed-off-by: Minchan Kim <minchan@kernel.org>
Signed-off-by: Minchan Kim <minchan@google.com>
Change-Id: Ie1e09cf26e3105b674a9aed4ac65070efee608af
2021-03-12 12:35:53 -08:00
Minchan Kim
134ac2d4dc FROMLIST: mm: replace migrate_prep with lru_add_drain_all
Currently, migrate_prep is merely a wrapper of lru_cache_add_all.
There is not much to gain from having additional abstraction.

Use lru_add_drain_all instead of migrate_prep, which would be more
descriptive.

note: migrate_prep_local in compaction.c changed into lru_add_drain
to avoid CPU schedule cost with involving many other CPUs to keep
keep old behavior.

Bug: 180018981
Link: https://lore.kernel.org/linux-mm/20210310161429.399432-1-minchan@kernel.org/
Signed-off-by: Minchan Kim <minchan@kernel.org>
Signed-off-by: Minchan Kim <minchan@google.com>
Change-Id: I1bd3fcb13993e8a7a7961ceec817ac17304364cb
2021-03-12 12:35:53 -08:00
Jan Stancek
a71a3e1ce6 UPSTREAM: mm: migrate: initialize err in do_migrate_pages
After commit 236c32eb10 ("mm: migrate: clean up migrate_prep{_local}")',
do_migrate_pages can return uninitialized variable 'err' (which is
propagated to user-space as error) when 'from' and 'to' nodesets are
identical.  This can be reproduced with LTP migrate_pages01, which calls
migrate_pages() with same set for both old/new_nodes.

Add 'err' initialization back.

Bug: 180018981
Link: https://lkml.kernel.org/r/456a021c7ef3636d7668cec9dcb4a446a4244812.1609855564.git.jstancek@redhat.com
Fixes: 236c32eb10 ("mm: migrate: clean up migrate_prep{_local}")
Signed-off-by: Jan Stancek <jstancek@redhat.com>
Acked-by: Michal Hocko <mhocko@suse.com>
Acked-by: Yang Shi <shy828301@gmail.com>
Cc: Zi Yan <ziy@nvidia.com>
Cc: Jan Kara <jack@suse.cz>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Mel Gorman <mgorman@suse.de>
Cc: Song Liu <songliubraving@fb.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
(cherry picked from commit f555befd18)
Signed-off-by: Minchan Kim <minchan@google.com>
Change-Id: Ia0b7012dc4191bf3af5ca015939d9e37a1f7ec43
2021-03-12 12:35:52 -08:00
Yang Shi
059eaf82c0 UPSTREAM: mm: migrate: clean up migrate_prep{_local}
The migrate_prep{_local} never fails, so it is pointless to have return
value and check the return value.

Bug: 180018981
Link: https://lkml.kernel.org/r/20201113205359.556831-5-shy828301@gmail.com
Signed-off-by: Yang Shi <shy828301@gmail.com>
Reviewed-by: Zi Yan <ziy@nvidia.com>
Cc: Jan Kara <jack@suse.cz>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Mel Gorman <mgorman@suse.de>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Song Liu <songliubraving@fb.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
(cherry picked from commit 236c32eb10)
Signed-off-by: Minchan Kim <minchan@google.com>
Change-Id: I26ae0a4240c704e6127b51532e5de8ba778edd6e
2021-03-12 12:35:52 -08:00
Giuliano Procida
be409db652 ANDROID: Clang LTO: Only set -fvisibility=hidden for x86
Otherwise this upsets ABI monitoring.

Leaf changes summary: 2689 artifacts changed
Changed leaf types summary: 16 leaf types changed
Removed/Changed/Added functions summary: 0 Removed, 2472 Changed, 136 Added functions
Removed/Changed/Added variables summary: 0 Removed, 47 Changed, 18 Added variables

136 Added functions:

  [A] 'function int ___pskb_trim(sk_buff*, unsigned int)'
  [A] 'function void __cfi_slowpath(uint64_t, void*, void*)'
  [A] 'function void __dynamic_dev_dbg(_ddebug*, const device*, const char*, ...)'
  [A] 'function void __dynamic_pr_debug(_ddebug*, const char*, ...)'
  [A] 'function ktime_t __hrtimer_get_remaining(const hrtimer*, bool)'
  [A] 'function zoneref* __next_zones_zonelist(zoneref*, zone_type, nodemask_t*)'
  [A] 'function int __nla_validate(const nlattr*, int, int, const nla_policy*, unsigned int, netlink_ext_ack*)'
  [A] 'function void __skb_get_hash(sk_buff*)'
  [A] 'function sk_buff* __skb_gso_segment(sk_buff*, netdev_features_t, bool)'
  [A] 'function int __trace_bputs(unsigned long int, const char*)'
  [A] 'function int __trace_printk(unsigned long int, const char*, ...)'
  [A] 'function int _raw_spin_trylock_bh(raw_spinlock_t*)'
  [A] 'function int add_memory_subsection(int, u64, u64)'
  [A] 'function int alarm_cancel(alarm*)'
  [A] 'function void alarm_init(alarm*, alarmtimer_type, enum alarmtimer_restart (alarm*, typedef ktime_t)*)'
  [A] 'function void alarm_start_relative(alarm*, ktime_t)'
  [A] 'function int bgpio_init(gpio_chip*, device*, unsigned long int, void*, void*, void*, void*, void*, unsigned long int)'
  [A] 'function int bitmap_parselist(const char*, unsigned long int*, int)'
  [A] 'function int bitmap_parselist_user(const char*, unsigned int, unsigned long int*, int)'
  [A] 'function void bt_err(const char*, ...)'
  [A] 'function int cgroup_path_ns(cgroup*, char*, size_t, cgroup_namespace*)'
  [A] 'function void clk_hw_set_rate_range(clk_hw*, unsigned long int, unsigned long int)'
  [A] 'function unsigned int cpufreq_quick_get(unsigned int)'
  [A] 'function s64 cpuidle_governor_latency_req(unsigned int)'
  [A] 'function int cpuidle_register_governor(cpuidle_governor*)'
  [A] 'function int cpupri_find_fitness(cpupri*, task_struct*, cpumask*, typedef bool (task_struct*, int)*)'
  [A] 'function __sum16 csum_ipv6_magic(const in6_addr*, const in6_addr*, __u32, __u8, __wsum)'
  [A] 'function __wsum csum_partial(void*, int, __wsum)'
  [A] 'function dentry* debugfs_create_blob(const char*, umode_t, dentry*, debugfs_blob_wrapper*)'
  [A] 'function dentry* debugfs_create_symlink(const char*, dentry*, const char*)'
  [A] 'function int dev_pm_genpd_remove_notifier(device*)'
  [A] 'function int dev_pm_genpd_set_next_wakeup(device*, ktime_t)'
  [A] 'function int dev_pm_opp_register_notifier(device*, notifier_block*)'
  [A] 'function int dev_pm_opp_unregister_notifier(device*, notifier_block*)'
  [A] 'function int devfreq_add_governor(devfreq_governor*)'
  [A] 'function int devfreq_remove_governor(devfreq_governor*)'
  [A] 'function void device_remove_groups(device*, const attribute_group**)'
  [A] 'function ssize_t device_show_int(device*, device_attribute*, char*)'
  [A] 'function ssize_t device_store_int(device*, device_attribute*, const char*, size_t)'
  [A] 'function backlight_device* devm_backlight_device_register(device*, const char*, device*, void*, const backlight_ops*, const backlight_properties*)'
  [A] 'function int devm_blk_ksm_init(device*, blk_keyslot_manager*, unsigned int)'
  [A] 'function void devm_extcon_dev_unregister(device*, extcon_dev*)'
  [A] 'function usb_phy* devm_usb_get_phy_by_node(device*, device_node*, notifier_block*)'
  [A] 'function bool drm_edid_is_valid(edid*)'
  [A] 'function bool drm_mode_is_420_only(const drm_display_info*, const drm_display_mode*)'
  [A] 'function pid* find_get_pid(pid_t)'
  [A] 'function task_struct* find_task_by_vpid(pid_t)'
  [A] 'function const char* fwnode_get_name(const fwnode_handle*)'
  [A] 'function fwnode_handle* fwnode_get_named_child_node(const fwnode_handle*, const char*)'
  [A] 'function pid* get_task_pid(task_struct*, pid_type)'
  [A] 'function unsigned long int get_unmapped_area(file*, unsigned long int, unsigned long int, unsigned long int, unsigned long int)'
  [A] 'function void getboottime64(timespec64*)'
  [A] 'function zone_type gfp_zone(gfp_t)'
  [A] 'function void gro_cells_destroy(gro_cells*)'
  [A] 'function int gro_cells_init(gro_cells*, net_device*)'
  [A] 'function int gro_cells_receive(gro_cells*, sk_buff*)'
  [A] 'function hci_dev* hci_alloc_dev()'
  [A] 'function void hci_free_dev(hci_dev*)'
  [A] 'function int hci_recv_frame(hci_dev*, sk_buff*)'
  [A] 'function int hci_register_dev(hci_dev*)'
  [A] 'function void hci_unregister_dev(hci_dev*)'
  [A] 'function bool hrtimer_active(const hrtimer*)'
  [A] 'function i2c_client* i2c_new_scanned_device(i2c_adapter*, i2c_board_info*, const unsigned short int*, int (i2c_adapter*, unsigned short int)*)'
  [A] 'function i2c_adapter* i2c_verify_adapter(device*)'
  [A] 'function int input_mt_assign_slots(input_dev*, int*, const input_mt_pos*, int, int)'
  [A] 'function void input_mt_drop_unused(input_dev*)'
  [A] 'function void input_mt_report_finger_count(input_dev*, int)'
  [A] 'function void input_mt_sync_frame(input_dev*)'
  [A] 'function unsigned long int int_sqrt(unsigned long int)'
  [A] 'function int iommu_attach_group(iommu_domain*, iommu_group*)'
  [A] 'function void iommu_detach_group(iommu_domain*, iommu_group*)'
  [A] 'function int iommu_get_msi_cookie(iommu_domain*, dma_addr_t)'
  [A] 'function phys_addr_t iommu_iova_to_phys(iommu_domain*, dma_addr_t)'
  [A] 'function __sum16 ip_compute_csum(void*, int)'
  [A] 'function bool ipv6_ext_hdr(u8)'
  [A] 'function int ipv6_skip_exthdr(const sk_buff*, int, u8*, __be16*)'
  [A] 'function int kstrtoull_from_user(const char*, size_t, unsigned int, long long unsigned int*)'
  [A] 'function llist_node* llist_reverse_order(llist_node*)'
  [A] 'function nlattr* nla_find(const nlattr*, int, int)'
  [A] 'function nlattr* nla_reserve(sk_buff*, int, int)'
  [A] 'function nlattr* nla_reserve_64bit(sk_buff*, int, int, int)'
  [A] 'function int nvmem_cell_read_u32(device*, const char*, u32*)'
  [A] 'function thermal_cooling_device* of_devfreq_cooling_register(device_node*, devfreq*)'
  [A] 'function device_node* of_find_node_by_phandle(phandle)'
  [A] 'function bool of_graph_is_present(const device_node*)'
  [A] 'function int of_platform_device_destroy(device*, void*)'
  [A] 'function int of_property_read_variable_u16_array(const device_node*, const char*, u16*, size_t, size_t)'
  [A] 'function int param_get_ullong(char*, const kernel_param*)'
  [A] 'function task_struct* pick_highest_pushable_task(rq*, int)'
  [A] 'function pid_t pid_nr_ns(pid*, pid_namespace*)'
  [A] 'function void proc_remove(proc_dir_entry*)'
  [A] 'function void proc_set_user(proc_dir_entry*, kuid_t, kgid_t)'
  [A] 'function void ps2_begin_command(ps2dev*)'
  [A] 'function void ps2_cmd_aborted(ps2dev*)'
  [A] 'function int ps2_command(ps2dev*, u8*, unsigned int)'
  [A] 'function void ps2_drain(ps2dev*, size_t, unsigned int)'
  [A] 'function void ps2_end_command(ps2dev*)'
  [A] 'function bool ps2_handle_ack(ps2dev*, u8)'
  [A] 'function bool ps2_handle_response(ps2dev*, u8)'
  [A] 'function void ps2_init(ps2dev*, serio*)'
  [A] 'function int ps2_sendbyte(ps2dev*, u8, unsigned int)'
  [A] 'function int ps2_sliced_command(ps2dev*, u8)'
  [A] 'function void qdisc_reset(Qdisc*)'
  [A] 'function rb_node* rb_last(const rb_root*)'
  [A] 'function int remove_memory_subsection(int, u64, u64)'
  [A] 'function int scsi_device_quiesce(scsi_device*)'
  [A] 'function void scsi_remove_device(scsi_device*)'
  [A] 'function void serio_rescan(serio*)'
  [A] 'function void serio_unregister_child_port(serio*)'
  [A] 'function void show_regs(pt_regs*)'
  [A] 'function void si_meminfo(sysinfo*)'
  [A] 'function void si_swapinfo(sysinfo*)'
  [A] 'function int skb_append_pagefrags(sk_buff*, page*, int, size_t)'
  [A] 'function __wsum skb_checksum(const sk_buff*, int, int, __wsum)'
  [A] 'function void snd_pcm_stream_lock(snd_pcm_substream*)'
  [A] 'function void snd_pcm_stream_unlock(snd_pcm_substream*)'
  [A] 'function void static_key_disable(static_key*)'
  [A] 'function long int strncpy_from_user(char*, const char*, long int)'
  [A] 'function int sysfs_create_bin_file(kobject*, const bin_attribute*)'
  [A] 'function void sysfs_remove_bin_file(kobject*, const bin_attribute*)'
  [A] 'function bool task_may_not_preempt(task_struct*, int)'
  [A] 'function int thermal_zone_get_slope(thermal_zone_device*)'
  [A] 'function ktime_t tick_nohz_get_sleep_length(ktime_t*)'
  [A] 'function unsigned long int total_swapcache_pages()'
  [A] 'function const char* trace_print_flags_seq(trace_seq*, const char*, unsigned long int, const trace_print_flags*)'
  [A] 'function const char* trace_print_hex_seq(trace_seq*, const unsigned char*, int, bool)'
  [A] 'function int tracepoint_probe_register_prio(tracepoint*, void*, void*, int)'
  [A] 'function int ufshcd_shutdown(ufs_hba*)'
  [A] 'function int update_devfreq(devfreq*)'
  [A] 'function void usb_phy_set_charger_current(usb_phy*, unsigned int)'
  [A] 'function void usb_put_dev(usb_device*)'
  [A] 'function usb_role_switch* usb_role_switch_find_by_fwnode(const fwnode_handle*)'
  [A] 'function int vm_insert_page(vm_area_struct*, unsigned long int, page*)'
  [A] 'function unsigned long int vmalloc_nr_pages()'
  [A] 'function bool zone_watermark_ok(zone*, unsigned int, unsigned long int, int, unsigned int)'
  [A] 'function bool zone_watermark_ok_safe(zone*, unsigned int, unsigned long int, int)'

2472 functions with some sub-type change:

  [C] 'function void* PDE_DATA(const inode*)' at generic.c:799:1 has some sub-type changes:
    CRC (modversions) changed from 0x7aae1df7 to 0x9d4e937a

  [C] 'function void __ClearPageMovable(page*)' at compaction.c:138:1 has some sub-type changes:
    CRC (modversions) changed from 0x10923ef0 to 0xbca697b6

  [C] 'function void __SetPageMovable(page*, address_space*)' at compaction.c:130:1 has some sub-type changes:
    CRC (modversions) changed from 0x78273bab to 0xbae6e38b

  ... 2469 omitted; 2472 symbols have only CRC changes

18 Added variables:

  [A] 'tracepoint __tracepoint_android_rvh_check_preempt_wakeup'
  [A] 'tracepoint __tracepoint_android_rvh_cpufreq_transition'
  [A] 'tracepoint __tracepoint_android_rvh_pick_next_entity'
  [A] 'tracepoint __tracepoint_android_rvh_sched_balance_rt'
  [A] 'tracepoint __tracepoint_android_rvh_select_task_rq_rt'
  [A] 'tracepoint __tracepoint_android_vh_allow_domain_state'
  [A] 'tracepoint __tracepoint_android_vh_ipi_stop'
  [A] 'tracepoint __tracepoint_android_vh_printk_hotplug'
  [A] 'tracepoint __tracepoint_android_vh_timer_calc_index'
  [A] 'tracepoint __tracepoint_cpu_frequency_limits'
  [A] 'tracepoint __tracepoint_ipi_entry'
  [A] 'tracepoint __tracepoint_ipi_raise'
  [A] 'tracepoint __tracepoint_irq_handler_entry'
  [A] 'tracepoint __tracepoint_sched_switch'
  [A] 'device_type i2c_client_type'
  [A] 'int overflowuid'
  [A] 'atomic_long_t vm_node_stat[38]'
  [A] 'atomic_long_t vm_zone_stat[12]'

47 Changed variables:

  [C] 'pglist_data contig_page_data' was changed at memblock.c:96:1:
    CRC (modversions) changed from 0xdeb74410 to 0x17ba9562
    type of variable changed:
      type size hasn't changed
      1 data member insertion:
        'deferred_split pglist_data::deferred_split_queue', at offset 54336 (in bits) at mmzone.h:828:1
      there are data member changes:
        2 ('lruvec pglist_data::__lruvec' .. 'unsigned long int pglist_data::flags') offsets changed (by +256 bits)
      2529 impacted interfaces

  [C] 'rq runqueues' was changed at core.c:51:1:
    CRC (modversions) changed from 0x7d8ddb7c to 0xa7379acd
    type of variable changed:
      type size hasn't changed
      1 data member insertion:
        'ktime_t rq::hrtick_time', at offset 25344 (in bits) at sched.h:1029:1
      there are data member changes:
        11 ('sched_info rq::rq_sched_info' .. 'u64 rq::android_vendor_data1[96]') offsets changed (by +64 bits)
      2529 impacted interfaces

  [C] 'bus_type amba_bustype' was changed at bus.c:215:1:
    CRC (modversions) changed from 0xa38da620 to 0xca23025

  [C] 'const clk_ops clk_fixed_factor_ops' was changed at clk-fixed-factor.c:60:1:
    CRC (modversions) changed from 0x6d350258 to 0x96009648

  [C] 'const clk_ops clk_fixed_rate_ops' was changed at clk-fixed-rate.c:46:1:
    CRC (modversions) changed from 0x6a810889 to 0xda835cdb

  ... 42 omitted; 45 symbols have only CRC changes

'enum cpuhp_state at cpuhotplug.h:25:1' changed:
  type size hasn't changed
  1 enumerator insertion:
    'cpuhp_state::CPUHP_AP_DTPM_CPU_ONLINE' value '215'
  2 enumerator changes:
    'cpuhp_state::CPUHP_AP_ACTIVE' from value '215' to '216' at cpuhotplug.h:25:1
    'cpuhp_state::CPUHP_ONLINE' from value '216' to '217' at cpuhotplug.h:25:1
  5 impacted interfaces
'struct address_space at fs.h:451:1' changed:
  type size changed from 1344 to 1408 (in bits)
  1 data member insertion:
    'atomic_t address_space::nr_thps', at offset 256 (in bits) at fs.h:458:1
  there are data member changes:
    11 ('rb_root_cached address_space::i_mmap' .. 'void* address_space::private_data') offsets changed (by +64 bits)
  2529 impacted interfaces

'struct amba_driver at bus.h:76:1' changed:
  type size hasn't changed
  there are data member changes:
    type 'int (amba_device*)*' of 'amba_driver::remove' changed:
      pointer type changed from: 'int (amba_device*)*' to: 'void (amba_device*)*'
  2 impacted interfaces

'struct block_device at blk_types.h:22:1' changed:
  type size changed from 1472 to 1536 (in bits)
  1 data member insertion:
    'super_block* block_device::bd_fsfreeze_sb', at offset 1472 (in bits) at blk_types.h:49:1
  2529 impacted interfaces

'struct drm_crtc_helper_funcs at drm_modeset_helper_vtables.h:61:1' changed (indirectly):
  type size hasn't changed
  there are data member changes:
    type 'int (drm_crtc*, drm_framebuffer*, int, int, enum mode_set_atomic)*' of 'drm_crtc_helper_funcs::mode_set_base_atomic' changed:
      pointer type changed from: 'int (drm_crtc*, drm_framebuffer*, int, int, enum mode_set_atomic)*' to: 'int (drm_crtc*, drm_framebuffer*, int, int, enum mode_set_atomic)*'
  246 impacted interfaces

'struct em_perf_domain at energy_model.h:43:1' changed:
  type size hasn't changed
  1 data member insertion:
    'int em_perf_domain::milliwatts', at offset 96 (in bits) at energy_model.h:48:1
  2529 impacted interfaces

'struct inode at fs.h:610:1' changed (indirectly):
  type size changed from 4800 to 4864 (in bits)
  there are data member changes:
    type 'struct address_space' of 'inode::i_data' changed, as reported earlier
    'list_head inode::i_devices' offset changed (by +64 bits)
    while looking at anonymous data member 'union {pipe_inode_info* i_pipe; block_device* i_bdev; cdev* i_cdev; char* i_link; unsigned int i_dir_seq;}':
    the internal name of that anonymous data member changed from:
     __anonymous_union__51
    to:
     __anonymous_union__27
     This is usually due to an anonymous member type being added or removed from the containing type
    and offset changed from 4416 to 4480 (in bits) (by +64 bits)
    6 ('__u32 inode::i_generation' .. 'void* inode::i_private') offsets changed (by +64 bits)
  2529 impacted interfaces

'struct module at module.h:366:1' changed:
  type size hasn't changed
  1 data member insertion:
    'cfi_check_fn module::cfi_check', at offset 1920 (in bits) at module.h:389:1
  there are data member changes:
    15 ('mutex module::param_lock' .. 'int ()* module::init') offsets changed (by +64 bits)
  2529 impacted interfaces

'struct pglist_data at mmzone.h:728:1' changed:
  details were reported earlier

'struct regulator_desc at driver.h:313:1' changed:
  type size changed from 2240 to 2304 (in bits)
  1 data member insertion:
    'bool regulator_desc::of_match_full_name', at offset 192 (in bits) at driver.h:319:1
  there are data member changes:
    52 ('const char* regulator_desc::regulators_node' .. 'unsigned int (unsigned int)* regulator_desc::of_map_mode') offsets changed (by +64 bits)
  32 impacted interfaces

'struct rq at sched.h:897:1' changed:
  details were reported earlier

'struct tty_ldisc_ops at tty_ldisc.h:175:1' changed:
  type size hasn't changed
  there are data member changes:
    type 'typedef ssize_t (tty_struct*, file*, unsigned char*, typedef size_t)*' of 'tty_ldisc_ops::read' changed:
      pointer type changed from: 'typedef ssize_t (tty_struct*, file*, unsigned char*, typedef size_t)*' to: 'typedef ssize_t (tty_struct*, file*, unsigned char*, typedef size_t, void**, unsigned long int)*'
  27 impacted interfaces

'struct ufs_hba_variant_ops at ufshcd.h:301:1' changed:
  type size changed from 1728 to 1408 (in bits)
  5 data member deletions:
    'int (ufs_hba*, ufshcd_lrb*, unsigned int)* ufs_hba_variant_ops::fill_prdt', at offset 1408 (in bits) at ufshcd.h:335:1
    'int (ufs_hba*, request*, ufshcd_lrb*)* ufs_hba_variant_ops::prepare_command', at offset 1472 (in bits) at ufshcd.h:337:1
    'int (ufs_hba*)* ufs_hba_variant_ops::update_sysfs', at offset 1536 (in bits) at ufshcd.h:339:1
    'void (ufs_hba*, ufshcd_lrb*)* ufs_hba_variant_ops::send_command', at offset 1600 (in bits) at ufshcd.h:340:1
    'void (ufs_hba*, ufshcd_lrb*)* ufs_hba_variant_ops::compl_command', at offset 1664 (in bits) at ufshcd.h:341:1
  15 impacted interfaces

'struct vm_area_struct at mm_types.h:306:1' changed (indirectly):
  type size changed from 1536 to 1600 (in bits)
  there are data member changes:
    'seqcount_t vm_area_struct::vm_sequence' offset changed (by +64 bits)
    type 'struct vm_userfaultfd_ctx' of 'vm_area_struct::vm_userfaultfd_ctx' changed:
      type size changed from 0 to 64 (in bits)
      1 data member insertion:
        'userfaultfd_ctx* vm_userfaultfd_ctx::ctx', at offset 0 (in bits) at mm_types.h:293:1
      2529 impacted interfaces
    'atomic_t vm_area_struct::vm_ref_count' offset changed (by +64 bits)
  2529 impacted interfaces

'struct vm_userfaultfd_ctx at mm_types.h:297:1' changed:
  details were reported earlier

'struct zone at mmzone.h:450:1' changed:
  type size hasn't changed
  1 data member insertion:
    'unsigned long int zone::cma_pages', at offset 960 (in bits) at mmzone.h:529:1
  there are data member changes:
    4 ('const char* zone::name' .. 'int zone::initialized') offsets changed (by +64 bits)
  2529 impacted interfaces

Bug: 182194803
Fixes: ba01e93b41 ("FROMLIST: kbuild: add support for Clang LTO")
Change-Id: If6011ad739ecccd23a92cfa2f9fd43084f9a0b4f
Signed-off-by: Giuliano Procida <gprocida@google.com>
2021-03-12 17:22:36 +00:00
Badhri Jagan Sridharan
02efd18b77 UPSTREAM: usb: typec: tcpci: Refactor tcpc_presenting_cc1_rd macro
Defining one macro instead of two for tcpc_presenting_*_rd.
This is a follow up of the comment left by Heikki Krogerus.

https://patchwork.kernel.org/project/linux-usb/patch/
20210304070931.1947316-1-badhri@google.com/

Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Badhri Jagan Sridharan <badhri@google.com>
Link: https://lore.kernel.org/r/20210310223536.3471243-1-badhri@google.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
(cherry picked from commit aecb1e452d)
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Change-Id: Iffee064c4aba766d9819673282ffe62835f1fb5d
2021-03-12 16:33:34 +00:00
Minchan Kim
8d03e49505 ANDROID: mm: build alloc_contig_dump_pages in page_alloc.o
GKI has CONFIG_DYNAMIC_DEBUG_CORE. Thus, to enable only the
specific alloc_contig_dump_pages without needing all pr_debug
in every source files is using -DCONFIG_DYNAMIC_MODULE
when the page_alloc.o compiled.

Bug: 182195592
Signed-off-by: Minchan Kim <minchan@google.com>
Change-Id: I93266eb4161b3653389c737d4c767fd5d1083339
2021-03-12 16:08:38 +00:00
Minchan Kim
28f6641041 FROMLIST: mm: page_alloc: dump migrate-failed pages
Currently, debugging CMA allocation failures is quite limited.
The most common source of these failures seems to be page
migration which doesn't provide any useful information on the
reason of the failure by itself. alloc_contig_range can report
those failures as it holds a list of migrate-failed pages.

The information logged by dump_page() has already proven helpful
for debugging allocation issues, like identifying long-term
pinnings on ZONE_MOVABLE or MIGRATE_CMA.

Let's use the dynamic debugging infrastructure, such that we
avoid flooding the logs and creating a lot of noise on frequent
alloc_contig_range() calls. This information is helpful for
debugging only.

There are two ifdefery conditions to support common dyndbg options:

- CONFIG_DYNAMIC_DEBUG_CORE && DYNAMIC_DEBUG_MODULE
It aims for supporting the feature with only specific file
with adding ccflags.

- CONFIG_DYNAMIC_DEBUG
It aims for supporting the feature with system wide globally.

A simple example to enable the feature:

Admin could enable the dump like this(by default, disabled)

	echo "func alloc_contig_dump_pages +p" > control

Admin could disable it.

	echo "func alloc_contig_dump_pages =_" > control

Detail goes Documentation/admin-guide/dynamic-debug-howto.rst

A concern is utility functions in dump_page use inconsistent
loglevels. In the future, we might want to make the loglevels
used inside dump_page() consistent and eventually rework the way
we log the information here. See [1].

[1] https://lore.kernel.org/linux-mm/YEh4doXvyuRl5BDB@google.com/

Bug: 182195592
Link: https://lore.kernel.org/linux-mm/20210311194042.825152-1-minchan@kernel.org/
Reviewed-by: David Hildenbrand <david@redhat.com>
Signed-off-by: Minchan Kim <minchan@kernel.org>
Change-Id: I4db99a76a543d559a05515d6800c66ab48196978
2021-03-12 16:08:03 +00:00