From 7bcfde2601c220ba8332941706e891e7fd4f444a Mon Sep 17 00:00:00 2001 From: Liujie Xie Date: Mon, 12 Jul 2021 20:37:25 +0800 Subject: [PATCH 01/73] ANDROID: ashmem: Export is_ashmem_file Export is_ashmem_file function which will be used by the minidump module to get ashmem info. Bug: 193397560 Change-Id: I5b7816ad4775e5cf2c4f41c28b1c8dacc2c85b7e Signed-off-by: liuhailong Signed-off-by: Liujie Xie --- drivers/staging/android/ashmem.c | 9 +++++++++ drivers/staging/android/ashmem.h | 2 ++ 2 files changed, 11 insertions(+) diff --git a/drivers/staging/android/ashmem.c b/drivers/staging/android/ashmem.c index 900cad5d79da..05e47ce9657d 100644 --- a/drivers/staging/android/ashmem.c +++ b/drivers/staging/android/ashmem.c @@ -915,6 +915,15 @@ static const struct file_operations ashmem_fops = { #endif }; +/* + * is_ashmem_file - Check if struct file* is associated with ashmem + */ +int is_ashmem_file(struct file *file) +{ + return file->f_op == &ashmem_fops; +} +EXPORT_SYMBOL_GPL(is_ashmem_file); + static struct miscdevice ashmem_misc = { .minor = MISC_DYNAMIC_MINOR, .name = "ashmem", diff --git a/drivers/staging/android/ashmem.h b/drivers/staging/android/ashmem.h index 1a478173cd21..9fa72ed7b7ed 100644 --- a/drivers/staging/android/ashmem.h +++ b/drivers/staging/android/ashmem.h @@ -21,4 +21,6 @@ #define COMPAT_ASHMEM_SET_PROT_MASK _IOW(__ASHMEMIOC, 5, unsigned int) #endif +int is_ashmem_file(struct file *file); + #endif /* _LINUX_ASHMEM_H */ From 2ad2c3a25b20cd310857acba4a7ab58e41a7c9b3 Mon Sep 17 00:00:00 2001 From: Charan Teja Reddy Date: Tue, 13 Jul 2021 15:46:23 +0530 Subject: [PATCH 02/73] ANDROID: abi_gki_aarch64_qcom: whitelist vm_event_states Add vm_event_states, which is an already exported symbol, to the list of whitelisted symbols. No message with 'Leaf changes summary:' is printed to add to this commit message. Bug: 187798288 Change-Id: I3c6d39d5b2838ac7fa64db152cca5685b9f43238 Signed-off-by: Charan Teja Reddy --- android/abi_gki_aarch64_qcom | 1 + 1 file changed, 1 insertion(+) diff --git a/android/abi_gki_aarch64_qcom b/android/abi_gki_aarch64_qcom index 972b6ed9acdd..73fe0796a766 100644 --- a/android/abi_gki_aarch64_qcom +++ b/android/abi_gki_aarch64_qcom @@ -2923,6 +2923,7 @@ vmalloc_to_pfn vmap vmemdup_user + vm_event_states vmf_insert_mixed vmf_insert_pfn vm_get_page_prot From 018332e87198c94fda770b1e166ed14640b0b964 Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Fri, 9 Jul 2021 11:10:28 -0700 Subject: [PATCH 03/73] ANDROID: Revert "scsi: block: Do not accept any requests while suspended" Commit "block: Do not accept any requests while suspended" broke the UFS driver. In the upstream kernel this has been fixed by commit b294ff3e3449 ("scsi: ufs: core: Enable power management for wlun"). Backporting that commit or backporting the entire v5.14-rc1 UFS driver is too risky. Hence revert the block layer patch that is incompatible with the v5.10 UFS driver power management code. This reverts commit d55d15a332ec651ccb49c42a8a10c03447fdf418. Bug: 193181075 Change-Id: Ic50d4e1df98d7ed393bf9797787225ae22e5d7a3 Signed-off-by: Bart Van Assche --- block/blk-core.c | 7 +++---- block/blk-pm.h | 14 +++++--------- include/linux/blkdev.h | 12 ------------ 3 files changed, 8 insertions(+), 25 deletions(-) diff --git a/block/blk-core.c b/block/blk-core.c index 2d53e2ff48ff..a00bce9f46d8 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -18,7 +18,6 @@ #include #include #include -#include #include #include #include @@ -441,8 +440,7 @@ int blk_queue_enter(struct request_queue *q, blk_mq_req_flags_t flags) * responsible for ensuring that that counter is * globally visible before the queue is unfrozen. */ - if ((pm && queue_rpm_status(q) != RPM_SUSPENDED) || - !blk_queue_pm_only(q)) { + if (pm || !blk_queue_pm_only(q)) { success = true; } else { percpu_ref_put(&q->q_usage_counter); @@ -467,7 +465,8 @@ int blk_queue_enter(struct request_queue *q, blk_mq_req_flags_t flags) wait_event(q->mq_freeze_wq, (!q->mq_freeze_depth && - blk_pm_resume_queue(pm, q)) || + (pm || (blk_pm_request_resume(q), + !blk_queue_pm_only(q)))) || blk_queue_dying(q)); if (blk_queue_dying(q)) return -ENODEV; diff --git a/block/blk-pm.h b/block/blk-pm.h index a2283cc9f716..ea5507d23e75 100644 --- a/block/blk-pm.h +++ b/block/blk-pm.h @@ -6,14 +6,11 @@ #include #ifdef CONFIG_PM -static inline int blk_pm_resume_queue(const bool pm, struct request_queue *q) +static inline void blk_pm_request_resume(struct request_queue *q) { - if (!q->dev || !blk_queue_pm_only(q)) - return 1; /* Nothing to do */ - if (pm && q->rpm_status != RPM_SUSPENDED) - return 1; /* Request allowed */ - pm_request_resume(q->dev); - return 0; + if (q->dev && (q->rpm_status == RPM_SUSPENDED || + q->rpm_status == RPM_SUSPENDING)) + pm_request_resume(q->dev); } static inline void blk_pm_mark_last_busy(struct request *rq) @@ -47,9 +44,8 @@ static inline void blk_pm_put_request(struct request *rq) --rq->q->nr_pending; } #else -static inline int blk_pm_resume_queue(const bool pm, struct request_queue *q) +static inline void blk_pm_request_resume(struct request_queue *q) { - return 1; } static inline void blk_pm_mark_last_busy(struct request *rq) diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index dcb7b342f0d3..433ae2605277 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -694,18 +694,6 @@ static inline bool queue_is_mq(struct request_queue *q) return q->mq_ops; } -#ifdef CONFIG_PM -static inline enum rpm_status queue_rpm_status(struct request_queue *q) -{ - return q->rpm_status; -} -#else -static inline enum rpm_status queue_rpm_status(struct request_queue *q) -{ - return RPM_ACTIVE; -} -#endif - static inline enum blk_zoned_model blk_queue_zoned_model(struct request_queue *q) { From dcf509fea78c8379cbf53caa459ff2847daa9f09 Mon Sep 17 00:00:00 2001 From: Rocco Yue Date: Sun, 11 Jul 2021 13:49:50 +0800 Subject: [PATCH 04/73] ANDROID: ipv6: add vendor hook for gen ipv6 link-local addr This patch provides an ipv6 vendor hook which can be used to disable kernel auto generate the ipv6 link-local address. The reasons why the kernel does not need to automatically generate the ipv6 link-local address are as follows: (1) In the 3GPP TS 29.061, here is a description as follows: "in order to avoid any conflict between the link-local address of the MS and that of the GGSN, the Interface-Identifier used by the MS to build its link-local address shall be assigned by the GGSN. The GGSN ensures the uniqueness of this Interface- Identifier. The MT shall then enforce the use of this Interface-Identifier by the TE" In other words, in the cellular network, GGSN determines whether to reply a solicited RA message by identifying the low 64 bits of the source address of the received RS message. Therefore, cellular network device's ipv6 link-local address should be set as the format of fe80::(GGSN assigned IID). For example: When using a new kernel and ARPHRD_RAWIP, kernel will generate an EUI64 format ipv6 link-local address, and the Linux kernel will uses this link-local address to send RS message. The result is that the GGSN will not reply to the RS message with a solicited RA message. For mobile operators that don't need to support RFC7217, setting addr_gen_mode == 1 is sufficient, it can avoid the above issue, but when the addr_gen_mode is changed to the IN6_ADDR_GEN_MODE_STABLE_PRIVACY, the above problem still exist. The detail as follows: (2) For some other mobile operators that need to support RFC7217, the mobile device's addr_gen_mode will be switched to the IN6_ADDR_GEN_MODE_STABLE_PRIVACY, instead of using IN6_ADDR_GEN_MODE_NONE. The purpose is: in the IN6_ADDR_GEN_MODE_STABLE_PRIVACY mode, kernel can gererate a stable privacy global ipv6 address after receiveing RA, and network processes can use this global address to communicate with the outside network. Of course, mobile operators that need to support RFC7217 should also meet the requirement of 3GPP TS 29.061, that is, MT should use IID assigned by the GGSN to build its ipv6 link-local address and use this address to send RS. We don't want the kernel to automatically generate an ipv6 link-local address when addr_gen_mode == 2. Otherwise, using the stable privacy ipv6 link-local address automatically generated by the kernel to send RS message, GGSN will not be able to respond to the RS and reply a RA message. Therefore, after this patch, the kernel can determine whether to disable the automatic ipv6 link-local address generation by judging the net device name. Bug: 190685002 Change-Id: I93420cacd96789769edc7214fb8a2dd1455ce374 Signed-off-by: Rocco Yue --- drivers/android/vendor_hooks.c | 2 ++ include/trace/hooks/ipv6.h | 22 ++++++++++++++++++++++ net/ipv6/addrconf.c | 7 +++++++ 3 files changed, 31 insertions(+) create mode 100644 include/trace/hooks/ipv6.h diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 07eb8efd7c40..4bea5f851083 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -68,6 +68,7 @@ #include #include #include +#include /* * Export tracepoints that act as a bare tracehook (ie: have no trace event @@ -353,3 +354,4 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_check_file_open); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_check_bpf_syscall); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_usb_dev_suspend); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_usb_dev_resume); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ipv6_gen_linklocal_addr); diff --git a/include/trace/hooks/ipv6.h b/include/trace/hooks/ipv6.h new file mode 100644 index 000000000000..c1998af0c5a0 --- /dev/null +++ b/include/trace/hooks/ipv6.h @@ -0,0 +1,22 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM ipv6 +#define TRACE_INCLUDE_PATH trace/hooks + +#if !defined(_TRACE_HOOK_IPV6_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_HOOK_IPV6_H +#include +#include +/* + * Following tracepoints are not exported in tracefs and provide a + * mechanism for vendor modules to hook and extend functionality + */ +DECLARE_HOOK(android_vh_ipv6_gen_linklocal_addr, + TP_PROTO(struct net_device *dev, bool *ret), + TP_ARGS(dev, ret)); + +/* macro versions of hooks are no longer required */ + +#endif /* _TRACE_HOOK_IPV6_H */ +/* This part must be outside protection */ +#include diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index d6e7a77ca123..812b79192b7e 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -90,6 +90,8 @@ #include #include +#include + #define INFINITY_LIFE_TIME 0xFFFFFFFF #define IPV6_MAX_STRLEN \ @@ -3344,6 +3346,7 @@ static void addrconf_addr_gen(struct inet6_dev *idev, bool prefix_route) static void addrconf_dev_config(struct net_device *dev) { struct inet6_dev *idev; + bool ret = false; ASSERT_RTNL(); @@ -3371,6 +3374,10 @@ static void addrconf_dev_config(struct net_device *dev) if (IS_ERR(idev)) return; + trace_android_vh_ipv6_gen_linklocal_addr(dev, &ret); + if (ret) + return; + /* this device type has no EUI support */ if (dev->type == ARPHRD_NONE && idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_EUI64) From 1061ef04934b53a2fad0d6225104024ad4ca4b57 Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Thu, 8 Jul 2021 14:46:44 -0700 Subject: [PATCH 05/73] ANDROID: jump_label: disable jump labels in fips140.ko The fips140 module doesn't support jump labels, as they would invalidate the hash of the .text section. So when building the module, switch to the generic implementation that does not rely on arch-specific code patching support. This fixes a failure in check_fips140_module_hmac() caused by the module containing a call to crypto_alg_put(), which is an inline function that calls refcount_dec_and_test(), which on arm64 uses a jump label. Note that the optimized definition of struct static_key is retained, to ensure ABI compatibility across the FIPS140 module boundary. To ensure that static keys and their associated jump labels remain in a consistent state, the fips140 module will not be able to manipulate static keys, but only to check their state. Bug: 153614920 Bug: 188620248 Change-Id: Ie834bbf2eed5d09bfae7f387b711a934bedf390d Signed-off-by: Eric Biggers [ardb: disable jump labels in generic code not in arm64 arch code] Signed-off-by: Ard Biesheuvel --- include/linux/jump_label.h | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h index 32809624d422..6175b3e0d220 100644 --- a/include/linux/jump_label.h +++ b/include/linux/jump_label.h @@ -113,7 +113,7 @@ struct static_key { #endif /* CONFIG_JUMP_LABEL */ #endif /* __ASSEMBLY__ */ -#ifdef CONFIG_JUMP_LABEL +#if defined(CONFIG_JUMP_LABEL) && !defined(BUILD_FIPS140_KO) #include #ifndef __ASSEMBLY__ @@ -188,7 +188,28 @@ enum jump_label_type { struct module; -#ifdef CONFIG_JUMP_LABEL +#ifdef BUILD_FIPS140_KO + +static inline int static_key_count(struct static_key *key) +{ + return atomic_read(&key->enabled); +} + +static __always_inline bool static_key_false(struct static_key *key) +{ + if (unlikely(static_key_count(key) > 0)) + return true; + return false; +} + +static __always_inline bool static_key_true(struct static_key *key) +{ + if (likely(static_key_count(key) > 0)) + return true; + return false; +} + +#elif defined(CONFIG_JUMP_LABEL) #define JUMP_TYPE_FALSE 0UL #define JUMP_TYPE_TRUE 1UL @@ -393,7 +414,7 @@ extern bool ____wrong_branch_error(void); static_key_count((struct static_key *)x) > 0; \ }) -#ifdef CONFIG_JUMP_LABEL +#if defined(CONFIG_JUMP_LABEL) && !defined(BUILD_FIPS140_KO) /* * Combine the right initial value (type) with the right branch order From bd7d13c36e4b10e3f0173b2e481dbb04ecfcd56f Mon Sep 17 00:00:00 2001 From: Ard Biesheuvel Date: Mon, 12 Jul 2021 07:49:03 +0000 Subject: [PATCH 06/73] ANDROID: arm64: disable LSE when building the FIPS140 module The arm64 LSE atomics implementation uses both alternatives patching and jump label patching, both of which need to be selectively disabled when building the FIPS140 module, or the hashing of the .text section no longer works. We already disable jump labels in generic code, but this uncovers a rather nasty circular include dependency, as the jump label fallback code uses atomics, which are provided by the LSE code if enabled. So let's disable LSE as well when building the FIPS140 module: this does not have any impact on the code, as no code patching goes on in this module anyway, but it avoids #include hell. Bug: 153614920 Bug: 188620248 Change-Id: Ia3d823fa3a309777f0c955d619ae8b139dc74061 Signed-off-by: Ard Biesheuvel --- arch/arm64/include/asm/lse.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/include/asm/lse.h b/arch/arm64/include/asm/lse.h index 5d10051c3e62..29d0719bd2ed 100644 --- a/arch/arm64/include/asm/lse.h +++ b/arch/arm64/include/asm/lse.h @@ -4,7 +4,7 @@ #include -#ifdef CONFIG_ARM64_LSE_ATOMICS +#if defined(CONFIG_ARM64_LSE_ATOMICS) && !defined(BUILD_FIPS140_KO) #define __LSE_PREAMBLE ".arch_extension lse\n" From b7397e89db2952192f3c688351a74428e7b5d3af Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Thu, 8 Jul 2021 14:46:46 -0700 Subject: [PATCH 07/73] ANDROID: fips140: add power-up cryptographic self-tests Make fips140.ko run a suite of known answer self-tests at load time to demonstrate the correct operation of cryptographic functionality, as required by FIPS 140-2/3 and NIAP FPT_TST_EXT.1.1. Bug: 153614920 Bug: 173104584 Bug: 188620248 Test: Built and loaded fips140.ko on a HiKey960, and on a Pixel device. Change-Id: I38e5c8052ff57ddfe44624beb626d38b7706b0a4 Co-developed-by: Elena Petrova Signed-off-by: Elena Petrova [ebiggers: Rewrote most of lenaptr@'s original patch. Added some missing tests, removed some unnecessary tests in accordance with the FIPS 140-2 IG, changed most test vectors and added a script to generate them, removed an unnecessary kconfig option, changed implementation of error injection, and many other improvements.] Signed-off-by: Eric Biggers [ardb: add generation of AES-CTR test vector and the associated runtime selftest] Signed-off-by: Ard Biesheuvel --- crypto/Kconfig | 9 + crypto/Makefile | 2 +- crypto/fips140-generated-testvecs.h | 65 ++ crypto/fips140-module.c | 25 +- crypto/fips140-module.h | 20 + crypto/fips140-selftests.c | 867 +++++++++++++++++++++++++++ tools/crypto/gen_fips140_testvecs.py | 121 ++++ 7 files changed, 1104 insertions(+), 5 deletions(-) create mode 100644 crypto/fips140-generated-testvecs.h create mode 100644 crypto/fips140-module.h create mode 100644 crypto/fips140-selftests.c create mode 100755 tools/crypto/gen_fips140_testvecs.py diff --git a/crypto/Kconfig b/crypto/Kconfig index ca514e82431a..f52237ac12c5 100644 --- a/crypto/Kconfig +++ b/crypto/Kconfig @@ -40,6 +40,15 @@ config CRYPTO_FIPS140_MOD bool "Enable FIPS140 integrity self-checked loadable module" depends on LTO_CLANG && CRYPTO_FIPS140 +config CRYPTO_FIPS140_MOD_ERROR_INJECTION + bool "Support injecting failures into the FIPS 140 self-tests" + depends on CRYPTO_FIPS140_MOD + help + This option adds a module parameter "broken_alg" to the fips140 module + which can be used to fail the self-tests for a particular algorithm, + causing a kernel panic. This option is for FIPS lab testing only, and + it shouldn't be enabled on production systems. + config CRYPTO_ALGAPI tristate select CRYPTO_ALGAPI2 diff --git a/crypto/Makefile b/crypto/Makefile index 63874cb2d4d4..aff52de1f84b 100644 --- a/crypto/Makefile +++ b/crypto/Makefile @@ -228,7 +228,7 @@ $(obj)/lib-crypto-%-fips.o: $(srctree)/lib/crypto/%.c FORCE $(obj)/crypto-fips.a: $(addprefix $(obj)/,$(crypto-fips-objs)) FORCE $(call if_changed,ar_and_symver) -fips140-objs := fips140-module.o crypto-fips.a +fips140-objs := fips140-module.o fips140-selftests.o crypto-fips.a obj-m += fips140.o CFLAGS_fips140-module.o += $(FIPS140_CFLAGS) diff --git a/crypto/fips140-generated-testvecs.h b/crypto/fips140-generated-testvecs.h new file mode 100644 index 000000000000..9328e9bacca7 --- /dev/null +++ b/crypto/fips140-generated-testvecs.h @@ -0,0 +1,65 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* Copyright 2021 Google LLC */ + +/* + * This header was automatically generated by gen_fips140_testvecs.py. + * Don't edit it directly. + */ + +static const u8 fips_message[32] __initconst = + "This is a 32-byte test message."; + +static const u8 fips_aes_key[16] __initconst = "128-bit AES key"; + +static const u8 fips_aes_iv[16] __initconst = "ABCDEFGHIJKL"; + +static const u8 fips_aes_cbc_ciphertext[32] __initconst = + "\xc4\x6d\xad\xa4\x04\x52\x11\x5a\x7a\xb3\x7c\x68\x85\x8d\x90\xf0" + "\x55\xc3\xd3\x35\xc1\x75\x31\x90\xdf\x90\x4b\x5a\x56\xfd\xa7\x89"; + +static const u8 fips_aes_ecb_ciphertext[32] __initconst = + "\xc1\x9d\xe6\xb8\xb2\x90\xff\xfe\xf2\x77\x18\xb0\x55\xd3\xee\xa9" + "\xe2\x6f\x4a\x32\x67\xfd\xb7\xa5\x2f\x4b\x6e\x1a\x86\x2b\x6e\x3a"; + +static const u8 fips_aes_ctr_ciphertext[32] __initconst = + "\x92\xbe\x23\xa1\x80\x88\x5d\x31\x27\xb3\x9c\x40\x58\x57\x1d\xde" + "\xc1\x8d\x5b\xe7\x42\x93\x09\xf8\xd4\xf7\x49\x42\xcf\x40\x62\x7e"; + +static const u8 fips_aes_gcm_assoc[22] __initconst = "associated data string"; + +static const u8 fips_aes_gcm_ciphertext[48] __initconst = + "\x37\x88\x3e\x1d\x58\x50\xda\x10\x07\xeb\x52\xdf\xea\x0a\x54\xd4" + "\x44\xbf\x88\x2a\xf3\x03\x03\x84\xaf\x8b\x96\xbd\xea\x65\x60\x6f" + "\x82\xfa\x51\xf4\x28\xad\x0c\xf1\xce\x0f\x91\xdd\x1a\x4c\x77\x5f"; + +static const u8 fips_aes_xts_key[32] __initconst = + "This is an AES-128-XTS key."; + +static const u8 fips_aes_xts_ciphertext[32] __initconst = + "\x5e\xb9\x98\xd6\x26\xb3\x55\xbf\x44\xab\x3e\xae\x73\xc0\x81\xc9" + "\xf4\x29\x0e\x17\x1e\xc5\xc8\x90\x79\x99\xf1\x43\x3a\x23\x08\x5a"; + +static const u8 fips_hmac_key[16] __initconst = "128-bit HMAC key"; + +static const u8 fips_sha1_digest[20] __initconst = + "\x1b\x78\xc7\x4b\xd5\xd4\x83\xb1\x58\xc5\x96\x83\x4f\x16\x8d\x15" + "\xb4\xaa\x22\x8c"; + +static const u8 fips_sha256_digest[32] __initconst = + "\x4e\x11\x83\x0c\x53\x80\x1e\x5f\x9b\x38\x33\x38\xe8\x74\x43\xb0" + "\xc1\x3a\xbe\xbf\x75\xf0\x12\x0f\x21\x33\xf5\x16\x33\xf1\xb0\x81"; + +static const u8 fips_hmac_sha256_digest[32] __initconst = + "\x63\x0e\xb5\x73\x79\xfc\xaf\x5f\x86\xe3\xaf\xf0\xc8\x36\xef\xd5" + "\x35\x8d\x40\x25\x38\xb3\x65\x72\x98\xf3\x59\xd8\x1e\x54\x4c\xa1"; + +static const u8 fips_sha512_digest[64] __initconst = + "\x32\xe0\x44\x23\xbd\xe3\xec\x28\xbf\xf1\x34\x11\xd5\xae\xbf\xd5" + "\xc0\x8e\xb5\xa1\x04\xef\x2f\x07\x84\xf1\xd9\x83\x0f\x6c\x31\xab" + "\xf7\xe7\x57\xfa\xf7\xae\xf0\x6f\xb2\x16\x08\x32\xcf\xc7\xef\x35" + "\xb3\x3b\x51\xb9\xfd\xe7\xff\x5e\xb2\x8b\xc6\x79\xe6\x14\x04\xb4"; + +/* + * This header was automatically generated by gen_fips140_testvecs.py. + * Don't edit it directly. + */ diff --git a/crypto/fips140-module.c b/crypto/fips140-module.c index 225c6bb020aa..f0ed4602e924 100644 --- a/crypto/fips140-module.c +++ b/crypto/fips140-module.c @@ -11,8 +11,6 @@ * a cryptographic software module. */ -#define pr_fmt(fmt) "fips140: " fmt - #include #include #include @@ -23,8 +21,18 @@ #include #include +#include "fips140-module.h" #include "internal.h" +/* + * This option allows deliberately failing the self-tests for a particular + * algorithm. This is for FIPS lab testing only. + */ +#ifdef CONFIG_CRYPTO_FIPS140_MOD_ERROR_INJECTION +char *fips140_broken_alg; +module_param_named(broken_alg, fips140_broken_alg, charp, 0); +#endif + /* * FIPS 140-2 prefers the use of HMAC with a public key over a plain hash. */ @@ -52,6 +60,12 @@ const u32 *__initcall_start = &__initcall_start_marker; const u8 *__text_start = &__fips140_text_start; const u8 *__rodata_start = &__fips140_rodata_start; +/* + * The list of the crypto API algorithms (by cra_name) that will be unregistered + * by this module, in preparation for the module registering its own + * implementation(s) of them. When adding a new algorithm here, make sure to + * consider whether it needs a self-test added to fips140_selftests[] as well. + */ static const char * const fips140_algorithms[] __initconst = { "aes", @@ -566,13 +580,16 @@ fips140_init(void) */ synchronize_rcu_tasks(); - /* insert self tests here */ + if (!fips140_run_selftests()) + goto panic; /* * It may seem backward to perform the integrity check last, but this * is intentional: the check itself uses hmac(sha256) which is one of * the algorithms that are replaced with versions from this module, and - * the integrity check must use the replacement version. + * the integrity check must use the replacement version. Also, to be + * ready for FIPS 140-3, the integrity check algorithm must have already + * been self-tested. */ if (!check_fips140_module_hmac()) { diff --git a/crypto/fips140-module.h b/crypto/fips140-module.h new file mode 100644 index 000000000000..b30a2e2928a6 --- /dev/null +++ b/crypto/fips140-module.h @@ -0,0 +1,20 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright 2021 Google LLC + */ + +#ifndef _CRYPTO_FIPS140_MODULE_H +#define _CRYPTO_FIPS140_MODULE_H + +#include + +#undef pr_fmt +#define pr_fmt(fmt) "fips140: " fmt + +#ifdef CONFIG_CRYPTO_FIPS140_MOD_ERROR_INJECTION +extern char *fips140_broken_alg; +#endif + +bool __init __must_check fips140_run_selftests(void); + +#endif /* _CRYPTO_FIPS140_MODULE_H */ diff --git a/crypto/fips140-selftests.c b/crypto/fips140-selftests.c new file mode 100644 index 000000000000..3ebf5a914cf0 --- /dev/null +++ b/crypto/fips140-selftests.c @@ -0,0 +1,867 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright 2021 Google LLC + * + * Authors: Elena Petrova , + * Eric Biggers + * + * Self-tests of fips140.ko cryptographic functionality. These are run at + * module load time to fulfill FIPS 140 and NIAP FPT_TST_EXT.1 requirements. + * + * The actual requirements for these self-tests are somewhat vague, but + * section 9 ("Self-Tests") of the FIPS 140-2 Implementation Guidance document + * (https://csrc.nist.gov/csrc/media/projects/cryptographic-module-validation-program/documents/fips140-2/fips1402ig.pdf) + * is somewhat helpful. Basically, all implementations of all FIPS approved + * algorithms (including modes of operation) must be tested. However: + * + * - If an implementation won't be used, it doesn't have to be tested. So + * when multiple implementations of the same algorithm are registered with + * the crypto API, we only have to test the default (highest-priority) one. + * + * - There are provisions for skipping tests that are already sufficiently + * covered by other tests. E.g., HMAC-SHA256 may cover SHA-256. + * + * - Only one test vector is required per algorithm, and it can be generated + * by any known-good implementation or taken from any official document. + * + * - For ciphers, both encryption and decryption must be tested. + * + * - Only one key size per algorithm needs to be tested. + * + * See fips140_selftests[] for the list of tests we've selected. Currently, all + * our test vectors except the DRBG ones were generated by the script + * tools/crypto/gen_fips140_testvecs.py, using the known-good implementations in + * the Python packages hashlib, pycryptodome, and cryptography. The DRBG test + * vectors were manually extracted from + * https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/drbg/drbgtestvectors.zip. + * + * Note that we don't reuse the upstream crypto API's self-tests + * (crypto/testmgr.{c,h}), for several reasons: + * + * - To meet FIPS requirements, the self-tests must be located within the FIPS + * module boundary (fips140.ko). But testmgr is integrated into the crypto + * API framework and can't be extracted into the module. + * + * - testmgr is much more heavyweight than required for FIPS and NIAP; it + * tests more algorithms and does more tests per algorithm, as it's meant to + * do proper testing and not just meet certification requirements. We need + * tests that can run with minimal overhead on every boot-up. + * + * - Despite being more heavyweight in general, testmgr doesn't test the + * SHA-256 and AES library APIs, despite that being needed here. + */ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "fips140-module.h" + +/* Test vector for a block cipher algorithm */ +struct blockcipher_testvec { + const u8 *key; + size_t key_size; + const u8 *plaintext; + const u8 *ciphertext; + size_t block_size; +}; + +/* Test vector for an AEAD algorithm */ +struct aead_testvec { + const u8 *key; + size_t key_size; + const u8 *iv; + size_t iv_size; + const u8 *assoc; + size_t assoc_size; + const u8 *plaintext; + size_t plaintext_size; + const u8 *ciphertext; + size_t ciphertext_size; +}; + +/* Test vector for a length-preserving encryption algorithm */ +struct skcipher_testvec { + const u8 *key; + size_t key_size; + const u8 *iv; + size_t iv_size; + const u8 *plaintext; + const u8 *ciphertext; + size_t message_size; +}; + +/* Test vector for a hash algorithm */ +struct hash_testvec { + const u8 *key; + size_t key_size; + const u8 *message; + size_t message_size; + const u8 *digest; + size_t digest_size; +}; + +/* Test vector for a DRBG algorithm */ +struct drbg_testvec { + const u8 *entropy; + size_t entropy_size; + const u8 *pers; + size_t pers_size; + const u8 *entpr_a; + const u8 *entpr_b; + size_t entpr_size; + const u8 *add_a; + const u8 *add_b; + size_t add_size; + const u8 *output; + size_t out_size; +}; + +/* + * A struct which specifies an algorithm name (using crypto API syntax), a test + * function for that algorithm, and a test vector used by that test function. + */ +struct fips_test { + const char *alg; + int __must_check (*func)(const struct fips_test *test); + union { + struct blockcipher_testvec blockcipher; + struct aead_testvec aead; + struct skcipher_testvec skcipher; + struct hash_testvec hash; + struct drbg_testvec drbg; + }; +}; + +/* Maximum IV size (in bytes) among any algorithm tested here */ +#define MAX_IV_SIZE 16 + +static int __init __must_check +fips_check_result(const struct fips_test *test, u8 *result, + const u8 *expected_result, size_t result_size, + const char *operation) +{ +#ifdef CONFIG_CRYPTO_FIPS140_MOD_ERROR_INJECTION + /* Inject a failure (via corrupting the result) if requested. */ + if (fips140_broken_alg && strcmp(test->alg, fips140_broken_alg) == 0) + result[0] ^= 0xff; +#endif + if (memcmp(result, expected_result, result_size) != 0) { + pr_err("wrong result from %s %s\n", test->alg, operation); + return -EBADMSG; + } + return 0; +} + +/* + * None of the algorithms should be ASYNC, as the FIPS module doesn't register + * any ASYNC algorithms. (The ASYNC flag is only declared by hardware + * algorithms, which would need their own FIPS certification.) + * + * Ideally we would verify alg->cra_module == THIS_MODULE here as well, but that + * doesn't work because the files are compiled as built-in code. + */ +static int __init __must_check +fips_validate_alg(const struct crypto_alg *alg) +{ + if (alg->cra_flags & CRYPTO_ALG_ASYNC) { + pr_err("unexpectedly got async implementation of %s (%s)\n", + alg->cra_name, alg->cra_driver_name); + return -EINVAL; + } + return 0; +} + +/* Test a block cipher using the crypto_cipher API. */ +static int __init __must_check +fips_test_blockcipher(const struct fips_test *test) +{ + const struct blockcipher_testvec *vec = &test->blockcipher; + struct crypto_cipher *tfm; + u8 block[MAX_CIPHER_BLOCKSIZE]; + int err; + + if (WARN_ON(vec->block_size > MAX_CIPHER_BLOCKSIZE)) + return -EINVAL; + + tfm = crypto_alloc_cipher(test->alg, 0, 0); + if (IS_ERR(tfm)) { + err = PTR_ERR(tfm); + pr_err("failed to allocate %s tfm: %d\n", test->alg, err); + return err; + } + err = fips_validate_alg(tfm->base.__crt_alg); + if (err) + goto out; + if (crypto_cipher_blocksize(tfm) != vec->block_size) { + pr_err("%s has wrong block size\n", test->alg); + err = -EINVAL; + goto out; + } + + err = crypto_cipher_setkey(tfm, vec->key, vec->key_size); + if (err) { + pr_err("failed to set %s key: %d\n", test->alg, err); + goto out; + } + + /* Encrypt the plaintext, then verify the resulting ciphertext. */ + memcpy(block, vec->plaintext, vec->block_size); + crypto_cipher_encrypt_one(tfm, block, block); + err = fips_check_result(test, block, vec->ciphertext, vec->block_size, + "encryption"); + if (err) + goto out; + + /* Decrypt the ciphertext, then verify the resulting plaintext. */ + crypto_cipher_decrypt_one(tfm, block, block); + err = fips_check_result(test, block, vec->plaintext, vec->block_size, + "decryption"); +out: + crypto_free_cipher(tfm); + return err; +} + +/* + * Test for plain AES (no mode of operation). We test this separately from the + * AES modes because the implementation of AES which is used by the "aes" + * crypto_cipher isn't necessarily the same as that used by the AES modes such + * as "ecb(aes)". Similarly, the aes_{encrypt,decrypt}() library functions may + * use a different implementation as well, so we test them separately too. + */ +static int __init __must_check +fips_test_aes(const struct fips_test *test) +{ + const struct blockcipher_testvec *vec = &test->blockcipher; + struct crypto_aes_ctx ctx; + u8 block[AES_BLOCK_SIZE]; + int err; + + if (WARN_ON(vec->block_size != AES_BLOCK_SIZE)) + return -EINVAL; + + err = fips_test_blockcipher(test); + if (err) + return err; + + err = aes_expandkey(&ctx, vec->key, vec->key_size); + if (err) { + pr_err("aes_expandkey() failed: %d\n", err); + return err; + } + aes_encrypt(&ctx, block, vec->plaintext); + err = fips_check_result(test, block, vec->ciphertext, AES_BLOCK_SIZE, + "encryption (library API)"); + if (err) + return err; + aes_decrypt(&ctx, block, block); + return fips_check_result(test, block, vec->plaintext, AES_BLOCK_SIZE, + "decryption (library API)"); +} + +/* Test a length-preserving symmetric cipher using the crypto_skcipher API. */ +static int __init __must_check +fips_test_skcipher(const struct fips_test *test) +{ + const struct skcipher_testvec *vec = &test->skcipher; + struct crypto_skcipher *tfm; + struct skcipher_request *req = NULL; + u8 *message = NULL; + struct scatterlist sg; + u8 iv[MAX_IV_SIZE]; + int err; + + if (WARN_ON(vec->iv_size > MAX_IV_SIZE)) + return -EINVAL; + + tfm = crypto_alloc_skcipher(test->alg, 0, 0); + if (IS_ERR(tfm)) { + err = PTR_ERR(tfm); + pr_err("failed to allocate %s tfm: %d\n", test->alg, err); + return err; + } + err = fips_validate_alg(&crypto_skcipher_alg(tfm)->base); + if (err) + goto out; + if (crypto_skcipher_ivsize(tfm) != vec->iv_size) { + pr_err("%s has wrong IV size\n", test->alg); + err = -EINVAL; + goto out; + } + + req = skcipher_request_alloc(tfm, GFP_KERNEL); + message = kmemdup(vec->plaintext, vec->message_size, GFP_KERNEL); + if (!req || !message) { + err = -ENOMEM; + goto out; + } + sg_init_one(&sg, message, vec->message_size); + + skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_SLEEP, + NULL, NULL); + skcipher_request_set_crypt(req, &sg, &sg, vec->message_size, iv); + + err = crypto_skcipher_setkey(tfm, vec->key, vec->key_size); + if (err) { + pr_err("failed to set %s key: %d\n", test->alg, err); + goto out; + } + + /* Encrypt the plaintext, then verify the resulting ciphertext. */ + memcpy(iv, vec->iv, vec->iv_size); + err = crypto_skcipher_encrypt(req); + if (err) { + pr_err("%s encryption failed: %d\n", test->alg, err); + goto out; + } + err = fips_check_result(test, message, vec->ciphertext, + vec->message_size, "encryption"); + if (err) + goto out; + + /* Decrypt the ciphertext, then verify the resulting plaintext. */ + memcpy(iv, vec->iv, vec->iv_size); + err = crypto_skcipher_decrypt(req); + if (err) { + pr_err("%s decryption failed: %d\n", test->alg, err); + goto out; + } + err = fips_check_result(test, message, vec->plaintext, + vec->message_size, "decryption"); +out: + kfree(message); + skcipher_request_free(req); + crypto_free_skcipher(tfm); + return err; +} + +/* Test an AEAD using the crypto_aead API. */ +static int __init __must_check +fips_test_aead(const struct fips_test *test) +{ + const struct aead_testvec *vec = &test->aead; + const int tag_size = vec->ciphertext_size - vec->plaintext_size; + struct crypto_aead *tfm; + struct aead_request *req = NULL; + u8 *assoc = NULL; + u8 *message = NULL; + struct scatterlist sg[2]; + int sg_idx = 0; + u8 iv[MAX_IV_SIZE]; + int err; + + if (WARN_ON(vec->iv_size > MAX_IV_SIZE)) + return -EINVAL; + if (WARN_ON(vec->ciphertext_size <= vec->plaintext_size)) + return -EINVAL; + + tfm = crypto_alloc_aead(test->alg, 0, 0); + if (IS_ERR(tfm)) { + err = PTR_ERR(tfm); + pr_err("failed to allocate %s tfm: %d\n", test->alg, err); + return err; + } + err = fips_validate_alg(&crypto_aead_alg(tfm)->base); + if (err) + goto out; + if (crypto_aead_ivsize(tfm) != vec->iv_size) { + pr_err("%s has wrong IV size\n", test->alg); + err = -EINVAL; + goto out; + } + + req = aead_request_alloc(tfm, GFP_KERNEL); + assoc = kmemdup(vec->assoc, vec->assoc_size, GFP_KERNEL); + message = kzalloc(vec->ciphertext_size, GFP_KERNEL); + if (!req || !assoc || !message) { + err = -ENOMEM; + goto out; + } + memcpy(message, vec->plaintext, vec->plaintext_size); + + sg_init_table(sg, ARRAY_SIZE(sg)); + if (vec->assoc_size) + sg_set_buf(&sg[sg_idx++], assoc, vec->assoc_size); + sg_set_buf(&sg[sg_idx++], message, vec->ciphertext_size); + + aead_request_set_ad(req, vec->assoc_size); + aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_SLEEP, NULL, NULL); + + err = crypto_aead_setkey(tfm, vec->key, vec->key_size); + if (err) { + pr_err("failed to set %s key: %d\n", test->alg, err); + goto out; + } + + err = crypto_aead_setauthsize(tfm, tag_size); + if (err) { + pr_err("failed to set %s authentication tag size: %d\n", + test->alg, err); + goto out; + } + + /* + * Encrypt the plaintext, then verify the resulting ciphertext (which + * includes the authentication tag). + */ + memcpy(iv, vec->iv, vec->iv_size); + aead_request_set_crypt(req, sg, sg, vec->plaintext_size, iv); + err = crypto_aead_encrypt(req); + if (err) { + pr_err("%s encryption failed: %d\n", test->alg, err); + goto out; + } + err = fips_check_result(test, message, vec->ciphertext, + vec->ciphertext_size, "encryption"); + if (err) + goto out; + + /* + * Decrypt the ciphertext (which includes the authentication tag), then + * verify the resulting plaintext. + */ + memcpy(iv, vec->iv, vec->iv_size); + aead_request_set_crypt(req, sg, sg, vec->ciphertext_size, iv); + err = crypto_aead_decrypt(req); + if (err) { + pr_err("%s decryption failed: %d\n", test->alg, err); + goto out; + } + err = fips_check_result(test, message, vec->plaintext, + vec->plaintext_size, "decryption"); +out: + kfree(message); + kfree(assoc); + aead_request_free(req); + crypto_free_aead(tfm); + return err; +} + +/* + * Test a hash algorithm using the crypto_shash API. + * + * Note that we don't need to test the crypto_ahash API too, since none of the + * hash algorithms in the FIPS module have the ASYNC flag, and thus there will + * be no hash algorithms that can be accessed only through crypto_ahash. + */ +static int __init __must_check +fips_test_hash(const struct fips_test *test) +{ + const struct hash_testvec *vec = &test->hash; + struct crypto_shash *tfm; + u8 digest[HASH_MAX_DIGESTSIZE]; + int err; + + if (WARN_ON(vec->digest_size > HASH_MAX_DIGESTSIZE)) + return -EINVAL; + + tfm = crypto_alloc_shash(test->alg, 0, 0); + if (IS_ERR(tfm)) { + err = PTR_ERR(tfm); + pr_err("failed to allocate %s tfm: %d\n", test->alg, err); + return err; + } + err = fips_validate_alg(&crypto_shash_alg(tfm)->base); + if (err) + goto out; + if (crypto_shash_digestsize(tfm) != vec->digest_size) { + pr_err("%s has wrong digest size\n", test->alg); + err = -EINVAL; + goto out; + } + + if (vec->key) { + err = crypto_shash_setkey(tfm, vec->key, vec->key_size); + if (err) { + pr_err("failed to set %s key: %d\n", test->alg, err); + goto out; + } + } + + err = crypto_shash_tfm_digest(tfm, vec->message, vec->message_size, + digest); + if (err) { + pr_err("%s digest computation failed: %d\n", test->alg, err); + goto out; + } + err = fips_check_result(test, digest, vec->digest, vec->digest_size, + "digest"); +out: + crypto_free_shash(tfm); + return err; +} + +/* + * Test the sha256() library function, as it may not be covered by the "sha256" + * crypto_shash, and thus may not be covered by the "hmac(sha256)" test we do. + */ +static int __init __must_check +fips_test_sha256_library(const struct fips_test *test) +{ + const struct hash_testvec *vec = &test->hash; + u8 digest[SHA256_DIGEST_SIZE]; + + if (WARN_ON(vec->digest_size != SHA256_DIGEST_SIZE)) + return -EINVAL; + + sha256(vec->message, vec->message_size, digest); + return fips_check_result(test, digest, vec->digest, vec->digest_size, + "digest (library API)"); +} + +/* Test a DRBG using the crypto_rng API. */ +static int __init __must_check +fips_test_drbg(const struct fips_test *test) +{ + const struct drbg_testvec *vec = &test->drbg; + struct crypto_rng *rng; + u8 *output = NULL; + struct drbg_test_data test_data; + struct drbg_string addtl, pers, testentropy; + int err; + + rng = crypto_alloc_rng(test->alg, 0, 0); + if (IS_ERR(rng)) { + err = PTR_ERR(rng); + pr_err("failed to allocate %s tfm: %d\n", test->alg, err); + return PTR_ERR(rng); + } + err = fips_validate_alg(&crypto_rng_alg(rng)->base); + if (err) + goto out; + + output = kzalloc(vec->out_size, GFP_KERNEL); + if (!output) { + err = -ENOMEM; + goto out; + } + + /* + * Initialize the DRBG with the entropy and personalization string given + * in the test vector. + */ + test_data.testentropy = &testentropy; + drbg_string_fill(&testentropy, vec->entropy, vec->entropy_size); + drbg_string_fill(&pers, vec->pers, vec->pers_size); + err = crypto_drbg_reset_test(rng, &pers, &test_data); + if (err) { + pr_err("failed to reset %s\n", test->alg); + goto out; + } + + /* + * Generate some random bytes using the additional data string provided + * in the test vector. Also use the additional entropy if provided + * (relevant for the prediction-resistant DRBG variants only). + */ + drbg_string_fill(&addtl, vec->add_a, vec->add_size); + if (vec->entpr_size) { + drbg_string_fill(&testentropy, vec->entpr_a, vec->entpr_size); + err = crypto_drbg_get_bytes_addtl_test(rng, output, + vec->out_size, &addtl, + &test_data); + } else { + err = crypto_drbg_get_bytes_addtl(rng, output, vec->out_size, + &addtl); + } + if (err) { + pr_err("failed to get bytes from %s (try 1): %d\n", + test->alg, err); + goto out; + } + + /* + * Do the same again, using a second additional data string, and (when + * applicable) a second additional entropy string. + */ + drbg_string_fill(&addtl, vec->add_b, vec->add_size); + if (test->drbg.entpr_size) { + drbg_string_fill(&testentropy, vec->entpr_b, vec->entpr_size); + err = crypto_drbg_get_bytes_addtl_test(rng, output, + vec->out_size, &addtl, + &test_data); + } else { + err = crypto_drbg_get_bytes_addtl(rng, output, vec->out_size, + &addtl); + } + if (err) { + pr_err("failed to get bytes from %s (try 2): %d\n", + test->alg, err); + goto out; + } + + /* Check that the DRBG generated the expected output. */ + err = fips_check_result(test, output, vec->output, vec->out_size, + "get_bytes"); +out: + kfree(output); + crypto_free_rng(rng); + return err; +} + +/* Include the test vectors generated by the Python script. */ +#include "fips140-generated-testvecs.h" + +/* List of all self-tests. Keep this in sync with fips140_algorithms[]. */ +static const struct fips_test fips140_selftests[] __initconst = { + /* + * Tests for AES and AES modes. + * + * The full list of AES algorithms we potentially need to test are AES + * by itself, AES-CBC, AES-CTR, AES-ECB, AES-GCM, and AES-XTS. We can + * follow the FIPS 140-2 Implementation Guidance (IG) document to try to + * reduce this list, but we run into the issue that the architecture- + * specific implementations of these algorithms in Linux often don't + * share the "same" underlying AES implementation. E.g., the ARMv8 CE + * optimized implementations issue ARMv8 CE instructions directly rather + * than going through a separate AES implementation. In this case, + * separate tests are needed according to section 9.2 of the IG. + */ + { + .alg = "aes", + .func = fips_test_aes, + .blockcipher = { + .key = fips_aes_key, + .key_size = sizeof(fips_aes_key), + .plaintext = fips_message, + .ciphertext = fips_aes_ecb_ciphertext, + .block_size = 16, + } + }, { + .alg = "cbc(aes)", + .func = fips_test_skcipher, + .skcipher = { + .key = fips_aes_key, + .key_size = sizeof(fips_aes_key), + .iv = fips_aes_iv, + .iv_size = sizeof(fips_aes_iv), + .plaintext = fips_message, + .ciphertext = fips_aes_cbc_ciphertext, + .message_size = sizeof(fips_message), + } + }, { + .alg = "ctr(aes)", + .func = fips_test_skcipher, + .skcipher = { + .key = fips_aes_key, + .key_size = sizeof(fips_aes_key), + .iv = fips_aes_iv, + .iv_size = sizeof(fips_aes_iv), + .plaintext = fips_message, + .ciphertext = fips_aes_ctr_ciphertext, + .message_size = sizeof(fips_message), + } + }, { + .alg = "ecb(aes)", + .func = fips_test_skcipher, + .skcipher = { + .key = fips_aes_key, + .key_size = sizeof(fips_aes_key), + .plaintext = fips_message, + .ciphertext = fips_aes_ecb_ciphertext, + .message_size = sizeof(fips_message) + } + }, { + .alg = "gcm(aes)", + .func = fips_test_aead, + .aead = { + .key = fips_aes_key, + .key_size = sizeof(fips_aes_key), + .iv = fips_aes_iv, + /* The GCM implementation assumes an IV size of 12. */ + .iv_size = 12, + .assoc = fips_aes_gcm_assoc, + .assoc_size = sizeof(fips_aes_gcm_assoc), + .plaintext = fips_message, + .plaintext_size = sizeof(fips_message), + .ciphertext = fips_aes_gcm_ciphertext, + .ciphertext_size = sizeof(fips_aes_gcm_ciphertext), + } + }, { + .alg = "xts(aes)", + .func = fips_test_skcipher, + .skcipher = { + .key = fips_aes_xts_key, + .key_size = sizeof(fips_aes_xts_key), + .iv = fips_aes_iv, + .iv_size = sizeof(fips_aes_iv), + .plaintext = fips_message, + .ciphertext = fips_aes_xts_ciphertext, + .message_size = sizeof(fips_message), + } + /* + * Tests for SHA-1, SHA-256, HMAC-SHA256, and SHA-512. + * + * The selection of these specific tests follows the guidance from + * section 9 of the FIPS 140-2 Implementation Guidance (IG) document to + * achieve a minimal list of tests, rather than testing all of + * SHA-{1,224,256,384,512} and HMAC-SHA{1,224,256,384,512}. As per the + * IG, testing SHA-224 is only required if SHA-256 isn't implemented, + * and testing SHA-384 is only required if SHA-512 isn't implemented. + * Also, HMAC only has to be tested with one underlying SHA, and the + * HMAC test also fulfills the test for its underlying SHA. That would + * result in a test list of e.g. SHA-1, HMAC-SHA256, and SHA-512. + * + * However we also need to take into account cases where implementations + * aren't shared in the "natural" way assumed by the IG. Currently the + * only known exception w.r.t. SHA-* and HMAC-* is the sha256() library + * function which may not be covered by the test of the "hmac(sha256)" + * crypto_shash. So, we test sha256() separately. + */ + }, { + .alg = "sha1", + .func = fips_test_hash, + .hash = { + .message = fips_message, + .message_size = sizeof(fips_message), + .digest = fips_sha1_digest, + .digest_size = sizeof(fips_sha1_digest) + } + }, { + .alg = "sha256", + .func = fips_test_sha256_library, + .hash = { + .message = fips_message, + .message_size = sizeof(fips_message), + .digest = fips_sha256_digest, + .digest_size = sizeof(fips_sha256_digest) + } + }, { + .alg = "hmac(sha256)", + .func = fips_test_hash, + .hash = { + .key = fips_hmac_key, + .key_size = sizeof(fips_hmac_key), + .message = fips_message, + .message_size = sizeof(fips_message), + .digest = fips_hmac_sha256_digest, + .digest_size = sizeof(fips_hmac_sha256_digest) + } + }, { + .alg = "sha512", + .func = fips_test_hash, + .hash = { + .message = fips_message, + .message_size = sizeof(fips_message), + .digest = fips_sha512_digest, + .digest_size = sizeof(fips_sha512_digest) + } + /* + * Tests for DRBG algorithms. + * + * Only the default variant (the one that users get when they request + * "stdrng") is required to be tested, as we don't consider the other + * variants to be used / usable in the FIPS security policy. This is + * similar to how e.g. we don't test both "xts(aes-generic)" and + * "xts-aes-ce" but rather just "xts(aes)". + * + * Currently the default one is "drbg_nopr_hmac_sha256"; however, just + * in case we also test the prediction-resistant enabled variant too. + */ + }, { + .alg = "drbg_nopr_hmac_sha256", + .func = fips_test_drbg, + .drbg = { + .entropy = + "\xf9\x7a\x3c\xfd\x91\xfa\xa0\x46\xb9\xe6\x1b\x94" + "\x93\xd4\x36\xc4\x93\x1f\x60\x4b\x22\xf1\x08\x15" + "\x21\xb3\x41\x91\x51\xe8\xff\x06\x11\xf3\xa7\xd4" + "\x35\x95\x35\x7d\x58\x12\x0b\xd1\xe2\xdd\x8a\xed", + .entropy_size = 48, + .output = + "\xc6\x87\x1c\xff\x08\x24\xfe\x55\xea\x76\x89\xa5" + "\x22\x29\x88\x67\x30\x45\x0e\x5d\x36\x2d\xa5\xbf" + "\x59\x0d\xcf\x9a\xcd\x67\xfe\xd4\xcb\x32\x10\x7d" + "\xf5\xd0\x39\x69\xa6\x6b\x1f\x64\x94\xfd\xf5\xd6" + "\x3d\x5b\x4d\x0d\x34\xea\x73\x99\xa0\x7d\x01\x16" + "\x12\x6d\x0d\x51\x8c\x7c\x55\xba\x46\xe1\x2f\x62" + "\xef\xc8\xfe\x28\xa5\x1c\x9d\x42\x8e\x6d\x37\x1d" + "\x73\x97\xab\x31\x9f\xc7\x3d\xed\x47\x22\xe5\xb4" + "\xf3\x00\x04\x03\x2a\x61\x28\xdf\x5e\x74\x97\xec" + "\xf8\x2c\xa7\xb0\xa5\x0e\x86\x7e\xf6\x72\x8a\x4f" + "\x50\x9a\x8c\x85\x90\x87\x03\x9c", + .out_size = 128, + .add_a = + "\x51\x72\x89\xaf\xe4\x44\xa0\xfe\x5e\xd1\xa4\x1d" + "\xbb\xb5\xeb\x17\x15\x00\x79\xbd\xd3\x1e\x29\xcf" + "\x2f\xf3\x00\x34\xd8\x26\x8e\x3b", + .add_b = + "\x88\x02\x8d\x29\xef\x80\xb4\xe6\xf0\xfe\x12\xf9" + "\x1d\x74\x49\xfe\x75\x06\x26\x82\xe8\x9c\x57\x14" + "\x40\xc0\xc9\xb5\x2c\x42\xa6\xe0", + .add_size = 32, + } + }, { + .alg = "drbg_pr_hmac_sha256", + .func = fips_test_drbg, + .drbg = { + .entropy = + "\xc7\xcc\xbc\x67\x7e\x21\x66\x1e\x27\x2b\x63\xdd" + "\x3a\x78\xdc\xdf\x66\x6d\x3f\x24\xae\xcf\x37\x01" + "\xa9\x0d\x89\x8a\xa7\xdc\x81\x58\xae\xb2\x10\x15" + "\x7e\x18\x44\x6d\x13\xea\xdf\x37\x85\xfe\x81\xfb", + .entropy_size = 48, + .entpr_a = + "\x7b\xa1\x91\x5b\x3c\x04\xc4\x1b\x1d\x19\x2f\x1a" + "\x18\x81\x60\x3c\x6c\x62\x91\xb7\xe9\xf5\xcb\x96" + "\xbb\x81\x6a\xcc\xb5\xae\x55\xb6", + .entpr_b = + "\x99\x2c\xc7\x78\x7e\x3b\x88\x12\xef\xbe\xd3\xd2" + "\x7d\x2a\xa5\x86\xda\x8d\x58\x73\x4a\x0a\xb2\x2e" + "\xbb\x4c\x7e\xe3\x9a\xb6\x81\xc1", + .entpr_size = 32, + .output = + "\x95\x6f\x95\xfc\x3b\xb7\xfe\x3e\xd0\x4e\x1a\x14" + "\x6c\x34\x7f\x7b\x1d\x0d\x63\x5e\x48\x9c\x69\xe6" + "\x46\x07\xd2\x87\xf3\x86\x52\x3d\x98\x27\x5e\xd7" + "\x54\xe7\x75\x50\x4f\xfb\x4d\xfd\xac\x2f\x4b\x77" + "\xcf\x9e\x8e\xcc\x16\xa2\x24\xcd\x53\xde\x3e\xc5" + "\x55\x5d\xd5\x26\x3f\x89\xdf\xca\x8b\x4e\x1e\xb6" + "\x88\x78\x63\x5c\xa2\x63\x98\x4e\x6f\x25\x59\xb1" + "\x5f\x2b\x23\xb0\x4b\xa5\x18\x5d\xc2\x15\x74\x40" + "\x59\x4c\xb4\x1e\xcf\x9a\x36\xfd\x43\xe2\x03\xb8" + "\x59\x91\x30\x89\x2a\xc8\x5a\x43\x23\x7c\x73\x72" + "\xda\x3f\xad\x2b\xba\x00\x6b\xd1", + .out_size = 128, + .add_a = + "\x18\xe8\x17\xff\xef\x39\xc7\x41\x5c\x73\x03\x03" + "\xf6\x3d\xe8\x5f\xc8\xab\xe4\xab\x0f\xad\xe8\xd6" + "\x86\x88\x55\x28\xc1\x69\xdd\x76", + .add_b = + "\xac\x07\xfc\xbe\x87\x0e\xd3\xea\x1f\x7e\xb8\xe7" + "\x9d\xec\xe8\xe7\xbc\xf3\x18\x25\x77\x35\x4a\xaa" + "\x00\x99\x2a\xdd\x0a\x00\x50\x82", + .add_size = 32, + .pers = + "\xbc\x55\xab\x3c\xf6\x52\xb0\x11\x3d\x7b\x90\xb8" + "\x24\xc9\x26\x4e\x5a\x1e\x77\x0d\x3d\x58\x4a\xda" + "\xd1\x81\xe9\xf8\xeb\x30\x8f\x6f", + .pers_size = 32, + } + } +}; + +bool __init fips140_run_selftests(void) +{ + int i; + + pr_info("running self-tests\n"); + for (i = 0; i < ARRAY_SIZE(fips140_selftests); i++) { + const struct fips_test *test = &fips140_selftests[i]; + int err; + + err = test->func(test); + if (err) { + pr_emerg("self-tests failed for algorithm %s: %d\n", + test->alg, err); + /* The caller is responsible for calling panic(). */ + return false; + } + } + pr_info("all self-tests passed\n"); + return true; +} diff --git a/tools/crypto/gen_fips140_testvecs.py b/tools/crypto/gen_fips140_testvecs.py new file mode 100755 index 000000000000..25164d83389c --- /dev/null +++ b/tools/crypto/gen_fips140_testvecs.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright 2021 Google LLC +# +# Generate most of the test vectors for the FIPS 140 cryptographic self-tests. +# +# Usage: +# tools/crypto/gen_fips140_testvecs.py > crypto/fips140-generated-testvecs.h +# +# Prerequisites: +# Debian: apt-get install python3-pycryptodome python3-cryptography +# Arch Linux: pacman -S python-pycryptodomex python-cryptography + +import hashlib +import hmac +import os + +import Cryptodome.Cipher.AES +import Cryptodome.Util.Counter + +import cryptography.hazmat.primitives.ciphers +import cryptography.hazmat.primitives.ciphers.algorithms +import cryptography.hazmat.primitives.ciphers.modes + +scriptname = os.path.basename(__file__) + +message = bytes('This is a 32-byte test message.\0', 'ascii') +aes_key = bytes('128-bit AES key\0', 'ascii') +aes_xts_key = bytes('This is an AES-128-XTS key.\0\0\0\0\0', 'ascii') +aes_iv = bytes('ABCDEFGHIJKL\0\0\0\0', 'ascii') +assoc = bytes('associated data string', 'ascii') +hmac_key = bytes('128-bit HMAC key', 'ascii') + +def warn_generated(): + print(f'''/* + * This header was automatically generated by {scriptname}. + * Don't edit it directly. + */''') + +def is_string_value(value): + return (value.isascii() and + all(c == '\x00' or c.isprintable() for c in str(value, 'ascii'))) + +def format_value(value, is_string): + if is_string: + return value + hexstr = '' + for byte in value: + hexstr += f'\\x{byte:02x}' + return hexstr + +def print_value(name, value): + is_string = is_string_value(value) + hdr = f'static const u8 fips_{name}[{len(value)}] __initconst =' + print(hdr, end='') + if is_string: + value = str(value, 'ascii').rstrip('\x00') + chars_per_byte = 1 + else: + chars_per_byte = 4 + bytes_per_line = 64 // chars_per_byte + + if len(hdr) + (chars_per_byte * len(value)) + 4 <= 80: + print(f' "{format_value(value, is_string)}"', end='') + else: + for chunk in [value[i:i+bytes_per_line] + for i in range(0, len(value), bytes_per_line)]: + print(f'\n\t"{format_value(chunk, is_string)}"', end='') + print(';') + print('') + +def generate_aes_testvecs(): + print_value('aes_key', aes_key) + print_value('aes_iv', aes_iv) + + cbc = Cryptodome.Cipher.AES.new(aes_key, Cryptodome.Cipher.AES.MODE_CBC, + iv=aes_iv) + print_value('aes_cbc_ciphertext', cbc.encrypt(message)) + + ecb = Cryptodome.Cipher.AES.new(aes_key, Cryptodome.Cipher.AES.MODE_ECB) + print_value('aes_ecb_ciphertext', ecb.encrypt(message)) + + ctr = Cryptodome.Cipher.AES.new(aes_key, Cryptodome.Cipher.AES.MODE_CTR, + nonce=aes_iv[:12]) + print_value('aes_ctr_ciphertext', ctr.encrypt(message)) + + print_value('aes_gcm_assoc', assoc) + gcm = Cryptodome.Cipher.AES.new(aes_key, Cryptodome.Cipher.AES.MODE_GCM, + nonce=aes_iv[:12], mac_len=16) + gcm.update(assoc) + raw_ciphertext, tag = gcm.encrypt_and_digest(message) + print_value('aes_gcm_ciphertext', raw_ciphertext + tag) + + # Unfortunately, pycryptodome doesn't support XTS, so for it we need to use + # a different Python package (the "cryptography" package). + print_value('aes_xts_key', aes_xts_key) + xts = cryptography.hazmat.primitives.ciphers.Cipher( + cryptography.hazmat.primitives.ciphers.algorithms.AES(aes_xts_key), + cryptography.hazmat.primitives.ciphers.modes.XTS(aes_iv)).encryptor() + ciphertext = xts.update(message) + xts.finalize() + print_value('aes_xts_ciphertext', ciphertext) + +def generate_sha_testvecs(): + print_value('hmac_key', hmac_key) + for alg in ['sha1', 'sha256', 'hmac_sha256', 'sha512']: + if alg.startswith('hmac_'): + h = hmac.new(hmac_key, message, alg.removeprefix('hmac_')) + else: + h = hashlib.new(alg, message) + print_value(f'{alg}_digest', h.digest()) + +print('/* SPDX-License-Identifier: GPL-2.0-only */') +print('/* Copyright 2021 Google LLC */') +print('') +warn_generated() +print('') +print_value('message', message) +generate_aes_testvecs() +generate_sha_testvecs() +warn_generated() From 50661975be743adc212b2fe000f8b883507f2618 Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Thu, 8 Jul 2021 14:46:47 -0700 Subject: [PATCH 08/73] ANDROID: fips140: add/update module help text Add some help text for CONFIG_CRYPTO_FIPS140_MOD, add a comment for CONFIG_CRYPTO_FIPS140, and update the file comment for fips140-module.c. In particular, mention that the module also does self-tests, and that it is also intended to meet NIAP requirements -- not just FIPS. Bug: 153614920 Bug: 188620248 Change-Id: If2c316e54fba2c4594e70a14a5a8fa1dba3589a1 Signed-off-by: Eric Biggers --- crypto/Kconfig | 15 ++++++++++++++- crypto/fips140-module.c | 15 +++++++++------ 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/crypto/Kconfig b/crypto/Kconfig index f52237ac12c5..d726b1c3a7f8 100644 --- a/crypto/Kconfig +++ b/crypto/Kconfig @@ -32,13 +32,26 @@ config CRYPTO_FIPS certification. You should say no unless you know what this is. +# CRYPTO_FIPS140 just enables the support in the kernel for loading fips140.ko. +# The module still needs to be built and loaded if you need FIPS 140 compliance. config CRYPTO_FIPS140 def_bool y depends on MODULES && ARM64 && ARM64_MODULE_PLTS config CRYPTO_FIPS140_MOD - bool "Enable FIPS140 integrity self-checked loadable module" + bool "Enable FIPS 140 cryptographic module" depends on LTO_CLANG && CRYPTO_FIPS140 + help + This option enables building a loadable module fips140.ko, which + contains various crypto algorithms that are also built into vmlinux. + At load time, this module overrides the built-in implementations of + these algorithms with its implementations. It also runs self-tests on + these algorithms and verifies the integrity of its code and data. If + either of these steps fails, the kernel will panic. + + This module is intended to be loaded at early boot time in order to + meet FIPS 140 and NIAP FPT_TST_EXT.1 requirements. It shouldn't be + used if you don't need to meet these requirements. config CRYPTO_FIPS140_MOD_ERROR_INJECTION bool "Support injecting failures into the FIPS 140 self-tests" diff --git a/crypto/fips140-module.c b/crypto/fips140-module.c index f0ed4602e924..a91735c37c67 100644 --- a/crypto/fips140-module.c +++ b/crypto/fips140-module.c @@ -3,12 +3,15 @@ * Copyright 2021 Google LLC * Author: Ard Biesheuvel * - * This file is the core of the fips140.ko, which carries a number of crypto - * algorithms and chaining mode templates that are also built into vmlinux. - * This modules performs a load time integrity check, as mandated by FIPS 140, - * and replaces registered crypto algorithms that appear on the FIPS 140 list - * with ones provided by this module. This meets the FIPS 140 requirements for - * a cryptographic software module. + * This file is the core of fips140.ko, which contains various crypto algorithms + * that are also built into vmlinux. At load time, this module overrides the + * built-in implementations of these algorithms with its implementations. It + * also runs self-tests on these algorithms and verifies the integrity of its + * code and data. If either of these steps fails, the kernel will panic. + * + * This module is intended to be loaded at early boot time in order to meet + * FIPS 140 and NIAP FPT_TST_EXT.1 requirements. It shouldn't be used if you + * don't need to meet these requirements. */ #include From d25e256373946e1d715742e98f9dc06436e28592 Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Thu, 8 Jul 2021 14:46:48 -0700 Subject: [PATCH 09/73] ANDROID: ABI: add new symbols required by fips140.ko fips140.ko now uses more crypto API functions due to self-tests being added, so add them to the symbol list and update the ABI representation. Generated by running: BUILD_CONFIG=common/build.config.gki.aarch64.fips140 build/build_abi.sh --update-symbol-list ... then adding the relevant portion only, and then: BUILD_CONFIG=common/build.config.gki.aarch64 build/build_abi.sh --update --print-report Leaf changes summary: 2 artifacts changed (1 filtered out) Changed leaf types summary: 0 (1 filtered out) leaf type changed Removed/Changed/Added functions summary: 0 Removed, 0 Changed, 2 Added functions Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable 2 Added functions: [A] 'function void crypto_cipher_decrypt_one(crypto_cipher*, u8*, const u8*)' [A] 'function int crypto_rng_reset(crypto_rng*, const u8*, unsigned int)' Bug: 153614920 Bug: 188620248 Change-Id: Ic51a3d2c33718d2da41a6b6a9f9578a00322e9d6 Signed-off-by: Eric Biggers [ardb: refresh] Signed-off-by: Ard Biesheuvel --- android/abi_gki_aarch64.xml | 14 ++++++++++++++ android/abi_gki_aarch64_fips140 | 11 +++++++++++ 2 files changed, 25 insertions(+) diff --git a/android/abi_gki_aarch64.xml b/android/abi_gki_aarch64.xml index 70a60d06019b..b1dd30c0bb3e 100755 --- a/android/abi_gki_aarch64.xml +++ b/android/abi_gki_aarch64.xml @@ -948,6 +948,7 @@ + @@ -981,6 +982,7 @@ + @@ -110988,6 +110990,12 @@ + + + + + + @@ -111164,6 +111172,12 @@ + + + + + + diff --git a/android/abi_gki_aarch64_fips140 b/android/abi_gki_aarch64_fips140 index 05df3848ff15..cf48b6d66aa9 100644 --- a/android/abi_gki_aarch64_fips140 +++ b/android/abi_gki_aarch64_fips140 @@ -1,12 +1,17 @@ [abi_symbol_list] +# commonly used symbols + module_layout + __put_task_struct # required by fips140.ko add_random_ready_callback aead_register_instance + arm64_const_caps_ready bcmp cancel_work_sync __cfi_slowpath cpu_have_feature + cpu_hwcap_keys crypto_aead_decrypt crypto_aead_encrypt crypto_aead_setauthsize @@ -16,11 +21,14 @@ crypto_alg_list crypto_alg_mod_lookup crypto_alg_sem + crypto_alloc_aead crypto_alloc_base crypto_alloc_rng crypto_alloc_shash + crypto_alloc_skcipher crypto_attr_alg_name crypto_check_attr_type + crypto_cipher_decrypt_one crypto_cipher_encrypt_one crypto_cipher_setkey crypto_destroy_tfm @@ -43,6 +51,7 @@ crypto_remove_final crypto_remove_spawns crypto_req_done + crypto_rng_reset crypto_shash_alg_has_setkey crypto_shash_digest crypto_shash_final @@ -77,6 +86,7 @@ kmalloc_caches kmalloc_order_trace kmem_cache_alloc_trace + kmemdup __list_add_valid __list_del_entry_valid memcpy @@ -89,6 +99,7 @@ preempt_schedule_notrace printk queue_work_on + refcount_warn_saturate scatterwalk_ffwd scatterwalk_map_and_copy sg_init_one From 67e3e39eb1d3c937f290f9dd3295765c5cf25660 Mon Sep 17 00:00:00 2001 From: Chanho Park Date: Mon, 12 Jul 2021 20:48:12 +0900 Subject: [PATCH 10/73] ANDROID: GKI: sync allowed list for exynosauto SoC This patch is for updating GKI allowed symbol list without adding any new symbol. Next patch will introduce newly added symbols for Exynosauto SoC GKI vendor modules. Bug: 193391505 Signed-off-by: Chanho Park Change-Id: I53206b12887add9ff40003dd09f6ff1afa5c027a --- android/abi_gki_aarch64_exynosauto | 53 +++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 11 deletions(-) diff --git a/android/abi_gki_aarch64_exynosauto b/android/abi_gki_aarch64_exynosauto index 681f0f27b372..fbbc93b059a8 100644 --- a/android/abi_gki_aarch64_exynosauto +++ b/android/abi_gki_aarch64_exynosauto @@ -120,6 +120,7 @@ dma_buf_unmap_attachment dma_buf_vmap dma_buf_vunmap + dmaengine_unmap_put dma_fence_add_callback dma_fence_context_alloc dma_fence_default_wait @@ -338,6 +339,7 @@ of_property_read_string of_property_read_string_helper of_property_read_u32_index + of_property_read_variable_u16_array of_property_read_variable_u32_array of_property_read_variable_u8_array of_prop_next_string @@ -348,6 +350,7 @@ panic_notifier_list param_ops_bool param_ops_int + param_ops_string param_ops_uint PDE_DATA __per_cpu_offset @@ -358,7 +361,6 @@ pinctrl_lookup_state pinctrl_select_state platform_bus_type - platform_device_unregister __platform_driver_register platform_driver_unregister platform_get_irq @@ -563,6 +565,7 @@ wait_for_completion_timeout __wake_up wake_up_process + wakeup_source_register wakeup_source_unregister __warn_printk work_busy @@ -598,6 +601,18 @@ debugfs_create_x32 kernel_kobj +# required by dmatest.ko + __dma_request_channel + kthread_should_stop + param_get_bool + param_get_string + param_set_bool + param_set_copystring + prandom_bytes + set_freezable + set_user_nice + strim + # required by dss.ko android_debug_symbol arch_timer_read_counter @@ -657,6 +672,7 @@ platform_device_alloc platform_device_del platform_device_put + platform_device_unregister platform_get_irq_byname_optional __pm_relax pm_runtime_allow @@ -723,16 +739,19 @@ __drm_atomic_helper_plane_destroy_state __drm_atomic_helper_plane_duplicate_state __drm_atomic_helper_plane_reset + __drm_atomic_helper_private_obj_duplicate_state drm_atomic_helper_set_config drm_atomic_helper_shutdown drm_atomic_helper_update_plane drm_atomic_helper_wait_for_vblanks drm_atomic_normalize_zpos + drm_atomic_private_obj_init drm_bridge_attach drm_compat_ioctl drm_connector_list_iter_begin drm_connector_list_iter_end drm_connector_list_iter_next + drm_connector_set_tile_property drm_connector_unregister drm_crtc_arm_vblank_event drm_crtc_cleanup @@ -758,7 +777,9 @@ drm_dp_aux_register drm_dp_aux_unregister drm_dp_bw_code_to_link_rate + drm_dp_calc_pbn_mode drm_dp_channel_eq_ok + drm_dp_check_act_status drm_dp_clock_recovery_ok drm_dp_downstream_debug drm_dp_dpcd_read @@ -766,11 +787,23 @@ drm_dp_dpcd_write drm_dp_dsc_sink_line_buf_depth drm_dp_dsc_sink_max_slice_count + drm_dp_find_vcpi_slots drm_dp_get_adjust_request_pre_emphasis drm_dp_get_adjust_request_voltage drm_dp_link_train_channel_eq_delay drm_dp_link_train_clock_recovery_delay + drm_dp_mst_allocate_vcpi + drm_dp_mst_deallocate_vcpi + drm_dp_mst_detect_port drm_dp_mst_dump_topology + drm_dp_mst_get_port_malloc + drm_dp_mst_hpd_irq + drm_dp_mst_put_port_malloc + drm_dp_mst_reset_vcpi_slots + drm_dp_mst_topology_mgr_init + drm_dp_mst_topology_mgr_set_mst + drm_dp_update_payload_part1 + drm_dp_update_payload_part2 drm_dsc_compute_rc_parameters drm_dsc_pps_payload_pack drm_encoder_cleanup @@ -831,6 +864,7 @@ kstrtobool mipi_dsi_host_register mipi_dsi_host_unregister + mutex_is_locked of_drm_find_bridge of_drm_find_panel of_graph_get_endpoint_by_regs @@ -841,9 +875,7 @@ of_graph_parse_endpoint of_phandle_iterator_init of_phandle_iterator_next - platform_find_device_by_driver seq_hex_dump - strnstr # required by exynos_mfc.ko iommu_dma_reserve_iova @@ -857,6 +889,13 @@ _raw_write_lock_irqsave _raw_write_unlock_irqrestore +# required by exynos_thermal.ko + of_thermal_get_ntrips + of_thermal_is_trip_valid + thermal_zone_device_update + thermal_zone_of_sensor_register + thermal_zone_of_sensor_unregister + # required by exynos_tty.ko dma_get_slave_caps do_SAK @@ -902,7 +941,6 @@ i2c_del_adapter # required by lt8912.ko - drm_mode_duplicate of_get_drm_display_mode # required by mali_kbase.ko @@ -1065,7 +1103,6 @@ dma_async_device_register dma_async_device_unregister dma_async_tx_descriptor_init - dmaengine_unmap_put dma_get_slave_channel dma_map_resource dma_unmap_resource @@ -1125,7 +1162,6 @@ kthread_flush_work kthread_flush_worker ktime_get_with_offset - param_ops_string phy_configure pm_relax pm_stay_awake @@ -1371,10 +1407,8 @@ # required by ufs-exynosauto-core.ko blk_ksm_init_passthrough - of_property_read_variable_u16_array __traceiter_android_vh_ufs_fill_prdt __tracepoint_android_vh_ufs_fill_prdt - ufshcd_alloc_host ufshcd_config_pwr_mode ufshcd_dme_get_attr ufshcd_dme_set_attr @@ -1386,9 +1420,6 @@ ufshcd_system_resume ufshcd_system_suspend -# required by vbpipe-module.ko - wakeup_source_register - # required by vbufq-be-module.ko drain_workqueue radix_tree_delete From efc09793ead72cde4bef5dd00463f8b96b5b1cdd Mon Sep 17 00:00:00 2001 From: Chanho Park Date: Mon, 12 Jul 2021 21:37:38 +0900 Subject: [PATCH 11/73] ANDROID: GKI: update allowed GKI symbol for Exynosauto SoC - Removed 2 functions no longer used from Exynosauto SoC Leaf changes summary: 7 artifacts changed Changed leaf types summary: 0 leaf type changed Removed/Changed/Added functions summary: 2 Removed, 0 Changed, 5 Added functions Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable 2 Removed functions: [D] 'function int of_get_drm_display_mode(device_node*, drm_display_mode*, u32*, int)' [D] 'function int ufshcd_init(ufs_hba*, void*, unsigned int)' 5 Added functions: [A] 'function dma_status dma_sync_wait(dma_chan*, dma_cookie_t)' [A] 'function dmaengine_unmap_data* dmaengine_get_unmap_data(device*, int, gfp_t)' [A] 'function int drm_connector_set_path_property(drm_connector*, const char*)' [A] 'function int drm_helper_probe_detect(drm_connector*, drm_modeset_acquire_ctx*, bool)' [A] 'function int of_graph_get_endpoint_count(const device_node*)' Bug: 193391505 Signed-off-by: Chanho Park Change-Id: Iba127a26dc84f1399042ec6048bbd5a9ceaeebe8 --- android/abi_gki_aarch64.xml | 102 +++++++++++++++++------------ android/abi_gki_aarch64_exynosauto | 9 +-- 2 files changed, 64 insertions(+), 47 deletions(-) diff --git a/android/abi_gki_aarch64.xml b/android/abi_gki_aarch64.xml index b1dd30c0bb3e..b85cfb21f2cf 100755 --- a/android/abi_gki_aarch64.xml +++ b/android/abi_gki_aarch64.xml @@ -1430,6 +1430,7 @@ + @@ -1437,6 +1438,7 @@ + @@ -1564,6 +1566,7 @@ + @@ -1734,6 +1737,7 @@ + @@ -2878,7 +2882,6 @@ - @@ -2889,6 +2892,7 @@ + @@ -4323,7 +4327,6 @@ - @@ -113617,6 +113620,11 @@ + + + + + @@ -113659,6 +113667,12 @@ + + + + + + @@ -114298,6 +114312,11 @@ + + + + + @@ -115168,6 +115187,12 @@ + + + + + + @@ -119297,8 +119322,8 @@ - - + + @@ -119306,10 +119331,10 @@ - - - - + + + + @@ -121024,13 +121049,6 @@ - - - - - - - @@ -121084,6 +121102,10 @@ + + + + @@ -121462,8 +121484,8 @@ - - + + @@ -128461,12 +128483,6 @@ - - - - - - @@ -128843,12 +128859,12 @@ - - + + - - + + @@ -128926,8 +128942,8 @@ - - + + @@ -128937,8 +128953,8 @@ - - + + @@ -129277,10 +129293,10 @@ - - - - + + + + @@ -130576,16 +130592,16 @@ - + - - - - - - - + + + + + + + diff --git a/android/abi_gki_aarch64_exynosauto b/android/abi_gki_aarch64_exynosauto index fbbc93b059a8..d05a5baadab9 100644 --- a/android/abi_gki_aarch64_exynosauto +++ b/android/abi_gki_aarch64_exynosauto @@ -602,7 +602,9 @@ kernel_kobj # required by dmatest.ko + dmaengine_get_unmap_data __dma_request_channel + dma_sync_wait kthread_should_stop param_get_bool param_get_string @@ -751,6 +753,7 @@ drm_connector_list_iter_begin drm_connector_list_iter_end drm_connector_list_iter_next + drm_connector_set_path_property drm_connector_set_tile_property drm_connector_unregister drm_crtc_arm_vblank_event @@ -831,6 +834,7 @@ drm_helper_connector_dpms drm_helper_hpd_irq_event drm_helper_mode_fill_fb_struct + drm_helper_probe_detect drm_ioctl drm_kms_helper_poll_fini drm_kms_helper_poll_init @@ -868,6 +872,7 @@ of_drm_find_bridge of_drm_find_panel of_graph_get_endpoint_by_regs + of_graph_get_endpoint_count of_graph_get_next_endpoint of_graph_get_port_by_id of_graph_get_remote_port @@ -940,9 +945,6 @@ # required by i2c-exynosauto.ko i2c_del_adapter -# required by lt8912.ko - of_get_drm_display_mode - # required by mali_kbase.ko anon_inode_getfd __arch_clear_user @@ -1412,7 +1414,6 @@ ufshcd_config_pwr_mode ufshcd_dme_get_attr ufshcd_dme_set_attr - ufshcd_init ufshcd_link_recovery ufshcd_pltfrm_init ufshcd_remove From d820d22b5d8c7eb86f42b987ed64157baefa11ab Mon Sep 17 00:00:00 2001 From: Minchan Kim Date: Tue, 13 Jul 2021 17:34:51 -0700 Subject: [PATCH 12/73] ANDROID: mm: page_pinner: use EXPORT_SYMBOL_GPL GKI requires EXPORT_SYMBOL_GPL so change it. Bug: 192475091 Signed-off-by: Minchan Kim Change-Id: Iba310d0a78f6ddb1e7980177fe7c624d0a0f254a --- mm/page_pinner.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mm/page_pinner.c b/mm/page_pinner.c index f4a141aafac6..3f5c48af3135 100644 --- a/mm/page_pinner.c +++ b/mm/page_pinner.c @@ -59,7 +59,7 @@ static bool page_pinner_enabled; DEFINE_STATIC_KEY_FALSE(page_pinner_inited); DEFINE_STATIC_KEY_TRUE(failure_tracking); -EXPORT_SYMBOL(failure_tracking); +EXPORT_SYMBOL_GPL(failure_tracking); static depot_stack_handle_t failure_handle; @@ -350,7 +350,7 @@ void __page_pinner_migration_failed(struct page *page) acf_pinner.pinner[idx] = record; spin_unlock_irqrestore(&acf_pinner.lock, flags); } -EXPORT_SYMBOL(__page_pinner_migration_failed); +EXPORT_SYMBOL_GPL(__page_pinner_migration_failed); void __page_pinner_mark_migration_failed_pages(struct list_head *page_list) { From e8516fd3af3f81a65eedb751716e886733d8fcf3 Mon Sep 17 00:00:00 2001 From: JJ Lee Date: Mon, 12 Jul 2021 17:50:02 +0800 Subject: [PATCH 13/73] ANDROID: sound: usb: add vendor hook for cpu suspend support Add vendor hook android_vh_sound_check_support_cpu_suspend to allow ACPU to suspend during USB playback/capture, if this is supported. Bug: 192206510 Change-Id: Ia8d4c335db27de5fcefab13cab653fd1ae34f691 Signed-off-by: JJ Lee --- drivers/android/vendor_hooks.c | 2 ++ include/trace/hooks/sound.h | 20 ++++++++++++++++++++ sound/usb/pcm.c | 13 +++++++++++++ 3 files changed, 35 insertions(+) create mode 100644 include/trace/hooks/sound.h diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 4bea5f851083..7da0fbf06d9d 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -69,6 +69,7 @@ #include #include #include +#include /* * Export tracepoints that act as a bare tracehook (ie: have no trace event @@ -355,3 +356,4 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_check_bpf_syscall); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_usb_dev_suspend); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_usb_dev_resume); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ipv6_gen_linklocal_addr); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_sound_usb_support_cpu_suspend); diff --git a/include/trace/hooks/sound.h b/include/trace/hooks/sound.h new file mode 100644 index 000000000000..2bf018edf392 --- /dev/null +++ b/include/trace/hooks/sound.h @@ -0,0 +1,20 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM sound +#undef TRACE_INCLUDE_PATH +#define TRACE_INCLUDE_PATH trace/hooks +#if !defined(_TRACE_HOOK_SOUND_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_HOOK_SOUND_H +#include +#include +#include + +DECLARE_HOOK(android_vh_sound_usb_support_cpu_suspend, + TP_PROTO(struct usb_device *udev, + int direction, + bool *is_support), + TP_ARGS(udev, direction, is_support)); + +#endif /* _TRACE_HOOK_SOUND_H */ +/* This part must be outside protection */ +#include diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c index 0b90a4d04d7d..9e93a43ab353 100644 --- a/sound/usb/pcm.c +++ b/sound/usb/pcm.c @@ -14,6 +14,8 @@ #include #include +#include + #include "usbaudio.h" #include "card.h" #include "quirks.h" @@ -1508,6 +1510,7 @@ static int snd_usb_pcm_open(struct snd_pcm_substream *substream) struct snd_pcm_runtime *runtime = substream->runtime; struct snd_usb_substream *subs = &as->substream[direction]; int ret; + bool is_support = false; ret = snd_vendor_set_pcm_connection(subs->dev, SOUND_PCM_OPEN, direction); @@ -1532,6 +1535,11 @@ static int snd_usb_pcm_open(struct snd_pcm_substream *substream) if (ret) snd_usb_autosuspend(subs->stream->chip); } + + trace_android_vh_sound_usb_support_cpu_suspend(subs->dev, direction, &is_support); + if (!ret && is_support) + snd_usb_autosuspend(subs->stream->chip); + return ret; } @@ -1541,12 +1549,17 @@ static int snd_usb_pcm_close(struct snd_pcm_substream *substream) struct snd_usb_stream *as = snd_pcm_substream_chip(substream); struct snd_usb_substream *subs = &as->substream[direction]; int ret; + bool is_support = false; ret = snd_vendor_set_pcm_connection(subs->dev, SOUND_PCM_CLOSE, direction); if (ret) return ret; + trace_android_vh_sound_usb_support_cpu_suspend(subs->dev, direction, &is_support); + if (!ret && is_support) + snd_usb_autoresume(subs->stream->chip); + snd_media_stop_pipeline(subs); if (!as->chip->keep_iface && From 288805c86a87a2e7c2b889ab0b09d07e991b9dea Mon Sep 17 00:00:00 2001 From: Guru Das Srinagesh Date: Mon, 12 Jul 2021 16:49:11 -0700 Subject: [PATCH 14/73] ANDROID: abi_gki_aarch64_qcom: Add idr_alloc_u32 Add idr_alloc_u32 to the qcom symbol list. Bug: 193461266 Change-Id: I7415a67a51041c0f7595f9b5c6d96615f3eecc41 Signed-off-by: Guru Das Srinagesh --- android/abi_gki_aarch64_qcom | 1 + 1 file changed, 1 insertion(+) diff --git a/android/abi_gki_aarch64_qcom b/android/abi_gki_aarch64_qcom index 73fe0796a766..4d17da68f3e9 100644 --- a/android/abi_gki_aarch64_qcom +++ b/android/abi_gki_aarch64_qcom @@ -1069,6 +1069,7 @@ ida_free idr_alloc idr_alloc_cyclic + idr_alloc_u32 idr_destroy idr_find idr_for_each From 9c2958f454f124b8b0016430c8285c794e4db55f Mon Sep 17 00:00:00 2001 From: "chunhui.li" Date: Thu, 8 Jul 2021 18:57:06 +0800 Subject: [PATCH 15/73] ANDROID: GKI: Export put_task_stack symbol We need dump task->stack in kernel module for debug usage, call try_get_task_stack to lock task->stack, and try_get_task_stack/put_task_stack should call in pairs, but put_task_stack is not exported Bug: 192990535 Change-Id: Ifb2f3d16f93039bffeb3e822bc066e42e2d21d13 Signed-off-by: chunhui.li --- kernel/fork.c | 1 + 1 file changed, 1 insertion(+) diff --git a/kernel/fork.c b/kernel/fork.c index c2657304d67b..8f188222a41b 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -443,6 +443,7 @@ void put_task_stack(struct task_struct *tsk) if (refcount_dec_and_test(&tsk->stack_refcount)) release_task_stack(tsk); } +EXPORT_SYMBOL_GPL(put_task_stack); #endif void free_task(struct task_struct *tsk) From eecc725a8e0b7c10f3b37f7c80531dc859c7dc99 Mon Sep 17 00:00:00 2001 From: Yang Yang Date: Tue, 8 Jun 2021 21:17:45 +0800 Subject: [PATCH 16/73] ANDROID: vendor_hooks: add vendor hook in blk_mq_alloc_rqs() This vendor hook let us attach oem data as payload to the request. The payload is used by oem driver for debugging purpose. Bug: 188749221 Change-Id: Iac598bd9cce836dac0efe9198a3e7752928f351a Signed-off-by: Yang Yang --- block/blk-mq.c | 3 +++ drivers/android/vendor_hooks.c | 2 ++ include/trace/hooks/block.h | 24 ++++++++++++++++++++++++ 3 files changed, 29 insertions(+) create mode 100644 include/trace/hooks/block.h diff --git a/block/blk-mq.c b/block/blk-mq.c index 08d5571d95e0..9fb88dac18e3 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -41,6 +41,8 @@ #include "blk-mq-sched.h" #include "blk-rq-qos.h" +#include + static DEFINE_PER_CPU(struct list_head, blk_cpu_done); static void blk_mq_poll_stats_start(struct request_queue *q); @@ -2483,6 +2485,7 @@ int blk_mq_alloc_rqs(struct blk_mq_tag_set *set, struct blk_mq_tags *tags, */ rq_size = round_up(sizeof(struct request) + set->cmd_size, cache_line_size()); + trace_android_vh_blk_alloc_rqs(&rq_size, set, tags); left = rq_size * depth; for (i = 0; i < depth; ) { diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 7da0fbf06d9d..6cd8e36a08e3 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include @@ -239,6 +240,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_selinux_avc_insert); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_selinux_avc_node_delete); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_selinux_avc_node_replace); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_selinux_avc_lookup); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_blk_alloc_rqs); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_commit_creds); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_exit_creds); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_override_creds); diff --git a/include/trace/hooks/block.h b/include/trace/hooks/block.h new file mode 100644 index 000000000000..cccdf419ceb7 --- /dev/null +++ b/include/trace/hooks/block.h @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM block + +#define TRACE_INCLUDE_PATH trace/hooks + +#if !defined(_TRACE_HOOK_BLOCK_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_HOOK_BLOCK_H + +#include +#include + +struct blk_mq_tag_set; +struct blk_mq_tags; + +DECLARE_HOOK(android_vh_blk_alloc_rqs, + TP_PROTO(size_t *rq_size, struct blk_mq_tag_set *set, + struct blk_mq_tags *tags), + TP_ARGS(rq_size, set, tags)); + +#endif /* _TRACE_HOOK_BLOCK_H */ + +/* This part must be outside protection */ +#include From 292baba45a9fb666839001cb2a4aef7afdba466e Mon Sep 17 00:00:00 2001 From: Mukesh Kumar Savaliya Date: Sat, 10 Jul 2021 03:01:29 +0530 Subject: [PATCH 17/73] ANDROID: abi_gki_aarch64_qcom: Add I3C core symbols to qcom tree This change adds I3C core functions being used by Geni Master driver into the qcom symbol list. Helps fixing the ABI differences. Leaf changes summary: 14 artifacts changed Changed leaf types summary: 0 leaf type changed Removed/Changed/Added functions summary: 0 Removed, 0 Changed, 14 Added functions Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable 14 Added functions: [A] 'function i3c_generic_ibi_pool* i3c_generic_ibi_alloc_pool(i3c_dev_desc*, const i3c_ibi_setup*)' [A] 'function void i3c_generic_ibi_free_pool(i3c_generic_ibi_pool*)' [A] 'function i3c_ibi_slot* i3c_generic_ibi_get_free_slot(i3c_generic_ibi_pool*)' [A] 'function void i3c_generic_ibi_recycle_slot(i3c_generic_ibi_pool*, i3c_ibi_slot*)' [A] 'function int i3c_master_add_i3c_dev_locked(i3c_master_controller*, u8)' [A] 'function int i3c_master_disec_locked(i3c_master_controller*, u8, u8)' [A] 'function int i3c_master_do_daa(i3c_master_controller*)' [A] 'function int i3c_master_enec_locked(i3c_master_controller*, u8, u8)' [A] 'function int i3c_master_entdaa_locked(i3c_master_controller*)' [A] 'function int i3c_master_get_free_addr(i3c_master_controller*, u8)' [A] 'function void i3c_master_queue_ibi(i3c_dev_desc*, i3c_ibi_slot*)' [A] 'function int i3c_master_register(i3c_master_controller*, device*, const i3c_master_controller_ops*, bool)' [A] 'function int i3c_master_set_info(i3c_master_controller*, const i3c_device_info*)' [A] 'function int i3c_master_unregister(i3c_master_controller*)' Bug: 193223418 Change-Id: I8cbcba99e3843bc0e06c772954a7120f7ee33148 Signed-off-by: Mukesh Kumar Savaliya Signed-off-by: Giuliano Procida --- android/abi_gki_aarch64.xml | 813 ++++++++++++++++++++++++++++++----- android/abi_gki_aarch64_qcom | 14 + 2 files changed, 710 insertions(+), 117 deletions(-) diff --git a/android/abi_gki_aarch64.xml b/android/abi_gki_aarch64.xml index b85cfb21f2cf..8f68437891a4 100755 --- a/android/abi_gki_aarch64.xml +++ b/android/abi_gki_aarch64.xml @@ -2191,6 +2191,20 @@ + + + + + + + + + + + + + + @@ -5280,6 +5294,13 @@ + + + + + + + @@ -5294,6 +5315,7 @@ + @@ -5931,6 +5953,7 @@ + @@ -6320,6 +6343,7 @@ + @@ -6569,6 +6593,23 @@ + + + + + + + + + + + + + + + + + @@ -7261,6 +7302,23 @@ + + + + + + + + + + + + + + + + + @@ -7435,6 +7493,7 @@ + @@ -8810,6 +8869,7 @@ + @@ -10210,6 +10270,23 @@ + + + + + + + + + + + + + + + + + @@ -10692,6 +10769,14 @@ + + + + + + + + @@ -14074,6 +14159,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -14572,6 +14686,7 @@ + @@ -15149,6 +15264,7 @@ + @@ -15597,6 +15713,12 @@ + + + + + + @@ -16296,6 +16418,7 @@ + @@ -16931,6 +17054,17 @@ + + + + + + + + + + + @@ -17288,9 +17422,9 @@ - + - + @@ -18366,6 +18500,7 @@ + @@ -19764,6 +19899,7 @@ + @@ -21854,6 +21990,20 @@ + + + + + + + + + + + + + + @@ -22550,6 +22700,7 @@ + @@ -23885,6 +24036,11 @@ + + + + + @@ -23905,6 +24061,7 @@ + @@ -24136,6 +24293,10 @@ + + + + @@ -24149,6 +24310,7 @@ + @@ -25871,6 +26033,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -26583,6 +26783,7 @@ + @@ -27024,6 +27225,7 @@ + @@ -28478,6 +28680,7 @@ + @@ -29777,6 +29980,14 @@ + + + + + + + + @@ -30611,9 +30822,9 @@ - + - + @@ -31271,6 +31482,10 @@ + + + + @@ -31386,6 +31601,7 @@ + @@ -33406,6 +33622,26 @@ + + + + + + + + + + + + + + + + + + + + @@ -34140,6 +34376,7 @@ + @@ -34469,6 +34706,7 @@ + @@ -35257,6 +35495,14 @@ + + + + + + + + @@ -36181,6 +36427,14 @@ + + + + + + + + @@ -36477,6 +36731,10 @@ + + + + @@ -40705,6 +40963,7 @@ + @@ -41518,6 +41777,7 @@ + @@ -41747,6 +42007,19 @@ + + + + + + + + + + + + + @@ -46402,21 +46675,21 @@ - + - + - + - + - + - + @@ -49229,6 +49502,11 @@ + + + + + @@ -49582,6 +49860,7 @@ + @@ -50215,6 +50494,7 @@ + @@ -50318,6 +50598,17 @@ + + + + + + + + + + + @@ -52804,6 +53095,7 @@ + @@ -53074,6 +53366,20 @@ + + + + + + + + + + + + + + @@ -54065,6 +54371,11 @@ + + + + + @@ -55061,6 +55372,29 @@ + + + + + + + + + + + + + + + + + + + + + + + @@ -58185,6 +58519,10 @@ + + + + @@ -59499,6 +59837,7 @@ + @@ -59637,6 +59976,7 @@ + @@ -59780,6 +60120,11 @@ + + + + + @@ -60863,6 +61208,7 @@ + @@ -62845,24 +63191,24 @@ - + - + - + - + - + - + - + @@ -66735,6 +67081,7 @@ + @@ -68028,6 +68375,26 @@ + + + + + + + + + + + + + + + + + + + + @@ -72020,6 +72387,11 @@ + + + + + @@ -72614,6 +72986,10 @@ + + + + @@ -72922,6 +73298,7 @@ + @@ -73147,6 +73524,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -76563,6 +76993,7 @@ + @@ -79502,6 +79933,7 @@ + @@ -84034,6 +84466,7 @@ + @@ -84260,6 +84693,14 @@ + + + + + + + + @@ -84547,6 +84988,7 @@ + @@ -85838,6 +86280,7 @@ + @@ -88979,6 +89422,7 @@ + @@ -89133,6 +89577,7 @@ + @@ -90829,51 +91274,51 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -92357,21 +92802,41 @@ - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + @@ -93978,6 +94443,7 @@ + @@ -95811,6 +96277,7 @@ + @@ -96337,6 +96804,17 @@ + + + + + + + + + + + @@ -96669,6 +97147,7 @@ + @@ -98611,6 +99090,17 @@ + + + + + + + + + + + @@ -99210,6 +99700,7 @@ + @@ -102023,6 +102514,12 @@ + + + + + + @@ -102867,6 +103364,13 @@ + + + + + + + @@ -103047,6 +103551,10 @@ + + + + @@ -104361,6 +104869,7 @@ + @@ -105437,6 +105946,7 @@ + @@ -106417,8 +106927,8 @@ - - + + @@ -109235,8 +109745,8 @@ - - + + @@ -109246,8 +109756,8 @@ - - + + @@ -109265,27 +109775,27 @@ - - + + - - + + - - - - + + + + - - - + + + @@ -109476,12 +109986,12 @@ - - + + - - + + @@ -109509,19 +110019,19 @@ - - - + + + - - - + + + - - - + + + @@ -109637,28 +110147,28 @@ - - + + - - + + - - + + - - + + @@ -109666,10 +110176,10 @@ - - - - + + + + @@ -111307,9 +111817,9 @@ - - - + + + @@ -113123,16 +113633,16 @@ - - - - + + + + - - - - + + + + @@ -116185,7 +116695,7 @@ - + @@ -117538,6 +118048,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -120772,13 +121351,13 @@ - - + + - - - + + + @@ -121409,9 +121988,9 @@ - - - + + + @@ -121582,16 +122161,16 @@ - - - - + + + + - - - - + + + + @@ -124393,8 +124972,8 @@ - - + + @@ -126803,10 +127382,10 @@ - - - - + + + + @@ -127306,8 +127885,8 @@ - - + + diff --git a/android/abi_gki_aarch64_qcom b/android/abi_gki_aarch64_qcom index 4d17da68f3e9..d39aebce8bea 100644 --- a/android/abi_gki_aarch64_qcom +++ b/android/abi_gki_aarch64_qcom @@ -1052,6 +1052,20 @@ i2c_register_driver i2c_transfer i2c_transfer_buffer_flags + i3c_generic_ibi_alloc_pool + i3c_generic_ibi_free_pool + i3c_generic_ibi_get_free_slot + i3c_generic_ibi_recycle_slot + i3c_master_add_i3c_dev_locked + i3c_master_disec_locked + i3c_master_do_daa + i3c_master_enec_locked + i3c_master_entdaa_locked + i3c_master_get_free_addr + i3c_master_queue_ibi + i3c_master_register + i3c_master_set_info + i3c_master_unregister icc_disable icc_enable icc_get From 2faed7779206367f40c9687e029b5bd168a646da Mon Sep 17 00:00:00 2001 From: Yang Yang Date: Thu, 8 Jul 2021 17:55:51 +0800 Subject: [PATCH 18/73] ANDROID: vendor_hooks: add vendor hook in blk_mq_rq_ctx_init() This vendor hook let us initialize payload of the request. Bug: 188749221 Change-Id: I51d6a3010ac0ab36066dbe1368158592832112b7 Signed-off-by: Yang Yang --- block/blk-mq.c | 1 + drivers/android/vendor_hooks.c | 1 + include/trace/hooks/block.h | 6 ++++++ 3 files changed, 8 insertions(+) diff --git a/block/blk-mq.c b/block/blk-mq.c index 9fb88dac18e3..a55c0449f411 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -343,6 +343,7 @@ static struct request *blk_mq_rq_ctx_init(struct blk_mq_alloc_data *data, } data->hctx->queued++; + trace_android_vh_blk_rq_ctx_init(rq, tags, data, alloc_time_ns); return rq; } diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 6cd8e36a08e3..8bbf73750265 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -241,6 +241,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_selinux_avc_node_delete); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_selinux_avc_node_replace); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_selinux_avc_lookup); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_blk_alloc_rqs); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_blk_rq_ctx_init); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_commit_creds); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_exit_creds); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_override_creds); diff --git a/include/trace/hooks/block.h b/include/trace/hooks/block.h index cccdf419ceb7..0d9d7db39968 100644 --- a/include/trace/hooks/block.h +++ b/include/trace/hooks/block.h @@ -12,12 +12,18 @@ struct blk_mq_tag_set; struct blk_mq_tags; +struct blk_mq_alloc_data; DECLARE_HOOK(android_vh_blk_alloc_rqs, TP_PROTO(size_t *rq_size, struct blk_mq_tag_set *set, struct blk_mq_tags *tags), TP_ARGS(rq_size, set, tags)); +DECLARE_HOOK(android_vh_blk_rq_ctx_init, + TP_PROTO(struct request *rq, struct blk_mq_tags *tags, + struct blk_mq_alloc_data *data, u64 alloc_time_ns), + TP_ARGS(rq, tags, data, alloc_time_ns)); + #endif /* _TRACE_HOOK_BLOCK_H */ /* This part must be outside protection */ From 13bc06efd9b1bdf253974ee0da3239324226c442 Mon Sep 17 00:00:00 2001 From: Robert Lee Date: Wed, 14 Jul 2021 13:56:16 +0800 Subject: [PATCH 19/73] ANDROID: ALSA: compress: add vendor hook to support pause in draining Add a hook to query from vendor's compress driver if it is support pause in draining and if the platform need to keep in draining state. Bug: 184020292 Bug: 178992384 Change-Id: Id2e2ff72d7ee66fc633473ec109ed3d8a2baaeff Signed-off-by: Robert Lee --- drivers/android/vendor_hooks.c | 2 ++ include/trace/hooks/snd_compr.h | 25 +++++++++++++++++++++++++ sound/core/compress_offload.c | 26 ++++++++++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 include/trace/hooks/snd_compr.h diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 8bbf73750265..bf20ca7252b0 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -71,6 +71,7 @@ #include #include #include +#include /* * Export tracepoints that act as a bare tracehook (ie: have no trace event @@ -360,3 +361,4 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_usb_dev_suspend); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_usb_dev_resume); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ipv6_gen_linklocal_addr); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_sound_usb_support_cpu_suspend); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_snd_compr_use_pause_in_drain); diff --git a/include/trace/hooks/snd_compr.h b/include/trace/hooks/snd_compr.h new file mode 100644 index 000000000000..c42ed8d6bc30 --- /dev/null +++ b/include/trace/hooks/snd_compr.h @@ -0,0 +1,25 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM snd_compr + +#undef TRACE_INCLUDE_PATH +#define TRACE_INCLUDE_PATH trace/hooks + +#if !defined(_TRACE_HOOK_SND_COMPR_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_HOOK_SND_COMPR_H + +#include +#include +/* + * Following tracepoints are not exported in tracefs and provide a + * mechanism for vendor modules to hook and extend functionality + */ + +DECLARE_HOOK(android_vh_snd_compr_use_pause_in_drain, + TP_PROTO(bool *use_pause_in_drain, bool *leave_draining), + TP_ARGS(use_pause_in_drain, leave_draining)); + +#endif /* _TRACE_HOOK_SND_COMPR_H */ +/* This part must be outside protection */ +#include + diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c index c1fec932c49d..f43a1dce3bd2 100644 --- a/sound/core/compress_offload.c +++ b/sound/core/compress_offload.c @@ -33,6 +33,10 @@ #include #include +#ifndef __GENKSYMS__ +#include +#endif + /* struct snd_compr_codec_caps overflows the ioctl bit size for some * architectures, so we need to disable the relevant ioctls. */ @@ -708,6 +712,20 @@ snd_compr_tstamp(struct snd_compr_stream *stream, unsigned long arg) static int snd_compr_pause(struct snd_compr_stream *stream) { int retval; + bool use_pause_in_drain = false; + bool leave_draining_state = false; + + trace_android_vh_snd_compr_use_pause_in_drain(&use_pause_in_drain, + &leave_draining_state); + + if (use_pause_in_drain && stream->runtime->state == SNDRV_PCM_STATE_DRAINING) { + retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_PAUSE_PUSH); + if (!retval && leave_draining_state) { + stream->runtime->state = SNDRV_PCM_STATE_PAUSED; + wake_up(&stream->runtime->sleep); + } + return retval; + } if (stream->runtime->state != SNDRV_PCM_STATE_RUNNING) return -EPERM; @@ -720,6 +738,14 @@ static int snd_compr_pause(struct snd_compr_stream *stream) static int snd_compr_resume(struct snd_compr_stream *stream) { int retval; + bool use_pause_in_drain = false; + bool leave_draining_state = false; + + trace_android_vh_snd_compr_use_pause_in_drain(&use_pause_in_drain, + &leave_draining_state); + + if (use_pause_in_drain && stream->runtime->state == SNDRV_PCM_STATE_DRAINING) + return stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_PAUSE_RELEASE); if (stream->runtime->state != SNDRV_PCM_STATE_PAUSED) return -EPERM; From b1e4543c270135bd18aea1653392f1b419eed35b Mon Sep 17 00:00:00 2001 From: Vlastimil Babka Date: Mon, 14 Dec 2020 19:10:56 -0800 Subject: [PATCH 20/73] UPSTREAM: mm, page_alloc: move draining pcplists to page isolation users Currently, pcplists are drained during set_migratetype_isolate() which means once per pageblock processed start_isolate_page_range(). This is somewhat wasteful. Moreover, the callers might need different guarantees, and the draining is currently prone to races and does not guarantee that no page from isolated pageblock will end up on the pcplist after the drain. Better guarantees are added by later patches and require explicit actions by page isolation users that need them. Thus it makes sense to move the current imperfect draining to the callers also as a preparation step. Link: https://lkml.kernel.org/r/20201111092812.11329-7-vbabka@suse.cz Suggested-by: David Hildenbrand Suggested-by: Pavel Tatashin Signed-off-by: Vlastimil Babka Reviewed-by: David Hildenbrand Reviewed-by: Oscar Salvador Acked-by: Michal Hocko Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds (cherry picked from commit 7612921f2376d51d020ae2f06ffb7da40422b75b) Change-Id: I10fc574024606c499ddda325d188d181aff7ceec --- mm/memory_hotplug.c | 11 ++++++----- mm/page_alloc.c | 2 ++ mm/page_isolation.c | 10 +++++----- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index f1b193096ffa..d0747f0b6a41 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c @@ -1547,6 +1547,8 @@ int __ref offline_pages(unsigned long start_pfn, unsigned long nr_pages) goto failed_removal; } + drain_all_pages(zone); + arg.start_pfn = start_pfn; arg.nr_pages = nr_pages; node_states_check_changes_offline(nr_pages, zone, &arg); @@ -1596,11 +1598,10 @@ int __ref offline_pages(unsigned long start_pfn, unsigned long nr_pages) } /* - * per-cpu pages are drained in start_isolate_page_range, but if - * there are still pages that are not free, make sure that we - * drain again, because when we isolated range we might - * have raced with another thread that was adding pages to pcp - * list. + * per-cpu pages are drained after start_isolate_page_range, but + * if there are still pages that are not free, make sure that we + * drain again, because when we isolated range we might have + * raced with another thread that was adding pages to pcp list. * * Forward progress should be still guaranteed because * pages on the pcp list can only belong to MOVABLE_ZONE diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 013a9e62c050..46200b4cede2 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -8712,6 +8712,8 @@ int alloc_contig_range(unsigned long start, unsigned long end, if (ret) return ret; + drain_all_pages(cc.zone); + /* * In case of -EBUSY, we'd like to know which page causes problem. * So, just fall through. test_pages_isolated() has a tracepoint diff --git a/mm/page_isolation.c b/mm/page_isolation.c index 6ecd3f432336..2399e3bf6393 100644 --- a/mm/page_isolation.c +++ b/mm/page_isolation.c @@ -49,7 +49,6 @@ static int set_migratetype_isolate(struct page *page, int migratetype, int isol_ __mod_zone_freepage_state(zone, -nr_pages, mt); spin_unlock_irqrestore(&zone->lock, flags); - drain_all_pages(zone); return 0; } @@ -172,11 +171,12 @@ __first_valid_page(unsigned long pfn, unsigned long nr_pages) * * Please note that there is no strong synchronization with the page allocator * either. Pages might be freed while their page blocks are marked ISOLATED. - * In some cases pages might still end up on pcp lists and that would allow + * A call to drain_all_pages() after isolation can flush most of them. However + * in some cases pages might still end up on pcp lists and that would allow * for their allocation even when they are in fact isolated already. Depending - * on how strong of a guarantee the caller needs drain_all_pages might be needed - * (e.g. __offline_pages will need to call it after check for isolated range for - * a next retry). + * on how strong of a guarantee the caller needs, further drain_all_pages() + * might be needed (e.g. __offline_pages will need to call it after check for + * isolated range for a next retry). * * Return: 0 on success and -EBUSY if any part of range cannot be isolated. */ From 675e5045983a35caf3578ff5fe8ee17e3b0ede4a Mon Sep 17 00:00:00 2001 From: Minchan Kim Date: Tue, 29 Jun 2021 11:28:13 -0700 Subject: [PATCH 21/73] ANDROID: mm: add cma allocation statistics alloc_contig_range is the core worker function for CMA allocation so it has every information to be able to understand allocation latency. For example, how many pages are migrated, how many time unmap was needed to migrate pages, how many times it encountered errors by some reasons. This patch adds such statistics in the alloc_contig_range and return it to user so user can use those information to analyize latency. The cma_alloc is first user for the statistics, which export the statistics as new trace event(i.e., cma_alloc_info). It was really usefuli to optimize cma allocation work. Bug: 192475091 Signed-off-by: Minchan Kim Change-Id: I7be43cc89d11078e2a324d2d06aada6d8e9e1cc9 --- drivers/virtio/virtio_mem.c | 3 ++- include/linux/cma.h | 9 ++++++++ include/linux/gfp.h | 14 +++++++++++- include/trace/events/cma.h | 45 +++++++++++++++++++++++++++++++++++++ mm/cma.c | 17 +++++++++++++- mm/page_alloc.c | 25 ++++++++++++++++----- 6 files changed, 105 insertions(+), 8 deletions(-) diff --git a/drivers/virtio/virtio_mem.c b/drivers/virtio/virtio_mem.c index 181e2f18beae..41bd84335b23 100644 --- a/drivers/virtio/virtio_mem.c +++ b/drivers/virtio/virtio_mem.c @@ -1307,11 +1307,12 @@ static int virtio_mem_mb_unplug_sb_online(struct virtio_mem *vm, const unsigned long nr_pages = PFN_DOWN(vm->subblock_size) * count; unsigned long start_pfn; int rc; + struct acr_info dummy; start_pfn = PFN_DOWN(virtio_mem_mb_id_to_phys(mb_id) + sb_id * vm->subblock_size); rc = alloc_contig_range(start_pfn, start_pfn + nr_pages, - MIGRATE_MOVABLE, GFP_KERNEL); + MIGRATE_MOVABLE, GFP_KERNEL, &dummy); if (rc == -ENOMEM) /* whoops, out of memory */ return rc; diff --git a/include/linux/cma.h b/include/linux/cma.h index d6c02d08ddbc..4f29ac17067d 100644 --- a/include/linux/cma.h +++ b/include/linux/cma.h @@ -22,6 +22,15 @@ struct cma; +struct cma_alloc_info { + unsigned long nr_migrated; + unsigned long nr_reclaimed; + unsigned long nr_mapped; + unsigned int nr_isolate_fail; + unsigned int nr_migrate_fail; + unsigned int nr_test_fail; +}; + extern unsigned long totalcma_pages; extern phys_addr_t cma_get_base(const struct cma *cma); extern unsigned long cma_get_size(const struct cma *cma); diff --git a/include/linux/gfp.h b/include/linux/gfp.h index 44f613870fa3..53f8ecadf996 100644 --- a/include/linux/gfp.h +++ b/include/linux/gfp.h @@ -642,9 +642,21 @@ static inline bool pm_suspended_storage(void) #endif /* CONFIG_PM_SLEEP */ #ifdef CONFIG_CONTIG_ALLOC +#define ACR_ERR_ISOLATE (1 << 0) +#define ACR_ERR_MIGRATE (1 << 1) +#define ACR_ERR_TEST (1 << 2) + +struct acr_info { + unsigned long nr_mapped; + unsigned long nr_migrated; + unsigned long nr_reclaimed; + unsigned int err; +}; + /* The below functions must be run on a range from a single zone. */ extern int alloc_contig_range(unsigned long start, unsigned long end, - unsigned migratetype, gfp_t gfp_mask); + unsigned migratetype, gfp_t gfp_mask, + struct acr_info *info); extern struct page *alloc_contig_pages(unsigned long nr_pages, gfp_t gfp_mask, int nid, nodemask_t *nodemask); #endif diff --git a/include/trace/events/cma.h b/include/trace/events/cma.h index 5cf385ae7c08..9c134325d6b2 100644 --- a/include/trace/events/cma.h +++ b/include/trace/events/cma.h @@ -91,6 +91,51 @@ TRACE_EVENT(cma_alloc_start, __entry->align) ); +TRACE_EVENT(cma_alloc_info, + + TP_PROTO(const char *name, const struct page *page, unsigned int count, unsigned int align, struct cma_alloc_info *info), + + TP_ARGS(name, page, count, align, info), + + TP_STRUCT__entry( + __string(name, name) + __field(unsigned long, pfn) + __field(unsigned int, count) + __field(unsigned int, align) + __field(unsigned long, nr_migrated) + __field(unsigned long, nr_reclaimed) + __field(unsigned long, nr_mapped) + __field(unsigned int, err_iso) + __field(unsigned int, err_mig) + __field(unsigned int, err_test) + ), + + TP_fast_assign( + __assign_str(name, name); + __entry->pfn = page ? page_to_pfn(page) : -1; + __entry->count = count; + __entry->align = align; + __entry->nr_migrated = info->nr_migrated; + __entry->nr_reclaimed = info->nr_reclaimed; + __entry->nr_mapped = info->nr_mapped; + __entry->err_iso = info->nr_isolate_fail; + __entry->err_mig = info->nr_migrate_fail; + __entry->err_test = info->nr_test_fail; + ), + + TP_printk("name=%s pfn=0x%lx count=%u align=%u nr_migrated=%lu nr_reclaimed=%lu nr_mapped=%lu err_iso=%u err_mig=%u err_test=%u", + __get_str(name), + __entry->pfn, + __entry->count, + __entry->align, + __entry->nr_migrated, + __entry->nr_reclaimed, + __entry->nr_mapped, + __entry->err_iso, + __entry->err_mig, + __entry->err_test) +); + DEFINE_EVENT(cma_alloc_class, cma_alloc_finish, TP_PROTO(const char *name, unsigned long pfn, const struct page *page, diff --git a/mm/cma.c b/mm/cma.c index 7bbc98a90e29..00c1b110a39e 100644 --- a/mm/cma.c +++ b/mm/cma.c @@ -443,6 +443,7 @@ struct page *cma_alloc(struct cma *cma, size_t count, unsigned int align, int num_attempts = 0; int max_retries = 5; s64 ts; + struct cma_alloc_info cma_info = {0}; trace_android_vh_cma_alloc_start(&ts); @@ -466,6 +467,8 @@ struct page *cma_alloc(struct cma *cma, size_t count, unsigned int align, goto out; for (;;) { + struct acr_info info = {0}; + mutex_lock(&cma->lock); bitmap_no = bitmap_find_next_zero_area_off(cma->bitmap, bitmap_maxno, start, bitmap_count, mask, @@ -503,7 +506,18 @@ struct page *cma_alloc(struct cma *cma, size_t count, unsigned int align, mutex_unlock(&cma->lock); pfn = cma->base_pfn + (bitmap_no << cma->order_per_bit); - ret = alloc_contig_range(pfn, pfn + count, MIGRATE_CMA, gfp_mask); + ret = alloc_contig_range(pfn, pfn + count, MIGRATE_CMA, gfp_mask, &info); + cma_info.nr_migrated += info.nr_migrated; + cma_info.nr_reclaimed += info.nr_reclaimed; + cma_info.nr_mapped += info.nr_mapped; + if (info.err) { + if (info.err & ACR_ERR_ISOLATE) + cma_info.nr_isolate_fail++; + if (info.err & ACR_ERR_MIGRATE) + cma_info.nr_migrate_fail++; + if (info.err & ACR_ERR_TEST) + cma_info.nr_test_fail++; + } if (ret == 0) { page = pfn_to_page(pfn); break; @@ -523,6 +537,7 @@ struct page *cma_alloc(struct cma *cma, size_t count, unsigned int align, } trace_cma_alloc_finish(cma->name, pfn, page, count, align); + trace_cma_alloc_info(cma->name, page, count, align, &cma_info); /* * CMA can allocate multiple page blocks, which results in different diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 46200b4cede2..a0cf1738bdb2 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -8586,7 +8586,8 @@ static inline void alloc_contig_dump_pages(struct list_head *page_list) /* [start, end) must belong to a single zone. */ static int __alloc_contig_migrate_range(struct compact_control *cc, - unsigned long start, unsigned long end) + unsigned long start, unsigned long end, + struct acr_info *info) { /* This function is based on compact_zone() from compaction.c. */ unsigned int nr_reclaimed; @@ -8594,6 +8595,7 @@ static int __alloc_contig_migrate_range(struct compact_control *cc, unsigned int tries = 0; unsigned int max_tries = 5; int ret = 0; + struct page *page; struct migration_target_control mtc = { .nid = zone_to_nid(cc->zone), .gfp_mask = GFP_USER | __GFP_MOVABLE | __GFP_RETRY_MAYFAIL, @@ -8625,10 +8627,16 @@ static int __alloc_contig_migrate_range(struct compact_control *cc, nr_reclaimed = reclaim_clean_pages_from_list(cc->zone, &cc->migratepages); + info->nr_reclaimed += nr_reclaimed; cc->nr_migratepages -= nr_reclaimed; + list_for_each_entry(page, &cc->migratepages, lru) + info->nr_mapped += page_mapcount(page); + ret = migrate_pages(&cc->migratepages, alloc_migration_target, NULL, (unsigned long)&mtc, cc->mode, MR_CONTIG_RANGE); + if (!ret) + info->nr_migrated += cc->nr_migratepages; } lru_cache_enable(); @@ -8637,7 +8645,9 @@ static int __alloc_contig_migrate_range(struct compact_control *cc, alloc_contig_dump_pages(&cc->migratepages); page_pinner_mark_migration_failed_pages(&cc->migratepages); } + putback_movable_pages(&cc->migratepages); + info->err |= ACR_ERR_MIGRATE; return ret; } return 0; @@ -8665,7 +8675,8 @@ static int __alloc_contig_migrate_range(struct compact_control *cc, * need to be freed with free_contig_range(). */ int alloc_contig_range(unsigned long start, unsigned long end, - unsigned migratetype, gfp_t gfp_mask) + unsigned migratetype, gfp_t gfp_mask, + struct acr_info *info) { unsigned long outer_start, outer_end; unsigned int order; @@ -8709,8 +8720,10 @@ int alloc_contig_range(unsigned long start, unsigned long end, ret = start_isolate_page_range(pfn_max_align_down(start), pfn_max_align_up(end), migratetype, 0); - if (ret) + if (ret) { + info->err |= ACR_ERR_ISOLATE; return ret; + } drain_all_pages(cc.zone); @@ -8724,7 +8737,7 @@ int alloc_contig_range(unsigned long start, unsigned long end, * allocated. So, if we fall through be sure to clear ret so that * -EBUSY is not accidentally used or returned to caller. */ - ret = __alloc_contig_migrate_range(&cc, start, end); + ret = __alloc_contig_migrate_range(&cc, start, end, info); if (ret && ret != -EBUSY) goto done; ret =0; @@ -8774,6 +8787,7 @@ int alloc_contig_range(unsigned long start, unsigned long end, pr_info_ratelimited("%s: [%lx, %lx) PFNs busy\n", __func__, outer_start, end); ret = -EBUSY; + info->err |= ACR_ERR_TEST; goto done; } @@ -8800,10 +8814,11 @@ EXPORT_SYMBOL(alloc_contig_range); static int __alloc_contig_pages(unsigned long start_pfn, unsigned long nr_pages, gfp_t gfp_mask) { + struct acr_info dummy; unsigned long end_pfn = start_pfn + nr_pages; return alloc_contig_range(start_pfn, end_pfn, MIGRATE_MOVABLE, - gfp_mask); + gfp_mask, &dummy); } static bool pfn_range_valid_contig(struct zone *z, unsigned long start_pfn, From c01ce3b5ef6cd9fdc015afc0bbb6d17b3aa49fb9 Mon Sep 17 00:00:00 2001 From: Minchan Kim Date: Mon, 12 Jul 2021 16:06:34 -0700 Subject: [PATCH 22/73] ANDROID: mm: do not try test_page_isoalte if migration fails Currently, alloc_contig_range expects that even though a page fails with -EBUSY from __alloc_contig_migrate_range, it want to check those failed pages in test_pages_isolated again with hope that those page would be freed soon so cma allocatoin would be succeeded. However, it depends on the luck and I found sometimes test_page_isolated constantly fails at the page repeatedly whenever cma_alloc retried. Rather than burning out CPU to check the page's status in test_pages_isolated for GFP_NORETRY allocation, just bail out and relies on the user what they want to do. Currently, this option works for only __GFP_NORETRY case for safe of existing other users. Bug: 192475091 Signed-off-by: Minchan Kim Change-Id: I9211452be06960dc7d8f854537e53b3fc5262c8e --- mm/page_alloc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index a0cf1738bdb2..7c01170eeca5 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -8738,7 +8738,7 @@ int alloc_contig_range(unsigned long start, unsigned long end, * -EBUSY is not accidentally used or returned to caller. */ ret = __alloc_contig_migrate_range(&cc, start, end, info); - if (ret && ret != -EBUSY) + if (ret && (ret != -EBUSY || (gfp_mask & __GFP_NORETRY))) goto done; ret =0; From c8578a3e9015352bb59ec37dd9528ec4479a9b6f Mon Sep 17 00:00:00 2001 From: Minchan Kim Date: Tue, 13 Jul 2021 12:24:14 -0700 Subject: [PATCH 23/73] ANDROID: mm: lru_cache_disable skips lru cache drainnig lru_cache_disable is not trivial cost since it should run work from every cores in the system. Thus, repeated call of the function whenever alloc_contig_range in the cma's allocation loop is called is expensive. This patch makes the lru_cache_disable smarter in that it will not run __lru_add_drain_all since it knows the cache was already disabled by someone else. With that, user of alloc_contig_range can disable the lru cache in advance in their context so that subsequent alloc_contig_range for user's operation will avoid the costly function call. This patch moves lru_cache APIs from swap.h to swap.c and export it for vendor users. Bug: 192475091 Signed-off-by: Minchan Kim Change-Id: I23da8599c55db49dc80226285972e4cd80dedcff --- include/linux/swap.h | 14 ++------------ mm/swap.c | 22 ++++++++++++++++++++-- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/include/linux/swap.h b/include/linux/swap.h index 357d4c94fa45..f750b27773ea 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -342,19 +342,9 @@ extern void lru_add_page_tail(struct page *page, struct page *page_tail, struct lruvec *lruvec, struct list_head *head); extern void mark_page_accessed(struct page *); -extern atomic_t lru_disable_count; - -static inline bool lru_cache_disabled(void) -{ - return atomic_read(&lru_disable_count); -} - -static inline void lru_cache_enable(void) -{ - atomic_dec(&lru_disable_count); -} - +extern bool lru_cache_disabled(void); extern void lru_cache_disable(void); +extern void lru_cache_enable(void); extern void lru_add_drain(void); extern void lru_add_drain_cpu(int cpu); extern void lru_add_drain_cpu_zone(struct zone *zone); diff --git a/mm/swap.c b/mm/swap.c index 171213a64202..09923999ddc2 100644 --- a/mm/swap.c +++ b/mm/swap.c @@ -924,7 +924,18 @@ void lru_add_drain_all(void) } #endif /* CONFIG_SMP */ -atomic_t lru_disable_count = ATOMIC_INIT(0); +static atomic_t lru_disable_count = ATOMIC_INIT(0); + +bool lru_cache_disabled(void) +{ + return atomic_read(&lru_disable_count) != 0; +} + +void lru_cache_enable(void) +{ + atomic_dec(&lru_disable_count); +} +EXPORT_SYMBOL_GPL(lru_cache_enable); /* * lru_cache_disable() needs to be called before we start compiling @@ -936,7 +947,12 @@ atomic_t lru_disable_count = ATOMIC_INIT(0); */ void lru_cache_disable(void) { - atomic_inc(&lru_disable_count); + /* + * If someone is already disabled lru_cache, just return with + * increasing the lru_disable_count. + */ + if (atomic_inc_not_zero(&lru_disable_count)) + return; #ifdef CONFIG_SMP /* * lru_add_drain_all in the force mode will schedule draining on @@ -950,7 +966,9 @@ void lru_cache_disable(void) #else lru_add_drain(); #endif + atomic_inc(&lru_disable_count); } +EXPORT_SYMBOL_GPL(lru_cache_disable); /** * release_pages - batched put_page() From 9938b82be10c3cf6e363bb8c32c364cb622bcdce Mon Sep 17 00:00:00 2001 From: Minchan Kim Date: Mon, 28 Jun 2021 18:47:11 -0700 Subject: [PATCH 24/73] ANDROID: mm: bail out tlb free batching on page zapping when cma is going on I found sometime cma allocation took a long time to be succeeded because one of the pages is in the middle of zapping(e.g., munmap, exit) so alloc_contig_range couldn't migrate the page because it was zero page mapcount. So, CMA allocator need to wait it until tlb batching frees the page and the batching free happens on the target process's context which is quite random, sometimes, very low priority process on little core. It makes CMA allocation very slow up to several hundreds millisecond. To solve the issue, let's make the TLB free batching aware of CMA progress so whenever cma allocation is going on, TLB free batching should bail out asap to minimize cma allocation latency. Bug: 192475091 Signed-off-by: Minchan Kim Change-Id: Ic76ecff795639085c4372791d922301467563a06 --- mm/memory.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mm/memory.c b/mm/memory.c index 3e76655b279b..20cb1473431e 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -1302,7 +1302,8 @@ again: page_remove_rmap(page, false); if (unlikely(page_mapcount(page) < 0)) print_bad_pte(vma, addr, ptent, page); - if (unlikely(__tlb_remove_page(tlb, page))) { + if (unlikely(__tlb_remove_page(tlb, page)) || + lru_cache_disabled()) { force_flush = 1; addr += PAGE_SIZE; break; From 0e688e972d7efc9fba8b5050d43245ab904c21a4 Mon Sep 17 00:00:00 2001 From: Minchan Kim Date: Tue, 29 Jun 2021 12:08:44 -0700 Subject: [PATCH 25/73] ANDROID: mm: cma: skip problematic pageblock alloc_contig_range is supposed to work on max(MAX_ORDER_NR_PAGES, or pageblock_nr_pages) granularity aligned range. If it fails at a page and return error to user, user doesn't know what page makes the allocation failure and keep retrying another allocation with new range including the failed page and encountered error again and again until it could escape the out of the granularity block. Instead, let's make CMA aware of what pfn was troubled in previous trial and then continue to work new pageblock out of the failed page so it doesn't see the repeated error repeatedly. Currently, this option works for only __GFP_NORETRY case for safe for existing CMA users. Bug: 192475091 Signed-off-by: Minchan Kim Change-Id: I0959c9df3d4b36408a68920abbb4d52d31026079 --- include/linux/gfp.h | 3 +++ include/linux/page-isolation.h | 5 +++-- mm/cma.c | 12 ++++++++++-- mm/memory_hotplug.c | 4 ++-- mm/page_alloc.c | 12 +++++++++--- mm/page_isolation.c | 9 +++++++-- 6 files changed, 34 insertions(+), 11 deletions(-) diff --git a/include/linux/gfp.h b/include/linux/gfp.h index 53f8ecadf996..fbed5dd273db 100644 --- a/include/linux/gfp.h +++ b/include/linux/gfp.h @@ -642,6 +642,8 @@ static inline bool pm_suspended_storage(void) #endif /* CONFIG_PM_SLEEP */ #ifdef CONFIG_CONTIG_ALLOC +extern unsigned long pfn_max_align_up(unsigned long pfn); + #define ACR_ERR_ISOLATE (1 << 0) #define ACR_ERR_MIGRATE (1 << 1) #define ACR_ERR_TEST (1 << 2) @@ -651,6 +653,7 @@ struct acr_info { unsigned long nr_migrated; unsigned long nr_reclaimed; unsigned int err; + unsigned long failed_pfn; }; /* The below functions must be run on a range from a single zone. */ diff --git a/include/linux/page-isolation.h b/include/linux/page-isolation.h index 572458016331..ccd3ed46434f 100644 --- a/include/linux/page-isolation.h +++ b/include/linux/page-isolation.h @@ -44,7 +44,8 @@ int move_freepages_block(struct zone *zone, struct page *page, */ int start_isolate_page_range(unsigned long start_pfn, unsigned long end_pfn, - unsigned migratetype, int flags); + unsigned migratetype, int flags, + unsigned long *failed_pfn); /* * Changes MIGRATE_ISOLATE to MIGRATE_MOVABLE. @@ -58,7 +59,7 @@ undo_isolate_page_range(unsigned long start_pfn, unsigned long end_pfn, * Test all pages in [start_pfn, end_pfn) are isolated or not. */ int test_pages_isolated(unsigned long start_pfn, unsigned long end_pfn, - int isol_flags); + int isol_flags, unsigned long *failed_pfn); struct page *alloc_migrate_target(struct page *page, unsigned long private); diff --git a/mm/cma.c b/mm/cma.c index 00c1b110a39e..0df6554bf0fc 100644 --- a/mm/cma.c +++ b/mm/cma.c @@ -532,8 +532,16 @@ struct page *cma_alloc(struct cma *cma, size_t count, unsigned int align, trace_cma_alloc_busy_retry(cma->name, pfn, pfn_to_page(pfn), count, align); - /* try again with a bit different memory target */ - start = bitmap_no + mask + 1; + + if (info.failed_pfn && gfp_mask & __GFP_NORETRY) { + /* try again from following failed page */ + start = (pfn_max_align_up(info.failed_pfn + 1) - + cma->base_pfn) >> cma->order_per_bit; + + } else { + /* try again with a bit different memory target */ + start = bitmap_no + mask + 1; + } } trace_cma_alloc_finish(cma->name, pfn, page, count, align); diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index d0747f0b6a41..41ac69bc0299 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c @@ -1541,7 +1541,7 @@ int __ref offline_pages(unsigned long start_pfn, unsigned long nr_pages) /* set above range as isolated */ ret = start_isolate_page_range(start_pfn, end_pfn, MIGRATE_MOVABLE, - MEMORY_OFFLINE | REPORT_FAILURE); + MEMORY_OFFLINE | REPORT_FAILURE, NULL); if (ret) { reason = "failure to isolate range"; goto failed_removal; @@ -1608,7 +1608,7 @@ int __ref offline_pages(unsigned long start_pfn, unsigned long nr_pages) * because has_unmovable_pages explicitly checks for * PageBuddy on freed pages on other zones. */ - ret = test_pages_isolated(start_pfn, end_pfn, MEMORY_OFFLINE); + ret = test_pages_isolated(start_pfn, end_pfn, MEMORY_OFFLINE, NULL); if (ret) drain_all_pages(zone); } while (ret); diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 7c01170eeca5..cdebaa666ece 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -8547,7 +8547,7 @@ static unsigned long pfn_max_align_down(unsigned long pfn) pageblock_nr_pages) - 1); } -static unsigned long pfn_max_align_up(unsigned long pfn) +unsigned long pfn_max_align_up(unsigned long pfn) { return ALIGN(pfn, max_t(unsigned long, MAX_ORDER_NR_PAGES, pageblock_nr_pages)); @@ -8646,6 +8646,11 @@ static int __alloc_contig_migrate_range(struct compact_control *cc, page_pinner_mark_migration_failed_pages(&cc->migratepages); } + if (!list_empty(&cc->migratepages)) { + page = list_first_entry(&cc->migratepages, struct page , lru); + info->failed_pfn = page_to_pfn(page); + } + putback_movable_pages(&cc->migratepages); info->err |= ACR_ERR_MIGRATE; return ret; @@ -8719,7 +8724,8 @@ int alloc_contig_range(unsigned long start, unsigned long end, */ ret = start_isolate_page_range(pfn_max_align_down(start), - pfn_max_align_up(end), migratetype, 0); + pfn_max_align_up(end), migratetype, 0, + &info->failed_pfn); if (ret) { info->err |= ACR_ERR_ISOLATE; return ret; @@ -8783,7 +8789,7 @@ int alloc_contig_range(unsigned long start, unsigned long end, } /* Make sure the range is really isolated. */ - if (test_pages_isolated(outer_start, end, 0)) { + if (test_pages_isolated(outer_start, end, 0, &info->failed_pfn)) { pr_info_ratelimited("%s: [%lx, %lx) PFNs busy\n", __func__, outer_start, end); ret = -EBUSY; diff --git a/mm/page_isolation.c b/mm/page_isolation.c index 2399e3bf6393..b391091bfd5c 100644 --- a/mm/page_isolation.c +++ b/mm/page_isolation.c @@ -181,7 +181,8 @@ __first_valid_page(unsigned long pfn, unsigned long nr_pages) * Return: 0 on success and -EBUSY if any part of range cannot be isolated. */ int start_isolate_page_range(unsigned long start_pfn, unsigned long end_pfn, - unsigned migratetype, int flags) + unsigned migratetype, int flags, + unsigned long *failed_pfn) { unsigned long pfn; unsigned long undo_pfn; @@ -197,6 +198,8 @@ int start_isolate_page_range(unsigned long start_pfn, unsigned long end_pfn, if (page) { if (set_migratetype_isolate(page, migratetype, flags)) { undo_pfn = pfn; + if (failed_pfn) + *failed_pfn = page_to_pfn(page); goto undo; } } @@ -282,7 +285,7 @@ __test_page_isolated_in_pageblock(unsigned long pfn, unsigned long end_pfn, /* Caller should ensure that requested range is in a single zone */ int test_pages_isolated(unsigned long start_pfn, unsigned long end_pfn, - int isol_flags) + int isol_flags, unsigned long *failed_pfn) { unsigned long pfn, flags; struct page *page; @@ -310,6 +313,8 @@ int test_pages_isolated(unsigned long start_pfn, unsigned long end_pfn, trace_test_pages_isolated(start_pfn, end_pfn, pfn); if (pfn < end_pfn) { page_pinner_failure_detect(pfn_to_page(pfn)); + if (failed_pfn) + *failed_pfn = pfn; return -EBUSY; } From 12f48605e86dc9439cc4f0413eb07984f93927a3 Mon Sep 17 00:00:00 2001 From: Minchan Kim Date: Tue, 13 Jul 2021 08:56:06 -0700 Subject: [PATCH 26/73] ANDROID: mm: cma do not sleep for __GFP_NORETRY Do not sleep for retrying for __GFP_NORERY since it's failfast mode approach. User could retry the allocation without the flag by themselves if they see the failure. Bug: 192475091 Signed-off-by: Minchan Kim Change-Id: Ic6a857978fda8e353b9ed770d1e0ba1808fd201e --- mm/cma.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mm/cma.c b/mm/cma.c index 0df6554bf0fc..47538607045e 100644 --- a/mm/cma.c +++ b/mm/cma.c @@ -477,7 +477,8 @@ struct page *cma_alloc(struct cma *cma, size_t count, unsigned int align, if ((num_attempts < max_retries) && (ret == -EBUSY)) { mutex_unlock(&cma->lock); - if (fatal_signal_pending(current)) + if (fatal_signal_pending(current) || + (gfp_mask & __GFP_NORETRY)) break; /* From 9df147298f55f5c13f0fdfc22a2edfbc98ab6341 Mon Sep 17 00:00:00 2001 From: Minchan Kim Date: Tue, 13 Jul 2021 18:20:06 -0700 Subject: [PATCH 27/73] ANDROID: Update the generic symbol list Add a few more symbols. [A] 'function void lru_cache_disable()' [A] 'function void lru_cache_enable()' Bug: 192475091 Signed-off-by: Minchan Kim Change-Id: If538f62fca14b7c43e98a786b2fc7766545dc7d6 --- android/abi_gki_aarch64_generic | 96 +++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/android/abi_gki_aarch64_generic b/android/abi_gki_aarch64_generic index 20cbaa91b817..0f9777cc52e8 100644 --- a/android/abi_gki_aarch64_generic +++ b/android/abi_gki_aarch64_generic @@ -24,6 +24,8 @@ amba_driver_unregister android_rvh_probe_register anon_inode_getfd + arc4_crypt + arc4_setkey __arch_clear_user __arch_copy_from_user __arch_copy_in_user @@ -105,6 +107,7 @@ bus_unregister bus_unregister_notifier cache_line_size + call_rcu cancel_delayed_work cancel_delayed_work_sync cancel_work_sync @@ -225,6 +228,8 @@ cpus_read_lock cpus_read_unlock cpu_subsys + crc32_be + crc32_le crc8 crc8_populate_msb crypto_aead_decrypt @@ -234,19 +239,24 @@ crypto_alloc_aead crypto_alloc_base crypto_alloc_shash + crypto_alloc_skcipher crypto_alloc_sync_skcipher crypto_comp_compress crypto_comp_decompress crypto_destroy_tfm + __crypto_memneq crypto_register_alg crypto_register_scomp crypto_shash_digest crypto_shash_finup crypto_shash_setkey + crypto_shash_update + crypto_skcipher_decrypt crypto_skcipher_encrypt crypto_skcipher_setkey crypto_unregister_alg crypto_unregister_scomp + __crypto_xor csum_ipv6_magic csum_tcpudp_nofold _ctype @@ -264,6 +274,7 @@ debugfs_create_x32 debugfs_lookup debugfs_remove + debugfs_rename dec_zone_page_state default_llseek deferred_free @@ -273,11 +284,14 @@ del_timer_sync desc_to_gpio destroy_workqueue + dev_alloc_name + dev_change_net_namespace dev_close _dev_crit dev_driver_string _dev_emerg _dev_err + dev_fetch_sw_netstats devfreq_add_device devfreq_add_governor devfreq_monitor_resume @@ -290,12 +304,16 @@ devfreq_unregister_opp_notifier devfreq_update_interval dev_fwnode + __dev_get_by_index + dev_get_by_index dev_get_by_name + device_add device_add_disk device_add_groups device_create device_create_file device_create_with_groups + device_del device_destroy device_find_child device_for_each_child @@ -311,6 +329,7 @@ device_register device_remove_file device_remove_groups + device_rename device_set_wakeup_capable device_set_wakeup_enable device_unregister @@ -390,6 +409,8 @@ devm_thermal_zone_of_sensor_unregister devm_usb_get_phy_by_phandle _dev_notice + dev_pm_domain_attach_by_name + dev_pm_domain_detach dev_pm_opp_add dev_pm_opp_disable dev_pm_opp_find_freq_ceil @@ -406,6 +427,7 @@ dev_pm_opp_set_regulators dev_pm_qos_read_value dev_pm_qos_update_request + dev_printk dev_printk_emit dev_queue_xmit devres_add @@ -690,6 +712,9 @@ emergency_restart enable_irq enable_percpu_irq + ether_setup + eth_mac_addr + ethtool_op_get_link eth_type_trans eventfd_ctx_fdget eventfd_ctx_put @@ -719,6 +744,7 @@ find_vma finish_wait flush_dcache_page + flush_delayed_work flush_work flush_workqueue fput @@ -745,6 +771,7 @@ generic_file_llseek generic_handle_irq generic_iommu_put_resv_regions + genlmsg_multicast_allns genlmsg_put genl_register_family genl_unregister_family @@ -763,6 +790,8 @@ get_device __get_free_pages get_governor_parent_kobj + get_net_ns_by_fd + get_net_ns_by_pid get_pid_task get_random_bytes get_random_bytes_arch @@ -830,6 +859,9 @@ hrtimer_sleeper_start_expires hrtimer_start_range_ns hrtimer_try_to_cancel + __hw_addr_init + __hw_addr_sync + __hw_addr_unsync hwrng_register hwrng_unregister i2c_adapter_type @@ -858,6 +890,7 @@ idr_destroy idr_find idr_for_each + idr_get_next idr_preload idr_remove iio_device_unregister @@ -865,6 +898,7 @@ in6_pton in_aton inc_zone_page_state + inet_csk_get_port init_dummy_netdev init_net init_pseudo @@ -872,6 +906,7 @@ __init_swait_queue_head init_task init_timer_key + init_uts_ns init_wait_entry __init_waitqueue_head input_allocate_device @@ -960,9 +995,14 @@ kasprintf kernel_cpustat kernel_kobj + kernel_param_lock + kernel_param_unlock kernel_restart kern_mount kern_unmount + key_create_or_update + key_put + keyring_alloc __kfifo_alloc __kfifo_free __kfifo_in @@ -971,6 +1011,7 @@ kfree kfree_sensitive kfree_skb + kfree_skb_list kill_anon_super kill_fasync kimage_voffset @@ -1026,11 +1067,13 @@ kthread_stop kthread_worker_fn ktime_get + ktime_get_coarse_with_offset ktime_get_mono_fast_ns ktime_get_raw ktime_get_raw_ts64 ktime_get_real_seconds ktime_get_real_ts64 + ktime_get_seconds ktime_get_ts64 ktime_get_with_offset kvfree @@ -1049,6 +1092,8 @@ log_threaded_irq_wakeup_reason __log_write_mmio loops_per_jiffy + lru_cache_disable + lru_cache_enable lzo1x_1_compress lzo1x_decompress_safe lzorle1x_1_compress @@ -1116,19 +1161,31 @@ __napi_schedule napi_schedule_prep __netdev_alloc_skb + netdev_err + netdev_info + netdev_set_default_ethtool_ops netdev_state_change netdev_update_features + netif_carrier_off + netif_carrier_on netif_napi_add __netif_napi_del netif_receive_skb + netif_receive_skb_list netif_rx netif_rx_ni + netif_tx_stop_all_queues netif_tx_wake_queue + netlink_broadcast __netlink_kernel_create netlink_kernel_release + netlink_register_notifier netlink_unicast + netlink_unregister_notifier + net_ns_type_operations net_ratelimit nla_append + nla_find nla_memcpy __nla_parse nla_put @@ -1136,6 +1193,7 @@ nla_put_nohdr nla_reserve nla_strlcpy + __nla_validate __nlmsg_put no_llseek nonseekable_open @@ -1370,8 +1428,10 @@ proc_remove pskb_expand_head __pskb_pull_tail + ___pskb_trim put_device put_disk + __put_net __put_page put_sg_io_hdr __put_task_struct @@ -1409,6 +1469,7 @@ rb_next rb_prev rb_replace_node + rcu_barrier __rcu_read_lock __rcu_read_unlock rdev_get_drvdata @@ -1430,6 +1491,7 @@ register_netdev register_netdevice register_netdevice_notifier + register_pernet_device register_pernet_subsys register_pm_notifier register_reboot_notifier @@ -1489,11 +1551,24 @@ return_address revalidate_disk_size rfkill_alloc + rfkill_blocked rfkill_destroy rfkill_init_sw_state + rfkill_pause_polling rfkill_register + rfkill_resume_polling + rfkill_set_hw_state rfkill_unregister + rhashtable_free_and_destroy + rhashtable_insert_slow + rhltable_init + __rht_bucket_nested + rht_bucket_nested + rht_bucket_nested_insert root_task_group + round_jiffies + round_jiffies_relative + round_jiffies_up rps_needed rtc_class_close rtc_class_open @@ -1583,11 +1658,20 @@ single_open single_open_size single_release + skb_add_rx_frag skb_checksum + skb_checksum_help skb_clone + skb_clone_sk + skb_complete_wifi_ack skb_copy + skb_copy_bits + skb_copy_expand skb_dequeue skb_dequeue_tail + skb_ensure_writable + __skb_get_hash + __skb_gso_segment skb_pull skb_push skb_put @@ -1677,6 +1761,8 @@ snd_soc_unregister_component snprintf soc_device_register + __sock_create + sock_release sock_wfree softnet_data sort @@ -1735,8 +1821,10 @@ submit_bio submit_bio_wait subsys_system_register + __sw_hweight16 __sw_hweight32 __sw_hweight64 + __sw_hweight8 sync_file_create sync_file_get_fence synchronize_irq @@ -1761,6 +1849,7 @@ sysfs_streq sysfs_update_group sysrq_mask + system_freezable_wq system_freezing_cnt system_highpri_wq system_long_wq @@ -1821,6 +1910,7 @@ __traceiter_android_rvh_post_init_entity_util_avg __traceiter_android_rvh_preempt_disable __traceiter_android_rvh_preempt_enable + __traceiter_android_rvh_sched_fork __traceiter_android_rvh_select_task_rq_rt __traceiter_android_rvh_set_iowait __traceiter_android_rvh_typec_tcpci_chk_contaminant @@ -1891,6 +1981,7 @@ __tracepoint_android_rvh_post_init_entity_util_avg __tracepoint_android_rvh_preempt_disable __tracepoint_android_rvh_preempt_enable + __tracepoint_android_rvh_sched_fork __tracepoint_android_rvh_select_task_rq_rt __tracepoint_android_rvh_set_iowait __tracepoint_android_rvh_typec_tcpci_chk_contaminant @@ -2004,8 +2095,10 @@ unregister_inet6addr_notifier unregister_inetaddr_notifier unregister_netdev + unregister_netdevice_many unregister_netdevice_notifier unregister_netdevice_queue + unregister_pernet_device unregister_pernet_subsys unregister_pm_notifier unregister_reboot_notifier @@ -2113,6 +2206,7 @@ vb2_streamon vb2_vmalloc_memops vb2_wait_for_all_buffers + verify_pkcs7_signature vfree video_devdata video_device_alloc @@ -2164,6 +2258,7 @@ watchdog_register_device watchdog_set_restart_priority watchdog_unregister_device + wireless_nlevent_flush woken_wake_function work_busy __xfrm_state_destroy @@ -2178,6 +2273,7 @@ xhci_handle_event xhci_init_driver xhci_resume + xhci_ring_alloc xhci_ring_free xhci_run xhci_suspend From 99bf8cf8fa9d8d58e6cda1567cca3a6918b0c6b6 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 22 Apr 2020 15:35:41 +0200 Subject: [PATCH 28/73] ANDROID: GKI: ufs: add Android ABI padding to some structures Try to mitigate potential future driver core api changes by adding padding to struct ufs_hba_crypto_variant_ops, and struct ufs_hba. Bug: 151154716 Signed-off-by: Greg Kroah-Hartman Change-Id: Ib881e531d87eae1f7a5ca312bd36086d62ccaf94 --- drivers/scsi/ufs/ufshcd.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h index d044ecbb06ad..6577dc68ec6e 100644 --- a/drivers/scsi/ufs/ufshcd.h +++ b/drivers/scsi/ufs/ufshcd.h @@ -43,6 +43,7 @@ #include #include #include +#include #include "ufs.h" #include "ufs_quirks.h" @@ -353,6 +354,11 @@ struct ufs_hba_variant_ops { const union ufs_crypto_cfg_entry *cfg, int slot); void (*event_notify)(struct ufs_hba *hba, enum ufs_event_type evt, void *data); + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); }; /* clock gating state */ @@ -915,6 +921,11 @@ struct ufs_hba { #ifdef CONFIG_DEBUG_FS struct dentry *debugfs_root; #endif + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); }; /* Returns true if clocks can be gated. Otherwise false */ From b9081a2925c87934583cfb29d31ae40ad92d1723 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 22 Apr 2020 15:42:10 +0200 Subject: [PATCH 29/73] ANDROID: GKI: bio: add Android ABI padding to some structures Try to mitigate potential future driver core api changes by adding a padding to struct bio_integrity_payload and struct bio_set. Based on a change made to the RHEL/CENTOS 8 kernel. Bug: 151154716 Signed-off-by: Greg Kroah-Hartman Change-Id: I0397ede2e11560ad9422cd7765434fcd4f7a6dd8 --- include/linux/bio.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/include/linux/bio.h b/include/linux/bio.h index c6d765382926..5d6593db3b62 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -10,6 +10,7 @@ #include /* struct bio, bio_vec and BIO_* flags are defined in blk_types.h */ #include +#include #define BIO_DEBUG @@ -325,6 +326,10 @@ struct bio_integrity_payload { struct work_struct bip_work; /* I/O completion */ struct bio_vec *bip_vec; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + struct bio_vec bip_inline_vecs[];/* embedded bvec array */ }; @@ -698,6 +703,11 @@ struct bio_set { struct bio_list rescue_list; struct work_struct rescue_work; struct workqueue_struct *rescue_workqueue; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); }; struct biovec_slab { From 48cddc7c427be3a9657e9cb0c6e64b44c3c597bb Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 22 Apr 2020 15:47:34 +0200 Subject: [PATCH 30/73] ANDROID: GKI: dentry: add Android ABI padding to some structures Try to mitigate potential future driver core api changes by adding a padding to struct dentry and struct dentry_operations. Based on a change made to the RHEL/CENTOS 8 kernel. Bug: 151154716 Signed-off-by: Greg Kroah-Hartman Change-Id: Idde3c6e99bd4af3a91ba115b8ec148e3e1cdd4a9 --- include/linux/dcache.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/include/linux/dcache.h b/include/linux/dcache.h index 49d0b6f732f2..8836cf7c4874 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h @@ -13,6 +13,7 @@ #include #include #include +#include struct path; struct vfsmount; @@ -118,6 +119,9 @@ struct dentry { struct hlist_bl_node d_in_lookup_hash; /* only for in-lookup ones */ struct rcu_head d_rcu; } d_u; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); } __randomize_layout; /* @@ -148,6 +152,10 @@ struct dentry_operations { int (*d_manage)(const struct path *, bool); struct dentry *(*d_real)(struct dentry *, const struct inode *); void (*d_canonical_path)(const struct path *, struct path *); + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); } ____cacheline_aligned; /* From f4872b23537d192a8477746b6c5edc7511d1a5c3 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 25 Mar 2020 12:16:07 +0100 Subject: [PATCH 31/73] ANDROID: GKI: fs.h: add Android ABI padding to some structures Try to mitigate potential future driver core api changes by adding a padding to a bunch of filesystem structures. Based on a change made to the RHEL/CENTOS 8 kernel. Bug: 151154716 Change-Id: Ida6d98d30f292c980ab07e0250fec5268c4c87ed Signed-off-by: Greg Kroah-Hartman --- include/linux/blk_types.h | 5 ++++ include/linux/fs.h | 49 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index a42b751da268..3fb97c2af669 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h @@ -48,6 +48,11 @@ struct block_device { /* Mutex for freeze */ struct mutex bd_fsfreeze_mutex; struct super_block *bd_fsfreeze_sb; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); } __randomize_layout; /* diff --git a/include/linux/fs.h b/include/linux/fs.h index 342a93553eaf..d3a1342281dd 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -39,6 +39,7 @@ #include #include #include +#include #include #include @@ -413,6 +414,11 @@ struct address_space_operations { int (*swap_activate)(struct swap_info_struct *sis, struct file *file, sector_t *span); void (*swap_deactivate)(struct file *file); + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); }; extern const struct address_space_operations empty_aops; @@ -468,6 +474,11 @@ struct address_space { spinlock_t private_lock; struct list_head private_list; void *private_data; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); } __attribute__((aligned(sizeof(long)))) __randomize_layout; /* * On most architectures that alignment is already the case; but @@ -718,6 +729,9 @@ struct inode { #endif void *i_private; /* fs or device private pointer */ + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); } __randomize_layout; struct timespec64 timestamp_truncate(struct timespec64 t, struct inode *inode); @@ -1011,6 +1025,9 @@ struct file_lock; struct file_lock_operations { void (*fl_copy_lock)(struct file_lock *, struct file_lock *); void (*fl_release_private)(struct file_lock *); + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; struct lock_manager_operations { @@ -1022,6 +1039,9 @@ struct lock_manager_operations { int (*lm_change)(struct file_lock *, int, struct list_head *); void (*lm_setup)(struct file_lock *, void **); bool (*lm_breaker_owns_lease)(struct file_lock *); + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; struct lock_manager { @@ -1095,6 +1115,10 @@ struct file_lock { unsigned int debug_id; } afs; } fl_u; + + struct list_head android_reserved1; /* not a macro as we might just need it as-is */ + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); } __randomize_layout; struct file_lock_context { @@ -1547,6 +1571,11 @@ struct super_block { spinlock_t s_inode_wblist_lock; struct list_head s_inodes_wb; /* writeback inodes */ + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); } __randomize_layout; /* Helper functions so that in most cases filesystems will @@ -1859,6 +1888,11 @@ struct file_operations { struct file *file_out, loff_t pos_out, loff_t len, unsigned int remap_flags); int (*fadvise)(struct file *, loff_t, loff_t, int); + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); } __randomize_layout; struct inode_operations { @@ -1889,6 +1923,11 @@ struct inode_operations { umode_t create_mode); int (*tmpfile) (struct inode *, struct dentry *, umode_t); int (*set_acl)(struct inode *, struct posix_acl *, int); + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); } ____cacheline_aligned; static inline ssize_t call_read_iter(struct file *file, struct kiocb *kio, @@ -1965,6 +2004,11 @@ struct super_operations { struct shrink_control *); long (*free_cached_objects)(struct super_block *, struct shrink_control *); + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); }; /* @@ -2252,6 +2296,11 @@ struct file_system_type { struct lock_class_key i_lock_key; struct lock_class_key i_mutex_key; struct lock_class_key i_mutex_dir_key; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); }; #define MODULE_ALIAS_FS(NAME) MODULE_ALIAS("fs-" NAME) From 9c4854fa5a552925394f6ab59d0f950b6d64e680 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 18 Mar 2020 09:03:38 +0100 Subject: [PATCH 32/73] ANDROID: GKI: phy: add Android ABI padding to some structures Try to mitigate potential future driver core api changes by adding a padding to stuct phy_device and struct phy_driver Inspired by the upstream changes in 5.4.26 and 4.19.111 Bug: 151154716 Signed-off-by: Greg Kroah-Hartman Change-Id: I8dbc5f76e9eddfc5741f944168222aedacd0a8bb --- include/linux/phy.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/include/linux/phy.h b/include/linux/phy.h index 08725a262f32..afeda1c01e3a 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -27,6 +27,7 @@ #include #include #include +#include #include @@ -645,6 +646,11 @@ struct phy_device { /* MACsec management functions */ const struct macsec_ops *macsec_ops; #endif + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); }; #define to_phy_device(d) container_of(to_mdio_device(d), \ struct phy_device, mdio) @@ -875,6 +881,9 @@ struct phy_driver { int (*get_sqi)(struct phy_device *dev); /** @get_sqi_max: Get the maximum signal quality indication */ int (*get_sqi_max)(struct phy_device *dev); + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; #define to_phy_driver(d) container_of(to_mdio_common_driver(d), \ struct phy_driver, mdiodrv) From d5c344a498f587cc777a153e60e78ff14d55f5dc Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Sat, 2 May 2020 09:35:50 +0200 Subject: [PATCH 33/73] ANDROID: GKI: sched: add Android ABI padding to some structures Try to mitigate potential future driver core api changes by adding a padding to struct user_struct and struct sched_domain. Based on a change made to the RHEL/CENTOS 8 kernel. Bug: 151154716 Signed-off-by: Greg Kroah-Hartman Change-Id: Ie8f685122767b690a116193aefd8c5e3b6ef8f17 --- include/linux/sched/topology.h | 5 +++++ include/linux/sched/user.h | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/include/linux/sched/topology.h b/include/linux/sched/topology.h index 452158253764..173463340280 100644 --- a/include/linux/sched/topology.h +++ b/include/linux/sched/topology.h @@ -3,6 +3,7 @@ #define _LINUX_SCHED_TOPOLOGY_H #include +#include #include #include @@ -146,6 +147,10 @@ struct sched_domain { struct sched_domain_shared *shared; unsigned int span_weight; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + /* * Span of all CPUs in this domain. * diff --git a/include/linux/sched/user.h b/include/linux/sched/user.h index dd6a413d9565..6d63a5260130 100644 --- a/include/linux/sched/user.h +++ b/include/linux/sched/user.h @@ -6,6 +6,7 @@ #include #include #include +#include /* * Some day this will be a full-fledged user tracking system.. @@ -42,6 +43,9 @@ struct user_struct { /* Miscellaneous per-user rate limit */ struct ratelimit_state ratelimit; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); ANDROID_OEM_DATA_ARRAY(1, 2); }; From 33175403b942076234e081a19b085a8e5fc7dfe2 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 26 Mar 2020 11:21:23 +0100 Subject: [PATCH 34/73] ANDROID: GKI: workqueue.h: add Android ABI padding to some structures Try to mitigate potential future driver core api changes by adding a padding to struct work_struct and struct delayed_work Based on a change made to the RHEL/CENTOS 8 kernel. Bug: 151154716 Signed-off-by: Greg Kroah-Hartman Change-Id: I5492a13e2430c1a5775aec52518144b7aa4f3268 --- include/linux/workqueue.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h index 26de0cae2a0a..e98cc6dea2b9 100644 --- a/include/linux/workqueue.h +++ b/include/linux/workqueue.h @@ -14,6 +14,7 @@ #include #include #include +#include struct workqueue_struct; @@ -106,6 +107,8 @@ struct work_struct { #ifdef CONFIG_LOCKDEP struct lockdep_map lockdep_map; #endif + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; #define WORK_DATA_INIT() ATOMIC_LONG_INIT((unsigned long)WORK_STRUCT_NO_POOL) @@ -119,6 +122,9 @@ struct delayed_work { /* target workqueue and CPU ->timer uses to queue ->work */ struct workqueue_struct *wq; int cpu; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; struct rcu_work { From 1b79ef2754b8eac8c49ecdeabb85118c8ae98647 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 22 Apr 2020 15:35:08 +0200 Subject: [PATCH 35/73] ANDROID: GKI: scsi: add Android ABI padding to some structures Try to mitigate potential future driver core api changes by adding a padding to struct scsi_cmnd, struct scsi_device, and struct scsi_host_template. Based on a change made to the RHEL/CENTOS 8 kernel. Bug: 151154716 Signed-off-by: Greg Kroah-Hartman Change-Id: Ie6a2b91970e8f9063bf00e96a0dff661f77b8e8d --- include/scsi/scsi_cmnd.h | 6 ++++++ include/scsi/scsi_device.h | 7 +++++++ include/scsi/scsi_host.h | 6 ++++++ 3 files changed, 19 insertions(+) diff --git a/include/scsi/scsi_cmnd.h b/include/scsi/scsi_cmnd.h index 69ade4fb71aa..b6398c9d2c5c 100644 --- a/include/scsi/scsi_cmnd.h +++ b/include/scsi/scsi_cmnd.h @@ -11,6 +11,7 @@ #include #include #include +#include struct Scsi_Host; struct scsi_driver; @@ -142,6 +143,11 @@ struct scsi_cmnd { unsigned char tag; /* SCSI-II queued command tag */ unsigned int extra_len; /* length of alignment and padding */ + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); }; /* diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h index 1a5c9a3df6d6..158423bcdde9 100644 --- a/include/scsi/scsi_device.h +++ b/include/scsi/scsi_device.h @@ -8,6 +8,7 @@ #include #include #include +#include struct device; struct request_queue; @@ -237,6 +238,12 @@ struct scsi_device { struct mutex state_mutex; enum scsi_device_state sdev_state; struct task_struct *quiesced_by; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); + unsigned long sdev_data[]; } __attribute__((aligned(sizeof(unsigned long)))); diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h index 701f178b20ae..cfc0cfde98f0 100644 --- a/include/scsi/scsi_host.h +++ b/include/scsi/scsi_host.h @@ -10,6 +10,7 @@ #include #include #include +#include struct block_device; struct completion; @@ -486,6 +487,11 @@ struct scsi_host_template { /* Delay for runtime autosuspend */ int rpm_autosuspend_delay; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); }; /* From aea5e1c230289122e0de23939488b8de0fcd93dd Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 22 Apr 2020 15:50:51 +0200 Subject: [PATCH 36/73] ANDROID: GKI: elevator: add Android ABI padding to some structures Try to mitigate potential future driver core api changes by adding a padding to struct elevator_mq_ops and struct elevator_type. Based on a change made to the RHEL/CENTOS 8 kernel. Bug: 151154716 Signed-off-by: Greg Kroah-Hartman Change-Id: Ia4c2667fd5ca9e6dd2e0d30b95a0f8d5eb7921dc --- include/linux/elevator.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/include/linux/elevator.h b/include/linux/elevator.h index dcb2f9022c1d..0c75ed0604aa 100644 --- a/include/linux/elevator.h +++ b/include/linux/elevator.h @@ -4,6 +4,7 @@ #include #include +#include #ifdef CONFIG_BLOCK @@ -50,6 +51,11 @@ struct elevator_mq_ops { struct request *(*next_request)(struct request_queue *, struct request *); void (*init_icq)(struct io_cq *); void (*exit_icq)(struct io_cq *); + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); }; #define ELV_NAME_MAX (16) @@ -86,6 +92,9 @@ struct elevator_type /* managed by elevator core */ char icq_cache_name[ELV_NAME_MAX + 6]; /* elvname + "_io_cq" */ struct list_head list; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; #define ELV_HASH_BITS 6 From 429c78f9b03c57e9a186cc3a13b6d2e9a8cb350f Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Tue, 10 Mar 2020 18:31:03 +0100 Subject: [PATCH 37/73] ANDROID: GKI: device.h: add Android ABI padding to some structures Try to mitigate potential future driver core api changes by padding to struct bus_type, struct device_driver, struct class, and struct device. Based on a patch from Michal Marek from the SLES kernel Bug: 151154716 Signed-off-by: Greg Kroah-Hartman Change-Id: I6892cde6481ba775789f0c02239dcfde3a26b56e --- include/linux/device.h | 9 +++++++++ include/linux/device/bus.h | 5 +++++ include/linux/device/class.h | 4 ++++ include/linux/device/driver.h | 5 +++++ 4 files changed, 23 insertions(+) diff --git a/include/linux/device.h b/include/linux/device.h index 4e1e42798879..540a14f1e052 100644 --- a/include/linux/device.h +++ b/include/linux/device.h @@ -30,6 +30,7 @@ #include #include #include +#include #include struct device; @@ -553,6 +554,14 @@ struct device { #ifdef CONFIG_DMA_OPS_BYPASS bool dma_ops_bypass : 1; #endif + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); + ANDROID_KABI_RESERVE(5); + ANDROID_KABI_RESERVE(6); + ANDROID_KABI_RESERVE(7); + ANDROID_KABI_RESERVE(8); }; /** diff --git a/include/linux/device/bus.h b/include/linux/device/bus.h index 1ea5e1d1545b..93ed259748f8 100644 --- a/include/linux/device/bus.h +++ b/include/linux/device/bus.h @@ -112,6 +112,11 @@ struct bus_type { struct lock_class_key lock_key; bool need_parent_lock; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); }; extern int __must_check bus_register(struct bus_type *bus); diff --git a/include/linux/device/class.h b/include/linux/device/class.h index 04e983415c3d..9923e4835526 100644 --- a/include/linux/device/class.h +++ b/include/linux/device/class.h @@ -76,7 +76,11 @@ struct class { const struct dev_pm_ops *pm; struct subsys_private *p; + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); }; struct class_dev_iter { diff --git a/include/linux/device/driver.h b/include/linux/device/driver.h index ee7ba5b5417e..d5ad474e4fab 100644 --- a/include/linux/device/driver.h +++ b/include/linux/device/driver.h @@ -118,6 +118,11 @@ struct device_driver { void (*coredump) (struct device *dev); struct driver_private *p; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); }; From 37485a30251f6b72ad7f5e236eb4804762e56f9b Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 2 Jul 2021 15:58:26 +0200 Subject: [PATCH 38/73] ANDROID: add kabi padding for structures for the android12 release There are a lot of different structures that need to have a "frozen" abi for the next 5+ years. Add padding to a lot of them in order to be able to handle any future changes that might be needed due to LTS and security fixes that might come up. It's a best guess, based on what has happened in the past from the 5.4.0..5.4.129 release (1 1/2 years). Yes, past changes do not mean that future changes will also be needed in the same area, but that is a hint that those areas are both well maintained and looked after, and there have been previous problems found in them. Also the list of structures that are being required based on OEM usage in the android/ symbol lists were consulted as that's a larger list than what has been changed in the past. Hopefully we caught everything we need to worry about, only time will tell... Bug: 151154716 Signed-off-by: Greg Kroah-Hartman Change-Id: I880bbcda0628a7459988eeb49d18655522697664 --- drivers/mmc/host/sdhci.h | 5 +++ drivers/scsi/ufs/ufs.h | 2 ++ drivers/scsi/ufs/ufshcd.h | 6 ++++ drivers/usb/typec/class.c | 5 +++ include/linux/amba/bus.h | 5 +++ include/linux/backing-dev-defs.h | 7 ++++ include/linux/blkdev.h | 12 +++++++ include/linux/bpf.h | 9 ++++++ include/linux/bpf_verifier.h | 6 ++++ include/linux/cgroup.h | 3 ++ include/linux/cpuhotplug.h | 4 +++ include/linux/cpuidle.h | 5 +++ include/linux/device-mapper.h | 7 ++++ include/linux/dma-buf.h | 13 ++++++++ include/linux/dmaengine.h | 6 ++++ include/linux/fs.h | 3 ++ include/linux/gpio/driver.h | 7 ++++ include/linux/input.h | 13 ++++++++ include/linux/iomap.h | 2 ++ include/linux/kernfs.h | 6 ++++ include/linux/key-type.h | 4 +++ include/linux/mm_types.h | 2 ++ include/linux/mmc/card.h | 5 +++ include/linux/mmc/host.h | 9 ++++++ include/linux/netfilter.h | 9 ++++++ include/linux/netfilter/ipset/ip_set.h | 7 ++++ include/linux/netfilter/nfnetlink.h | 5 +++ include/linux/netfilter_ipv6.h | 3 ++ include/linux/pci.h | 8 +++++ include/linux/platform_device.h | 8 +++++ include/linux/pm.h | 8 +++++ include/linux/power_supply.h | 9 ++++++ include/linux/pwm.h | 7 ++++ include/linux/regmap.h | 7 ++++ include/linux/regulator/driver.h | 7 ++++ include/linux/rtc.h | 5 +++ include/linux/scmi_protocol.h | 17 ++++++++++ include/linux/serial_core.h | 9 ++++++ include/linux/serio.h | 5 +++ include/linux/spi/spi.h | 15 +++++++++ include/linux/spmi.h | 3 ++ include/linux/suspend.h | 7 ++++ include/linux/tcp.h | 3 ++ include/linux/thermal.h | 16 ++++++++++ include/linux/tty.h | 8 +++++ include/linux/tty_driver.h | 7 ++++ include/linux/tty_ldisc.h | 4 +++ include/linux/uio_driver.h | 4 +++ include/linux/usb/gadget.h | 11 +++++++ include/linux/usb/otg.h | 2 ++ include/linux/usb/phy.h | 3 ++ include/linux/usb/typec.h | 3 ++ include/linux/usb/typec_altmode.h | 2 ++ include/media/v4l2-ctrls.h | 16 ++++++++++ include/media/v4l2-dev.h | 6 ++++ include/media/videobuf2-v4l2.h | 3 ++ include/net/bluetooth/hci_core.h | 19 +++++++++++ include/net/bluetooth/l2cap.h | 10 ++++++ include/net/bluetooth/rfcomm.h | 6 ++++ include/net/cfg80211.h | 44 ++++++++++++++++++++++++++ include/net/genetlink.h | 5 +++ include/net/inet_connection_sock.h | 5 +++ include/net/ip6_fib.h | 10 ++++++ include/net/mac80211.h | 24 ++++++++++++++ include/net/neighbour.h | 8 +++++ include/net/netns/can.h | 3 ++ include/net/netns/ipv4.h | 3 ++ include/net/netns/ipv6.h | 3 ++ include/net/netns/netfilter.h | 3 ++ include/net/netns/nftables.h | 3 ++ include/net/netns/xfrm.h | 3 ++ include/net/page_pool.h | 3 ++ include/net/sch_generic.h | 7 ++++ include/net/tls.h | 7 ++++ include/scsi/scsi_host.h | 2 ++ include/sound/compress_driver.h | 8 +++++ include/sound/core.h | 10 ++++++ include/sound/hwdep.h | 5 +++ include/sound/info.h | 5 +++ include/sound/jack.h | 3 ++ include/sound/soc.h | 15 +++++++++ include/sound/timer.h | 7 ++++ sound/usb/card.h | 2 ++ sound/usb/usbaudio.h | 10 ++++++ 84 files changed, 606 insertions(+) diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h index 0770c036e2ff..63f51491fffe 100644 --- a/drivers/mmc/host/sdhci.h +++ b/drivers/mmc/host/sdhci.h @@ -16,6 +16,7 @@ #include #include #include +#include #include @@ -605,6 +606,8 @@ struct sdhci_host { u64 data_timeout; + ANDROID_KABI_RESERVE(1); + unsigned long private[] ____cacheline_aligned; }; @@ -652,6 +655,8 @@ struct sdhci_ops { void (*request_done)(struct sdhci_host *host, struct mmc_request *mrq); void (*dump_vendor_regs)(struct sdhci_host *host); + + ANDROID_KABI_RESERVE(1); }; #ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS diff --git a/drivers/scsi/ufs/ufs.h b/drivers/scsi/ufs/ufs.h index d69032d65463..1ee80cda3d01 100644 --- a/drivers/scsi/ufs/ufs.h +++ b/drivers/scsi/ufs/ufs.h @@ -13,6 +13,7 @@ #include #include +#include #include #define GENERAL_UPIU_REQUEST_SIZE (sizeof(struct utp_upiu_req)) @@ -594,6 +595,7 @@ struct ufs_dev_info { u8 b_presrv_uspc_en; /* UFS HPB related flag */ bool hpb_enabled; + ANDROID_KABI_RESERVE(1); }; /** diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h index 6577dc68ec6e..f4d0fb6fdd97 100644 --- a/drivers/scsi/ufs/ufshcd.h +++ b/drivers/scsi/ufs/ufshcd.h @@ -218,6 +218,8 @@ struct ufshcd_lrb { #endif bool req_abort_skip; + + ANDROID_KABI_RESERVE(1); }; /** @@ -398,6 +400,8 @@ struct ufs_clk_gating { bool is_initialized; int active_reqs; struct workqueue_struct *clk_gating_workq; + + ANDROID_KABI_RESERVE(1); }; struct ufs_saved_pwr_info { @@ -444,6 +448,8 @@ struct ufs_clk_scaling { bool is_initialized; bool is_busy_started; bool is_suspended; + + ANDROID_KABI_RESERVE(1); }; #define UFS_EVENT_HIST_LENGTH 8 diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c index bca461ea6456..8277c2907b8e 100644 --- a/drivers/usb/typec/class.c +++ b/drivers/usb/typec/class.c @@ -12,6 +12,7 @@ #include #include #include +#include #include "bus.h" @@ -20,6 +21,7 @@ struct typec_plug { enum typec_plug_index index; struct ida mode_ids; int num_altmodes; + ANDROID_KABI_RESERVE(1); }; struct typec_cable { @@ -28,6 +30,7 @@ struct typec_cable { struct usb_pd_identity *identity; unsigned int active:1; u16 pd_revision; /* 0300H = "3.0" */ + ANDROID_KABI_RESERVE(1); }; struct typec_partner { @@ -39,6 +42,7 @@ struct typec_partner { int num_altmodes; u16 pd_revision; /* 0300H = "3.0" */ enum usb_pd_svdm_ver svdm_version; + ANDROID_KABI_RESERVE(1); }; struct typec_port { @@ -60,6 +64,7 @@ struct typec_port { const struct typec_capability *cap; const struct typec_operations *ops; + ANDROID_KABI_RESERVE(1); }; #define to_typec_port(_dev_) container_of(_dev_, struct typec_port, dev) diff --git a/include/linux/amba/bus.h b/include/linux/amba/bus.h index 6cc93ab5b809..55e2f02bd45a 100644 --- a/include/linux/amba/bus.h +++ b/include/linux/amba/bus.h @@ -17,6 +17,7 @@ #include #include #include +#include #define AMBA_NR_IRQS 9 #define AMBA_CID 0xb105f00d @@ -71,6 +72,8 @@ struct amba_device { struct amba_cs_uci_id uci; unsigned int irq[AMBA_NR_IRQS]; char *driver_override; + + ANDROID_KABI_RESERVE(1); }; struct amba_driver { @@ -79,6 +82,8 @@ struct amba_driver { void (*remove)(struct amba_device *); void (*shutdown)(struct amba_device *); const struct amba_id *id_table; + + ANDROID_KABI_RESERVE(1); }; /* diff --git a/include/linux/backing-dev-defs.h b/include/linux/backing-dev-defs.h index fff9367a6348..f3314adb6a8d 100644 --- a/include/linux/backing-dev-defs.h +++ b/include/linux/backing-dev-defs.h @@ -13,6 +13,7 @@ #include #include #include +#include struct page; struct device; @@ -160,6 +161,9 @@ struct bdi_writeback { struct rcu_head rcu; }; #endif + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; struct backing_dev_info { @@ -198,6 +202,9 @@ struct backing_dev_info { #ifdef CONFIG_DEBUG_FS struct dentry *debug_dir; #endif + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; enum { diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 433ae2605277..cdd5a0e2ec6a 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -26,6 +26,7 @@ #include #include #include +#include struct module; struct scsi_ioctl_command; @@ -242,6 +243,8 @@ struct request { */ rq_end_io_fn *end_io; void *end_io_data; + + ANDROID_KABI_RESERVE(1); }; static inline bool blk_op_is_scsi(unsigned int op) @@ -346,6 +349,8 @@ struct queue_limits { unsigned char discard_misaligned; unsigned char raid_partial_stripes_expensive; enum blk_zoned_model zoned; + + ANDROID_KABI_RESERVE(1); }; typedef int (*report_zones_cb)(struct blk_zone *zone, unsigned int idx, @@ -589,6 +594,10 @@ struct request_queue { #define BLK_MAX_WRITE_HINTS 5 u64 write_hints[BLK_MAX_WRITE_HINTS]; + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); ANDROID_OEM_DATA(1); }; @@ -1858,6 +1867,9 @@ struct block_device_operations { char *(*devnode)(struct gendisk *disk, umode_t *mode); struct module *owner; const struct pr_ops *pr_ops; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; #ifdef CONFIG_COMPAT diff --git a/include/linux/bpf.h b/include/linux/bpf.h index 6460b57b4b79..62ff6b56a929 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -21,6 +21,7 @@ #include #include #include +#include struct bpf_verifier_env; struct bpf_verifier_log; @@ -132,6 +133,9 @@ struct bpf_map_ops { /* bpf_iter info used to open a seq_file */ const struct bpf_iter_seq_info *iter_seq_info; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; struct bpf_map_memory { @@ -218,6 +222,8 @@ struct bpf_map_dev_ops { int (*map_update_elem)(struct bpf_offloaded_map *map, void *key, void *value, u64 flags); int (*map_delete_elem)(struct bpf_offloaded_map *map, void *key); + + ANDROID_KABI_RESERVE(1); }; struct bpf_offloaded_map { @@ -459,6 +465,7 @@ struct bpf_verifier_ops { const struct btf_type *t, int off, int size, enum bpf_access_type atype, u32 *next_btf_id); + ANDROID_KABI_RESERVE(1); }; struct bpf_prog_offload_ops { @@ -474,6 +481,7 @@ struct bpf_prog_offload_ops { int (*prepare)(struct bpf_prog *prog); int (*translate)(struct bpf_prog *prog); void (*destroy)(struct bpf_prog *prog); + ANDROID_KABI_RESERVE(1); }; struct bpf_prog_offload { @@ -851,6 +859,7 @@ struct bpf_prog_aux { struct work_struct work; struct rcu_head rcu; }; + ANDROID_KABI_RESERVE(1); }; struct bpf_array_aux { diff --git a/include/linux/bpf_verifier.h b/include/linux/bpf_verifier.h index 2739a6431b9e..b83f1dd5c719 100644 --- a/include/linux/bpf_verifier.h +++ b/include/linux/bpf_verifier.h @@ -7,6 +7,7 @@ #include /* for enum bpf_reg_type */ #include /* for MAX_BPF_STACK */ #include +#include /* Maximum variable offset umax_value permitted when resolving memory accesses. * In practice this is far bigger than any realistic pointer offset; this limit @@ -370,6 +371,8 @@ struct bpf_subprog_info { bool has_tail_call; bool tail_call_reachable; bool has_ld_abs; + + ANDROID_KABI_RESERVE(1); }; /* single container for all structs @@ -425,6 +428,9 @@ struct bpf_verifier_env { u32 peak_states; /* longest register parentage chain walked for liveness marking */ u32 longest_mark_read_walk; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; __printf(2, 0) void bpf_verifier_vlog(struct bpf_verifier_log *log, diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h index 14b808b02872..67b2190b1dae 100644 --- a/include/linux/cgroup.h +++ b/include/linux/cgroup.h @@ -24,6 +24,7 @@ #include #include #include +#include #include @@ -66,6 +67,8 @@ struct css_task_iter { struct css_set *cur_dcset; struct task_struct *cur_task; struct list_head iters_node; /* css_set->task_iters */ + + ANDROID_KABI_RESERVE(1); }; extern struct cgroup_root cgrp_dfl_root; diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h index 1366cfbfdc78..843bb056b8c6 100644 --- a/include/linux/cpuhotplug.h +++ b/include/linux/cpuhotplug.h @@ -195,6 +195,10 @@ enum cpuhp_state { CPUHP_AP_X86_KVM_CLK_ONLINE, CPUHP_AP_DTPM_CPU_ONLINE, CPUHP_AP_ACTIVE, + CPUHP_ANDROID_RESERVED_1, + CPUHP_ANDROID_RESERVED_2, + CPUHP_ANDROID_RESERVED_3, + CPUHP_ANDROID_RESERVED_4, CPUHP_ONLINE, }; diff --git a/include/linux/cpuidle.h b/include/linux/cpuidle.h index bd605b5585cf..4b51019dd2b8 100644 --- a/include/linux/cpuidle.h +++ b/include/linux/cpuidle.h @@ -14,6 +14,7 @@ #include #include #include +#include #define CPUIDLE_STATE_MAX 10 #define CPUIDLE_NAME_LEN 16 @@ -110,6 +111,8 @@ struct cpuidle_device { cpumask_t coupled_cpus; struct cpuidle_coupled *coupled; #endif + + ANDROID_KABI_RESERVE(1); }; DECLARE_PER_CPU(struct cpuidle_device *, cpuidle_devices); @@ -135,6 +138,8 @@ struct cpuidle_driver { /* preferred governor to switch at register time */ const char *governor; + + ANDROID_KABI_RESERVE(1); }; #ifdef CONFIG_CPU_IDLE diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h index 8858ffd6fb10..ccb909edca38 100644 --- a/include/linux/device-mapper.h +++ b/include/linux/device-mapper.h @@ -13,6 +13,7 @@ #include #include #include +#include struct dm_dev; struct dm_target; @@ -198,6 +199,9 @@ struct target_type { dm_dax_copy_iter_fn dax_copy_to_iter; dm_dax_zero_page_range_fn dax_zero_page_range; + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + /* For internal device-mapper use. */ struct list_head list; }; @@ -349,6 +353,9 @@ struct dm_target { * Set if we need to limit the number of in-flight bios when swapping. */ bool limit_swap_bios:1; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; void *dm_per_bio_data(struct bio *bio, size_t data_size); diff --git a/include/linux/dma-buf.h b/include/linux/dma-buf.h index 303f559d7b30..bddf8b8f2347 100644 --- a/include/linux/dma-buf.h +++ b/include/linux/dma-buf.h @@ -21,6 +21,7 @@ #include #include #include +#include struct device; struct dma_buf; @@ -353,6 +354,9 @@ struct dma_buf_ops { * will be populated with the buffer's flags. */ int (*get_flags)(struct dma_buf *dmabuf, unsigned long *flags); + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; /** @@ -425,6 +429,9 @@ struct dma_buf { struct kset *attach_stats_kset; } *sysfs_entry; #endif + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; /** @@ -505,6 +512,9 @@ struct dma_buf_attachment { unsigned int map_counter; } *sysfs_entry; #endif + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; /** @@ -528,6 +538,9 @@ struct dma_buf_export_info { int flags; struct dma_resv *resv; void *priv; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; /** diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h index 493a047ed0a2..3f8dcaa83a49 100644 --- a/include/linux/dmaengine.h +++ b/include/linux/dmaengine.h @@ -12,6 +12,7 @@ #include #include #include +#include #include /** @@ -941,6 +942,11 @@ struct dma_device { void (*dbg_summary_show)(struct seq_file *s, struct dma_device *dev); struct dentry *dbg_dev_root; #endif + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); }; static inline int dmaengine_slave_config(struct dma_chan *chan, diff --git a/include/linux/fs.h b/include/linux/fs.h index d3a1342281dd..ff841fa9ea35 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -966,6 +966,9 @@ struct file { struct address_space *f_mapping; errseq_t f_wb_err; errseq_t f_sb_err; /* for syncfs */ + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); } __randomize_layout __attribute__((aligned(4))); /* lest something weird decides that 2 is OK */ diff --git a/include/linux/gpio/driver.h b/include/linux/gpio/driver.h index 8e144306e262..ff3e6e3eb9c1 100644 --- a/include/linux/gpio/driver.h +++ b/include/linux/gpio/driver.h @@ -10,6 +10,7 @@ #include #include #include +#include struct gpio_desc; struct of_phandle_args; @@ -266,6 +267,9 @@ struct gpio_irq_chip { * Store old irq_chip irq_mask callback */ void (*irq_mask)(struct irq_data *data); + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; /** @@ -469,6 +473,9 @@ struct gpio_chip { int (*of_xlate)(struct gpio_chip *gc, const struct of_phandle_args *gpiospec, u32 *flags); #endif /* CONFIG_OF_GPIO */ + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; extern const char *gpiochip_is_requested(struct gpio_chip *gc, diff --git a/include/linux/input.h b/include/linux/input.h index 56f2fd32e609..4d752cedf581 100644 --- a/include/linux/input.h +++ b/include/linux/input.h @@ -7,6 +7,7 @@ #include #include +#include #include /* Implementation details, userspace should not care about these */ #define ABS_MT_FIRST ABS_MT_TOUCH_MAJOR @@ -201,6 +202,11 @@ struct input_dev { bool devres_managed; ktime_t timestamp[INPUT_CLK_MAX]; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); }; #define to_input_dev(d) container_of(d, struct input_dev, dev) @@ -320,6 +326,8 @@ struct input_handler { struct list_head h_list; struct list_head node; + + ANDROID_KABI_RESERVE(1); }; /** @@ -346,6 +354,8 @@ struct input_handle { struct list_head d_node; struct list_head h_node; + + ANDROID_KABI_RESERVE(1); }; struct input_dev __must_check *input_allocate_device(void); @@ -550,6 +560,9 @@ struct ff_device { int max_effects; struct ff_effect *effects; + + ANDROID_KABI_RESERVE(1); + struct file *effect_owners[]; }; diff --git a/include/linux/iomap.h b/include/linux/iomap.h index 8a6add3abb3f..257ffd4d921f 100644 --- a/include/linux/iomap.h +++ b/include/linux/iomap.h @@ -89,6 +89,8 @@ struct iomap { void *inline_data; void *private; /* filesystem private */ const struct iomap_page_ops *page_ops; + + ANDROID_KABI_RESERVE(1); }; static inline sector_t diff --git a/include/linux/kernfs.h b/include/linux/kernfs.h index c8529e9fa8de..44349791737a 100644 --- a/include/linux/kernfs.h +++ b/include/linux/kernfs.h @@ -157,6 +157,8 @@ struct kernfs_node { unsigned short flags; umode_t mode; struct kernfs_iattrs *iattr; + + ANDROID_KABI_RESERVE(1); }; /* @@ -198,6 +200,8 @@ struct kernfs_root { struct list_head supers; wait_queue_head_t deactivate_waitq; + + ANDROID_KABI_RESERVE(1); }; struct kernfs_open_file { @@ -218,6 +222,8 @@ struct kernfs_open_file { bool mmapped:1; bool released:1; const struct vm_operations_struct *vm_ops; + + ANDROID_KABI_RESERVE(1); }; struct kernfs_ops { diff --git a/include/linux/key-type.h b/include/linux/key-type.h index 2ab2d6d6aeab..5e85fe05c7b1 100644 --- a/include/linux/key-type.h +++ b/include/linux/key-type.h @@ -10,6 +10,7 @@ #include #include +#include #ifdef CONFIG_KEYS @@ -155,6 +156,9 @@ struct key_type { int (*asym_verify_signature)(struct kernel_pkey_params *params, const void *in, const void *in2); + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + /* internal fields */ struct list_head link; /* link in types list */ struct lock_class_key lock_class; /* key->sem lock class */ diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index 4398d84d2f8b..c853f612a815 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -598,6 +598,8 @@ struct mm_struct { #ifdef CONFIG_IOMMU_SUPPORT u32 pasid; #endif + + ANDROID_KABI_RESERVE(1); } __randomize_layout; /* diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index 6f13f15e95f0..bb62eae4d88a 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h @@ -9,6 +9,7 @@ #include #include +#include struct mmc_cid { unsigned int manfid; @@ -236,6 +237,8 @@ struct mmc_part { #define MMC_BLK_DATA_AREA_BOOT (1<<1) #define MMC_BLK_DATA_AREA_GP (1<<2) #define MMC_BLK_DATA_AREA_RPMB (1<<3) + + ANDROID_KABI_RESERVE(1); }; /* @@ -314,6 +317,8 @@ struct mmc_card { unsigned int bouncesz; /* Bounce buffer size */ struct workqueue_struct *complete_wq; /* Private workqueue */ + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); ANDROID_VENDOR_DATA(1); }; diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index 7891e314599d..6fa9e476e778 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h @@ -16,6 +16,7 @@ #include #include #include +#include #include @@ -176,6 +177,9 @@ struct mmc_host_ops { */ int (*multi_io_quirk)(struct mmc_card *card, unsigned int direction, int blk_size); + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; struct mmc_cqe_ops { @@ -220,6 +224,9 @@ struct mmc_cqe_ops { * will have zero data bytes transferred. */ void (*cqe_recovery_finish)(struct mmc_host *host); + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; struct mmc_async_req { @@ -485,6 +492,8 @@ struct mmc_host { /* Host Software Queue support */ bool hsq_enabled; + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); ANDROID_VENDOR_DATA(1); ANDROID_OEM_DATA(1); diff --git a/include/linux/netfilter.h b/include/linux/netfilter.h index 0101747de549..a12c285222a8 100644 --- a/include/linux/netfilter.h +++ b/include/linux/netfilter.h @@ -14,6 +14,7 @@ #include #include #include +#include #include static inline int NF_DROP_GETERR(int verdict) @@ -171,6 +172,8 @@ struct nf_sockopt_ops { int (*get)(struct sock *sk, int optval, void __user *user, int *len); /* Use the module struct to lock set/get code in place */ struct module *owner; + + ANDROID_KABI_RESERVE(1); }; /* Function to register/unregister hook points. */ @@ -373,6 +376,8 @@ struct nf_nat_hook { unsigned int (*manip_pkt)(struct sk_buff *skb, struct nf_conn *ct, enum nf_nat_manip_type mtype, enum ip_conntrack_dir dir); + + ANDROID_KABI_RESERVE(1); }; extern struct nf_nat_hook __rcu *nf_nat_hook; @@ -457,6 +462,8 @@ struct nf_ct_hook { void (*destroy)(struct nf_conntrack *); bool (*get_tuple_skb)(struct nf_conntrack_tuple *, const struct sk_buff *); + + ANDROID_KABI_RESERVE(1); }; extern struct nf_ct_hook __rcu *nf_ct_hook; @@ -474,6 +481,8 @@ struct nfnl_ct_hook { u32 portid, u32 report); void (*seq_adjust)(struct sk_buff *skb, struct nf_conn *ct, enum ip_conntrack_info ctinfo, s32 off); + + ANDROID_KABI_RESERVE(1); }; extern struct nfnl_ct_hook __rcu *nfnl_ct_hook; diff --git a/include/linux/netfilter/ipset/ip_set.h b/include/linux/netfilter/ipset/ip_set.h index ab192720e2d6..5206d0991022 100644 --- a/include/linux/netfilter/ipset/ip_set.h +++ b/include/linux/netfilter/ipset/ip_set.h @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -190,6 +191,8 @@ struct ip_set_type_variant { bool (*same_set)(const struct ip_set *a, const struct ip_set *b); /* Region-locking is used */ bool region_lock; + + ANDROID_KABI_RESERVE(1); }; struct ip_set_region { @@ -228,6 +231,8 @@ struct ip_set_type { /* Set this to THIS_MODULE if you are a module, otherwise NULL */ struct module *me; + + ANDROID_KABI_RESERVE(1); }; /* register and unregister set type */ @@ -270,6 +275,8 @@ struct ip_set { size_t offset[IPSET_EXT_ID_MAX]; /* The type specific data */ void *data; + + ANDROID_KABI_RESERVE(1); }; static inline void diff --git a/include/linux/netfilter/nfnetlink.h b/include/linux/netfilter/nfnetlink.h index f6267e2883f2..15775bc5b174 100644 --- a/include/linux/netfilter/nfnetlink.h +++ b/include/linux/netfilter/nfnetlink.h @@ -4,6 +4,7 @@ #include #include +#include #include #include @@ -22,6 +23,8 @@ struct nfnl_callback { struct netlink_ext_ack *extack); const struct nla_policy *policy; /* netlink attribute policy */ const u_int16_t attr_count; /* number of nlattr's */ + + ANDROID_KABI_RESERVE(1); }; enum nfnl_abort_action { @@ -41,6 +44,8 @@ struct nfnetlink_subsystem { enum nfnl_abort_action action); void (*cleanup)(struct net *net); bool (*valid_genid)(struct net *net, u32 genid); + + ANDROID_KABI_RESERVE(1); }; int nfnetlink_subsys_register(const struct nfnetlink_subsystem *n); diff --git a/include/linux/netfilter_ipv6.h b/include/linux/netfilter_ipv6.h index 48314ade1506..c3d17fe68426 100644 --- a/include/linux/netfilter_ipv6.h +++ b/include/linux/netfilter_ipv6.h @@ -7,6 +7,7 @@ #ifndef __LINUX_IP6_NETFILTER_H #define __LINUX_IP6_NETFILTER_H +#include #include #include @@ -65,6 +66,8 @@ struct nf_ipv6_ops { const struct nf_bridge_frag_data *data, struct sk_buff *)); #endif + + ANDROID_KABI_RESERVE(1); }; #ifdef CONFIG_NETFILTER diff --git a/include/linux/pci.h b/include/linux/pci.h index cc772efa9713..76ea634f24a7 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -558,6 +558,10 @@ struct pci_host_bridge { resource_size_t start, resource_size_t size, resource_size_t align); + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + unsigned long private[] ____cacheline_aligned; }; @@ -745,6 +749,8 @@ struct pci_ops { void __iomem *(*map_bus)(struct pci_bus *bus, unsigned int devfn, int where); int (*read)(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *val); int (*write)(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 val); + + ANDROID_KABI_RESERVE(1); }; /* @@ -820,6 +826,8 @@ struct pci_error_handlers { /* Device driver may resume normal operations */ void (*resume)(struct pci_dev *dev); + + ANDROID_KABI_RESERVE(1); }; diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h index 17f9cd5626c8..72b8a954e6bb 100644 --- a/include/linux/platform_device.h +++ b/include/linux/platform_device.h @@ -11,6 +11,7 @@ #define _PLATFORM_DEVICE_H_ #include +#include #define PLATFORM_DEVID_NONE (-1) #define PLATFORM_DEVID_AUTO (-2) @@ -37,6 +38,9 @@ struct platform_device { /* arch specific additions */ struct pdev_archdata archdata; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; #define platform_get_device_id(pdev) ((pdev)->id_entry) @@ -94,6 +98,8 @@ struct platform_device_info { u64 dma_mask; const struct property_entry *properties; + + ANDROID_KABI_RESERVE(1); }; extern struct platform_device *platform_device_register_full( const struct platform_device_info *pdevinfo); @@ -206,6 +212,8 @@ struct platform_driver { struct device_driver driver; const struct platform_device_id *id_table; bool prevent_deferred_probe; + + ANDROID_KABI_RESERVE(1); }; #define to_platform_driver(drv) (container_of((drv), struct platform_driver, \ diff --git a/include/linux/pm.h b/include/linux/pm.h index 52d9724db9dc..8b174a8f9f04 100644 --- a/include/linux/pm.h +++ b/include/linux/pm.h @@ -15,6 +15,7 @@ #include #include #include +#include /* * Callbacks for platform drivers to implement. @@ -299,6 +300,8 @@ struct dev_pm_ops { int (*runtime_suspend)(struct device *dev); int (*runtime_resume)(struct device *dev); int (*runtime_idle)(struct device *dev); + + ANDROID_KABI_RESERVE(1); }; #ifdef CONFIG_PM_SLEEP @@ -621,6 +624,9 @@ struct dev_pm_info { struct pm_subsys_data *subsys_data; /* Owned by the subsystem. */ void (*set_latency_tolerance)(struct device *, s32); struct dev_pm_qos *qos; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; extern int dev_pm_get_subsys_data(struct device *dev); @@ -647,6 +653,8 @@ struct dev_pm_domain { int (*activate)(struct device *dev); void (*sync)(struct device *dev); void (*dismiss)(struct device *dev); + + ANDROID_KABI_RESERVE(1); }; /* diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h index aefa0b0bc4c4..a8fa073a09b6 100644 --- a/include/linux/power_supply.h +++ b/include/linux/power_supply.h @@ -17,6 +17,7 @@ #include #include #include +#include /* * All voltages, currents, charges, energies, time and temperatures in uV, @@ -233,6 +234,8 @@ struct power_supply_config { char **supplied_to; size_t num_supplicants; + + ANDROID_KABI_RESERVE(1); }; /* Description of power supply */ @@ -274,6 +277,8 @@ struct power_supply_desc { bool no_thermal; /* For APM emulation, think legacy userspace. */ int use_for_apm; + + ANDROID_KABI_RESERVE(1); }; struct power_supply { @@ -315,6 +320,8 @@ struct power_supply { struct led_trigger *charging_blink_full_solid_trig; char *charging_blink_full_solid_trig_name; #endif + + ANDROID_KABI_RESERVE(1); }; /* @@ -382,6 +389,8 @@ struct power_supply_battery_info { int ocv_table_size[POWER_SUPPLY_OCV_TEMP_MAX]; struct power_supply_resistance_temp_table *resist_table; int resist_table_size; + + ANDROID_KABI_RESERVE(1); }; extern struct atomic_notifier_head power_supply_notifier; diff --git a/include/linux/pwm.h b/include/linux/pwm.h index f0a7329ba3b2..72fe459f0267 100644 --- a/include/linux/pwm.h +++ b/include/linux/pwm.h @@ -5,6 +5,7 @@ #include #include #include +#include struct pwm_capture; struct seq_file; @@ -97,6 +98,8 @@ struct pwm_device { struct pwm_args args; struct pwm_state state; struct pwm_state last; + + ANDROID_KABI_RESERVE(1); }; /** @@ -298,6 +301,8 @@ struct pwm_ops { enum pwm_polarity polarity); int (*enable)(struct pwm_chip *chip, struct pwm_device *pwm); void (*disable)(struct pwm_chip *chip, struct pwm_device *pwm); + + ANDROID_KABI_RESERVE(1); }; /** @@ -324,6 +329,8 @@ struct pwm_chip { /* only used internally by the PWM framework */ struct list_head list; struct pwm_device *pwms; + + ANDROID_KABI_RESERVE(1); }; /** diff --git a/include/linux/regmap.h b/include/linux/regmap.h index e7834d98207f..751ca3869307 100644 --- a/include/linux/regmap.h +++ b/include/linux/regmap.h @@ -19,6 +19,7 @@ #include #include #include +#include struct module; struct clk; @@ -401,6 +402,8 @@ struct regmap_config { unsigned int hwlock_mode; bool can_sleep; + + ANDROID_KABI_RESERVE(1); }; /** @@ -438,6 +441,8 @@ struct regmap_range_cfg { /* Data window (per each page) */ unsigned int window_start; unsigned int window_len; + + ANDROID_KABI_RESERVE(1); }; struct regmap_async; @@ -514,6 +519,8 @@ struct regmap_bus { enum regmap_endian val_format_endian_default; size_t max_raw_read; size_t max_raw_write; + + ANDROID_KABI_RESERVE(1); }; /* diff --git a/include/linux/regulator/driver.h b/include/linux/regulator/driver.h index d7c77ee370f3..4d73dc580d75 100644 --- a/include/linux/regulator/driver.h +++ b/include/linux/regulator/driver.h @@ -17,6 +17,7 @@ #include #include #include +#include struct gpio_desc; struct regmap; @@ -202,6 +203,8 @@ struct regulator_ops { int (*resume)(struct regulator_dev *rdev); int (*set_pull_down) (struct regulator_dev *); + + ANDROID_KABI_RESERVE(1); }; /* @@ -381,6 +384,8 @@ struct regulator_desc { unsigned int poll_enabled_time; unsigned int (*of_map_mode)(unsigned int mode); + + ANDROID_KABI_RESERVE(1); }; /** @@ -473,6 +478,8 @@ struct regulator_dev { /* time when this regulator was disabled last time */ unsigned long last_off_jiffy; + + ANDROID_KABI_RESERVE(1); }; struct regulator_dev * diff --git a/include/linux/rtc.h b/include/linux/rtc.h index 22d1575e4991..d51770334160 100644 --- a/include/linux/rtc.h +++ b/include/linux/rtc.h @@ -16,6 +16,7 @@ #include #include #include +#include #include extern int rtc_month_days(unsigned int month, unsigned int year); @@ -66,6 +67,8 @@ struct rtc_class_ops { int (*alarm_irq_enable)(struct device *, unsigned int enabled); int (*read_offset)(struct device *, long *offset); int (*set_offset)(struct device *, long offset); + + ANDROID_KABI_RESERVE(1); }; struct rtc_device; @@ -140,6 +143,8 @@ struct rtc_device { unsigned int uie_task_active:1; unsigned int uie_timer_active:1; #endif + + ANDROID_KABI_RESERVE(1); }; #define to_rtc_device(d) container_of(d, struct rtc_device, dev) diff --git a/include/linux/scmi_protocol.h b/include/linux/scmi_protocol.h index fb8c8f16a49b..57d23fae3781 100644 --- a/include/linux/scmi_protocol.h +++ b/include/linux/scmi_protocol.h @@ -12,6 +12,7 @@ #include #include #include +#include #define SCMI_MAX_STR_SIZE 16 #define SCMI_MAX_NUM_RATES 16 @@ -82,6 +83,8 @@ struct scmi_clk_proto_ops { u64 rate); int (*enable)(const struct scmi_protocol_handle *ph, u32 clk_id); int (*disable)(const struct scmi_protocol_handle *ph, u32 clk_id); + + ANDROID_KABI_RESERVE(1); }; /** @@ -125,6 +128,8 @@ struct scmi_perf_proto_ops { bool (*fast_switch_possible)(const struct scmi_protocol_handle *ph, struct device *dev); bool (*power_scale_mw_get)(const struct scmi_protocol_handle *ph); + + ANDROID_KABI_RESERVE(1); }; /** @@ -150,6 +155,8 @@ struct scmi_power_proto_ops { u32 state); int (*state_get)(const struct scmi_protocol_handle *ph, u32 domain, u32 *state); + + ANDROID_KABI_RESERVE(1); }; /** @@ -326,6 +333,8 @@ struct scmi_sensor_info { unsigned int resolution; int exponent; struct scmi_range_attrs scalar_attrs; + + ANDROID_KABI_RESERVE(1); }; /* @@ -461,6 +470,8 @@ struct scmi_sensor_proto_ops { u32 sensor_id, u32 *sensor_config); int (*config_set)(const struct scmi_protocol_handle *ph, u32 sensor_id, u32 sensor_config); + + ANDROID_KABI_RESERVE(1); }; /** @@ -481,6 +492,8 @@ struct scmi_reset_proto_ops { int (*reset)(const struct scmi_protocol_handle *ph, u32 domain); int (*assert)(const struct scmi_protocol_handle *ph, u32 domain); int (*deassert)(const struct scmi_protocol_handle *ph, u32 domain); + + ANDROID_KABI_RESERVE(1); }; /** @@ -625,6 +638,8 @@ struct scmi_handle { void (*devm_put_protocol)(struct scmi_device *sdev, u8 proto); const struct scmi_notify_ops *notify_ops; + + ANDROID_KABI_RESERVE(1); }; enum scmi_std_protocol { @@ -653,6 +668,8 @@ struct scmi_device { const char *name; struct device dev; struct scmi_handle *handle; + + ANDROID_KABI_RESERVE(1); }; #define to_scmi_dev(d) container_of(d, struct scmi_device, dev) diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h index ff63c2963359..0a361d4b58de 100644 --- a/include/linux/serial_core.h +++ b/include/linux/serial_core.h @@ -17,6 +17,7 @@ #include #include #include +#include #include #ifdef CONFIG_SERIAL_CORE_CONSOLE @@ -80,6 +81,9 @@ struct uart_ops { void (*poll_put_char)(struct uart_port *, unsigned char); int (*poll_get_char)(struct uart_port *); #endif + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; #define NO_POLL_CHAR 0x00ff0000 @@ -256,6 +260,9 @@ struct uart_port { struct gpio_desc *rs485_term_gpio; /* enable RS485 bus termination */ struct serial_iso7816 iso7816; void *private_data; /* generic platform data pointer */ + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; static inline int serial_port_in(struct uart_port *up, int offset) @@ -318,6 +325,8 @@ struct uart_driver { */ struct uart_state *state; struct tty_driver *tty_driver; + + ANDROID_KABI_RESERVE(1); }; void uart_write_wakeup(struct uart_port *port); diff --git a/include/linux/serio.h b/include/linux/serio.h index 6c27d413da92..25d638f584a6 100644 --- a/include/linux/serio.h +++ b/include/linux/serio.h @@ -13,6 +13,7 @@ #include #include #include +#include #include extern struct bus_type serio_bus; @@ -61,6 +62,8 @@ struct serio { * may get indigestion when exposed to concurrent access (i8042). */ struct mutex *ps2_cmd_mutex; + + ANDROID_KABI_RESERVE(1); }; #define to_serio_port(d) container_of(d, struct serio, dev) @@ -79,6 +82,8 @@ struct serio_driver { void (*cleanup)(struct serio *); struct device_driver driver; + + ANDROID_KABI_RESERVE(1); }; #define to_serio_driver(d) container_of(d, struct serio_driver, driver) diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index b390fdac1587..f47b06683b36 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h @@ -14,6 +14,7 @@ #include #include #include +#include struct dma_chan; struct property_entry; @@ -197,6 +198,9 @@ struct spi_device { /* the statistics */ struct spi_statistics statistics; + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + /* * likely need more hooks for more protocol options affecting how * the controller talks to each chip, like: @@ -281,6 +285,8 @@ struct spi_driver { int (*remove)(struct spi_device *spi); void (*shutdown)(struct spi_device *spi); struct device_driver driver; + + ANDROID_KABI_RESERVE(1); }; static inline struct spi_driver *to_spi_driver(struct device_driver *drv) @@ -667,6 +673,9 @@ struct spi_controller { /* Interrupt enable state during PTP system timestamping */ unsigned long irq_flags; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; static inline void *spi_controller_get_devdata(struct spi_controller *ctlr) @@ -964,6 +973,8 @@ struct spi_transfer { #define SPI_TRANS_FAIL_NO_START BIT(0) u16 error; + + ANDROID_KABI_RESERVE(1); }; /** @@ -1030,6 +1041,8 @@ struct spi_message { /* list of spi_res reources when the spi message is processed */ struct list_head resources; + + ANDROID_KABI_RESERVE(1); }; static inline void spi_message_init_no_memset(struct spi_message *m) @@ -1468,6 +1481,8 @@ struct spi_board_info { */ u32 mode; + ANDROID_KABI_RESERVE(1); + /* ... may need additional spi_device chip config data here. * avoid stuff protocol drivers can set; but include stuff * needed to behave without being bound to a driver: diff --git a/include/linux/spmi.h b/include/linux/spmi.h index 394a3f68bad5..6744f7cfadaf 100644 --- a/include/linux/spmi.h +++ b/include/linux/spmi.h @@ -7,6 +7,7 @@ #include #include #include +#include /* Maximum slave identifier */ #define SPMI_MAX_SLAVE_ID 16 @@ -85,6 +86,7 @@ struct spmi_controller { u8 sid, u16 addr, u8 *buf, size_t len); int (*write_cmd)(struct spmi_controller *ctrl, u8 opcode, u8 sid, u16 addr, const u8 *buf, size_t len); + ANDROID_KABI_RESERVE(1); }; static inline struct spmi_controller *to_spmi_controller(struct device *d) @@ -138,6 +140,7 @@ struct spmi_driver { struct device_driver driver; int (*probe)(struct spmi_device *sdev); void (*remove)(struct spmi_device *sdev); + ANDROID_KABI_RESERVE(1); }; static inline struct spmi_driver *to_spmi_driver(struct device_driver *d) diff --git a/include/linux/suspend.h b/include/linux/suspend.h index 04b337d3a3cb..fa2ea36a7bd7 100644 --- a/include/linux/suspend.h +++ b/include/linux/suspend.h @@ -8,6 +8,7 @@ #include #include #include +#include #include #ifdef CONFIG_VT @@ -185,6 +186,8 @@ struct platform_suspend_ops { bool (*suspend_again)(void); void (*end)(void); void (*recover)(void); + + ANDROID_KABI_RESERVE(1); }; struct platform_s2idle_ops { @@ -195,6 +198,8 @@ struct platform_s2idle_ops { void (*restore_early)(void); void (*restore)(void); void (*end)(void); + + ANDROID_KABI_RESERVE(1); }; #ifdef CONFIG_SUSPEND @@ -426,6 +431,8 @@ struct platform_hibernation_ops { int (*pre_restore)(void); void (*restore_cleanup)(void); void (*recover)(void); + + ANDROID_KABI_RESERVE(1); }; #ifdef CONFIG_HIBERNATION diff --git a/include/linux/tcp.h b/include/linux/tcp.h index 2f87377e9af7..b163dbd6875c 100644 --- a/include/linux/tcp.h +++ b/include/linux/tcp.h @@ -16,6 +16,7 @@ #include #include +#include #include #include #include @@ -412,6 +413,8 @@ struct tcp_sock { */ struct request_sock __rcu *fastopen_rsk; struct saved_syn *saved_syn; + + ANDROID_KABI_RESERVE(1); }; enum tsq_enum { diff --git a/include/linux/thermal.h b/include/linux/thermal.h index fa9c9eae22a0..a7c121d53960 100644 --- a/include/linux/thermal.h +++ b/include/linux/thermal.h @@ -15,6 +15,7 @@ #include #include #include +#include #include #define THERMAL_TRIPS_NONE -1 @@ -79,6 +80,7 @@ struct thermal_zone_device_ops { enum thermal_trend *); int (*notify) (struct thermal_zone_device *, int, enum thermal_trip_type); + ANDROID_KABI_RESERVE(1); }; struct thermal_cooling_device_ops { @@ -88,6 +90,8 @@ struct thermal_cooling_device_ops { int (*get_requested_power)(struct thermal_cooling_device *, u32 *); int (*state2power)(struct thermal_cooling_device *, unsigned long, u32 *); int (*power2state)(struct thermal_cooling_device *, u32, unsigned long *); + + ANDROID_KABI_RESERVE(1); }; struct thermal_cooling_device { @@ -102,6 +106,8 @@ struct thermal_cooling_device { struct mutex lock; /* protect thermal_instances list */ struct list_head thermal_instances; struct list_head node; + + ANDROID_KABI_RESERVE(1); }; /** @@ -179,6 +185,8 @@ struct thermal_zone_device { struct list_head node; struct delayed_work poll_queue; enum thermal_notify_event notify_event; + + ANDROID_KABI_RESERVE(1); }; /** @@ -199,6 +207,8 @@ struct thermal_governor { void (*unbind_from_tz)(struct thermal_zone_device *tz); int (*throttle)(struct thermal_zone_device *tz, int trip); struct list_head governor_list; + + ANDROID_KABI_RESERVE(1); }; /* Structure that holds binding parameters for a zone */ @@ -234,6 +244,8 @@ struct thermal_bind_params { unsigned long *binding_limits; int (*match) (struct thermal_zone_device *tz, struct thermal_cooling_device *cdev); + + ANDROID_KABI_RESERVE(1); }; /* Structure to define Thermal Zone parameters */ @@ -287,6 +299,8 @@ struct thermal_zone_params { * Used by thermal zone drivers (default 0). */ int offset; + + ANDROID_KABI_RESERVE(1); }; /** @@ -311,6 +325,8 @@ struct thermal_zone_of_device_ops { int (*set_trips)(void *, int, int); int (*set_emul_temp)(void *, int); int (*set_trip_temp)(void *, int, int); + + ANDROID_KABI_RESERVE(1); }; /* Function declarations */ diff --git a/include/linux/tty.h b/include/linux/tty.h index 94fa384a650b..bd76f2f1cde0 100644 --- a/include/linux/tty.h +++ b/include/linux/tty.h @@ -14,6 +14,7 @@ #include #include #include +#include /* @@ -218,6 +219,8 @@ struct tty_port_operations { int (*activate)(struct tty_port *port, struct tty_struct *tty); /* Called on the final put of a port */ void (*destruct)(struct tty_port *port); + + ANDROID_KABI_RESERVE(1); }; struct tty_port_client_operations { @@ -252,6 +255,8 @@ struct tty_port { set to size of fifo */ struct kref kref; /* Ref counter */ void *client_data; + + ANDROID_KABI_RESERVE(1); }; /* tty_port::iflags bits -- use atomic bit ops */ @@ -345,6 +350,9 @@ struct tty_struct { /* If the tty has a pending do_SAK, queue it here - akpm */ struct work_struct SAK_work; struct tty_port *port; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); } __randomize_layout; /* Each of a tty's open files has private_data pointing to tty_file_private */ diff --git a/include/linux/tty_driver.h b/include/linux/tty_driver.h index 5d509c125171..61f29370e1c3 100644 --- a/include/linux/tty_driver.h +++ b/include/linux/tty_driver.h @@ -237,6 +237,7 @@ #include #include #include +#include struct tty_struct; struct tty_driver; @@ -292,6 +293,9 @@ struct tty_operations { void (*poll_put_char)(struct tty_driver *driver, int line, char ch); #endif int (*proc_show)(struct seq_file *, void *); + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); } __randomize_layout; struct tty_driver { @@ -326,6 +330,9 @@ struct tty_driver { const struct tty_operations *ops; struct list_head tty_drivers; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); } __randomize_layout; extern struct list_head tty_drivers; diff --git a/include/linux/tty_ldisc.h b/include/linux/tty_ldisc.h index 572a07976116..689ba487e752 100644 --- a/include/linux/tty_ldisc.h +++ b/include/linux/tty_ldisc.h @@ -126,6 +126,7 @@ #include #include #include +#include /* * the semaphore definition @@ -211,6 +212,9 @@ struct tty_ldisc_ops { struct module *owner; int refcount; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; struct tty_ldisc { diff --git a/include/linux/uio_driver.h b/include/linux/uio_driver.h index 54bf6b118401..77131e8fefcc 100644 --- a/include/linux/uio_driver.h +++ b/include/linux/uio_driver.h @@ -16,6 +16,7 @@ #include #include #include +#include struct module; struct uio_map; @@ -77,6 +78,8 @@ struct uio_device { struct mutex info_lock; struct kobject *map_dir; struct kobject *portio_dir; + + ANDROID_KABI_RESERVE(1); }; /** @@ -109,6 +112,7 @@ struct uio_info { int (*open)(struct uio_info *info, struct inode *inode); int (*release)(struct uio_info *info, struct inode *inode); int (*irqcontrol)(struct uio_info *info, s32 irq_on); + ANDROID_KABI_RESERVE(1); }; extern int __must_check diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h index ea02847923bf..cf14bb3912f0 100644 --- a/include/linux/usb/gadget.h +++ b/include/linux/usb/gadget.h @@ -123,6 +123,8 @@ struct usb_request { int status; unsigned actual; + + ANDROID_KABI_RESERVE(1); }; /*-------------------------------------------------------------------------*/ @@ -153,6 +155,8 @@ struct usb_ep_ops { int (*fifo_status) (struct usb_ep *ep); void (*fifo_flush) (struct usb_ep *ep); + + ANDROID_KABI_RESERVE(1); }; /** @@ -241,6 +245,8 @@ struct usb_ep { u8 address; const struct usb_endpoint_descriptor *desc; const struct usb_ss_ep_comp_descriptor *comp_desc; + + ANDROID_KABI_RESERVE(1); }; /*-------------------------------------------------------------------------*/ @@ -329,6 +335,11 @@ struct usb_gadget_ops { struct usb_ep *(*match_ep)(struct usb_gadget *, struct usb_endpoint_descriptor *, struct usb_ss_ep_comp_descriptor *); + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); }; /** diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h index 69f1b6328532..10cb3d193d77 100644 --- a/include/linux/usb/otg.h +++ b/include/linux/usb/otg.h @@ -12,6 +12,7 @@ #include #include +#include struct usb_otg { u8 default_a; @@ -40,6 +41,7 @@ struct usb_otg { /* start or continue HNP role switch */ int (*start_hnp)(struct usb_otg *otg); + ANDROID_KABI_RESERVE(1); }; /** diff --git a/include/linux/usb/phy.h b/include/linux/usb/phy.h index e4de6bc1f69b..888d2fdb662f 100644 --- a/include/linux/usb/phy.h +++ b/include/linux/usb/phy.h @@ -13,6 +13,7 @@ #include #include #include +#include #include enum usb_phy_interface { @@ -155,6 +156,8 @@ struct usb_phy { * manually detect the charger type. */ enum usb_charger_type (*charger_detect)(struct usb_phy *x); + + ANDROID_KABI_RESERVE(1); }; /* for board-specific init logic */ diff --git a/include/linux/usb/typec.h b/include/linux/usb/typec.h index 91b4303ca305..b2e2c302caa6 100644 --- a/include/linux/usb/typec.h +++ b/include/linux/usb/typec.h @@ -4,6 +4,7 @@ #define __LINUX_USB_TYPEC_H #include +#include /* USB Type-C Specification releases */ #define USB_TYPEC_REV_1_0 0x100 /* 1.0 */ @@ -215,6 +216,7 @@ struct typec_operations { int (*vconn_set)(struct typec_port *port, enum typec_role role); int (*port_type_set)(struct typec_port *port, enum typec_port_type type); + ANDROID_KABI_RESERVE(1); }; enum usb_pd_svdm_ver { @@ -252,6 +254,7 @@ struct typec_capability { void *driver_data; const struct typec_operations *ops; + ANDROID_KABI_RESERVE(1); }; /* Specific to try_role(). Indicates the user want's to clear the preference. */ diff --git a/include/linux/usb/typec_altmode.h b/include/linux/usb/typec_altmode.h index 65933cbe9129..60531284df7c 100644 --- a/include/linux/usb/typec_altmode.h +++ b/include/linux/usb/typec_altmode.h @@ -30,6 +30,7 @@ struct typec_altmode { char *desc; const struct typec_altmode_ops *ops; + ANDROID_KABI_RESERVE(1); }; #define to_typec_altmode(d) container_of(d, struct typec_altmode, dev) @@ -63,6 +64,7 @@ struct typec_altmode_ops { int (*notify)(struct typec_altmode *altmode, unsigned long conf, void *data); int (*activate)(struct typec_altmode *altmode, int activate); + ANDROID_KABI_RESERVE(1); }; int typec_altmode_enter(struct typec_altmode *altmode, u32 *vdo); diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h index ead627c00655..113d39905b8c 100644 --- a/include/media/v4l2-ctrls.h +++ b/include/media/v4l2-ctrls.h @@ -11,6 +11,7 @@ #include #include #include +#include #include /* @@ -87,6 +88,9 @@ union v4l2_ctrl_ptr { struct v4l2_area *p_area; void *p; const void *p_const; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; /** @@ -119,6 +123,8 @@ struct v4l2_ctrl_ops { int (*g_volatile_ctrl)(struct v4l2_ctrl *ctrl); int (*try_ctrl)(struct v4l2_ctrl *ctrl); int (*s_ctrl)(struct v4l2_ctrl *ctrl); + + ANDROID_KABI_RESERVE(1); }; /** @@ -140,6 +146,8 @@ struct v4l2_ctrl_type_ops { void (*log)(const struct v4l2_ctrl *ctrl); int (*validate)(const struct v4l2_ctrl *ctrl, u32 idx, union v4l2_ctrl_ptr ptr); + + ANDROID_KABI_RESERVE(1); }; /** @@ -290,6 +298,8 @@ struct v4l2_ctrl { union v4l2_ctrl_ptr p_def; union v4l2_ctrl_ptr p_new; union v4l2_ctrl_ptr p_cur; + + ANDROID_KABI_RESERVE(1); }; /** @@ -329,6 +339,8 @@ struct v4l2_ctrl_ref { bool req_done; bool valid_p_req; union v4l2_ctrl_ptr p_req; + + ANDROID_KABI_RESERVE(1); }; /** @@ -379,6 +391,8 @@ struct v4l2_ctrl_handler { struct list_head requests; struct list_head requests_queued; struct media_request_object req_obj; + + ANDROID_KABI_RESERVE(1); }; /** @@ -430,6 +444,8 @@ struct v4l2_ctrl_config { const char * const *qmenu; const s64 *qmenu_int; unsigned int is_private:1; + + ANDROID_KABI_RESERVE(1); }; /** diff --git a/include/media/v4l2-dev.h b/include/media/v4l2-dev.h index ad2d41952442..3a66e78e8e3b 100644 --- a/include/media/v4l2-dev.h +++ b/include/media/v4l2-dev.h @@ -16,6 +16,7 @@ #include #include #include +#include #include @@ -211,6 +212,8 @@ struct v4l2_file_operations { int (*mmap) (struct file *, struct vm_area_struct *); int (*open) (struct file *); int (*release) (struct file *); + + ANDROID_KABI_RESERVE(1); }; /* @@ -307,6 +310,9 @@ struct video_device DECLARE_BITMAP(valid_ioctls, BASE_VIDIOC_PRIVATE); struct mutex *lock; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; /** diff --git a/include/media/videobuf2-v4l2.h b/include/media/videobuf2-v4l2.h index c203047eb834..1c59f0951b3b 100644 --- a/include/media/videobuf2-v4l2.h +++ b/include/media/videobuf2-v4l2.h @@ -13,6 +13,7 @@ #define _MEDIA_VIDEOBUF2_V4L2_H #include +#include #include #if VB2_MAX_FRAME != VIDEO_MAX_FRAME @@ -51,6 +52,8 @@ struct vb2_v4l2_buffer { __s32 request_fd; bool is_held; struct vb2_plane planes[VB2_MAX_PLANES]; + + ANDROID_KABI_RESERVE(1); }; /* VB2 V4L2 flags as set in vb2_queue.subsystem_flags */ diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index df611c8b6b59..36a6f84c5c49 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -564,6 +565,11 @@ struct hci_dev { int (*set_bdaddr)(struct hci_dev *hdev, const bdaddr_t *bdaddr); void (*cmd_timeout)(struct hci_dev *hdev); bool (*prevent_wake)(struct hci_dev *hdev); + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); }; #define HCI_PHY_HANDLE(handle) (handle & 0xff) @@ -660,6 +666,11 @@ struct hci_conn { void (*connect_cfm_cb) (struct hci_conn *conn, u8 status); void (*security_cfm_cb) (struct hci_conn *conn, u8 status); void (*disconn_cfm_cb) (struct hci_conn *conn, u8 reason); + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); }; struct hci_chan { @@ -670,6 +681,8 @@ struct hci_chan { unsigned int sent; __u8 state; bool amp; + + ANDROID_KABI_RESERVE(1); }; struct hci_conn_params { @@ -696,6 +709,8 @@ struct hci_conn_params { struct hci_conn *conn; bool explicit_connect; u32 current_flags; + + ANDROID_KABI_RESERVE(1); }; extern struct list_head hci_dev_list; @@ -1415,6 +1430,8 @@ struct hci_cb { __u8 encrypt); void (*key_change_cfm) (struct hci_conn *conn, __u8 status); void (*role_switch_cfm) (struct hci_conn *conn, __u8 status, __u8 role); + + ANDROID_KABI_RESERVE(1); }; static inline void hci_connect_cfm(struct hci_conn *conn, __u8 status) @@ -1675,6 +1692,8 @@ struct hci_mgmt_chan { size_t handler_count; const struct hci_mgmt_handler *handlers; void (*hdev_init) (struct sock *sk, struct hci_dev *hdev); + + ANDROID_KABI_RESERVE(1); }; int hci_mgmt_chan_register(struct hci_mgmt_chan *c); diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h index 1d1232917de7..8c99677077b6 100644 --- a/include/net/bluetooth/l2cap.h +++ b/include/net/bluetooth/l2cap.h @@ -29,6 +29,7 @@ #include #include +#include /* L2CAP defaults */ #define L2CAP_DEFAULT_MTU 672 @@ -643,6 +644,9 @@ struct l2cap_chan { void *data; const struct l2cap_ops *ops; struct mutex lock; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; struct l2cap_ops { @@ -667,6 +671,9 @@ struct l2cap_ops { unsigned long len, int nb); int (*filter) (struct l2cap_chan * chan, struct sk_buff *skb); + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; struct l2cap_conn { @@ -702,6 +709,9 @@ struct l2cap_conn { struct mutex chan_lock; struct kref ref; struct list_head users; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; struct l2cap_user { diff --git a/include/net/bluetooth/rfcomm.h b/include/net/bluetooth/rfcomm.h index 99d26879b02a..d8f4e835ede8 100644 --- a/include/net/bluetooth/rfcomm.h +++ b/include/net/bluetooth/rfcomm.h @@ -22,6 +22,7 @@ */ #include +#include #ifndef __RFCOMM_H #define __RFCOMM_H @@ -164,6 +165,8 @@ struct rfcomm_session { uint mtu; struct list_head dlcs; + + ANDROID_KABI_RESERVE(1); }; struct rfcomm_dlc { @@ -197,6 +200,9 @@ struct rfcomm_dlc { void (*data_ready)(struct rfcomm_dlc *d, struct sk_buff *skb); void (*state_change)(struct rfcomm_dlc *d, int err); void (*modem_status)(struct rfcomm_dlc *d, u8 v24_sig); + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; /* DLC and session flags */ diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index fab23df83050..81d5b2486c04 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -20,6 +20,7 @@ #include #include #include +#include #include /** @@ -1042,6 +1043,8 @@ struct cfg80211_crypto_settings { const u8 *sae_pwd; u8 sae_pwd_len; enum nl80211_sae_pwe_mechanism sae_pwe; + + ANDROID_KABI_RESERVE(1); }; /** @@ -1088,6 +1091,8 @@ struct cfg80211_beacon_data { size_t probe_resp_len; size_t lci_len; size_t civicloc_len; + + ANDROID_KABI_RESERVE(1); }; struct mac_address { @@ -1224,6 +1229,8 @@ struct cfg80211_ap_settings { struct cfg80211_he_bss_color he_bss_color; struct cfg80211_fils_discovery fils_discovery; struct cfg80211_unsol_bcast_probe_resp unsol_bcast_probe_resp; + + ANDROID_KABI_RESERVE(1); }; /** @@ -1253,6 +1260,8 @@ struct cfg80211_csa_settings { bool radar_required; bool block_tx; u8 count; + + ANDROID_KABI_RESERVE(1); }; #define CFG80211_MAX_NUM_DIFFERENT_CHANNELS 10 @@ -1395,6 +1404,8 @@ struct station_parameters { u16 airtime_weight; struct sta_txpwr txpwr; const struct ieee80211_he_6ghz_capa *he_6ghz_capa; + + ANDROID_KABI_RESERVE(1); }; /** @@ -1741,6 +1752,8 @@ struct station_info { u32 airtime_link_metric; u8 connected_to_as; + + ANDROID_KABI_RESERVE(1); }; #if IS_ENABLED(CONFIG_CFG80211) @@ -1995,6 +2008,8 @@ struct mesh_config { u16 dot11MeshAwakeWindowDuration; u32 plink_timeout; bool dot11MeshNolearn; + + ANDROID_KABI_RESERVE(1); }; /** @@ -2044,6 +2059,8 @@ struct mesh_setup { struct cfg80211_bitrate_mask beacon_rate; bool userspace_handles_dfs; bool control_port_over_nl80211; + + ANDROID_KABI_RESERVE(1); }; /** @@ -2205,6 +2222,8 @@ struct cfg80211_scan_request { u32 n_6ghz_params; struct cfg80211_scan_6ghz_params *scan_6ghz_params; + ANDROID_KABI_RESERVE(1); + /* keep last */ struct ieee80211_channel *channels[]; }; @@ -2351,6 +2370,8 @@ struct cfg80211_sched_scan_request { bool nl_owner_dead; struct list_head list; + ANDROID_KABI_RESERVE(1); + /* keep last */ struct ieee80211_channel *channels[]; }; @@ -2474,6 +2495,8 @@ struct cfg80211_bss { u8 bssid_index; u8 max_bssid_indicator; + ANDROID_KABI_RESERVE(1); + u8 priv[] __aligned(sizeof(void *)); }; @@ -2600,6 +2623,8 @@ struct cfg80211_assoc_request { size_t fils_kek_len; const u8 *fils_nonces; struct ieee80211_s1g_cap s1g_capa, s1g_capa_mask; + + ANDROID_KABI_RESERVE(1); }; /** @@ -2698,6 +2723,8 @@ struct cfg80211_ibss_params { struct ieee80211_ht_cap ht_capa_mask; struct key_params *wep_keys; int wep_tx_key; + + ANDROID_KABI_RESERVE(1); }; /** @@ -2812,6 +2839,8 @@ struct cfg80211_connect_params { size_t fils_erp_rrk_len; bool want_1x; struct ieee80211_edmg edmg; + + ANDROID_KABI_RESERVE(1); }; /** @@ -3269,6 +3298,8 @@ struct cfg80211_nan_func { u8 num_rx_filters; u8 instance_id; u64 cookie; + + ANDROID_KABI_RESERVE(1); }; /** @@ -3429,6 +3460,8 @@ struct cfg80211_pmsr_ftm_result { dist_avg_valid:1, dist_variance_valid:1, dist_spread_valid:1; + + ANDROID_KABI_RESERVE(1); }; /** @@ -4265,6 +4298,10 @@ struct cfg80211_ops { struct cfg80211_tid_config *tid_conf); int (*reset_tid_config)(struct wiphy *wiphy, struct net_device *dev, const u8 *peer, u8 tids); + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); }; /* @@ -4628,6 +4665,8 @@ struct wiphy_vendor_command { unsigned long *storage); const struct nla_policy *policy; unsigned int maxattr; + + ANDROID_KABI_RESERVE(1); }; /** @@ -5033,6 +5072,8 @@ struct wiphy { u8 max_data_retry_count; + ANDROID_KABI_RESERVE(1); + char priv[] __aligned(NETDEV_ALIGN); }; @@ -5332,6 +5373,9 @@ struct wireless_dev { struct work_struct pmsr_free_wk; unsigned long unprot_beacon_reported; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; static inline u8 *wdev_address(struct wireless_dev *wdev) diff --git a/include/net/genetlink.h b/include/net/genetlink.h index e55ec1597ce7..d66f0f397f2e 100644 --- a/include/net/genetlink.h +++ b/include/net/genetlink.h @@ -3,6 +3,7 @@ #define __NET_GENERIC_NETLINK_H #include +#include #include #include @@ -67,6 +68,8 @@ struct genl_family { const struct genl_small_ops *small_ops; const struct genl_multicast_group *mcgrps; struct module *module; + + ANDROID_KABI_RESERVE(1); }; /** @@ -158,6 +161,8 @@ struct genl_ops { u8 internal_flags; u8 flags; u8 validate; + + ANDROID_KABI_RESERVE(1); }; /** diff --git a/include/net/inet_connection_sock.h b/include/net/inet_connection_sock.h index aa92af3dd444..8177cb94958c 100644 --- a/include/net/inet_connection_sock.h +++ b/include/net/inet_connection_sock.h @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -51,6 +52,8 @@ struct inet_connection_sock_af_ops { char __user *optval, int __user *optlen); void (*addr2sockaddr)(struct sock *sk, struct sockaddr *); void (*mtu_reduced)(struct sock *sk); + + ANDROID_KABI_RESERVE(1); }; /** inet_connection_sock - INET connection oriented sock @@ -134,6 +137,8 @@ struct inet_connection_sock { u32 icsk_probes_tstamp; u32 icsk_user_timeout; + ANDROID_KABI_RESERVE(1); + u64 icsk_ca_priv[104 / sizeof(u64)]; #define ICSK_CA_PRIV_SIZE (13 * sizeof(u64)) }; diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h index ac5ff3c3afb1..bd4bfdd30e28 100644 --- a/include/net/ip6_fib.h +++ b/include/net/ip6_fib.h @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -67,6 +68,8 @@ struct fib6_config { struct nlattr *fc_encap; u16 fc_encap_type; bool fc_is_fdb; + + ANDROID_KABI_RESERVE(1); }; struct fib6_node { @@ -83,6 +86,8 @@ struct fib6_node { int fn_sernum; struct fib6_info __rcu *rr_ptr; struct rcu_head rcu; + + ANDROID_KABI_RESERVE(1); }; struct fib6_gc_args { @@ -199,6 +204,9 @@ struct fib6_info { struct rcu_head rcu; struct nexthop *nh; + + ANDROID_KABI_RESERVE(1); + struct fib6_nh fib6_nh[]; }; @@ -218,6 +226,8 @@ struct rt6_info { /* more non-fragment space at head required */ unsigned short rt6i_nfheader_len; + + ANDROID_KABI_RESERVE(1); }; struct fib6_result { diff --git a/include/net/mac80211.h b/include/net/mac80211.h index dcdba96814a2..0f701f9a8d79 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -701,6 +702,8 @@ struct ieee80211_bss_conf { u32 unsol_bcast_probe_resp_interval; bool s1g; struct cfg80211_bitrate_mask beacon_tx_rate; + + ANDROID_KABI_RESERVE(1); }; /** @@ -1097,6 +1100,9 @@ struct ieee80211_tx_info { void *rate_driver_data[ IEEE80211_TX_INFO_RATE_DRIVER_DATA_SIZE / sizeof(void *)]; }; + + ANDROID_KABI_RESERVE(1); + void *driver_data[ IEEE80211_TX_INFO_DRIVER_DATA_SIZE / sizeof(void *)]; }; @@ -1583,6 +1589,8 @@ struct ieee80211_conf { struct cfg80211_chan_def chandef; bool radar_enabled; enum ieee80211_smps_mode smps_mode; + + ANDROID_KABI_RESERVE(1); }; /** @@ -1727,6 +1735,8 @@ struct ieee80211_vif { bool txqs_stopped[IEEE80211_NUM_ACS]; + ANDROID_KABI_RESERVE(1); + /* must be last */ u8 drv_priv[] __aligned(sizeof(void *)); }; @@ -2112,6 +2122,8 @@ struct ieee80211_sta { struct ieee80211_txq *txq[IEEE80211_NUM_TIDS + 1]; + ANDROID_KABI_RESERVE(1); + /* must be last */ u8 drv_priv[] __aligned(sizeof(void *)); }; @@ -2606,6 +2618,8 @@ struct ieee80211_hw { u8 tx_sk_pacing_shift; u8 weight_multiplier; u32 max_mtu; + + ANDROID_KABI_RESERVE(1); }; static inline bool _ieee80211_hw_check(struct ieee80211_hw *hw, @@ -4192,6 +4206,11 @@ struct ieee80211_ops { struct ieee80211_vif *vif); void (*sta_set_4addr)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, struct ieee80211_sta *sta, bool enabled); + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); }; /** @@ -6161,6 +6180,11 @@ struct rate_control_ops { struct dentry *dir); u32 (*get_expected_throughput)(void *priv_sta); + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); }; static inline int rate_supported(struct ieee80211_sta *sta, diff --git a/include/net/neighbour.h b/include/net/neighbour.h index 22ced1381ede..8a26efdadbbc 100644 --- a/include/net/neighbour.h +++ b/include/net/neighbour.h @@ -28,6 +28,7 @@ #include #include #include +#include #include /* @@ -83,6 +84,8 @@ struct neigh_parms { int reachable_time; int data[NEIGH_VAR_DATA_MAX]; DECLARE_BITMAP(data_state, NEIGH_VAR_DATA_MAX); + + ANDROID_KABI_RESERVE(1); }; static inline void neigh_var_set(struct neigh_parms *p, int index, int val) @@ -157,6 +160,9 @@ struct neighbour { struct list_head gc_list; struct rcu_head rcu; struct net_device *dev; + + ANDROID_KABI_RESERVE(1); + u8 primary_key[0]; } __randomize_layout; @@ -226,6 +232,8 @@ struct neigh_table { struct neigh_statistics __percpu *stats; struct neigh_hash_table __rcu *nht; struct pneigh_entry **phash_buckets; + + ANDROID_KABI_RESERVE(1); }; enum { diff --git a/include/net/netns/can.h b/include/net/netns/can.h index 52fbd8291a96..d075f610e647 100644 --- a/include/net/netns/can.h +++ b/include/net/netns/can.h @@ -7,6 +7,7 @@ #define __NETNS_CAN_H__ #include +#include struct can_dev_rcv_lists; struct can_pkg_stats; @@ -35,6 +36,8 @@ struct netns_can { /* CAN GW per-net gateway jobs */ struct hlist_head cgw_list; + + ANDROID_KABI_RESERVE(1); }; #endif /* __NETNS_CAN_H__ */ diff --git a/include/net/netns/ipv4.h b/include/net/netns/ipv4.h index 175206956080..13b3defd5cb0 100644 --- a/include/net/netns/ipv4.h +++ b/include/net/netns/ipv4.h @@ -10,6 +10,7 @@ #include #include #include +#include struct tcpm_hash_bucket; struct ctl_table_header; @@ -228,5 +229,7 @@ struct netns_ipv4 { atomic_t rt_genid; siphash_key_t ip_id_key; + + ANDROID_KABI_RESERVE(1); }; #endif diff --git a/include/net/netns/ipv6.h b/include/net/netns/ipv6.h index 5ec054473d81..213e96241e76 100644 --- a/include/net/netns/ipv6.h +++ b/include/net/netns/ipv6.h @@ -7,6 +7,7 @@ #ifndef __NETNS_IPV6_H__ #define __NETNS_IPV6_H__ +#include #include #include @@ -115,6 +116,8 @@ struct netns_ipv6 { spinlock_t lock; u32 seq; } ip6addrlbl_table; + + ANDROID_KABI_RESERVE(1); }; #if IS_ENABLED(CONFIG_NF_DEFRAG_IPV6) diff --git a/include/net/netns/netfilter.h b/include/net/netns/netfilter.h index ca043342c0eb..fa2663747a85 100644 --- a/include/net/netns/netfilter.h +++ b/include/net/netns/netfilter.h @@ -3,6 +3,7 @@ #define __NETNS_NETFILTER_H #include +#include struct proc_dir_entry; struct nf_logger; @@ -34,5 +35,7 @@ struct netns_nf { #if IS_ENABLED(CONFIG_NF_DEFRAG_IPV6) bool defrag_ipv6; #endif + + ANDROID_KABI_RESERVE(1); }; #endif diff --git a/include/net/netns/nftables.h b/include/net/netns/nftables.h index 6c0806bd8d1e..ccb84b7dadce 100644 --- a/include/net/netns/nftables.h +++ b/include/net/netns/nftables.h @@ -3,6 +3,7 @@ #define _NETNS_NFTABLES_H_ #include +#include struct netns_nftables { struct list_head tables; @@ -13,6 +14,8 @@ struct netns_nftables { unsigned int base_seq; u8 gencursor; u8 validate_state; + + ANDROID_KABI_RESERVE(1); }; #endif diff --git a/include/net/netns/xfrm.h b/include/net/netns/xfrm.h index b59d73d529ba..93d74c68d87e 100644 --- a/include/net/netns/xfrm.h +++ b/include/net/netns/xfrm.h @@ -7,6 +7,7 @@ #include #include #include +#include #include struct ctl_table_header; @@ -77,6 +78,8 @@ struct netns_xfrm { spinlock_t xfrm_policy_lock; struct mutex xfrm_cfg_mutex; + + ANDROID_KABI_RESERVE(1); }; #endif diff --git a/include/net/page_pool.h b/include/net/page_pool.h index b139e7bf45fe..6c469951e589 100644 --- a/include/net/page_pool.h +++ b/include/net/page_pool.h @@ -33,6 +33,7 @@ #include /* Needed by ptr_ring */ #include #include +#include #define PP_FLAG_DMA_MAP BIT(0) /* Should page_pool do the DMA * map/unmap @@ -126,6 +127,8 @@ struct page_pool { refcount_t user_cnt; u64 destroy_cnt; + + ANDROID_KABI_RESERVE(1); }; struct page *page_pool_alloc_pages(struct page_pool *pool, gfp_t gfp); diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h index 4dd2c9e34976..a33c35133840 100644 --- a/include/net/sch_generic.h +++ b/include/net/sch_generic.h @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -114,6 +115,8 @@ struct Qdisc { bool empty; struct rcu_head rcu; + ANDROID_KABI_RESERVE(1); + /* private data */ long privdata[] ____cacheline_aligned; }; @@ -259,6 +262,8 @@ struct Qdisc_class_ops { struct sk_buff *skb, struct tcmsg*); int (*dump_stats)(struct Qdisc *, unsigned long, struct gnet_dump *); + + ANDROID_KABI_RESERVE(1); }; /* Qdisc_class_ops flag values */ @@ -302,6 +307,8 @@ struct Qdisc_ops { u32 (*egress_block_get)(struct Qdisc *sch); struct module *owner; + + ANDROID_KABI_RESERVE(1); }; diff --git a/include/net/tls.h b/include/net/tls.h index 624864c2dcfb..b0d953be977e 100644 --- a/include/net/tls.h +++ b/include/net/tls.h @@ -116,6 +116,9 @@ struct tls_rec { char aad_space[TLS_AAD_SPACE_SIZE]; u8 iv_data[MAX_IV_SIZE]; struct aead_request aead_req; + + ANDROID_KABI_RESERVE(1); + u8 aead_req_ctx[]; }; @@ -144,6 +147,8 @@ struct tls_sw_context_tx { #define BIT_TX_SCHEDULED 0 #define BIT_TX_CLOSING 1 unsigned long tx_bitmask; + + ANDROID_KABI_RESERVE(1); }; struct tls_sw_context_rx { @@ -161,6 +166,8 @@ struct tls_sw_context_rx { /* protect crypto_wait with decrypt_pending*/ spinlock_t decrypt_compl_lock; bool async_notify; + + ANDROID_KABI_RESERVE(1); }; struct tls_record_info { diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h index cfc0cfde98f0..8c0d37f389df 100644 --- a/include/scsi/scsi_host.h +++ b/include/scsi/scsi_host.h @@ -698,6 +698,8 @@ struct Scsi_Host { */ struct device *dma_dev; + ANDROID_KABI_RESERVE(1); + /* * We should ensure that this is aligned, both for better performance * and also because some compilers (m68k) don't automatically force diff --git a/include/sound/compress_driver.h b/include/sound/compress_driver.h index 70cbc5095e72..82417ce70d62 100644 --- a/include/sound/compress_driver.h +++ b/include/sound/compress_driver.h @@ -12,6 +12,7 @@ #include #include +#include #include #include #include @@ -54,6 +55,8 @@ struct snd_compr_runtime { dma_addr_t dma_addr; size_t dma_bytes; struct snd_dma_buffer *dma_buffer_p; + + ANDROID_KABI_RESERVE(1); }; /** @@ -82,6 +85,8 @@ struct snd_compr_stream { bool partial_drain; void *private_data; struct snd_dma_buffer dma_buffer; + + ANDROID_KABI_RESERVE(1); }; /** @@ -130,6 +135,8 @@ struct snd_compr_ops { struct snd_compr_caps *caps); int (*get_codec_caps) (struct snd_compr_stream *stream, struct snd_compr_codec_caps *codec); + + ANDROID_KABI_RESERVE(1); }; /** @@ -158,6 +165,7 @@ struct snd_compr { struct snd_info_entry *proc_root; struct snd_info_entry *proc_info_entry; #endif + ANDROID_KABI_RESERVE(1); }; /* compress device register APIs */ diff --git a/include/sound/core.h b/include/sound/core.h index 0462c577d7a3..b5ecbf936ffb 100644 --- a/include/sound/core.h +++ b/include/sound/core.h @@ -14,6 +14,7 @@ #include /* pm_message_t */ #include #include +#include /* number of supported soundcards */ #ifdef CONFIG_SND_DYNAMIC_MINORS @@ -61,6 +62,8 @@ struct snd_device_ops { int (*dev_free)(struct snd_device *dev); int (*dev_register)(struct snd_device *dev); int (*dev_disconnect)(struct snd_device *dev); + + ANDROID_KABI_RESERVE(1); }; struct snd_device { @@ -70,6 +73,8 @@ struct snd_device { enum snd_device_type type; /* device type */ void *device_data; /* device structure */ const struct snd_device_ops *ops; /* operations */ + + ANDROID_KABI_RESERVE(1); }; #define snd_device(n) list_entry(n, struct snd_device, list) @@ -132,6 +137,9 @@ struct snd_card { struct snd_mixer_oss *mixer_oss; int mixer_oss_change_count; #endif + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; #define dev_to_snd_card(p) container_of(p, struct snd_card, card_dev) @@ -167,6 +175,8 @@ struct snd_minor { void *private_data; /* private data for f_ops->open */ struct device *dev; /* device for sysfs */ struct snd_card *card_ptr; /* assigned card instance */ + + ANDROID_KABI_RESERVE(1); }; /* return a device pointer linked to each sound device as a parent */ diff --git a/include/sound/hwdep.h b/include/sound/hwdep.h index 8d6cdb254039..d99a53025ff0 100644 --- a/include/sound/hwdep.h +++ b/include/sound/hwdep.h @@ -9,6 +9,7 @@ #include #include +#include struct snd_hwdep; @@ -34,6 +35,8 @@ struct snd_hwdep_ops { struct snd_hwdep_dsp_status *status); int (*dsp_load)(struct snd_hwdep *hw, struct snd_hwdep_dsp_image *image); + + ANDROID_KABI_RESERVE(1); }; struct snd_hwdep { @@ -59,6 +62,8 @@ struct snd_hwdep { int used; /* reference counter */ unsigned int dsp_loaded; /* bit fields of loaded dsp indices */ unsigned int exclusive:1; /* exclusive access mode */ + + ANDROID_KABI_RESERVE(1); }; extern int snd_hwdep_new(struct snd_card *card, char *id, int device, diff --git a/include/sound/info.h b/include/sound/info.h index 7c13bf52cc81..25af5d8d1527 100644 --- a/include/sound/info.h +++ b/include/sound/info.h @@ -9,6 +9,7 @@ #include #include +#include #include /* buffer for information */ @@ -55,6 +56,8 @@ struct snd_info_entry_ops { int (*mmap)(struct snd_info_entry *entry, void *file_private_data, struct inode *inode, struct file *file, struct vm_area_struct *vma); + + ANDROID_KABI_RESERVE(1); }; struct snd_info_entry { @@ -74,6 +77,8 @@ struct snd_info_entry { struct mutex access; struct list_head children; struct list_head list; + + ANDROID_KABI_RESERVE(1); }; #if defined(CONFIG_SND_OSSEMUL) && defined(CONFIG_SND_PROC_FS) diff --git a/include/sound/jack.h b/include/sound/jack.h index 9eb2b5ec1ec4..70400b20e952 100644 --- a/include/sound/jack.h +++ b/include/sound/jack.h @@ -9,6 +9,7 @@ */ #include +#include struct input_dev; @@ -69,6 +70,8 @@ struct snd_jack { #endif /* CONFIG_SND_JACK_INPUT_DEV */ void *private_data; void (*private_free)(struct snd_jack *); + + ANDROID_KABI_RESERVE(1); }; #ifdef CONFIG_SND_JACK diff --git a/include/sound/soc.h b/include/sound/soc.h index f7fabb9d1c83..63338f68de48 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -846,6 +847,8 @@ struct snd_soc_dai_link { #ifdef CONFIG_SND_SOC_TOPOLOGY struct snd_soc_dobj dobj; /* For topology */ #endif + + ANDROID_KABI_RESERVE(1); }; #define for_each_link_codecs(link, i, codec) \ for ((i) = 0; \ @@ -1096,6 +1099,11 @@ struct snd_soc_card { unsigned int probed:1; void *drvdata; + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); }; #define for_each_card_prelinks(card, i, link) \ for ((i) = 0; \ @@ -1177,6 +1185,9 @@ struct snd_soc_pcm_runtime { unsigned int fe_compr:1; /* for Dynamic PCM */ int num_components; + + ANDROID_KABI_RESERVE(1); + struct snd_soc_component *components[]; /* CPU/Codec/Platform */ }; /* see soc_new_pcm_runtime() */ @@ -1222,6 +1233,8 @@ struct soc_mixer_control { #ifdef CONFIG_SND_SOC_TOPOLOGY struct snd_soc_dobj dobj; #endif + + ANDROID_KABI_RESERVE(1); }; struct soc_bytes { @@ -1266,6 +1279,8 @@ struct soc_enum { #ifdef CONFIG_SND_SOC_TOPOLOGY struct snd_soc_dobj dobj; #endif + + ANDROID_KABI_RESERVE(1); }; static inline bool snd_soc_volsw_is_stereo(struct soc_mixer_control *mc) diff --git a/include/sound/timer.h b/include/sound/timer.h index 760e132cc0cd..b7695e4dcca0 100644 --- a/include/sound/timer.h +++ b/include/sound/timer.h @@ -10,6 +10,7 @@ #include #include +#include #define snd_timer_chip(timer) ((timer)->private_data) @@ -52,6 +53,8 @@ struct snd_timer_hardware { int (*stop) (struct snd_timer * timer); int (*set_period) (struct snd_timer * timer, unsigned long period_num, unsigned long period_den); int (*precise_resolution) (struct snd_timer * timer, unsigned long *num, unsigned long *den); + + ANDROID_KABI_RESERVE(1); }; struct snd_timer { @@ -77,6 +80,8 @@ struct snd_timer { struct work_struct task_work; int max_instances; /* upper limit of timer instances */ int num_instances; /* current number of timer instances */ + + ANDROID_KABI_RESERVE(1); }; struct snd_timer_instance { @@ -106,6 +111,8 @@ struct snd_timer_instance { struct list_head slave_list_head; struct list_head slave_active_head; struct snd_timer_instance *master; + + ANDROID_KABI_RESERVE(1); }; /* diff --git a/sound/usb/card.h b/sound/usb/card.h index e3a59455f71c..3683f10ff542 100644 --- a/sound/usb/card.h +++ b/sound/usb/card.h @@ -178,6 +178,8 @@ struct snd_usb_substream { bool trigger_tstamp_pending_update; /* trigger timestamp being updated from initial estimate */ struct media_ctl *media_ctl; + + ANDROID_KABI_RESERVE(1); }; struct snd_usb_stream { diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h index 47f56e0354cc..6d40b46c3c13 100644 --- a/sound/usb/usbaudio.h +++ b/sound/usb/usbaudio.h @@ -12,6 +12,8 @@ #define USB_ID_VENDOR(id) ((id) >> 16) #define USB_ID_PRODUCT(id) ((u16)(id)) +#include + /* * */ @@ -64,6 +66,11 @@ struct snd_usb_audio { struct mutex dev_lock; /* to protect any race with disconnect */ int card_num; /* cache pcm card number to use upon disconnect */ void (*disconnect_cb)(struct snd_usb_audio *chip); + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); }; #define USB_AUDIO_IFACE_UNUSED ((void *)-1L) @@ -176,6 +183,9 @@ struct snd_usb_audio_vendor_ops { struct audioformat *found, int *cur_attr, int *attr); int (*usb_add_ctls)(struct snd_usb_audio *chip); + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); }; #endif /* __USBAUDIO_H */ From 9af9ef8dfa1af1f7d4ce8264c297ef0a800c0a6b Mon Sep 17 00:00:00 2001 From: Egor Uleyskiy Date: Wed, 7 Oct 2020 21:54:07 +0300 Subject: [PATCH 39/73] ANDROID: vendor_hooks: Add oem data to file struct Add ANDROID_OEM_DATA(1) to struct file Bug: 169343953 Signed-off-by: Egor Uleyskiy Signed-off-by: Greg Kroah-Hartman Change-Id: I1afc259f2bd02fee76b20802dda74cbe79658534 --- include/linux/fs.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/linux/fs.h b/include/linux/fs.h index ff841fa9ea35..090cb2938fdc 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -43,6 +43,7 @@ #include #include +#include struct backing_dev_info; struct bdi_writeback; @@ -969,6 +970,7 @@ struct file { ANDROID_KABI_RESERVE(1); ANDROID_KABI_RESERVE(2); + ANDROID_OEM_DATA(1); } __randomize_layout __attribute__((aligned(4))); /* lest something weird decides that 2 is OK */ From 914a7b14a04bc784361fb1e778d0bad7f791a5e6 Mon Sep 17 00:00:00 2001 From: Alan Stern Date: Thu, 20 May 2021 16:21:44 -0400 Subject: [PATCH 40/73] UPSTREAM: USB: UDC core: Add udc_async_callbacks gadget op The Gadget API has a theoretical race when a gadget driver is unbound. Although the pull-up is turned off before the driver's ->unbind callback runs, if the USB cable were to be unplugged at just the wrong moment there would be nothing to prevent the UDC driver from invoking the ->disconnect callback after the unbind has finished. In theory, other asynchronous callbacks could also happen during the time before the UDC driver's udc_stop routine is called, and the gadget driver would not be prepared to handle any of them. We need a way to tell UDC drivers to stop issuing asynchronous (that is, ->suspend, ->resume, ->disconnect, ->reset, or ->setup) callbacks at some point after the pull-up has been turned off and before the ->unbind callback runs. This patch adds a new ->udc_async_callbacks callback to the usb_gadget_ops structure for precisely this purpose, and it adds the corresponding support to the UDC core. Later patches in this series add support for udc_async_callbacks to several UDC drivers. Acked-by: Felipe Balbi Signed-off-by: Alan Stern Link: https://lore.kernel.org/r/20210520202144.GC1216852@rowland.harvard.edu Signed-off-by: Greg Kroah-Hartman Bug: 192984564 Change-Id: Ib50e7292436fe2067cdd6d9e953549f74a2513a9 (cherry picked from commit 7dc0c55e9f302e7048e040ee4437437bbea1e2cd) Signed-off-by: Jack Pham --- drivers/usb/gadget/udc/core.c | 49 +++++++++++++++++++++++++++++++++++ include/linux/usb/gadget.h | 1 + 2 files changed, 50 insertions(+) diff --git a/drivers/usb/gadget/udc/core.c b/drivers/usb/gadget/udc/core.c index 1ecb94f2737f..119284d48349 100644 --- a/drivers/usb/gadget/udc/core.c +++ b/drivers/usb/gadget/udc/core.c @@ -1150,6 +1150,53 @@ static inline void usb_gadget_udc_set_speed(struct usb_udc *udc, gadget->ops->udc_set_speed(gadget, s); } +/** + * usb_gadget_enable_async_callbacks - tell usb device controller to enable asynchronous callbacks + * @udc: The UDC which should enable async callbacks + * + * This routine is used when binding gadget drivers. It undoes the effect + * of usb_gadget_disable_async_callbacks(); the UDC driver should enable IRQs + * (if necessary) and resume issuing callbacks. + * + * This routine will always be called in process context. + */ +static inline void usb_gadget_enable_async_callbacks(struct usb_udc *udc) +{ + struct usb_gadget *gadget = udc->gadget; + + if (gadget->ops->udc_async_callbacks) + gadget->ops->udc_async_callbacks(gadget, true); +} + +/** + * usb_gadget_disable_async_callbacks - tell usb device controller to disable asynchronous callbacks + * @udc: The UDC which should disable async callbacks + * + * This routine is used when unbinding gadget drivers. It prevents a race: + * The UDC driver doesn't know when the gadget driver's ->unbind callback + * runs, so unless it is told to disable asynchronous callbacks, it might + * issue a callback (such as ->disconnect) after the unbind has completed. + * + * After this function runs, the UDC driver must suppress all ->suspend, + * ->resume, ->disconnect, ->reset, and ->setup callbacks to the gadget driver + * until async callbacks are again enabled. A simple-minded but effective + * way to accomplish this is to tell the UDC hardware not to generate any + * more IRQs. + * + * Request completion callbacks must still be issued. However, it's okay + * to defer them until the request is cancelled, since the pull-up will be + * turned off during the time period when async callbacks are disabled. + * + * This routine will always be called in process context. + */ +static inline void usb_gadget_disable_async_callbacks(struct usb_udc *udc) +{ + struct usb_gadget *gadget = udc->gadget; + + if (gadget->ops->udc_async_callbacks) + gadget->ops->udc_async_callbacks(gadget, false); +} + /** * usb_udc_release - release the usb_udc struct * @dev: the dev member within usb_udc @@ -1364,6 +1411,7 @@ static void usb_gadget_remove_driver(struct usb_udc *udc) kobject_uevent(&udc->dev.kobj, KOBJ_CHANGE); usb_gadget_disconnect(udc->gadget); + usb_gadget_disable_async_callbacks(udc); if (udc->gadget->irq) synchronize_irq(udc->gadget->irq); udc->driver->unbind(udc->gadget); @@ -1445,6 +1493,7 @@ static int udc_bind_to_driver(struct usb_udc *udc, struct usb_gadget_driver *dri driver->unbind(udc->gadget); goto err1; } + usb_gadget_enable_async_callbacks(udc); usb_udc_connect_control(udc); kobject_uevent(&udc->dev.kobj, KOBJ_CHANGE); diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h index cf14bb3912f0..7c0a2a7aca6e 100644 --- a/include/linux/usb/gadget.h +++ b/include/linux/usb/gadget.h @@ -332,6 +332,7 @@ struct usb_gadget_ops { void (*udc_set_speed)(struct usb_gadget *, enum usb_device_speed); void (*udc_set_ssp_rate)(struct usb_gadget *gadget, enum usb_ssp_rate rate); + void (*udc_async_callbacks)(struct usb_gadget *gadget, bool enable); struct usb_ep *(*match_ep)(struct usb_gadget *, struct usb_endpoint_descriptor *, struct usb_ss_ep_comp_descriptor *); From a2b3afb2f7437d3c84a5ebdeb2ff957deadaee57 Mon Sep 17 00:00:00 2001 From: xieliujie Date: Fri, 2 Jul 2021 20:34:05 +0800 Subject: [PATCH 41/73] ANDROID: android: Add symbols to debug_symbols driver in our vendor driver, we need the following three kernel variables: include/linuc/mm.h: extern unsigned long stack_guard_gap; extern int sysctl_legacy_va_layout; include/linux/security.h: extern unsigned long mmap_min_addr; Bug: 191439466 Signed-off-by: xieliujie Change-Id: I9d1759d8157ddd214475742e417dfb9e870d4b2e --- drivers/android/debug_symbols.c | 9 +++++++++ include/linux/android_debug_symbols.h | 7 +++++++ 2 files changed, 16 insertions(+) diff --git a/drivers/android/debug_symbols.c b/drivers/android/debug_symbols.c index 61e55575ed5f..6a4a6f8992f2 100644 --- a/drivers/android/debug_symbols.c +++ b/drivers/android/debug_symbols.c @@ -16,6 +16,8 @@ #include #include #include +#include +#include struct ads_entry { char *name; @@ -59,6 +61,13 @@ static const struct ads_entry ads_entries[ADS_END] = { #ifdef CONFIG_SWAP ADS_ENTRY(ADS_NR_SWAP_PAGES, &nr_swap_pages), #endif +#ifdef CONFIG_MMU + ADS_ENTRY(ADS_MMAP_MIN_ADDR, &mmap_min_addr), +#endif + ADS_ENTRY(ADS_STACK_GUARD_GAP, &stack_guard_gap), +#ifdef CONFIG_SYSCTL + ADS_ENTRY(ADS_SYSCTL_LEGACY_VA_LAYOUT, &sysctl_legacy_va_layout), +#endif }; /* diff --git a/include/linux/android_debug_symbols.h b/include/linux/android_debug_symbols.h index 3fc44fb36fb7..c80f063ffef4 100644 --- a/include/linux/android_debug_symbols.h +++ b/include/linux/android_debug_symbols.h @@ -29,6 +29,13 @@ enum android_debug_symbol { #endif #ifdef CONFIG_SWAP ADS_NR_SWAP_PAGES, +#endif +#ifdef CONFIG_MMU + ADS_MMAP_MIN_ADDR, +#endif + ADS_STACK_GUARD_GAP, +#ifdef CONFIG_SYSCTL + ADS_SYSCTL_LEGACY_VA_LAYOUT, #endif ADS_END }; From a1ce719ca7e00d1310c4e60e25f8d981018225a9 Mon Sep 17 00:00:00 2001 From: Hridya Valsaraju Date: Wed, 7 Jul 2021 17:50:24 -0700 Subject: [PATCH 42/73] ANDROID: Delete the DMA-BUF attachment sysfs statistics The overhead of sysfs directory creation/teardown during dma_buf_attach()/dma_buf_detach() is causing perf regressions for certain drivers. Bug: 192621117 Change-Id: I908aa3b2717bf2e183628be3446e0069ce24c68a Fixes: 621f94a601eb (BACKPORT: FROMLIST: dmabuf: Add the capability to expose DMA-BUF stats in sysfs) Signed-off-by: Hridya Valsaraju --- .../ABI/testing/sysfs-kernel-dmabuf-buffers | 28 ---- drivers/dma-buf/dma-buf-sysfs-stats.c | 129 ------------------ drivers/dma-buf/dma-buf-sysfs-stats.h | 27 ---- drivers/dma-buf/dma-buf.c | 15 -- include/linux/dma-buf.h | 12 -- 5 files changed, 211 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-kernel-dmabuf-buffers b/Documentation/ABI/testing/sysfs-kernel-dmabuf-buffers index 6f7c65209f07..122185c6a88c 100644 --- a/Documentation/ABI/testing/sysfs-kernel-dmabuf-buffers +++ b/Documentation/ABI/testing/sysfs-kernel-dmabuf-buffers @@ -22,31 +22,3 @@ KernelVersion: v5.12 Contact: Hridya Valsaraju Description: This file is read-only and specifies the size of the DMA-BUF in bytes. - -What: /sys/kernel/dmabuf/buffers//attachments -Date: January 2021 -KernelVersion: v5.12 -Contact: Hridya Valsaraju -Description: This directory will contain subdirectories representing every - attachment of the DMA-BUF. - -What: /sys/kernel/dmabuf/buffers//attachments/ -Date: January 2021 -KernelVersion: v5.12 -Contact: Hridya Valsaraju -Description: This directory will contain information on the attaching device - and the number of current distinct device mappings. - -What: /sys/kernel/dmabuf/buffers//attachments//device -Date: January 2021 -KernelVersion: v5.12 -Contact: Hridya Valsaraju -Description: This file is read-only and is a symlink to the attaching devices's - sysfs entry. - -What: /sys/kernel/dmabuf/buffers//attachments//map_counter -Date: January 2021 -KernelVersion: v5.12 -Contact: Hridya Valsaraju -Description: This file is read-only and contains a map_counter indicating the - number of distinct device mappings of the attachment. diff --git a/drivers/dma-buf/dma-buf-sysfs-stats.c b/drivers/dma-buf/dma-buf-sysfs-stats.c index e5f9e33044ed..2389a363bd3a 100644 --- a/drivers/dma-buf/dma-buf-sysfs-stats.c +++ b/drivers/dma-buf/dma-buf-sysfs-stats.c @@ -84,120 +84,6 @@ static struct kobj_type dma_buf_ktype = { .default_groups = dma_buf_stats_default_groups, }; -#define to_dma_buf_attach_entry_from_kobj(x) container_of(x, struct dma_buf_attach_sysfs_entry, kobj) - -struct dma_buf_attach_stats_attribute { - struct attribute attr; - ssize_t (*show)(struct dma_buf_attach_sysfs_entry *sysfs_entry, - struct dma_buf_attach_stats_attribute *attr, char *buf); -}; -#define to_dma_buf_attach_stats_attr(x) container_of(x, struct dma_buf_attach_stats_attribute, attr) - -static ssize_t dma_buf_attach_stats_attribute_show(struct kobject *kobj, - struct attribute *attr, - char *buf) -{ - struct dma_buf_attach_stats_attribute *attribute; - struct dma_buf_attach_sysfs_entry *sysfs_entry; - - attribute = to_dma_buf_attach_stats_attr(attr); - sysfs_entry = to_dma_buf_attach_entry_from_kobj(kobj); - - if (!attribute->show) - return -EIO; - - return attribute->show(sysfs_entry, attribute, buf); -} - -static const struct sysfs_ops dma_buf_attach_stats_sysfs_ops = { - .show = dma_buf_attach_stats_attribute_show, -}; - -static ssize_t map_counter_show(struct dma_buf_attach_sysfs_entry *sysfs_entry, - struct dma_buf_attach_stats_attribute *attr, - char *buf) -{ - return sysfs_emit(buf, "%u\n", sysfs_entry->map_counter); -} - -static struct dma_buf_attach_stats_attribute map_counter_attribute = - __ATTR_RO(map_counter); - -static struct attribute *dma_buf_attach_stats_default_attrs[] = { - &map_counter_attribute.attr, - NULL, -}; -ATTRIBUTE_GROUPS(dma_buf_attach_stats_default); - -static void dma_buf_attach_sysfs_release(struct kobject *kobj) -{ - struct dma_buf_attach_sysfs_entry *sysfs_entry; - - sysfs_entry = to_dma_buf_attach_entry_from_kobj(kobj); - kfree(sysfs_entry); -} - -static struct kobj_type dma_buf_attach_ktype = { - .sysfs_ops = &dma_buf_attach_stats_sysfs_ops, - .release = dma_buf_attach_sysfs_release, - .default_groups = dma_buf_attach_stats_default_groups, -}; - -void dma_buf_attach_stats_teardown(struct dma_buf_attachment *attach) -{ - struct dma_buf_attach_sysfs_entry *sysfs_entry; - - sysfs_entry = attach->sysfs_entry; - if (!sysfs_entry) - return; - - sysfs_delete_link(&sysfs_entry->kobj, &attach->dev->kobj, "device"); - - kobject_del(&sysfs_entry->kobj); - kobject_put(&sysfs_entry->kobj); -} - -int dma_buf_attach_stats_setup(struct dma_buf_attachment *attach, - unsigned int uid) -{ - struct dma_buf_attach_sysfs_entry *sysfs_entry; - int ret; - struct dma_buf *dmabuf; - - if (!attach) - return -EINVAL; - - dmabuf = attach->dmabuf; - - sysfs_entry = kzalloc(sizeof(struct dma_buf_attach_sysfs_entry), - GFP_KERNEL); - if (!sysfs_entry) - return -ENOMEM; - - sysfs_entry->kobj.kset = dmabuf->sysfs_entry->attach_stats_kset; - - attach->sysfs_entry = sysfs_entry; - - ret = kobject_init_and_add(&sysfs_entry->kobj, &dma_buf_attach_ktype, - NULL, "%u", uid); - if (ret) - goto kobj_err; - - ret = sysfs_create_link(&sysfs_entry->kobj, &attach->dev->kobj, - "device"); - if (ret) - goto link_err; - - return 0; - -link_err: - kobject_del(&sysfs_entry->kobj); -kobj_err: - kobject_put(&sysfs_entry->kobj); - attach->sysfs_entry = NULL; - - return ret; -} void dma_buf_stats_teardown(struct dma_buf *dmabuf) { struct dma_buf_sysfs_entry *sysfs_entry; @@ -206,7 +92,6 @@ void dma_buf_stats_teardown(struct dma_buf *dmabuf) if (!sysfs_entry) return; - kset_unregister(sysfs_entry->attach_stats_kset); kobject_del(&sysfs_entry->kobj); kobject_put(&sysfs_entry->kobj); } @@ -254,7 +139,6 @@ int dma_buf_stats_setup(struct dma_buf *dmabuf) { struct dma_buf_sysfs_entry *sysfs_entry; int ret; - struct kset *attach_stats_kset; if (!dmabuf || !dmabuf->file) return -EINVAL; @@ -279,21 +163,8 @@ int dma_buf_stats_setup(struct dma_buf *dmabuf) if (ret) goto err_sysfs_dmabuf; - /* create the directory for attachment stats */ - attach_stats_kset = kset_create_and_add("attachments", - &dmabuf_sysfs_no_uevent_ops, - &sysfs_entry->kobj); - if (!attach_stats_kset) { - ret = -ENOMEM; - goto err_sysfs_attach; - } - - sysfs_entry->attach_stats_kset = attach_stats_kset; - return 0; -err_sysfs_attach: - kobject_del(&sysfs_entry->kobj); err_sysfs_dmabuf: kobject_put(&sysfs_entry->kobj); dmabuf->sysfs_entry = NULL; diff --git a/drivers/dma-buf/dma-buf-sysfs-stats.h b/drivers/dma-buf/dma-buf-sysfs-stats.h index 5f4703249117..a49c6e2650cc 100644 --- a/drivers/dma-buf/dma-buf-sysfs-stats.h +++ b/drivers/dma-buf/dma-buf-sysfs-stats.h @@ -14,23 +14,8 @@ int dma_buf_init_sysfs_statistics(void); void dma_buf_uninit_sysfs_statistics(void); int dma_buf_stats_setup(struct dma_buf *dmabuf); -int dma_buf_attach_stats_setup(struct dma_buf_attachment *attach, - unsigned int uid); -static inline void dma_buf_update_attachment_map_count(struct dma_buf_attachment *attach, - int delta) -{ - struct dma_buf_attach_sysfs_entry *entry = attach->sysfs_entry; - entry->map_counter += delta; -} void dma_buf_stats_teardown(struct dma_buf *dmabuf); -void dma_buf_attach_stats_teardown(struct dma_buf_attachment *attach); -static inline unsigned int dma_buf_update_attach_uid(struct dma_buf *dmabuf) -{ - struct dma_buf_sysfs_entry *entry = dmabuf->sysfs_entry; - - return entry->attachment_uid++; -} #else static inline int dma_buf_init_sysfs_statistics(void) @@ -44,19 +29,7 @@ static inline int dma_buf_stats_setup(struct dma_buf *dmabuf) { return 0; } -static inline int dma_buf_attach_stats_setup(struct dma_buf_attachment *attach, - unsigned int uid) -{ - return 0; -} static inline void dma_buf_stats_teardown(struct dma_buf *dmabuf) {} -static inline void dma_buf_attach_stats_teardown(struct dma_buf_attachment *attach) {} -static inline void dma_buf_update_attachment_map_count(struct dma_buf_attachment *attach, - int delta) {} -static inline unsigned int dma_buf_update_attach_uid(struct dma_buf *dmabuf) -{ - return 0; -} #endif #endif // _DMA_BUF_SYSFS_STATS_H diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c index eb8b66b569c8..47eeeb02513b 100644 --- a/drivers/dma-buf/dma-buf.c +++ b/drivers/dma-buf/dma-buf.c @@ -730,7 +730,6 @@ dma_buf_dynamic_attach(struct dma_buf *dmabuf, struct device *dev, { struct dma_buf_attachment *attach; int ret; - unsigned int attach_uid; if (WARN_ON(!dmabuf || !dev)) return ERR_PTR(-EINVAL); @@ -756,13 +755,8 @@ dma_buf_dynamic_attach(struct dma_buf *dmabuf, struct device *dev, } dma_resv_lock(dmabuf->resv, NULL); list_add(&attach->node, &dmabuf->attachments); - attach_uid = dma_buf_update_attach_uid(dmabuf); dma_resv_unlock(dmabuf->resv); - ret = dma_buf_attach_stats_setup(attach, attach_uid); - if (ret) - goto err_sysfs; - /* When either the importer or the exporter can't handle dynamic * mappings we cache the mapping here to avoid issues with the * reservation object lock. @@ -789,7 +783,6 @@ dma_buf_dynamic_attach(struct dma_buf *dmabuf, struct device *dev, dma_resv_unlock(attach->dmabuf->resv); attach->sgt = sgt; attach->dir = DMA_BIDIRECTIONAL; - dma_buf_update_attachment_map_count(attach, 1 /* delta */); } return attach; @@ -806,7 +799,6 @@ err_unlock: if (dma_buf_is_dynamic(attach->dmabuf)) dma_resv_unlock(attach->dmabuf->resv); -err_sysfs: dma_buf_detach(dmabuf, attach); return ERR_PTR(ret); } @@ -845,7 +837,6 @@ void dma_buf_detach(struct dma_buf *dmabuf, struct dma_buf_attachment *attach) dma_resv_lock(attach->dmabuf->resv, NULL); dmabuf->ops->unmap_dma_buf(attach, attach->sgt, attach->dir); - dma_buf_update_attachment_map_count(attach, -1 /* delta */); if (dma_buf_is_dynamic(attach->dmabuf)) { dma_buf_unpin(attach); @@ -859,7 +850,6 @@ void dma_buf_detach(struct dma_buf *dmabuf, struct dma_buf_attachment *attach) if (dmabuf->ops->detach) dmabuf->ops->detach(dmabuf, attach); - dma_buf_attach_stats_teardown(attach); kfree(attach); } EXPORT_SYMBOL_GPL(dma_buf_detach); @@ -965,9 +955,6 @@ struct sg_table *dma_buf_map_attachment(struct dma_buf_attachment *attach, attach->dir = direction; } - if (!IS_ERR(sg_table)) - dma_buf_update_attachment_map_count(attach, 1 /* delta */); - return sg_table; } EXPORT_SYMBOL_GPL(dma_buf_map_attachment); @@ -1005,8 +992,6 @@ void dma_buf_unmap_attachment(struct dma_buf_attachment *attach, if (dma_buf_is_dynamic(attach->dmabuf) && !IS_ENABLED(CONFIG_DMABUF_MOVE_NOTIFY)) dma_buf_unpin(attach); - - dma_buf_update_attachment_map_count(attach, -1 /* delta */); } EXPORT_SYMBOL_GPL(dma_buf_unmap_attachment); diff --git a/include/linux/dma-buf.h b/include/linux/dma-buf.h index bddf8b8f2347..63ffe57a61d5 100644 --- a/include/linux/dma-buf.h +++ b/include/linux/dma-buf.h @@ -383,8 +383,6 @@ struct dma_buf_ops { * @cb_excl: for userspace poll support * @cb_shared: for userspace poll support * @sysfs_entry: for exposing information about this buffer in sysfs. - * The attachment_uid member of @sysfs_entry is protected by dma_resv lock - * and is incremented on each attach. * * This represents a shared buffer, created by calling dma_buf_export(). The * userspace representation is a normal file descriptor, which can be created by @@ -425,8 +423,6 @@ struct dma_buf { struct dma_buf_sysfs_entry { struct kobject kobj; struct dma_buf *dmabuf; - unsigned int attachment_uid; - struct kset *attach_stats_kset; } *sysfs_entry; #endif @@ -483,7 +479,6 @@ struct dma_buf_attach_ops { * @importer_priv: importer specific attachment data. * @dma_map_attrs: DMA attributes to be used when the exporter maps the buffer * through dma_buf_map_attachment. - * @sysfs_entry: For exposing information about this attachment in sysfs. * * This structure holds the attachment information between the dma_buf buffer * and its user device(s). The list contains one attachment struct per device @@ -505,13 +500,6 @@ struct dma_buf_attachment { void *importer_priv; void *priv; unsigned long dma_map_attrs; -#ifdef CONFIG_DMABUF_SYSFS_STATS - /* for sysfs stats */ - struct dma_buf_attach_sysfs_entry { - struct kobject kobj; - unsigned int map_counter; - } *sysfs_entry; -#endif ANDROID_KABI_RESERVE(1); ANDROID_KABI_RESERVE(2); From 9bb1247653e0eb7ec411f75825c9efcdc7f85c82 Mon Sep 17 00:00:00 2001 From: Subash Abhinov Kasiviswanathan Date: Wed, 16 Jun 2021 00:11:21 -0600 Subject: [PATCH 43/73] ANDROID: GKI: Enable CONFIG_CGROUP_NET_PRIO Enable configuration to set the networking process priority. CONFIG_CGROUP_NET_PRIO=y Bug: 190818101 Change-Id: I2c9344bd8650e58796cca0ef31e05c2d0b813356 Signed-off-by: Subash Abhinov Kasiviswanathan --- arch/arm64/configs/gki_defconfig | 1 + arch/x86/configs/gki_defconfig | 1 + 2 files changed, 2 insertions(+) diff --git a/arch/arm64/configs/gki_defconfig b/arch/arm64/configs/gki_defconfig index 77216f65d4ee..e1d96b946ad8 100644 --- a/arch/arm64/configs/gki_defconfig +++ b/arch/arm64/configs/gki_defconfig @@ -257,6 +257,7 @@ CONFIG_NET_ACT_GACT=y CONFIG_NET_ACT_MIRRED=y CONFIG_NET_ACT_SKBEDIT=y CONFIG_VSOCKETS=y +CONFIG_CGROUP_NET_PRIO=y CONFIG_BPF_JIT=y CONFIG_CAN=y CONFIG_BT=y diff --git a/arch/x86/configs/gki_defconfig b/arch/x86/configs/gki_defconfig index 18c2c6f34b45..91998158ffac 100644 --- a/arch/x86/configs/gki_defconfig +++ b/arch/x86/configs/gki_defconfig @@ -233,6 +233,7 @@ CONFIG_NET_ACT_GACT=y CONFIG_NET_ACT_MIRRED=y CONFIG_NET_ACT_SKBEDIT=y CONFIG_VSOCKETS=y +CONFIG_CGROUP_NET_PRIO=y CONFIG_BPF_JIT=y CONFIG_CAN=y CONFIG_BT=y From 8011eb22150e5bb6eb1834ce9913f36081d48ab5 Mon Sep 17 00:00:00 2001 From: Charan Teja Reddy Date: Fri, 25 Jun 2021 12:30:50 +0530 Subject: [PATCH 44/73] ANDROID: mm: provision to add shmem pages to inactive file lru head Commit 9975da5f43bb ("ANDROID: mm: allow fast reclaim of shmem pages") allows pages to add only to the tail of the inactive file lru for faster reclaims. Extend the same to allow the pages added to the head of the inactive file lru too. This will enable users to selectively add the shmem file pages to head or tail of the inactive file lru. Bug: 187798288 Change-Id: Icf167e1e3ea68257291478e1f16de678ecbf6320 Signed-off-by: Charan Teja Reddy --- include/linux/shmem_fs.h | 2 +- include/linux/swap.h | 2 +- mm/shmem.c | 4 ++-- mm/swap.c | 11 ++++++++--- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/include/linux/shmem_fs.h b/include/linux/shmem_fs.h index 51b1dcfb5022..1bf2615449fe 100644 --- a/include/linux/shmem_fs.h +++ b/include/linux/shmem_fs.h @@ -85,7 +85,7 @@ extern bool shmem_huge_enabled(struct vm_area_struct *vma); extern unsigned long shmem_swap_usage(struct vm_area_struct *vma); extern unsigned long shmem_partial_swap_usage(struct address_space *mapping, pgoff_t start, pgoff_t end); -extern void shmem_mark_page_lazyfree(struct page *page); +extern void shmem_mark_page_lazyfree(struct page *page, bool tail); /* Flag allocation requirements to shmem_getpage */ enum sgp_type { diff --git a/include/linux/swap.h b/include/linux/swap.h index f750b27773ea..beda0a50d0b9 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -353,7 +353,7 @@ extern void rotate_reclaimable_page(struct page *page); extern void deactivate_file_page(struct page *page); extern void deactivate_page(struct page *page); extern void mark_page_lazyfree(struct page *page); -extern void mark_page_lazyfree_movetail(struct page *page); +extern void mark_page_lazyfree_movetail(struct page *page, bool tail); extern void swap_setup(void); extern void __lru_cache_add_inactive_or_unevictable(struct page *page, diff --git a/mm/shmem.c b/mm/shmem.c index efcffd4836c3..604c6d89d243 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -4295,9 +4295,9 @@ struct page *shmem_read_mapping_page_gfp(struct address_space *mapping, } EXPORT_SYMBOL_GPL(shmem_read_mapping_page_gfp); -void shmem_mark_page_lazyfree(struct page *page) +void shmem_mark_page_lazyfree(struct page *page, bool tail) { - mark_page_lazyfree_movetail(page); + mark_page_lazyfree_movetail(page, tail); } EXPORT_SYMBOL_GPL(shmem_mark_page_lazyfree); diff --git a/mm/swap.c b/mm/swap.c index 09923999ddc2..8d5c61de5a6e 100644 --- a/mm/swap.c +++ b/mm/swap.c @@ -634,6 +634,8 @@ static void lru_lazyfree_fn(struct page *page, struct lruvec *lruvec, static void lru_lazyfree_movetail_fn(struct page *page, struct lruvec *lruvec, void *arg) { + bool *add_to_tail = (bool *)arg; + if (PageLRU(page) && !PageUnevictable(page) && PageSwapBacked(page) && !PageSwapCache(page)) { bool active = PageActive(page); @@ -642,7 +644,10 @@ static void lru_lazyfree_movetail_fn(struct page *page, struct lruvec *lruvec, LRU_INACTIVE_ANON + active); ClearPageActive(page); ClearPageReferenced(page); - add_page_to_lru_list_tail(page, lruvec, LRU_INACTIVE_FILE); + if (add_to_tail && *add_to_tail) + add_page_to_lru_list_tail(page, lruvec, LRU_INACTIVE_FILE); + else + add_page_to_lru_list(page, lruvec, LRU_INACTIVE_FILE); } } @@ -769,7 +774,7 @@ void mark_page_lazyfree(struct page *page) * mark_page_lazyfree_movetail() moves @page to the tail of inactive file list. * This is done to accelerate the reclaim of @page. */ -void mark_page_lazyfree_movetail(struct page *page) +void mark_page_lazyfree_movetail(struct page *page, bool tail) { if (PageLRU(page) && !PageUnevictable(page) && PageSwapBacked(page) && !PageSwapCache(page)) { @@ -780,7 +785,7 @@ void mark_page_lazyfree_movetail(struct page *page) get_page(page); if (pagevec_add_and_need_flush(pvec, page)) pagevec_lru_move_fn(pvec, - lru_lazyfree_movetail_fn, NULL); + lru_lazyfree_movetail_fn, &tail); local_unlock(&lru_pvecs.lock); } } From 194fd9239ae697974aad9e038d4aea509bf45c43 Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Fri, 2 Jul 2021 10:25:47 -0700 Subject: [PATCH 45/73] ANDROID: GKI: fscrypt: add ABI padding to struct fscrypt_operations 'struct fscrypt_operations' shouldn't really be part of the KMI, as there's no reason for loadable modules to use it. However, due to the way MODVERSIONS calculates symbol CRCs by recursively dereferencing structures, changes to 'struct fscrypt_operations' affect the CRCs of KMI functions exported from certain core kernel files such as fs/dcache.c. That brings it in-scope for the KMI freeze. Therefore, add some reserved fields to this struct for LTS updates. Bug: 151154716 Change-Id: Ic3bf66c93a9be167a0a5b257bd55e2719d99a1b4 Signed-off-by: Eric Biggers --- include/linux/fscrypt.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/include/linux/fscrypt.h b/include/linux/fscrypt.h index 554b219c62cd..760d13699b0b 100644 --- a/include/linux/fscrypt.h +++ b/include/linux/fscrypt.h @@ -70,6 +70,11 @@ struct fscrypt_operations { int (*get_num_devices)(struct super_block *sb); void (*get_devices)(struct super_block *sb, struct request_queue **devs); + + ANDROID_KABI_RESERVE(1); + ANDROID_KABI_RESERVE(2); + ANDROID_KABI_RESERVE(3); + ANDROID_KABI_RESERVE(4); }; static inline struct fscrypt_info *fscrypt_get_info(const struct inode *inode) From 2ed5fbf261307962e40292207f66cb518bd30a5d Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Fri, 2 Jul 2021 10:25:48 -0700 Subject: [PATCH 46/73] ANDROID: GKI: fscrypt: add OEM data to struct fscrypt_operations 'struct fscrypt_operations' shouldn't really be part of the KMI, as there's no reason for loadable modules to use it. However, due to the way MODVERSIONS calculates symbol CRCs by recursively dereferencing structures, changes to 'struct fscrypt_operations' affect the CRCs of KMI functions exported from certain core kernel files such as fs/dcache.c. That brings it in-scope for the KMI freeze. There is an OEM who wants to add fields to this struct, so add an ANDROID_OEM_DATA_ARRAY for them to use. Bug: 173475629 Change-Id: Idfc76884fce8a5fcc0837cd9363695d5428b1624 Signed-off-by: Eric Biggers --- include/linux/fscrypt.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/linux/fscrypt.h b/include/linux/fscrypt.h index 760d13699b0b..3eb7cf0cb34d 100644 --- a/include/linux/fscrypt.h +++ b/include/linux/fscrypt.h @@ -75,6 +75,8 @@ struct fscrypt_operations { ANDROID_KABI_RESERVE(2); ANDROID_KABI_RESERVE(3); ANDROID_KABI_RESERVE(4); + + ANDROID_OEM_DATA_ARRAY(1, 4); }; static inline struct fscrypt_info *fscrypt_get_info(const struct inode *inode) From 6da5e7afbfc4934d264addc849476a5116c274b3 Mon Sep 17 00:00:00 2001 From: Wesley Cheng Date: Sat, 10 Jul 2021 02:13:10 -0700 Subject: [PATCH 47/73] FROMGIT: usb: gadget: udc: core: Introduce check_config to verify USB configuration Some UDCs may have constraints on how many high bandwidth endpoints it can support in a certain configuration. This API allows for the composite driver to pass down the total number of endpoints to the UDC so it can verify it has the required resources to support the configuration. Signed-off-by: Wesley Cheng Link: https://lore.kernel.org/r/1625908395-5498-2-git-send-email-wcheng@codeaurora.org Signed-off-by: Greg Kroah-Hartman (cherry picked from commit ce7d0008c2356626f69f37ef1afce8fbc83fe142 https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-next) Signed-off-by: Greg Kroah-Hartman Change-Id: I3bf7a2b345b002ea33cdd6d0b9aabbc12c3f90d7 --- drivers/usb/gadget/udc/core.c | 19 +++++++++++++++++++ include/linux/usb/gadget.h | 4 ++++ 2 files changed, 23 insertions(+) diff --git a/drivers/usb/gadget/udc/core.c b/drivers/usb/gadget/udc/core.c index 119284d48349..edb83c8825de 100644 --- a/drivers/usb/gadget/udc/core.c +++ b/drivers/usb/gadget/udc/core.c @@ -1006,6 +1006,25 @@ int usb_gadget_ep_match_desc(struct usb_gadget *gadget, } EXPORT_SYMBOL_GPL(usb_gadget_ep_match_desc); +/** + * usb_gadget_check_config - checks if the UDC can support the binded + * configuration + * @gadget: controller to check the USB configuration + * + * Ensure that a UDC is able to support the requested resources by a + * configuration, and that there are no resource limitations, such as + * internal memory allocated to all requested endpoints. + * + * Returns zero on success, else a negative errno. + */ +int usb_gadget_check_config(struct usb_gadget *gadget) +{ + if (gadget->ops->check_config) + return gadget->ops->check_config(gadget); + return 0; +} +EXPORT_SYMBOL_GPL(usb_gadget_check_config); + /* ------------------------------------------------------------------------- */ static void usb_gadget_state_work(struct work_struct *work) diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h index 7c0a2a7aca6e..2286ff72ab7e 100644 --- a/include/linux/usb/gadget.h +++ b/include/linux/usb/gadget.h @@ -336,6 +336,7 @@ struct usb_gadget_ops { struct usb_ep *(*match_ep)(struct usb_gadget *, struct usb_endpoint_descriptor *, struct usb_ss_ep_comp_descriptor *); + int (*check_config)(struct usb_gadget *gadget); ANDROID_KABI_RESERVE(1); ANDROID_KABI_RESERVE(2); @@ -625,6 +626,7 @@ int usb_gadget_connect(struct usb_gadget *gadget); int usb_gadget_disconnect(struct usb_gadget *gadget); int usb_gadget_deactivate(struct usb_gadget *gadget); int usb_gadget_activate(struct usb_gadget *gadget); +int usb_gadget_check_config(struct usb_gadget *gadget); #else static inline int usb_gadget_frame_number(struct usb_gadget *gadget) { return 0; } @@ -648,6 +650,8 @@ static inline int usb_gadget_deactivate(struct usb_gadget *gadget) { return 0; } static inline int usb_gadget_activate(struct usb_gadget *gadget) { return 0; } +static inline int usb_gadget_check_config(struct usb_gadget *gadget) +{ return 0; } #endif /* CONFIG_USB_GADGET */ /*-------------------------------------------------------------------------*/ From 1e11f36199bcddb0863f8fc68ebb989cb5e6f3a3 Mon Sep 17 00:00:00 2001 From: Wesley Cheng Date: Sat, 10 Jul 2021 02:13:11 -0700 Subject: [PATCH 48/73] FROMGIT: usb: gadget: configfs: Check USB configuration before adding Ensure that the USB gadget is able to support the configuration being added based on the number of endpoints required from all interfaces. This is for accounting for any bandwidth or space limitations. Signed-off-by: Wesley Cheng Link: https://lore.kernel.org/r/1625908395-5498-3-git-send-email-wcheng@codeaurora.org Signed-off-by: Greg Kroah-Hartman (cherry picked from commit 7adf9e3adc398e5d5b7af91e5fdfafa70e86dd36 https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-next) Signed-off-by: Greg Kroah-Hartman Change-Id: I956c5f1a707770d5b6bf52dbe0512654df38edd4 --- drivers/usb/gadget/configfs.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c index 9fa88eb25af2..2d7b7cd6d3a6 100644 --- a/drivers/usb/gadget/configfs.c +++ b/drivers/usb/gadget/configfs.c @@ -1436,6 +1436,10 @@ static int configfs_composite_bind(struct usb_gadget *gadget, goto err_purge_funcs; } } + ret = usb_gadget_check_config(cdev->gadget); + if (ret) + goto err_purge_funcs; + usb_ep_autoconfig_reset(cdev->gadget); } if (cdev->use_os_string) { From 79274dbb0011418ae935e40645116c2d1e18a0a8 Mon Sep 17 00:00:00 2001 From: Wesley Cheng Date: Sat, 10 Jul 2021 02:13:12 -0700 Subject: [PATCH 49/73] FROMGIT: usb: dwc3: Resize TX FIFOs to meet EP bursting requirements Some devices have USB compositions which may require multiple endpoints that support EP bursting. HW defined TX FIFO sizes may not always be sufficient for these compositions. By utilizing flexible TX FIFO allocation, this allows for endpoints to request the required FIFO depth to achieve higher bandwidth. With some higher bMaxBurst configurations, using a larger TX FIFO size results in better TX throughput. By introducing the check_config() callback, the resizing logic can fetch the maximum number of endpoints used in the USB composition (can contain multiple configurations), which helps ensure that the resizing logic can fulfill the configuration(s), or return an error to the gadget layer otherwise during bind time. Signed-off-by: Wesley Cheng Link: https://lore.kernel.org/r/1625908395-5498-4-git-send-email-wcheng@codeaurora.org Signed-off-by: Greg Kroah-Hartman (cherry picked from commit 9f607a309fbe95fc1f77acce5af70766a7142537 https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-next) Signed-off-by: Greg Kroah-Hartman Change-Id: I5066387ad4b434dd9dc31f119535d5d48e256a3a --- drivers/usb/dwc3/core.c | 15 +++ drivers/usb/dwc3/core.h | 16 +++ drivers/usb/dwc3/ep0.c | 2 + drivers/usb/dwc3/gadget.c | 232 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 265 insertions(+) diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index 1f961f2ead4c..172dfd20a705 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -1267,6 +1267,7 @@ static void dwc3_get_properties(struct dwc3 *dwc) u8 rx_max_burst_prd; u8 tx_thr_num_pkt_prd; u8 tx_max_burst_prd; + u8 tx_fifo_resize_max_num; const char *usb_psy_name; int ret; @@ -1282,6 +1283,13 @@ static void dwc3_get_properties(struct dwc3 *dwc) */ hird_threshold = 12; + /* + * default to a TXFIFO size large enough to fit 6 max packets. This + * allows for systems with larger bus latencies to have some headroom + * for endpoints that have a large bMaxBurst value. + */ + tx_fifo_resize_max_num = 6; + dwc->maximum_speed = usb_get_maximum_speed(dev); dwc->max_ssp_rate = usb_get_maximum_ssp_rate(dev); dwc->dr_mode = usb_get_dr_mode(dev); @@ -1325,6 +1333,11 @@ static void dwc3_get_properties(struct dwc3 *dwc) &tx_thr_num_pkt_prd); device_property_read_u8(dev, "snps,tx-max-burst-prd", &tx_max_burst_prd); + dwc->do_fifo_resize = device_property_read_bool(dev, + "tx-fifo-resize"); + if (dwc->do_fifo_resize) + device_property_read_u8(dev, "tx-fifo-max-num", + &tx_fifo_resize_max_num); dwc->disable_scramble_quirk = device_property_read_bool(dev, "snps,disable_scramble_quirk"); @@ -1390,6 +1403,8 @@ static void dwc3_get_properties(struct dwc3 *dwc) dwc->tx_max_burst_prd = tx_max_burst_prd; dwc->imod_interval = 0; + + dwc->tx_fifo_resize_max_num = tx_fifo_resize_max_num; } /* check whether the core supports IMOD */ diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index 05dfd01183f7..4faa14f8f8eb 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h @@ -1038,6 +1038,7 @@ struct dwc3_scratchpad_array { * @rx_max_burst_prd: max periodic ESS receive burst size * @tx_thr_num_pkt_prd: periodic ESS transmit packet count * @tx_max_burst_prd: max periodic ESS transmit burst size + * @tx_fifo_resize_max_num: max number of fifos allocated during txfifo resize * @hsphy_interface: "utmi" or "ulpi" * @connected: true when we're connected to a host, false otherwise * @delayed_status: true when gadget driver asks for delayed status @@ -1052,6 +1053,7 @@ struct dwc3_scratchpad_array { * 1 - utmi_l1_suspend_n * @is_fpga: true when we are using the FPGA board * @pending_events: true when we have pending IRQs to be handled + * @do_fifo_resize: true when txfifo resizing is enabled for dwc3 endpoints * @pullups_connected: true when Run/Stop bit is set * @setup_packet_pending: true when there's a Setup Packet in FIFO. Workaround * @three_stage_setup: set if we perform a three phase setup @@ -1094,6 +1096,11 @@ struct dwc3_scratchpad_array { * @dis_split_quirk: set to disable split boundary. * @imod_interval: set the interrupt moderation interval in 250ns * increments or 0 to disable. + * @max_cfg_eps: current max number of IN eps used across all USB configs. + * @last_fifo_depth: last fifo depth used to determine next fifo ram start + * address. + * @num_ep_resized: carries the current number endpoints which have had its tx + * fifo resized. */ struct dwc3 { struct work_struct drd_work; @@ -1249,6 +1256,7 @@ struct dwc3 { u8 rx_max_burst_prd; u8 tx_thr_num_pkt_prd; u8 tx_max_burst_prd; + u8 tx_fifo_resize_max_num; const char *hsphy_interface; @@ -1262,6 +1270,7 @@ struct dwc3 { unsigned is_utmi_l1_suspend:1; unsigned is_fpga:1; unsigned pending_events:1; + unsigned do_fifo_resize:1; unsigned pullups_connected:1; unsigned setup_packet_pending:1; unsigned three_stage_setup:1; @@ -1298,6 +1307,10 @@ struct dwc3 { u16 imod_interval; + int max_cfg_eps; + int last_fifo_depth; + int num_ep_resized; + ANDROID_KABI_RESERVE(1); ANDROID_KABI_RESERVE(2); ANDROID_KABI_RESERVE(3); @@ -1534,6 +1547,7 @@ int dwc3_send_gadget_ep_cmd(struct dwc3_ep *dep, unsigned int cmd, int dwc3_send_gadget_generic_command(struct dwc3 *dwc, unsigned int cmd, u32 param); void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force, bool interrupt); +void dwc3_gadget_clear_tx_fifos(struct dwc3 *dwc); #else static inline int dwc3_gadget_init(struct dwc3 *dwc) { return 0; } @@ -1556,6 +1570,8 @@ static inline int dwc3_send_gadget_generic_command(struct dwc3 *dwc, static inline void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force, bool interrupt) { } +static inline void dwc3_gadget_clear_tx_fifos(struct dwc3 *dwc) +{ } #endif #if IS_ENABLED(CONFIG_USB_DWC3_DUAL_ROLE) diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c index 8b668ef46f7f..4f216bd2c3b8 100644 --- a/drivers/usb/dwc3/ep0.c +++ b/drivers/usb/dwc3/ep0.c @@ -616,6 +616,8 @@ static int dwc3_ep0_set_config(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl) return -EINVAL; case USB_STATE_ADDRESS: + dwc3_gadget_clear_tx_fifos(dwc); + ret = dwc3_ep0_delegate_req(dwc, ctrl); /* if the cfg matches and the cfg is non zero */ if (cfg && (!ret || (ret == USB_GADGET_DELAYED_STATUS))) { diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 5e7d930508e2..40fafb34d774 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -629,6 +629,187 @@ static int dwc3_gadget_set_ep_config(struct dwc3_ep *dep, unsigned int action) return dwc3_send_gadget_ep_cmd(dep, DWC3_DEPCMD_SETEPCONFIG, ¶ms); } +/** + * dwc3_gadget_calc_tx_fifo_size - calculates the txfifo size value + * @dwc: pointer to the DWC3 context + * @nfifos: number of fifos to calculate for + * + * Calculates the size value based on the equation below: + * + * DWC3 revision 280A and prior: + * fifo_size = mult * (max_packet / mdwidth) + 1; + * + * DWC3 revision 290A and onwards: + * fifo_size = mult * ((max_packet + mdwidth)/mdwidth + 1) + 1 + * + * The max packet size is set to 1024, as the txfifo requirements mainly apply + * to super speed USB use cases. However, it is safe to overestimate the fifo + * allocations for other scenarios, i.e. high speed USB. + */ +static int dwc3_gadget_calc_tx_fifo_size(struct dwc3 *dwc, int mult) +{ + int max_packet = 1024; + int fifo_size; + int mdwidth; + + mdwidth = dwc3_mdwidth(dwc); + + /* MDWIDTH is represented in bits, we need it in bytes */ + mdwidth >>= 3; + + if (DWC3_VER_IS_PRIOR(DWC3, 290A)) + fifo_size = mult * (max_packet / mdwidth) + 1; + else + fifo_size = mult * ((max_packet + mdwidth) / mdwidth) + 1; + return fifo_size; +} + +/** + * dwc3_gadget_clear_tx_fifo_size - Clears txfifo allocation + * @dwc: pointer to the DWC3 context + * + * Iterates through all the endpoint registers and clears the previous txfifo + * allocations. + */ +void dwc3_gadget_clear_tx_fifos(struct dwc3 *dwc) +{ + struct dwc3_ep *dep; + int fifo_depth; + int size; + int num; + + if (!dwc->do_fifo_resize) + return; + + /* Read ep0IN related TXFIFO size */ + dep = dwc->eps[1]; + size = dwc3_readl(dwc->regs, DWC3_GTXFIFOSIZ(0)); + if (DWC3_IP_IS(DWC3)) + fifo_depth = DWC3_GTXFIFOSIZ_TXFDEP(size); + else + fifo_depth = DWC31_GTXFIFOSIZ_TXFDEP(size); + + dwc->last_fifo_depth = fifo_depth; + /* Clear existing TXFIFO for all IN eps except ep0 */ + for (num = 3; num < min_t(int, dwc->num_eps, DWC3_ENDPOINTS_NUM); + num += 2) { + dep = dwc->eps[num]; + /* Don't change TXFRAMNUM on usb31 version */ + size = DWC3_IP_IS(DWC3) ? 0 : + dwc3_readl(dwc->regs, DWC3_GTXFIFOSIZ(num >> 1)) & + DWC31_GTXFIFOSIZ_TXFRAMNUM; + + dwc3_writel(dwc->regs, DWC3_GTXFIFOSIZ(num >> 1), size); + } + dwc->num_ep_resized = 0; +} + +/* + * dwc3_gadget_resize_tx_fifos - reallocate fifo spaces for current use-case + * @dwc: pointer to our context structure + * + * This function will a best effort FIFO allocation in order + * to improve FIFO usage and throughput, while still allowing + * us to enable as many endpoints as possible. + * + * Keep in mind that this operation will be highly dependent + * on the configured size for RAM1 - which contains TxFifo -, + * the amount of endpoints enabled on coreConsultant tool, and + * the width of the Master Bus. + * + * In general, FIFO depths are represented with the following equation: + * + * fifo_size = mult * ((max_packet + mdwidth)/mdwidth + 1) + 1 + * + * In conjunction with dwc3_gadget_check_config(), this resizing logic will + * ensure that all endpoints will have enough internal memory for one max + * packet per endpoint. + */ +static int dwc3_gadget_resize_tx_fifos(struct dwc3_ep *dep) +{ + struct dwc3 *dwc = dep->dwc; + int fifo_0_start; + int ram1_depth; + int fifo_size; + int min_depth; + int num_in_ep; + int remaining; + int num_fifos = 1; + int fifo; + int tmp; + + if (!dwc->do_fifo_resize) + return 0; + + /* resize IN endpoints except ep0 */ + if (!usb_endpoint_dir_in(dep->endpoint.desc) || dep->number <= 1) + return 0; + + ram1_depth = DWC3_RAM1_DEPTH(dwc->hwparams.hwparams7); + + if ((dep->endpoint.maxburst > 1 && + usb_endpoint_xfer_bulk(dep->endpoint.desc)) || + usb_endpoint_xfer_isoc(dep->endpoint.desc)) + num_fifos = 3; + + if (dep->endpoint.maxburst > 6 && + usb_endpoint_xfer_bulk(dep->endpoint.desc) && DWC3_IP_IS(DWC31)) + num_fifos = dwc->tx_fifo_resize_max_num; + + /* FIFO size for a single buffer */ + fifo = dwc3_gadget_calc_tx_fifo_size(dwc, 1); + + /* Calculate the number of remaining EPs w/o any FIFO */ + num_in_ep = dwc->max_cfg_eps; + num_in_ep -= dwc->num_ep_resized; + + /* Reserve at least one FIFO for the number of IN EPs */ + min_depth = num_in_ep * (fifo + 1); + remaining = ram1_depth - min_depth - dwc->last_fifo_depth; + remaining = max_t(int, 0, remaining); + /* + * We've already reserved 1 FIFO per EP, so check what we can fit in + * addition to it. If there is not enough remaining space, allocate + * all the remaining space to the EP. + */ + fifo_size = (num_fifos - 1) * fifo; + if (remaining < fifo_size) + fifo_size = remaining; + + fifo_size += fifo; + /* Last increment according to the TX FIFO size equation */ + fifo_size++; + + /* Check if TXFIFOs start at non-zero addr */ + tmp = dwc3_readl(dwc->regs, DWC3_GTXFIFOSIZ(0)); + fifo_0_start = DWC3_GTXFIFOSIZ_TXFSTADDR(tmp); + + fifo_size |= (fifo_0_start + (dwc->last_fifo_depth << 16)); + if (DWC3_IP_IS(DWC3)) + dwc->last_fifo_depth += DWC3_GTXFIFOSIZ_TXFDEP(fifo_size); + else + dwc->last_fifo_depth += DWC31_GTXFIFOSIZ_TXFDEP(fifo_size); + + /* Check fifo size allocation doesn't exceed available RAM size. */ + if (dwc->last_fifo_depth >= ram1_depth) { + dev_err(dwc->dev, "Fifosize(%d) > RAM size(%d) %s depth:%d\n", + dwc->last_fifo_depth, ram1_depth, + dep->endpoint.name, fifo_size); + if (DWC3_IP_IS(DWC3)) + fifo_size = DWC3_GTXFIFOSIZ_TXFDEP(fifo_size); + else + fifo_size = DWC31_GTXFIFOSIZ_TXFDEP(fifo_size); + + dwc->last_fifo_depth -= fifo_size; + return -ENOMEM; + } + + dwc3_writel(dwc->regs, DWC3_GTXFIFOSIZ(dep->number >> 1), fifo_size); + dwc->num_ep_resized++; + + return 0; +} + /** * __dwc3_gadget_ep_enable - initializes a hw endpoint * @dep: endpoint to be initialized @@ -646,6 +827,10 @@ static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep, unsigned int action) int ret; if (!(dep->flags & DWC3_EP_ENABLED)) { + ret = dwc3_gadget_resize_tx_fifos(dep); + if (ret) + return ret; + ret = dwc3_gadget_start_config(dep); if (ret) return ret; @@ -2510,6 +2695,7 @@ static int dwc3_gadget_stop(struct usb_gadget *g) spin_lock_irqsave(&dwc->lock, flags); dwc->gadget_driver = NULL; + dwc->max_cfg_eps = 0; spin_unlock_irqrestore(&dwc->lock, flags); free_irq(dwc->irq_gadget, dwc->ev_buf); @@ -2597,6 +2783,51 @@ static int dwc3_gadget_vbus_draw(struct usb_gadget *g, unsigned int mA) return ret; } +/** + * dwc3_gadget_check_config - ensure dwc3 can support the USB configuration + * @g: pointer to the USB gadget + * + * Used to record the maximum number of endpoints being used in a USB composite + * device. (across all configurations) This is to be used in the calculation + * of the TXFIFO sizes when resizing internal memory for individual endpoints. + * It will help ensured that the resizing logic reserves enough space for at + * least one max packet. + */ +static int dwc3_gadget_check_config(struct usb_gadget *g) +{ + struct dwc3 *dwc = gadget_to_dwc(g); + struct usb_ep *ep; + int fifo_size = 0; + int ram1_depth; + int ep_num = 0; + + if (!dwc->do_fifo_resize) + return 0; + + list_for_each_entry(ep, &g->ep_list, ep_list) { + /* Only interested in the IN endpoints */ + if (ep->claimed && (ep->address & USB_DIR_IN)) + ep_num++; + } + + if (ep_num <= dwc->max_cfg_eps) + return 0; + + /* Update the max number of eps in the composition */ + dwc->max_cfg_eps = ep_num; + + fifo_size = dwc3_gadget_calc_tx_fifo_size(dwc, dwc->max_cfg_eps); + /* Based on the equation, increment by one for every ep */ + fifo_size += dwc->max_cfg_eps; + + /* Check if we can fit a single fifo per endpoint */ + ram1_depth = DWC3_RAM1_DEPTH(dwc->hwparams.hwparams7); + if (fifo_size > ram1_depth) + return -ENOMEM; + + return 0; +} + static const struct usb_gadget_ops dwc3_gadget_ops = { .get_frame = dwc3_gadget_get_frame, .wakeup = dwc3_gadget_wakeup, @@ -2608,6 +2839,7 @@ static const struct usb_gadget_ops dwc3_gadget_ops = { .udc_set_ssp_rate = dwc3_gadget_set_ssp_rate, .get_config_params = dwc3_gadget_config_params, .vbus_draw = dwc3_gadget_vbus_draw, + .check_config = dwc3_gadget_check_config, }; /* -------------------------------------------------------------------------- */ From 5bb2dd8d3975a4ccbbbd594e23b56b47300c37d8 Mon Sep 17 00:00:00 2001 From: Wesley Cheng Date: Sat, 10 Jul 2021 02:13:14 -0700 Subject: [PATCH 50/73] FROMGIT: usb: dwc3: dwc3-qcom: Enable tx-fifo-resize property by default In order to take advantage of the TX fifo resizing logic, manually add these properties to the DWC3 child node by default. This will allow the DWC3 gadget to resize the TX fifos for the IN endpoints, which help with performance. Signed-off-by: Wesley Cheng Link: https://lore.kernel.org/r/1625908395-5498-6-git-send-email-wcheng@codeaurora.org Signed-off-by: Greg Kroah-Hartman (cherry picked from commit cefdd52fa0455c0555c30927386ee466a108b060 https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-next) Signed-off-by: Greg Kroah-Hartman Change-Id: I42a9136864c883fd7ca8be7dedc325119fea21c4 --- drivers/usb/dwc3/dwc3-qcom.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/drivers/usb/dwc3/dwc3-qcom.c b/drivers/usb/dwc3/dwc3-qcom.c index 8bd077fb1190..a47af6082cc4 100644 --- a/drivers/usb/dwc3/dwc3-qcom.c +++ b/drivers/usb/dwc3/dwc3-qcom.c @@ -640,6 +640,7 @@ static int dwc3_qcom_of_register_core(struct platform_device *pdev) struct dwc3_qcom *qcom = platform_get_drvdata(pdev); struct device_node *np = pdev->dev.of_node, *dwc3_np; struct device *dev = &pdev->dev; + struct property *prop; int ret; dwc3_np = of_get_child_by_name(np, "dwc3"); @@ -648,6 +649,20 @@ static int dwc3_qcom_of_register_core(struct platform_device *pdev) return -ENODEV; } + prop = devm_kzalloc(dev, sizeof(*prop), GFP_KERNEL); + if (!prop) { + ret = -ENOMEM; + dev_err(dev, "unable to allocate memory for property\n"); + goto node_put; + } + + prop->name = "tx-fifo-resize"; + ret = of_add_property(dwc3_np, prop); + if (ret) { + dev_err(dev, "unable to add property\n"); + goto node_put; + } + ret = of_platform_populate(np, NULL, NULL, dev); if (ret) { dev_err(dev, "failed to register dwc3 core - %d\n", ret); From 26920e0f3a6252c9d47f70c8cc0842d53a4bf868 Mon Sep 17 00:00:00 2001 From: Linyu Yuan Date: Tue, 29 Jun 2021 09:51:18 +0800 Subject: [PATCH 51/73] FROMLIST: usb: dwc3: avoid NULL access of usb_gadget_driver we found crash in dwc3_disconnect_gadget(), it is because dwc->gadget_driver become NULL before async access. 7dc0c55e9f30 ('USB: UDC core: Add udc_async_callbacks gadget op') suggest a common way to avoid such kind of issue. this change implment the callback in dwc3 and change related functions which have callback to usb gadget driver. Signed-off-by: Linyu Yuan Bug: 193006095 Link: https://lore.kernel.org/linux-usb/20210629015118.7944-1-linyyuan@codeaurora.org Change-Id: Id6774f7f6b7c8d31338128ffc33f01f5575f4d16 Signed-off-by: Jack Pham --- drivers/usb/dwc3/core.h | 1 + drivers/usb/dwc3/ep0.c | 10 ++++++---- drivers/usb/dwc3/gadget.c | 21 ++++++++++++++++----- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index 4faa14f8f8eb..07d70418b7bd 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h @@ -1304,6 +1304,7 @@ struct dwc3 { unsigned dis_metastability_quirk:1; unsigned dis_split_quirk:1; + unsigned async_callbacks:1; u16 imod_interval; diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c index 4f216bd2c3b8..0c7e6eae940f 100644 --- a/drivers/usb/dwc3/ep0.c +++ b/drivers/usb/dwc3/ep0.c @@ -594,11 +594,13 @@ static int dwc3_ep0_set_address(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl) static int dwc3_ep0_delegate_req(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl) { - int ret; + int ret = -EINVAL; - spin_unlock(&dwc->lock); - ret = dwc->gadget_driver->setup(dwc->gadget, ctrl); - spin_lock(&dwc->lock); + if (dwc->async_callbacks) { + spin_unlock(&dwc->lock); + ret = dwc->gadget_driver->setup(dwc->gadget, ctrl); + spin_lock(&dwc->lock); + } return ret; } diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 40fafb34d774..6162570846d0 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -2828,6 +2828,16 @@ static int dwc3_gadget_check_config(struct usb_gadget *g) return 0; } +static void dwc3_gadget_async_callbacks(struct usb_gadget *g, bool enable) +{ + struct dwc3 *dwc = gadget_to_dwc(g); + unsigned long flags; + + spin_lock_irqsave(&dwc->lock, flags); + dwc->async_callbacks = enable; + spin_unlock_irqrestore(&dwc->lock, flags); +} + static const struct usb_gadget_ops dwc3_gadget_ops = { .get_frame = dwc3_gadget_get_frame, .wakeup = dwc3_gadget_wakeup, @@ -2840,6 +2850,7 @@ static const struct usb_gadget_ops dwc3_gadget_ops = { .get_config_params = dwc3_gadget_config_params, .vbus_draw = dwc3_gadget_vbus_draw, .check_config = dwc3_gadget_check_config, + .udc_async_callbacks = dwc3_gadget_async_callbacks, }; /* -------------------------------------------------------------------------- */ @@ -3473,7 +3484,7 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc, static void dwc3_disconnect_gadget(struct dwc3 *dwc) { - if (dwc->gadget_driver && dwc->gadget_driver->disconnect) { + if (dwc->async_callbacks && dwc->gadget_driver->disconnect) { spin_unlock(&dwc->lock); dwc->gadget_driver->disconnect(dwc->gadget); spin_lock(&dwc->lock); @@ -3482,7 +3493,7 @@ static void dwc3_disconnect_gadget(struct dwc3 *dwc) static void dwc3_suspend_gadget(struct dwc3 *dwc) { - if (dwc->gadget_driver && dwc->gadget_driver->suspend) { + if (dwc->async_callbacks && dwc->gadget_driver->suspend) { spin_unlock(&dwc->lock); dwc->gadget_driver->suspend(dwc->gadget); spin_lock(&dwc->lock); @@ -3491,7 +3502,7 @@ static void dwc3_suspend_gadget(struct dwc3 *dwc) static void dwc3_resume_gadget(struct dwc3 *dwc) { - if (dwc->gadget_driver && dwc->gadget_driver->resume) { + if (dwc->async_callbacks && dwc->gadget_driver->resume) { spin_unlock(&dwc->lock); dwc->gadget_driver->resume(dwc->gadget); spin_lock(&dwc->lock); @@ -3503,7 +3514,7 @@ static void dwc3_reset_gadget(struct dwc3 *dwc) if (!dwc->gadget_driver) return; - if (dwc->gadget->speed != USB_SPEED_UNKNOWN) { + if (dwc->async_callbacks && dwc->gadget->speed != USB_SPEED_UNKNOWN) { spin_unlock(&dwc->lock); usb_gadget_udc_reset(dwc->gadget, dwc->gadget_driver); spin_lock(&dwc->lock); @@ -3833,7 +3844,7 @@ static void dwc3_gadget_wakeup_interrupt(struct dwc3 *dwc) * implemented. */ - if (dwc->gadget_driver && dwc->gadget_driver->resume) { + if (dwc->async_callbacks && dwc->gadget_driver->resume) { spin_unlock(&dwc->lock); dwc->gadget_driver->resume(dwc->gadget); spin_lock(&dwc->lock); From 65115fdbf84d284ea5472e366cc0800896100de9 Mon Sep 17 00:00:00 2001 From: Liujie Xie Date: Sat, 3 Jul 2021 09:58:59 +0800 Subject: [PATCH 52/73] ANDROID: vendor_hooks: add a field in pglist_data Add a pglist_data field to record additional node parameters. Bug: 192052083 Signed-off-by: Liujie Xie Change-Id: I3d764ab298c71ab9aba245867ee529045551aef4 --- include/linux/mmzone.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 6aaebd16ba6d..08ccefa35267 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -778,6 +778,7 @@ typedef struct pglist_data { int kswapd_failures; /* Number of 'reclaimed == 0' runs */ + ANDROID_OEM_DATA(1); #ifdef CONFIG_COMPACTION int kcompactd_max_order; enum zone_type kcompactd_highest_zoneidx; From 9d1b55d20a406c8cba7a9c4c85bad8628f110ac0 Mon Sep 17 00:00:00 2001 From: Liujie Xie Date: Sat, 3 Jul 2021 10:05:21 +0800 Subject: [PATCH 53/73] ANDROID: vendor_hooks: add a field in mem_cgroup Add a field in mem_cgroup to record additional per-cgroup information for memory policy tuning. Bug: 192052083 Signed-off-by: Liujie Xie Change-Id: I28c8bc1c2455d53e68a05555b57b76ded27af98a --- include/linux/memcontrol.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index f99a651c9d21..394aff2668b9 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -331,6 +331,7 @@ struct mem_cgroup { struct deferred_split deferred_split_queue; #endif + ANDROID_OEM_DATA(1); struct mem_cgroup_per_node *nodeinfo[0]; /* WARNING: nodeinfo must be the last member here */ }; From 280c9b98aa6ca04f88197ed8e306fc10c9e0cb97 Mon Sep 17 00:00:00 2001 From: Vignesh Saravanaperumal Date: Thu, 8 Jul 2021 07:31:18 -0700 Subject: [PATCH 54/73] ANDROID: GKI: add vendor padding variable in struct nf_conn Some vendors want to add things to 'struct nf_conn', so give them a u64 where they can then have a pointer off to their private data and they can do whatever they want to do without breaking or changing any abi for anyone else. Note, usually an android trace hook is also needed to use this properly, so be aware that this will be required as well. Bug: 171013716 Signed-off-by: Vignesh Saravanaperumal Change-Id: I245c162ee3fb083e3f39cf7bec3bd78cb624e005 --- include/net/netfilter/nf_conntrack.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/include/net/netfilter/nf_conntrack.h b/include/net/netfilter/nf_conntrack.h index 7a44164f147c..878d0ce81321 100644 --- a/include/net/netfilter/nf_conntrack.h +++ b/include/net/netfilter/nf_conntrack.h @@ -15,6 +15,7 @@ #include #include +#include #include #include @@ -109,6 +110,8 @@ struct nf_conn { ANDROID_KABI_RESERVE(1); ANDROID_KABI_RESERVE(2); + + ANDROID_OEM_DATA(1); }; static inline struct nf_conn * From 7786463e48ffe1ec00f9984cb1b78107f83210f3 Mon Sep 17 00:00:00 2001 From: Vignesh Saravanaperumal Date: Thu, 8 Jul 2021 07:52:24 -0700 Subject: [PATCH 55/73] ANDROID: GKI: add vendor padding variable in struct sock Some vendors want to add things to 'struct sock', so give them a u64 where they can then have a pointer off to their private data and they can do whatever they want to do without breaking or changing any abi for anyone else. Note, usually an android trace hook is also needed to use this properly, so be aware that this will be required as well. Bug: 171013716 Signed-off-by: Vignesh Saravanaperumal Change-Id: Iab0b5570753d4a9722ecf9ca9eeb9b9887e2a9d9 --- include/net/sock.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/include/net/sock.h b/include/net/sock.h index f1de3d83469d..1f0a41d79baf 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -69,6 +69,7 @@ #include #include #include +#include /* * This structure really needs to be cleaned up. @@ -530,6 +531,8 @@ struct sock { ANDROID_KABI_RESERVE(6); ANDROID_KABI_RESERVE(7); ANDROID_KABI_RESERVE(8); + + ANDROID_OEM_DATA(1); }; enum sk_pacing { From 4d3095647872844a0449478beaf61db24cad779f Mon Sep 17 00:00:00 2001 From: Vignesh Saravanaperumal Date: Thu, 8 Jul 2021 12:00:53 -0700 Subject: [PATCH 56/73] ANDROID: GKI: net: add vendor hooks for 'struct nf_conn' lifecycle Some vendors want to add a field when a 'sruct nf_conn' is added so give a hook to handle this. Any memory allocated when trace_android_rvh_nf_conn_alloc() is called needs to be freed when trace_android_rvh_nf_conn_free() is called. Note, if trace_android_rvh_nf_conn_alloc() fails, be sure to be able to handle this in trace_android_rvh_nf_conn_free(), but that should not be an issue as that needs to be addressed in vendor code that runs for 'struct nf_conn' objects that have been created before the vendor code is loaded no matter what. Bug: 171013716 Signed-off-by: Vignesh Saravanaperumal Change-Id: I4d2b025196a3df7ba4adec313c90483811cac728 --- drivers/android/vendor_hooks.c | 2 ++ include/trace/hooks/net.h | 6 ++++++ net/netfilter/nf_conntrack_core.c | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index bf20ca7252b0..794b556cfd7f 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -91,6 +91,8 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_prepare_prio_fork); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_finish_prio_fork); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_user_nice); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_setscheduler); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_nf_conn_alloc); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_nf_conn_free); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_arch_set_freq_scale); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_is_fpsimd_save); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_transaction_init); diff --git a/include/trace/hooks/net.h b/include/trace/hooks/net.h index 31e0f21373e8..b2f68a1d8987 100644 --- a/include/trace/hooks/net.h +++ b/include/trace/hooks/net.h @@ -18,6 +18,12 @@ DECLARE_HOOK(android_vh_ptype_head, DECLARE_HOOK(android_vh_kfree_skb, TP_PROTO(struct sk_buff *skb), TP_ARGS(skb)); +struct nf_conn; +DECLARE_RESTRICTED_HOOK(android_rvh_nf_conn_alloc, + TP_PROTO(struct nf_conn *nf_conn), TP_ARGS(nf_conn), 1); +DECLARE_RESTRICTED_HOOK(android_rvh_nf_conn_free, + TP_PROTO(struct nf_conn *nf_conn), TP_ARGS(nf_conn), 1); + /* macro versions of hooks are no longer required */ #endif /* _TRACE_HOOK_NET_VH_H */ diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index ff0168736f6e..573e0b817d05 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c @@ -33,6 +33,7 @@ #include #include #include +#include #include #include @@ -1514,6 +1515,8 @@ __nf_conntrack_alloc(struct net *net, nf_ct_zone_add(ct, zone); + trace_android_rvh_nf_conn_alloc(ct); + /* Because we use RCU lookups, we set ct_general.use to zero before * this is inserted in any list. */ @@ -1546,6 +1549,7 @@ void nf_conntrack_free(struct nf_conn *ct) nf_ct_ext_destroy(ct); kmem_cache_free(nf_conntrack_cachep, ct); smp_mb__before_atomic(); + trace_android_rvh_nf_conn_free(ct); atomic_dec(&net->ct.count); } EXPORT_SYMBOL_GPL(nf_conntrack_free); From 0ed7424fa0cc7253718f29972af0a7362bc4a961 Mon Sep 17 00:00:00 2001 From: Vignesh Saravanaperumal Date: Thu, 8 Jul 2021 12:09:18 -0700 Subject: [PATCH 57/73] ANDROID: GKI: net: add vendor hooks for 'struct sock' lifecycle Some vendors want to add a field when a 'sruct sock' is added so give a hook to handle this. Any memory allocated when trace_android_rvh_sk_alloc() is called needs to be freed when trace_android_rvh_sk_free() is called. Note, if trace_android_rvh_sk_alloc() fails, be sure to be able to handle this in trace_android_rvh_sk_free(), but that should not be an issue as that needs to be addressed in vendor code that runs for 'struct sock' objects that have been created before the vendor code is loaded no matter what. Bug: 171013716 Signed-off-by: Vignesh Saravanaperumal Change-Id: I108a2f31d2dcc228f46159816deee6235afafbbd --- drivers/android/vendor_hooks.c | 2 ++ include/trace/hooks/net.h | 5 +++++ net/core/sock.c | 5 +++++ 3 files changed, 12 insertions(+) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 794b556cfd7f..6ebc82a0ff43 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -91,6 +91,8 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_prepare_prio_fork); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_finish_prio_fork); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_user_nice); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_setscheduler); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_sk_alloc); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_sk_free); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_nf_conn_alloc); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_nf_conn_free); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_arch_set_freq_scale); diff --git a/include/trace/hooks/net.h b/include/trace/hooks/net.h index b2f68a1d8987..6715aa4eb668 100644 --- a/include/trace/hooks/net.h +++ b/include/trace/hooks/net.h @@ -19,10 +19,15 @@ DECLARE_HOOK(android_vh_kfree_skb, TP_PROTO(struct sk_buff *skb), TP_ARGS(skb)); struct nf_conn; +struct sock; DECLARE_RESTRICTED_HOOK(android_rvh_nf_conn_alloc, TP_PROTO(struct nf_conn *nf_conn), TP_ARGS(nf_conn), 1); DECLARE_RESTRICTED_HOOK(android_rvh_nf_conn_free, TP_PROTO(struct nf_conn *nf_conn), TP_ARGS(nf_conn), 1); +DECLARE_RESTRICTED_HOOK(android_rvh_sk_alloc, + TP_PROTO(struct sock *sock), TP_ARGS(sock), 1); +DECLARE_RESTRICTED_HOOK(android_rvh_sk_free, + TP_PROTO(struct sock *sock), TP_ARGS(sock), 1); /* macro versions of hooks are no longer required */ diff --git a/net/core/sock.c b/net/core/sock.c index e640a68f34ba..ffc1e1e8ec73 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -136,6 +136,7 @@ #include #include +#include #include #include @@ -1678,6 +1679,8 @@ static struct sock *sk_prot_alloc(struct proto *prot, gfp_t priority, if (security_sk_alloc(sk, family, priority)) goto out_free; + trace_android_rvh_sk_alloc(sk); + if (!try_module_get(prot->owner)) goto out_free_sec; sk_tx_queue_clear(sk); @@ -1687,6 +1690,7 @@ static struct sock *sk_prot_alloc(struct proto *prot, gfp_t priority, out_free_sec: security_sk_free(sk); + trace_android_rvh_sk_free(sk); out_free: if (slab != NULL) kmem_cache_free(slab, sk); @@ -1706,6 +1710,7 @@ static void sk_prot_free(struct proto *prot, struct sock *sk) cgroup_sk_free(&sk->sk_cgrp_data); mem_cgroup_sk_free(sk); security_sk_free(sk); + trace_android_rvh_sk_free(sk); if (slab != NULL) kmem_cache_free(slab, sk); else From e85b291d7dd3cdfa4131cc3c0b4da3a4061b331e Mon Sep 17 00:00:00 2001 From: Suren Baghdasaryan Date: Wed, 23 Jun 2021 18:42:10 -0700 Subject: [PATCH 58/73] ANDROID: GKI: Enable CONFIG_MEMCG Enable CONFIG_MEMCG config to provide a way to use memory cgroups with GKI kernels. If not needed, memcgs can be disabled using "group_disable=memory" kernel command-line option. Bug: 191223209 Signed-off-by: Suren Baghdasaryan Change-Id: Ife5cfe17576d92ac116dabd1a118bc0bb013b26f --- arch/arm64/configs/gki_defconfig | 1 + arch/x86/configs/gki_defconfig | 1 + 2 files changed, 2 insertions(+) diff --git a/arch/arm64/configs/gki_defconfig b/arch/arm64/configs/gki_defconfig index e1d96b946ad8..9e75fba692ad 100644 --- a/arch/arm64/configs/gki_defconfig +++ b/arch/arm64/configs/gki_defconfig @@ -15,6 +15,7 @@ CONFIG_IKHEADERS=y CONFIG_UCLAMP_TASK=y CONFIG_UCLAMP_BUCKETS_COUNT=20 CONFIG_CGROUPS=y +CONFIG_MEMCG=y CONFIG_BLK_CGROUP=y CONFIG_CGROUP_SCHED=y CONFIG_UCLAMP_TASK_GROUP=y diff --git a/arch/x86/configs/gki_defconfig b/arch/x86/configs/gki_defconfig index 91998158ffac..c4f89cd04566 100644 --- a/arch/x86/configs/gki_defconfig +++ b/arch/x86/configs/gki_defconfig @@ -17,6 +17,7 @@ CONFIG_IKHEADERS=y CONFIG_UCLAMP_TASK=y CONFIG_UCLAMP_BUCKETS_COUNT=20 CONFIG_CGROUPS=y +CONFIG_MEMCG=y CONFIG_BLK_CGROUP=y CONFIG_CGROUP_SCHED=y CONFIG_UCLAMP_TASK_GROUP=y From 26cd2564e122bcb8b85419b954333334b94292c9 Mon Sep 17 00:00:00 2001 From: Suren Baghdasaryan Date: Tue, 15 Jun 2021 14:03:43 -0700 Subject: [PATCH 59/73] FROMLIST: psi: stop relying on timer_pending for poll_work rescheduling Psi polling mechanism is trying to minimize the number of wakeups to run psi_poll_work and is currently relying on timer_pending() to detect when this work is already scheduled. This provides a window of opportunity for psi_group_change to schedule an immediate psi_poll_work after poll_timer_fn got called but before psi_poll_work could reschedule itself. Below is the depiction of this entire window: poll_timer_fn wake_up_interruptible(&group->poll_wait); psi_poll_worker wait_event_interruptible(group->poll_wait, ...) psi_poll_work psi_schedule_poll_work if (timer_pending(&group->poll_timer)) return; ... mod_timer(&group->poll_timer, jiffies + delay); Prior to 461daba06bdc we used to rely on poll_scheduled atomic which was reset and set back inside psi_poll_work and therefore this race window was much smaller. The larger window causes increased number of wakeups and our partners report visible power regression of ~10mA after applying 461daba06bdc. Bring back the poll_scheduled atomic and make this race window even narrower by resetting poll_scheduled only when we reach polling expiration time. This does not completely eliminate the possibility of extra wakeups caused by a race with psi_group_change however it will limit it to the worst case scenario of one extra wakeup per every tracking window (0.5s in the worst case). This patch also ensures correct ordering between clearing poll_scheduled flag and obtaining changed_states using memory barrier. Correct ordering between updating changed_states and setting poll_scheduled is ensured by atomic_xchg operation. By tracing the number of immediate rescheduling attempts performed by psi_group_change and the number of these attempts being blocked due to psi monitor being already active, we can assess the effects of this change: Before the patch: Run#1 Run#2 Run#3 Immediate reschedules attempted: 684365 1385156 1261240 Immediate reschedules blocked: 682846 1381654 1258682 Immediate reschedules (delta): 1519 3502 2558 Immediate reschedules (% of attempted): 0.22% 0.25% 0.20% After the patch: Run#1 Run#2 Run#3 Immediate reschedules attempted: 882244 770298 426218 Immediate reschedules blocked: 881996 769796 426074 Immediate reschedules (delta): 248 502 144 Immediate reschedules (% of attempted): 0.03% 0.07% 0.03% The number of non-blocked immediate reschedules dropped from 0.22-0.25% to 0.03-0.07%. The drop is attributed to the decrease in the race window size and the fact that we allow this race only when psi monitors reach polling window expiration time. Fixes: 461daba06bdc ("psi: eliminate kthread_worker from psi trigger scheduling mechanism") Reported-by: Kathleen Chang Reported-by: Wenju Xu Reported-by: Jonathan Chen Signed-off-by: Suren Baghdasaryan Tested-by: SH Chen Acked-by: Johannes Weiner Link: https://lore.kernel.org/patchwork/patch/1455172/ Bug: 191127654 Signed-off-by: Suren Baghdasaryan Change-Id: Ie61547ca043e702442a9c6db1468cfb60ff2e729 --- include/linux/psi_types.h | 1 + kernel/sched/psi.c | 60 +++++++++++++++++++++++++++++++++------ 2 files changed, 52 insertions(+), 9 deletions(-) diff --git a/include/linux/psi_types.h b/include/linux/psi_types.h index b95f3211566a..4b73f0f19ef5 100644 --- a/include/linux/psi_types.h +++ b/include/linux/psi_types.h @@ -157,6 +157,7 @@ struct psi_group { struct timer_list poll_timer; wait_queue_head_t poll_wait; atomic_t poll_wakeup; + atomic_t poll_scheduled; /* Protects data used by the monitor */ struct mutex trigger_lock; diff --git a/kernel/sched/psi.c b/kernel/sched/psi.c index d46f7585e772..c2bc611e6430 100644 --- a/kernel/sched/psi.c +++ b/kernel/sched/psi.c @@ -193,6 +193,7 @@ static void group_init(struct psi_group *group) INIT_DELAYED_WORK(&group->avgs_work, psi_avgs_work); mutex_init(&group->avgs_lock); /* Init trigger-related members */ + atomic_set(&group->poll_scheduled, 0); mutex_init(&group->trigger_lock); INIT_LIST_HEAD(&group->triggers); memset(group->nr_triggers, 0, sizeof(group->nr_triggers)); @@ -556,18 +557,17 @@ static u64 update_triggers(struct psi_group *group, u64 now) return now + group->poll_min_period; } -/* Schedule polling if it's not already scheduled. */ -static void psi_schedule_poll_work(struct psi_group *group, unsigned long delay) +/* Schedule polling if it's not already scheduled or forced. */ +static void psi_schedule_poll_work(struct psi_group *group, unsigned long delay, + bool force) { struct task_struct *task; /* - * Do not reschedule if already scheduled. - * Possible race with a timer scheduled after this check but before - * mod_timer below can be tolerated because group->polling_next_update - * will keep updates on schedule. + * atomic_xchg should be called even when !force to provide a + * full memory barrier (see the comment inside psi_poll_work). */ - if (timer_pending(&group->poll_timer)) + if (atomic_xchg(&group->poll_scheduled, 1) && !force) return; rcu_read_lock(); @@ -579,12 +579,15 @@ static void psi_schedule_poll_work(struct psi_group *group, unsigned long delay) */ if (likely(task)) mod_timer(&group->poll_timer, jiffies + delay); + else + atomic_set(&group->poll_scheduled, 0); rcu_read_unlock(); } static void psi_poll_work(struct psi_group *group) { + bool force_reschedule = false; u32 changed_states; u64 now; @@ -592,6 +595,43 @@ static void psi_poll_work(struct psi_group *group) now = sched_clock(); + if (now > group->polling_until) { + /* + * We are either about to start or might stop polling if no + * state change was recorded. Resetting poll_scheduled leaves + * a small window for psi_group_change to sneak in and schedule + * an immegiate poll_work before we get to rescheduling. One + * potential extra wakeup at the end of the polling window + * should be negligible and polling_next_update still keeps + * updates correctly on schedule. + */ + atomic_set(&group->poll_scheduled, 0); + /* + * A task change can race with the poll worker that is supposed to + * report on it. To avoid missing events, ensure ordering between + * poll_scheduled and the task state accesses, such that if the poll + * worker misses the state update, the task change is guaranteed to + * reschedule the poll worker: + * + * poll worker: + * atomic_set(poll_scheduled, 0) + * smp_mb() + * LOAD states + * + * task change: + * STORE states + * if atomic_xchg(poll_scheduled, 1) == 0: + * schedule poll worker + * + * The atomic_xchg() implies a full barrier. + */ + smp_mb(); + } else { + /* Polling window is not over, keep rescheduling */ + force_reschedule = true; + } + + collect_percpu_times(group, PSI_POLL, &changed_states); if (changed_states & group->poll_states) { @@ -617,7 +657,8 @@ static void psi_poll_work(struct psi_group *group) group->polling_next_update = update_triggers(group, now); psi_schedule_poll_work(group, - nsecs_to_jiffies(group->polling_next_update - now) + 1); + nsecs_to_jiffies(group->polling_next_update - now) + 1, + force_reschedule); out: mutex_unlock(&group->trigger_lock); @@ -746,7 +787,7 @@ static void psi_group_change(struct psi_group *group, int cpu, write_seqcount_end(&groupc->seq); if (state_mask & group->poll_states) - psi_schedule_poll_work(group, 1); + psi_schedule_poll_work(group, 1, false); if (wake_clock && !delayed_work_pending(&group->avgs_work)) schedule_delayed_work(&group->avgs_work, PSI_FREQ); @@ -1214,6 +1255,7 @@ static void psi_trigger_destroy(struct kref *ref) */ del_timer_sync(&group->poll_timer); kthread_stop(task_to_destroy); + atomic_set(&group->poll_scheduled, 0); } kfree(t); } From a0c429e8e1ac59643489adadd1b100b77bc2fec8 Mon Sep 17 00:00:00 2001 From: Jaewon Kim Date: Fri, 9 Jul 2021 11:35:48 +0900 Subject: [PATCH 60/73] ANDROID: blkdev: add oem data to block_device_operations Add ANDROID_OEM_DATA to block_device_operations which allows a new vendor specific function call. Bug: 193106408 Signed-off-by: Jaewon Kim Change-Id: I472f1cc25698c841841822908c4827545b8593df --- include/linux/blkdev.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index cdd5a0e2ec6a..78eeb317027e 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -27,6 +27,7 @@ #include #include #include +#include struct module; struct scsi_ioctl_command; @@ -1870,6 +1871,7 @@ struct block_device_operations { ANDROID_KABI_RESERVE(1); ANDROID_KABI_RESERVE(2); + ANDROID_OEM_DATA(1); }; #ifdef CONFIG_COMPAT From 6119d18df76922ed7a81b14fd665710cc1907d24 Mon Sep 17 00:00:00 2001 From: Jaewon Kim Date: Wed, 7 Jul 2021 19:14:27 +0900 Subject: [PATCH 61/73] ANDROID: cleancache: add oem data to cleancache_ops Add ANDROID_OEM_DATA to cleancache_ops which allows a new function call between cleancache core and cleancache backend. Bug: 192984560 Signed-off-by: Jaewon Kim Change-Id: I99fb98f33b564fb288dc0d368b9d3049de5efdf9 --- include/linux/cleancache.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/linux/cleancache.h b/include/linux/cleancache.h index 5f5730c1d324..b6c42ce7f65b 100644 --- a/include/linux/cleancache.h +++ b/include/linux/cleancache.h @@ -5,6 +5,7 @@ #include #include #include +#include #define CLEANCACHE_NO_POOL -1 #define CLEANCACHE_NO_BACKEND -2 @@ -36,6 +37,7 @@ struct cleancache_ops { void (*invalidate_page)(int, struct cleancache_filekey, pgoff_t); void (*invalidate_inode)(int, struct cleancache_filekey); void (*invalidate_fs)(int); + ANDROID_OEM_DATA(1); }; extern int cleancache_register_ops(const struct cleancache_ops *ops); From 50829b8901944a279a9c2c8930fd5269f6f7f166 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Thu, 18 Mar 2021 20:10:53 -0700 Subject: [PATCH 62/73] BACKPORT: arm64: Introduce prctl(PR_PAC_{SET,GET}_ENABLED_KEYS) This change introduces a prctl that allows the user program to control which PAC keys are enabled in a particular task. The main reason why this is useful is to enable a userspace ABI that uses PAC to sign and authenticate function pointers and other pointers exposed outside of the function, while still allowing binaries conforming to the ABI to interoperate with legacy binaries that do not sign or authenticate pointers. The idea is that a dynamic loader or early startup code would issue this prctl very early after establishing that a process may load legacy binaries, but before executing any PAC instructions. This change adds a small amount of overhead to kernel entry and exit due to additional required instruction sequences. On a DragonBoard 845c (Cortex-A75) with the powersave governor, the overhead of similar instruction sequences was measured as 4.9ns when simulating the common case where IA is left enabled, or 43.7ns when simulating the uncommon case where IA is disabled. These numbers can be seen as the worst case scenario, since in more realistic scenarios a better performing governor would be used and a newer chip would be used that would support PAC unlike Cortex-A75 and would be expected to be faster than Cortex-A75. On an Apple M1 under a hypervisor, the overhead of the entry/exit instruction sequences introduced by this patch was measured as 0.3ns in the case where IA is left enabled, and 33.0ns in the case where IA is disabled. Signed-off-by: Peter Collingbourne Reviewed-by: Dave Martin Link: https://linux-review.googlesource.com/id/Ibc41a5e6a76b275efbaa126b31119dc197b927a5 Link: https://lore.kernel.org/r/d6609065f8f40397a4124654eb68c9f490b4d477.1616123271.git.pcc@google.com Signed-off-by: Catalin Marinas Bug: 192536783 (cherry picked from commit 201698626fbca1cf1a3b686ba14cf2a056500716) Change-Id: Ic0a21c92a22575f9ec3599fb67bd2931a50b9f04 [quic_eberman@quicinc.com: Resolved merge conflict in arch/arm64/kernel/process.c] Signed-off-by: Elliot Berman Signed-off-by: Peter Collingbourne --- .../arm64/pointer-authentication.rst | 34 ++++++++++ arch/arm64/include/asm/mte.h | 4 +- arch/arm64/include/asm/pointer_auth.h | 25 +++++++- arch/arm64/include/asm/processor.h | 9 ++- arch/arm64/include/asm/sysreg.h | 4 +- arch/arm64/kernel/asm-offsets.c | 1 + arch/arm64/kernel/entry.S | 39 +++++++++++- arch/arm64/kernel/mte.c | 2 +- arch/arm64/kernel/pointer_auth.c | 62 +++++++++++++++++++ arch/arm64/kernel/process.c | 10 ++- arch/arm64/kernel/ptrace.c | 41 ++++++++++++ include/uapi/linux/elf.h | 1 + include/uapi/linux/prctl.h | 4 ++ kernel/sys.c | 16 +++++ 14 files changed, 239 insertions(+), 13 deletions(-) diff --git a/Documentation/arm64/pointer-authentication.rst b/Documentation/arm64/pointer-authentication.rst index 30b2ab06526b..f127666ea3a8 100644 --- a/Documentation/arm64/pointer-authentication.rst +++ b/Documentation/arm64/pointer-authentication.rst @@ -107,3 +107,37 @@ filter out the Pointer Authentication system key registers from KVM_GET/SET_REG_* ioctls and mask those features from cpufeature ID register. Any attempt to use the Pointer Authentication instructions will result in an UNDEFINED exception being injected into the guest. + + +Enabling and disabling keys +--------------------------- + +The prctl PR_PAC_SET_ENABLED_KEYS allows the user program to control which +PAC keys are enabled in a particular task. It takes two arguments, the +first being a bitmask of PR_PAC_APIAKEY, PR_PAC_APIBKEY, PR_PAC_APDAKEY +and PR_PAC_APDBKEY specifying which keys shall be affected by this prctl, +and the second being a bitmask of the same bits specifying whether the key +should be enabled or disabled. For example:: + + prctl(PR_PAC_SET_ENABLED_KEYS, + PR_PAC_APIAKEY | PR_PAC_APIBKEY | PR_PAC_APDAKEY | PR_PAC_APDBKEY, + PR_PAC_APIBKEY, 0, 0); + +disables all keys except the IB key. + +The main reason why this is useful is to enable a userspace ABI that uses PAC +instructions to sign and authenticate function pointers and other pointers +exposed outside of the function, while still allowing binaries conforming to +the ABI to interoperate with legacy binaries that do not sign or authenticate +pointers. + +The idea is that a dynamic loader or early startup code would issue this +prctl very early after establishing that a process may load legacy binaries, +but before executing any PAC instructions. + +For compatibility with previous kernel versions, processes start up with IA, +IB, DA and DB enabled, and are reset to this state on exec(). Processes created +via fork() and clone() inherit the key enabled state from the calling process. + +It is recommended to avoid disabling the IA key, as this has higher performance +overhead than disabling any of the other keys. diff --git a/arch/arm64/include/asm/mte.h b/arch/arm64/include/asm/mte.h index 8bdf2cc006bc..67bf259ae768 100644 --- a/arch/arm64/include/asm/mte.h +++ b/arch/arm64/include/asm/mte.h @@ -40,7 +40,7 @@ void mte_free_tag_storage(char *storage); void mte_zero_clear_page_tags(void *addr); void mte_sync_tags(pte_t *ptep, pte_t pte); void mte_copy_page_tags(void *kto, const void *kfrom); -void flush_mte_state(void); +void mte_thread_init_user(void); void mte_thread_switch(struct task_struct *next); void mte_suspend_enter(void); void mte_suspend_exit(void); @@ -63,7 +63,7 @@ static inline void mte_sync_tags(pte_t *ptep, pte_t pte) static inline void mte_copy_page_tags(void *kto, const void *kfrom) { } -static inline void flush_mte_state(void) +static inline void mte_thread_init_user(void) { } static inline void mte_thread_switch(struct task_struct *next) diff --git a/arch/arm64/include/asm/pointer_auth.h b/arch/arm64/include/asm/pointer_auth.h index b112a11e9302..cefe7e9b6fa9 100644 --- a/arch/arm64/include/asm/pointer_auth.h +++ b/arch/arm64/include/asm/pointer_auth.h @@ -3,6 +3,7 @@ #define __ASM_POINTER_AUTH_H #include +#include #include #include @@ -71,6 +72,10 @@ static __always_inline void ptrauth_keys_switch_kernel(struct ptrauth_keys_kerne extern int ptrauth_prctl_reset_keys(struct task_struct *tsk, unsigned long arg); +extern int ptrauth_set_enabled_keys(struct task_struct *tsk, unsigned long keys, + unsigned long enabled); +extern int ptrauth_get_enabled_keys(struct task_struct *tsk); + static inline unsigned long ptrauth_strip_insn_pac(unsigned long ptr) { return ptrauth_clear_pac(ptr); @@ -85,8 +90,17 @@ static __always_inline void ptrauth_enable(void) isb(); } -#define ptrauth_thread_init_user(tsk) \ - ptrauth_keys_init_user(&(tsk)->thread.keys_user) +#define ptrauth_thread_init_user() \ + do { \ + ptrauth_keys_init_user(¤t->thread.keys_user); \ + \ + /* enable all keys */ \ + if (system_supports_address_auth()) \ + set_task_sctlr_el1(current->thread.sctlr_user | \ + SCTLR_ELx_ENIA | SCTLR_ELx_ENIB | \ + SCTLR_ELx_ENDA | SCTLR_ELx_ENDB); \ + } while (0) + #define ptrauth_thread_init_kernel(tsk) \ ptrauth_keys_init_kernel(&(tsk)->thread.keys_kernel) #define ptrauth_thread_switch_kernel(tsk) \ @@ -95,10 +109,15 @@ static __always_inline void ptrauth_enable(void) #else /* CONFIG_ARM64_PTR_AUTH */ #define ptrauth_enable() #define ptrauth_prctl_reset_keys(tsk, arg) (-EINVAL) +#define ptrauth_set_enabled_keys(tsk, keys, enabled) (-EINVAL) +#define ptrauth_get_enabled_keys(tsk) (-EINVAL) #define ptrauth_strip_insn_pac(lr) (lr) -#define ptrauth_thread_init_user(tsk) +#define ptrauth_thread_init_user() #define ptrauth_thread_init_kernel(tsk) #define ptrauth_thread_switch_kernel(tsk) #endif /* CONFIG_ARM64_PTR_AUTH */ +#define PR_PAC_ENABLED_KEYS_MASK \ + (PR_PAC_APIAKEY | PR_PAC_APIBKEY | PR_PAC_APDAKEY | PR_PAC_APDBKEY) + #endif /* __ASM_POINTER_AUTH_H */ diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h index e1ad8bb0c79d..421d5f2a0f4f 100644 --- a/arch/arm64/include/asm/processor.h +++ b/arch/arm64/include/asm/processor.h @@ -161,7 +161,9 @@ struct thread_struct { u64 sctlr_user; }; -#define SCTLR_USER_MASK SCTLR_EL1_TCF0_MASK +#define SCTLR_USER_MASK \ + (SCTLR_ELx_ENIA | SCTLR_ELx_ENIB | SCTLR_ELx_ENDA | SCTLR_ELx_ENDB | \ + SCTLR_EL1_TCF0_MASK) static inline void arch_thread_struct_whitelist(unsigned long *offset, unsigned long *size) @@ -310,6 +312,11 @@ extern void __init minsigstksz_setup(void); /* PR_PAC_RESET_KEYS prctl */ #define PAC_RESET_KEYS(tsk, arg) ptrauth_prctl_reset_keys(tsk, arg) +/* PR_PAC_{SET,GET}_ENABLED_KEYS prctl */ +#define PAC_SET_ENABLED_KEYS(tsk, keys, enabled) \ + ptrauth_set_enabled_keys(tsk, keys, enabled) +#define PAC_GET_ENABLED_KEYS(tsk) ptrauth_get_enabled_keys(tsk) + #ifdef CONFIG_ARM64_TAGGED_ADDR_ABI /* PR_{SET,GET}_TAGGED_ADDR_CTRL prctl */ long set_tagged_addr_ctrl(struct task_struct *task, unsigned long arg); diff --git a/arch/arm64/include/asm/sysreg.h b/arch/arm64/include/asm/sysreg.h index 1093196db31d..6201de6fdaac 100644 --- a/arch/arm64/include/asm/sysreg.h +++ b/arch/arm64/include/asm/sysreg.h @@ -610,8 +610,10 @@ #define SCTLR_ELx_TCF_ASYNC (UL(0x2) << SCTLR_ELx_TCF_SHIFT) #define SCTLR_ELx_TCF_MASK (UL(0x3) << SCTLR_ELx_TCF_SHIFT) +#define SCTLR_ELx_ENIA_SHIFT 31 + #define SCTLR_ELx_ITFSB (BIT(37)) -#define SCTLR_ELx_ENIA (BIT(31)) +#define SCTLR_ELx_ENIA (BIT(SCTLR_ELx_ENIA_SHIFT)) #define SCTLR_ELx_ENIB (BIT(30)) #define SCTLR_ELx_ENDA (BIT(27)) #define SCTLR_ELx_EE (BIT(25)) diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c index f396d951ee54..2d3169595a14 100644 --- a/arch/arm64/kernel/asm-offsets.c +++ b/arch/arm64/kernel/asm-offsets.c @@ -44,6 +44,7 @@ int main(void) #endif BLANK(); DEFINE(THREAD_CPU_CONTEXT, offsetof(struct task_struct, thread.cpu_context)); + DEFINE(THREAD_SCTLR_USER, offsetof(struct task_struct, thread.sctlr_user)); #ifdef CONFIG_ARM64_PTR_AUTH DEFINE(THREAD_KEYS_USER, offsetof(struct task_struct, thread.keys_user)); DEFINE(THREAD_KEYS_KERNEL, offsetof(struct task_struct, thread.keys_kernel)); diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index 1deb241eb74f..79264deb6353 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -249,7 +249,24 @@ alternative_else_nop_endif check_mte_async_tcf x22, x23 apply_ssbd 1, x22, x23 - ptrauth_keys_install_kernel tsk, x20, x22, x23 + ptrauth_keys_install_kernel_nosync tsk, x20, x22, x23 + +#ifdef CONFIG_ARM64_PTR_AUTH +alternative_if ARM64_HAS_ADDRESS_AUTH + /* + * Enable IA for in-kernel PAC if the task had it disabled. Although + * this could be implemented with an unconditional MRS which would avoid + * a load, this was measured to be slower on Cortex-A75 and Cortex-A76. + */ + ldr x0, [tsk, THREAD_SCTLR_USER] + tbnz x0, SCTLR_ELx_ENIA_SHIFT, 1f + mrs x0, sctlr_el1 + orr x0, x0, SCTLR_ELx_ENIA + msr sctlr_el1, x0 +1: + isb +alternative_else_nop_endif +#endif mte_set_kernel_gcr x22, x23 @@ -367,9 +384,27 @@ alternative_else_nop_endif 3: scs_save tsk, x0 - /* No kernel C function calls after this as user keys are set. */ + /* + * No kernel C function calls after this as user keys are set and IA may + * be disabled. + */ ptrauth_keys_install_user tsk, x0, x1, x2 +#ifdef CONFIG_ARM64_PTR_AUTH +alternative_if ARM64_HAS_ADDRESS_AUTH + /* + * IA was enabled for in-kernel PAC. Disable it now if needed. + * All other per-task SCTLR bits were updated on task switch. + */ + ldr x0, [tsk, THREAD_SCTLR_USER] + tbnz x0, SCTLR_ELx_ENIA_SHIFT, 1f + mrs x0, sctlr_el1 + bic x0, x0, SCTLR_ELx_ENIA + msr sctlr_el1, x0 +1: +alternative_else_nop_endif +#endif + mte_set_user_gcr tsk, x0, x1 apply_ssbd 0, x0, x1 diff --git a/arch/arm64/kernel/mte.c b/arch/arm64/kernel/mte.c index 8da597e41795..125a10e413e9 100644 --- a/arch/arm64/kernel/mte.c +++ b/arch/arm64/kernel/mte.c @@ -207,7 +207,7 @@ static void set_gcr_el1_excl(u64 excl) */ } -void flush_mte_state(void) +void mte_thread_init_user(void) { if (!system_supports_mte()) return; diff --git a/arch/arm64/kernel/pointer_auth.c b/arch/arm64/kernel/pointer_auth.c index adb955fd9bdd..f03e5bfe4490 100644 --- a/arch/arm64/kernel/pointer_auth.c +++ b/arch/arm64/kernel/pointer_auth.c @@ -46,3 +46,65 @@ int ptrauth_prctl_reset_keys(struct task_struct *tsk, unsigned long arg) return 0; } + +static u64 arg_to_enxx_mask(unsigned long arg) +{ + u64 sctlr_enxx_mask = 0; + + WARN_ON(arg & ~PR_PAC_ENABLED_KEYS_MASK); + if (arg & PR_PAC_APIAKEY) + sctlr_enxx_mask |= SCTLR_ELx_ENIA; + if (arg & PR_PAC_APIBKEY) + sctlr_enxx_mask |= SCTLR_ELx_ENIB; + if (arg & PR_PAC_APDAKEY) + sctlr_enxx_mask |= SCTLR_ELx_ENDA; + if (arg & PR_PAC_APDBKEY) + sctlr_enxx_mask |= SCTLR_ELx_ENDB; + return sctlr_enxx_mask; +} + +int ptrauth_set_enabled_keys(struct task_struct *tsk, unsigned long keys, + unsigned long enabled) +{ + u64 sctlr = tsk->thread.sctlr_user; + + if (!system_supports_address_auth()) + return -EINVAL; + + if (is_compat_thread(task_thread_info(tsk))) + return -EINVAL; + + if ((keys & ~PR_PAC_ENABLED_KEYS_MASK) || (enabled & ~keys)) + return -EINVAL; + + sctlr &= ~arg_to_enxx_mask(keys); + sctlr |= arg_to_enxx_mask(enabled); + if (tsk == current) + set_task_sctlr_el1(sctlr); + else + tsk->thread.sctlr_user = sctlr; + + return 0; +} + +int ptrauth_get_enabled_keys(struct task_struct *tsk) +{ + int retval = 0; + + if (!system_supports_address_auth()) + return -EINVAL; + + if (is_compat_thread(task_thread_info(tsk))) + return -EINVAL; + + if (tsk->thread.sctlr_user & SCTLR_ELx_ENIA) + retval |= PR_PAC_APIAKEY; + if (tsk->thread.sctlr_user & SCTLR_ELx_ENIB) + retval |= PR_PAC_APIBKEY; + if (tsk->thread.sctlr_user & SCTLR_ELx_ENDA) + retval |= PR_PAC_APDAKEY; + if (tsk->thread.sctlr_user & SCTLR_ELx_ENDB) + retval |= PR_PAC_APDBKEY; + + return retval; +} diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c index 9f5bfd1afb25..20952d95d9c3 100644 --- a/arch/arm64/kernel/process.c +++ b/arch/arm64/kernel/process.c @@ -337,7 +337,6 @@ void flush_thread(void) tls_thread_flush(); flush_ptrace_hw_breakpoint(current); flush_tagged_addr_state(); - flush_mte_state(); } void release_thread(struct task_struct *dead_task) @@ -540,7 +539,11 @@ static void erratum_1418040_thread_switch(struct task_struct *prev, static void update_sctlr_el1(u64 sctlr) { - sysreg_clear_set(sctlr_el1, SCTLR_USER_MASK, sctlr); + /* + * EnIA must not be cleared while in the kernel as this is necessary for + * in-kernel PAC. It will be cleared on kernel exit if needed. + */ + sysreg_clear_set(sctlr_el1, SCTLR_USER_MASK & ~SCTLR_ELx_ENIA, sctlr); /* ISB required for the kernel uaccess routines when setting TCF0. */ isb(); @@ -666,7 +669,8 @@ void arch_setup_new_exec(void) } current->mm->context.flags = mmflags; - ptrauth_thread_init_user(current); + ptrauth_thread_init_user(); + mte_thread_init_user(); if (task_spec_ssb_noexec(current)) { arch_prctl_spec_ctrl_set(current, PR_SPEC_STORE_BYPASS, diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c index 1d75471979cb..7d84854bc0e8 100644 --- a/arch/arm64/kernel/ptrace.c +++ b/arch/arm64/kernel/ptrace.c @@ -908,6 +908,38 @@ static int pac_mask_get(struct task_struct *target, return membuf_write(&to, &uregs, sizeof(uregs)); } +static int pac_enabled_keys_get(struct task_struct *target, + const struct user_regset *regset, + struct membuf to) +{ + long enabled_keys = ptrauth_get_enabled_keys(target); + + if (IS_ERR_VALUE(enabled_keys)) + return enabled_keys; + + return membuf_write(&to, &enabled_keys, sizeof(enabled_keys)); +} + +static int pac_enabled_keys_set(struct task_struct *target, + const struct user_regset *regset, + unsigned int pos, unsigned int count, + const void *kbuf, const void __user *ubuf) +{ + int ret; + long enabled_keys = ptrauth_get_enabled_keys(target); + + if (IS_ERR_VALUE(enabled_keys)) + return enabled_keys; + + ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &enabled_keys, 0, + sizeof(long)); + if (ret) + return ret; + + return ptrauth_set_enabled_keys(target, PR_PAC_ENABLED_KEYS_MASK, + enabled_keys); +} + #ifdef CONFIG_CHECKPOINT_RESTORE static __uint128_t pac_key_to_user(const struct ptrauth_key *key) { @@ -1073,6 +1105,7 @@ enum aarch64_regset { #endif #ifdef CONFIG_ARM64_PTR_AUTH REGSET_PAC_MASK, + REGSET_PAC_ENABLED_KEYS, #ifdef CONFIG_CHECKPOINT_RESTORE REGSET_PACA_KEYS, REGSET_PACG_KEYS, @@ -1159,6 +1192,14 @@ static const struct user_regset aarch64_regsets[] = { .regset_get = pac_mask_get, /* this cannot be set dynamically */ }, + [REGSET_PAC_ENABLED_KEYS] = { + .core_note_type = NT_ARM_PAC_ENABLED_KEYS, + .n = 1, + .size = sizeof(long), + .align = sizeof(long), + .regset_get = pac_enabled_keys_get, + .set = pac_enabled_keys_set, + }, #ifdef CONFIG_CHECKPOINT_RESTORE [REGSET_PACA_KEYS] = { .core_note_type = NT_ARM_PACA_KEYS, diff --git a/include/uapi/linux/elf.h b/include/uapi/linux/elf.h index 30f68b42eeb5..61bf4774b8f2 100644 --- a/include/uapi/linux/elf.h +++ b/include/uapi/linux/elf.h @@ -426,6 +426,7 @@ typedef struct elf64_shdr { #define NT_ARM_PACA_KEYS 0x407 /* ARM pointer authentication address keys */ #define NT_ARM_PACG_KEYS 0x408 /* ARM pointer authentication generic key */ #define NT_ARM_TAGGED_ADDR_CTRL 0x409 /* arm64 tagged address control (prctl()) */ +#define NT_ARM_PAC_ENABLED_KEYS 0x40a /* arm64 ptr auth enabled keys (prctl()) */ #define NT_ARC_V2 0x600 /* ARCv2 accumulator/extra registers */ #define NT_VMCOREDD 0x700 /* Vmcore Device Dump Note */ #define NT_MIPS_DSP 0x800 /* MIPS DSP ASE registers */ diff --git a/include/uapi/linux/prctl.h b/include/uapi/linux/prctl.h index c190e220ff67..1545ae9c8434 100644 --- a/include/uapi/linux/prctl.h +++ b/include/uapi/linux/prctl.h @@ -250,4 +250,8 @@ struct prctl_mm_map { #define PR_SET_VMA 0x53564d41 # define PR_SET_VMA_ANON_NAME 0 +/* Set/get enabled arm64 pointer authentication keys */ +#define PR_PAC_SET_ENABLED_KEYS 60 +#define PR_PAC_GET_ENABLED_KEYS 61 + #endif /* _LINUX_PRCTL_H */ diff --git a/kernel/sys.c b/kernel/sys.c index 452ac56bc628..e000e9b38e89 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -123,6 +123,12 @@ #ifndef PAC_RESET_KEYS # define PAC_RESET_KEYS(a, b) (-EINVAL) #endif +#ifndef PAC_SET_ENABLED_KEYS +# define PAC_SET_ENABLED_KEYS(a, b, c) (-EINVAL) +#endif +#ifndef PAC_GET_ENABLED_KEYS +# define PAC_GET_ENABLED_KEYS(a) (-EINVAL) +#endif #ifndef SET_TAGGED_ADDR_CTRL # define SET_TAGGED_ADDR_CTRL(a) (-EINVAL) #endif @@ -2651,6 +2657,16 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3, return -EINVAL; error = PAC_RESET_KEYS(me, arg2); break; + case PR_PAC_SET_ENABLED_KEYS: + if (arg4 || arg5) + return -EINVAL; + error = PAC_SET_ENABLED_KEYS(me, arg2, arg3); + break; + case PR_PAC_GET_ENABLED_KEYS: + if (arg2 || arg3 || arg4 || arg5) + return -EINVAL; + error = PAC_GET_ENABLED_KEYS(me); + break; case PR_SET_TAGGED_ADDR_CTRL: if (arg3 || arg4 || arg5) return -EINVAL; From a4c9e551b698b9fb0adf00647ca2791e623b0c60 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Thu, 18 Mar 2021 20:10:54 -0700 Subject: [PATCH 63/73] BACKPORT: arm64: pac: Optimize kernel entry/exit key installation code paths The kernel does not use any keys besides IA so we don't need to install IB/DA/DB/GA on kernel exit if we arrange to install them on task switch instead, which we can expect to happen an order of magnitude less often. Furthermore we can avoid installing the user IA in the case where the user task has IA disabled and just leave the kernel IA installed. This also lets us avoid needing to install IA on kernel entry. On an Apple M1 under a hypervisor, the overhead of kernel entry/exit has been measured to be reduced by 15.6ns in the case where IA is enabled, and 31.9ns in the case where IA is disabled. Signed-off-by: Peter Collingbourne Link: https://linux-review.googlesource.com/id/Ieddf6b580d23c9e0bed45a822dabe72d2ffc9a8e Link: https://lore.kernel.org/r/2d653d055f38f779937f2b92f8ddd5cf9e4af4f4.1616123271.git.pcc@google.com Signed-off-by: Catalin Marinas Bug: 192536783 (cherry picked from commit b90e483938ce387c256e03fb144f82f64551847b) Change-Id: Ia01f55f50c55b53e65ea7089a3bb61ee7660e578 [quic_eberman@quicinc.com: resolve merge conflict in arch/arm64/kernel/process.c] Signed-off-by: Elliot Berman Signed-off-by: Peter Collingbourne --- arch/arm64/include/asm/asm_pointer_auth.h | 20 +------------ arch/arm64/include/asm/pointer_auth.h | 36 ++++++++++++++++++----- arch/arm64/kernel/asm-offsets.c | 4 --- arch/arm64/kernel/entry.S | 33 ++++++++++++--------- arch/arm64/kernel/pointer_auth.c | 1 + arch/arm64/kernel/process.c | 1 + arch/arm64/kernel/suspend.c | 3 +- 7 files changed, 53 insertions(+), 45 deletions(-) diff --git a/arch/arm64/include/asm/asm_pointer_auth.h b/arch/arm64/include/asm/asm_pointer_auth.h index 52dead2a8640..8ca2dc0661ee 100644 --- a/arch/arm64/include/asm/asm_pointer_auth.h +++ b/arch/arm64/include/asm/asm_pointer_auth.h @@ -13,30 +13,12 @@ * so use the base value of ldp as thread.keys_user and offset as * thread.keys_user.ap*. */ - .macro ptrauth_keys_install_user tsk, tmp1, tmp2, tmp3 + .macro __ptrauth_keys_install_user tsk, tmp1, tmp2, tmp3 mov \tmp1, #THREAD_KEYS_USER add \tmp1, \tsk, \tmp1 -alternative_if_not ARM64_HAS_ADDRESS_AUTH - b .Laddr_auth_skip_\@ -alternative_else_nop_endif ldp \tmp2, \tmp3, [\tmp1, #PTRAUTH_USER_KEY_APIA] msr_s SYS_APIAKEYLO_EL1, \tmp2 msr_s SYS_APIAKEYHI_EL1, \tmp3 - ldp \tmp2, \tmp3, [\tmp1, #PTRAUTH_USER_KEY_APIB] - msr_s SYS_APIBKEYLO_EL1, \tmp2 - msr_s SYS_APIBKEYHI_EL1, \tmp3 - ldp \tmp2, \tmp3, [\tmp1, #PTRAUTH_USER_KEY_APDA] - msr_s SYS_APDAKEYLO_EL1, \tmp2 - msr_s SYS_APDAKEYHI_EL1, \tmp3 - ldp \tmp2, \tmp3, [\tmp1, #PTRAUTH_USER_KEY_APDB] - msr_s SYS_APDBKEYLO_EL1, \tmp2 - msr_s SYS_APDBKEYHI_EL1, \tmp3 -.Laddr_auth_skip_\@: -alternative_if ARM64_HAS_GENERIC_AUTH - ldp \tmp2, \tmp3, [\tmp1, #PTRAUTH_USER_KEY_APGA] - msr_s SYS_APGAKEYLO_EL1, \tmp2 - msr_s SYS_APGAKEYHI_EL1, \tmp3 -alternative_else_nop_endif .endm .macro __ptrauth_keys_install_kernel_nosync tsk, tmp1, tmp2, tmp3 diff --git a/arch/arm64/include/asm/pointer_auth.h b/arch/arm64/include/asm/pointer_auth.h index cefe7e9b6fa9..d50416be99be 100644 --- a/arch/arm64/include/asm/pointer_auth.h +++ b/arch/arm64/include/asm/pointer_auth.h @@ -35,6 +35,25 @@ struct ptrauth_keys_kernel { struct ptrauth_key apia; }; +#define __ptrauth_key_install_nosync(k, v) \ +do { \ + struct ptrauth_key __pki_v = (v); \ + write_sysreg_s(__pki_v.lo, SYS_ ## k ## KEYLO_EL1); \ + write_sysreg_s(__pki_v.hi, SYS_ ## k ## KEYHI_EL1); \ +} while (0) + +static inline void ptrauth_keys_install_user(struct ptrauth_keys_user *keys) +{ + if (system_supports_address_auth()) { + __ptrauth_key_install_nosync(APIB, keys->apib); + __ptrauth_key_install_nosync(APDA, keys->apda); + __ptrauth_key_install_nosync(APDB, keys->apdb); + } + + if (system_supports_generic_auth()) + __ptrauth_key_install_nosync(APGA, keys->apga); +} + static inline void ptrauth_keys_init_user(struct ptrauth_keys_user *keys) { if (system_supports_address_auth()) { @@ -46,14 +65,9 @@ static inline void ptrauth_keys_init_user(struct ptrauth_keys_user *keys) if (system_supports_generic_auth()) get_random_bytes(&keys->apga, sizeof(keys->apga)); -} -#define __ptrauth_key_install_nosync(k, v) \ -do { \ - struct ptrauth_key __pki_v = (v); \ - write_sysreg_s(__pki_v.lo, SYS_ ## k ## KEYLO_EL1); \ - write_sysreg_s(__pki_v.hi, SYS_ ## k ## KEYHI_EL1); \ -} while (0) + ptrauth_keys_install_user(keys); +} static __always_inline void ptrauth_keys_init_kernel(struct ptrauth_keys_kernel *keys) { @@ -90,6 +104,9 @@ static __always_inline void ptrauth_enable(void) isb(); } +#define ptrauth_suspend_exit() \ + ptrauth_keys_install_user(¤t->thread.keys_user) + #define ptrauth_thread_init_user() \ do { \ ptrauth_keys_init_user(¤t->thread.keys_user); \ @@ -101,6 +118,9 @@ static __always_inline void ptrauth_enable(void) SCTLR_ELx_ENDA | SCTLR_ELx_ENDB); \ } while (0) +#define ptrauth_thread_switch_user(tsk) \ + ptrauth_keys_install_user(&(tsk)->thread.keys_user) + #define ptrauth_thread_init_kernel(tsk) \ ptrauth_keys_init_kernel(&(tsk)->thread.keys_kernel) #define ptrauth_thread_switch_kernel(tsk) \ @@ -112,8 +132,10 @@ static __always_inline void ptrauth_enable(void) #define ptrauth_set_enabled_keys(tsk, keys, enabled) (-EINVAL) #define ptrauth_get_enabled_keys(tsk) (-EINVAL) #define ptrauth_strip_insn_pac(lr) (lr) +#define ptrauth_suspend_exit() #define ptrauth_thread_init_user() #define ptrauth_thread_init_kernel(tsk) +#define ptrauth_thread_switch_user(tsk) #define ptrauth_thread_switch_kernel(tsk) #endif /* CONFIG_ARM64_PTR_AUTH */ diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c index 2d3169595a14..b26189064b4a 100644 --- a/arch/arm64/kernel/asm-offsets.c +++ b/arch/arm64/kernel/asm-offsets.c @@ -154,10 +154,6 @@ int main(void) #endif #ifdef CONFIG_ARM64_PTR_AUTH DEFINE(PTRAUTH_USER_KEY_APIA, offsetof(struct ptrauth_keys_user, apia)); - DEFINE(PTRAUTH_USER_KEY_APIB, offsetof(struct ptrauth_keys_user, apib)); - DEFINE(PTRAUTH_USER_KEY_APDA, offsetof(struct ptrauth_keys_user, apda)); - DEFINE(PTRAUTH_USER_KEY_APDB, offsetof(struct ptrauth_keys_user, apdb)); - DEFINE(PTRAUTH_USER_KEY_APGA, offsetof(struct ptrauth_keys_user, apga)); DEFINE(PTRAUTH_KERNEL_KEY_APIA, offsetof(struct ptrauth_keys_kernel, apia)); BLANK(); #endif diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index 79264deb6353..0730e1d13fb4 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -249,21 +249,26 @@ alternative_else_nop_endif check_mte_async_tcf x22, x23 apply_ssbd 1, x22, x23 - ptrauth_keys_install_kernel_nosync tsk, x20, x22, x23 - #ifdef CONFIG_ARM64_PTR_AUTH alternative_if ARM64_HAS_ADDRESS_AUTH /* * Enable IA for in-kernel PAC if the task had it disabled. Although * this could be implemented with an unconditional MRS which would avoid * a load, this was measured to be slower on Cortex-A75 and Cortex-A76. + * + * Install the kernel IA key only if IA was enabled in the task. If IA + * was disabled on kernel exit then we would have left the kernel IA + * installed so there is no need to install it again. */ ldr x0, [tsk, THREAD_SCTLR_USER] - tbnz x0, SCTLR_ELx_ENIA_SHIFT, 1f + tbz x0, SCTLR_ELx_ENIA_SHIFT, 1f + __ptrauth_keys_install_kernel_nosync tsk, x20, x22, x23 + b 2f +1: mrs x0, sctlr_el1 orr x0, x0, SCTLR_ELx_ENIA msr sctlr_el1, x0 -1: +2: isb alternative_else_nop_endif #endif @@ -384,24 +389,24 @@ alternative_else_nop_endif 3: scs_save tsk, x0 - /* - * No kernel C function calls after this as user keys are set and IA may - * be disabled. - */ - ptrauth_keys_install_user tsk, x0, x1, x2 - #ifdef CONFIG_ARM64_PTR_AUTH alternative_if ARM64_HAS_ADDRESS_AUTH /* - * IA was enabled for in-kernel PAC. Disable it now if needed. - * All other per-task SCTLR bits were updated on task switch. + * IA was enabled for in-kernel PAC. Disable it now if needed, or + * alternatively install the user's IA. All other per-task keys and + * SCTLR bits were updated on task switch. + * + * No kernel C function calls after this. */ ldr x0, [tsk, THREAD_SCTLR_USER] - tbnz x0, SCTLR_ELx_ENIA_SHIFT, 1f + tbz x0, SCTLR_ELx_ENIA_SHIFT, 1f + __ptrauth_keys_install_user tsk, x0, x1, x2 + b 2f +1: mrs x0, sctlr_el1 bic x0, x0, SCTLR_ELx_ENIA msr sctlr_el1, x0 -1: +2: alternative_else_nop_endif #endif diff --git a/arch/arm64/kernel/pointer_auth.c b/arch/arm64/kernel/pointer_auth.c index f03e5bfe4490..60901ab0a7fe 100644 --- a/arch/arm64/kernel/pointer_auth.c +++ b/arch/arm64/kernel/pointer_auth.c @@ -43,6 +43,7 @@ int ptrauth_prctl_reset_keys(struct task_struct *tsk, unsigned long arg) get_random_bytes(&keys->apdb, sizeof(keys->apdb)); if (arg & PR_PAC_APGAKEY) get_random_bytes(&keys->apga, sizeof(keys->apga)); + ptrauth_keys_install_user(keys); return 0; } diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c index 20952d95d9c3..9b93be9ec1bb 100644 --- a/arch/arm64/kernel/process.c +++ b/arch/arm64/kernel/process.c @@ -578,6 +578,7 @@ __notrace_funcgraph struct task_struct *__switch_to(struct task_struct *prev, uao_thread_switch(next); ssbs_thread_switch(next); erratum_1418040_thread_switch(prev, next); + ptrauth_thread_switch_user(next); /* * vendor hook is needed before the dsb(), * because MPAM is related to cache maintenance. diff --git a/arch/arm64/kernel/suspend.c b/arch/arm64/kernel/suspend.c index adf86a26e252..1e8dc6f7d178 100644 --- a/arch/arm64/kernel/suspend.c +++ b/arch/arm64/kernel/suspend.c @@ -75,8 +75,9 @@ void notrace __cpu_suspend_exit(void) */ spectre_v4_enable_mitigation(NULL); - /* Restore additional MTE-specific configuration */ + /* Restore additional feature-specific configuration */ mte_suspend_exit(); + ptrauth_suspend_exit(); } /* From f438cf16cdfb1e518501d0d6b46ae12b661cbd5f Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Wed, 30 Jun 2021 14:57:35 -0700 Subject: [PATCH 64/73] FROMLIST: arm64: mte: rename gcr_user_excl to mte_ctrl We are going to use this field to store more data. To prepare for that, rename it and change the users to rely on the bit position of gcr_user_excl in mte_ctrl. Link: https://linux-review.googlesource.com/id/Ie1fd18e480100655f5d22137f5b22f4f3a9f9e2e Signed-off-by: Peter Collingbourne Reviewed-by: Catalin Marinas Link: https://lore.kernel.org/linux-arm-kernel/20210702194110.2045282-2-pcc@google.com/ Bug: 189966263 Change-Id: Ie1fd18e480100655f5d22137f5b22f4f3a9f9e2e --- arch/arm64/include/asm/processor.h | 5 ++++- arch/arm64/kernel/asm-offsets.c | 2 +- arch/arm64/kernel/entry.S | 4 ++-- arch/arm64/kernel/mte.c | 14 ++++++++------ 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h index 421d5f2a0f4f..6cca6a16114e 100644 --- a/arch/arm64/include/asm/processor.h +++ b/arch/arm64/include/asm/processor.h @@ -19,6 +19,9 @@ */ #define NET_IP_ALIGN 0 +#define MTE_CTRL_GCR_USER_EXCL_SHIFT 0 +#define MTE_CTRL_GCR_USER_EXCL_MASK 0xffff + #ifndef __ASSEMBLY__ #include @@ -156,7 +159,7 @@ struct thread_struct { struct ptrauth_keys_kernel keys_kernel; #endif #ifdef CONFIG_ARM64_MTE - u64 gcr_user_excl; + u64 mte_ctrl; #endif u64 sctlr_user; }; diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c index b26189064b4a..93da876a58e6 100644 --- a/arch/arm64/kernel/asm-offsets.c +++ b/arch/arm64/kernel/asm-offsets.c @@ -50,7 +50,7 @@ int main(void) DEFINE(THREAD_KEYS_KERNEL, offsetof(struct task_struct, thread.keys_kernel)); #endif #ifdef CONFIG_ARM64_MTE - DEFINE(THREAD_GCR_EL1_USER, offsetof(struct task_struct, thread.gcr_user_excl)); + DEFINE(THREAD_MTE_CTRL, offsetof(struct task_struct, thread.mte_ctrl)); #endif BLANK(); DEFINE(S_X0, offsetof(struct pt_regs, regs[0])); diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index 0730e1d13fb4..2fbb4b35be6e 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -182,7 +182,7 @@ alternative_else_nop_endif * the RRND (bit[16]) setting. */ mrs_s \tmp2, SYS_GCR_EL1 - bfi \tmp2, \tmp, #0, #16 + bfxil \tmp2, \tmp, #MTE_CTRL_GCR_USER_EXCL_SHIFT, #16 msr_s SYS_GCR_EL1, \tmp2 #endif .endm @@ -205,7 +205,7 @@ alternative_else_nop_endif alternative_if_not ARM64_MTE b 1f alternative_else_nop_endif - ldr \tmp, [\tsk, #THREAD_GCR_EL1_USER] + ldr \tmp, [\tsk, #THREAD_MTE_CTRL] mte_set_gcr \tmp, \tmp2 1: diff --git a/arch/arm64/kernel/mte.c b/arch/arm64/kernel/mte.c index 125a10e413e9..d3884d09513d 100644 --- a/arch/arm64/kernel/mte.c +++ b/arch/arm64/kernel/mte.c @@ -199,7 +199,7 @@ static void update_gcr_el1_excl(u64 excl) static void set_gcr_el1_excl(u64 excl) { - current->thread.gcr_user_excl = excl; + current->thread.mte_ctrl = excl; /* * SYS_GCR_EL1 will be set to current->thread.gcr_user_excl value @@ -263,8 +263,8 @@ void mte_suspend_exit(void) long set_mte_ctrl(struct task_struct *task, unsigned long arg) { u64 sctlr = task->thread.sctlr_user & ~SCTLR_EL1_TCF0_MASK; - u64 gcr_excl = ~((arg & PR_MTE_TAG_MASK) >> PR_MTE_TAG_SHIFT) & - SYS_GCR_EL1_EXCL_MASK; + u64 mte_ctrl = (~((arg & PR_MTE_TAG_MASK) >> PR_MTE_TAG_SHIFT) & + SYS_GCR_EL1_EXCL_MASK) << MTE_CTRL_GCR_USER_EXCL_SHIFT; if (!system_supports_mte()) return 0; @@ -285,10 +285,10 @@ long set_mte_ctrl(struct task_struct *task, unsigned long arg) if (task != current) { task->thread.sctlr_user = sctlr; - task->thread.gcr_user_excl = gcr_excl; + task->thread.mte_ctrl = mte_ctrl; } else { set_task_sctlr_el1(sctlr); - set_gcr_el1_excl(gcr_excl); + set_gcr_el1_excl(mte_ctrl); } return 0; @@ -297,7 +297,9 @@ long set_mte_ctrl(struct task_struct *task, unsigned long arg) long get_mte_ctrl(struct task_struct *task) { unsigned long ret; - u64 incl = ~task->thread.gcr_user_excl & SYS_GCR_EL1_EXCL_MASK; + u64 mte_ctrl = task->thread.mte_ctrl; + u64 incl = (~mte_ctrl >> MTE_CTRL_GCR_USER_EXCL_SHIFT) & + SYS_GCR_EL1_EXCL_MASK; if (!system_supports_mte()) return 0; From 6c08feaa27c2b8d87f07ea937dbd50ae181c9282 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Wed, 30 Jun 2021 15:02:41 -0700 Subject: [PATCH 65/73] FROMLIST: arm64: mte: change ASYNC and SYNC TCF settings into bitfields Allow the user program to specify both ASYNC and SYNC TCF modes by repurposing the existing constants as bitfields. This will allow the kernel to select one of the modes on behalf of the user program. With this patch the kernel will always select async mode, but a subsequent patch will make this configurable. Link: https://linux-review.googlesource.com/id/Icc5923c85a8ea284588cc399ae74fd19ec291230 Signed-off-by: Peter Collingbourne Reviewed-by: Catalin Marinas Link: https://lore.kernel.org/linux-arm-kernel/20210702194110.2045282-3-pcc@google.com/ Bug: 189966263 Change-Id: Icc5923c85a8ea284588cc399ae74fd19ec291230 --- arch/arm64/include/asm/processor.h | 3 ++ arch/arm64/kernel/mte.c | 70 ++++++++++++------------------ include/uapi/linux/prctl.h | 11 ++--- 3 files changed, 37 insertions(+), 47 deletions(-) diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h index 6cca6a16114e..6788ddddd1d0 100644 --- a/arch/arm64/include/asm/processor.h +++ b/arch/arm64/include/asm/processor.h @@ -22,6 +22,9 @@ #define MTE_CTRL_GCR_USER_EXCL_SHIFT 0 #define MTE_CTRL_GCR_USER_EXCL_MASK 0xffff +#define MTE_CTRL_TCF_SYNC (1UL << 16) +#define MTE_CTRL_TCF_ASYNC (1UL << 17) + #ifndef __ASSEMBLY__ #include diff --git a/arch/arm64/kernel/mte.c b/arch/arm64/kernel/mte.c index d3884d09513d..53d89915029d 100644 --- a/arch/arm64/kernel/mte.c +++ b/arch/arm64/kernel/mte.c @@ -197,14 +197,19 @@ static void update_gcr_el1_excl(u64 excl) sysreg_clear_set_s(SYS_GCR_EL1, SYS_GCR_EL1_EXCL_MASK, excl); } -static void set_gcr_el1_excl(u64 excl) +static void mte_update_sctlr_user(struct task_struct *task) { - current->thread.mte_ctrl = excl; + unsigned long sctlr = task->thread.sctlr_user; + unsigned long pref = MTE_CTRL_TCF_ASYNC; + unsigned long mte_ctrl = task->thread.mte_ctrl; + unsigned long resolved_mte_tcf = (mte_ctrl & pref) ? pref : mte_ctrl; - /* - * SYS_GCR_EL1 will be set to current->thread.gcr_user_excl value - * by mte_set_user_gcr() in kernel_exit, - */ + sctlr &= ~SCTLR_EL1_TCF0_MASK; + if (resolved_mte_tcf & MTE_CTRL_TCF_ASYNC) + sctlr |= SCTLR_EL1_TCF0_ASYNC; + else if (resolved_mte_tcf & MTE_CTRL_TCF_SYNC) + sctlr |= SCTLR_EL1_TCF0_SYNC; + task->thread.sctlr_user = sctlr; } void mte_thread_init_user(void) @@ -216,15 +221,16 @@ void mte_thread_init_user(void) dsb(ish); write_sysreg_s(0, SYS_TFSRE0_EL1); clear_thread_flag(TIF_MTE_ASYNC_FAULT); - /* disable tag checking */ - set_task_sctlr_el1((current->thread.sctlr_user & ~SCTLR_EL1_TCF0_MASK) | - SCTLR_EL1_TCF0_NONE); - /* reset tag generation mask */ - set_gcr_el1_excl(SYS_GCR_EL1_EXCL_MASK); + /* disable tag checking and reset tag generation mask */ + current->thread.mte_ctrl = MTE_CTRL_GCR_USER_EXCL_MASK; + mte_update_sctlr_user(current); + set_task_sctlr_el1(current->thread.sctlr_user); } void mte_thread_switch(struct task_struct *next) { + mte_update_sctlr_user(next); + /* * Check if an async tag exception occurred at EL1. * @@ -262,33 +268,21 @@ void mte_suspend_exit(void) long set_mte_ctrl(struct task_struct *task, unsigned long arg) { - u64 sctlr = task->thread.sctlr_user & ~SCTLR_EL1_TCF0_MASK; u64 mte_ctrl = (~((arg & PR_MTE_TAG_MASK) >> PR_MTE_TAG_SHIFT) & SYS_GCR_EL1_EXCL_MASK) << MTE_CTRL_GCR_USER_EXCL_SHIFT; if (!system_supports_mte()) return 0; - switch (arg & PR_MTE_TCF_MASK) { - case PR_MTE_TCF_NONE: - sctlr |= SCTLR_EL1_TCF0_NONE; - break; - case PR_MTE_TCF_SYNC: - sctlr |= SCTLR_EL1_TCF0_SYNC; - break; - case PR_MTE_TCF_ASYNC: - sctlr |= SCTLR_EL1_TCF0_ASYNC; - break; - default: - return -EINVAL; - } + if (arg & PR_MTE_TCF_ASYNC) + mte_ctrl |= MTE_CTRL_TCF_ASYNC; + if (arg & PR_MTE_TCF_SYNC) + mte_ctrl |= MTE_CTRL_TCF_SYNC; - if (task != current) { - task->thread.sctlr_user = sctlr; - task->thread.mte_ctrl = mte_ctrl; - } else { - set_task_sctlr_el1(sctlr); - set_gcr_el1_excl(mte_ctrl); + task->thread.mte_ctrl = mte_ctrl; + if (task == current) { + mte_update_sctlr_user(task); + set_task_sctlr_el1(task->thread.sctlr_user); } return 0; @@ -305,18 +299,10 @@ long get_mte_ctrl(struct task_struct *task) return 0; ret = incl << PR_MTE_TAG_SHIFT; - - switch (task->thread.sctlr_user & SCTLR_EL1_TCF0_MASK) { - case SCTLR_EL1_TCF0_NONE: - ret |= PR_MTE_TCF_NONE; - break; - case SCTLR_EL1_TCF0_SYNC: - ret |= PR_MTE_TCF_SYNC; - break; - case SCTLR_EL1_TCF0_ASYNC: + if (mte_ctrl & MTE_CTRL_TCF_ASYNC) ret |= PR_MTE_TCF_ASYNC; - break; - } + if (mte_ctrl & MTE_CTRL_TCF_SYNC) + ret |= PR_MTE_TCF_SYNC; return ret; } diff --git a/include/uapi/linux/prctl.h b/include/uapi/linux/prctl.h index 1545ae9c8434..58b37b12e745 100644 --- a/include/uapi/linux/prctl.h +++ b/include/uapi/linux/prctl.h @@ -234,14 +234,15 @@ struct prctl_mm_map { #define PR_GET_TAGGED_ADDR_CTRL 56 # define PR_TAGGED_ADDR_ENABLE (1UL << 0) /* MTE tag check fault modes */ -# define PR_MTE_TCF_SHIFT 1 -# define PR_MTE_TCF_NONE (0UL << PR_MTE_TCF_SHIFT) -# define PR_MTE_TCF_SYNC (1UL << PR_MTE_TCF_SHIFT) -# define PR_MTE_TCF_ASYNC (2UL << PR_MTE_TCF_SHIFT) -# define PR_MTE_TCF_MASK (3UL << PR_MTE_TCF_SHIFT) +# define PR_MTE_TCF_NONE 0 +# define PR_MTE_TCF_SYNC (1UL << 1) +# define PR_MTE_TCF_ASYNC (1UL << 2) +# define PR_MTE_TCF_MASK (PR_MTE_TCF_SYNC | PR_MTE_TCF_ASYNC) /* MTE tag inclusion mask */ # define PR_MTE_TAG_SHIFT 3 # define PR_MTE_TAG_MASK (0xffffUL << PR_MTE_TAG_SHIFT) +/* Unused; kept only for source compatibility */ +# define PR_MTE_TCF_SHIFT 1 /* Control reclaim behavior when allocating memory */ #define PR_SET_IO_FLUSHER 57 From ce5ba15abce683e38c82b0599b9f4f7012676aaa Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Tue, 13 Jul 2021 13:50:02 -0700 Subject: [PATCH 66/73] FROMLIST: arm64: move preemption disablement to prctl handlers In the next patch, we will start reading sctlr_user from mte_update_sctlr_user and subsequently writing a new value based on the task's TCF setting and potentially the per-CPU TCF preference. This means that we need to be careful to disable preemption around any code sequences that read from sctlr_user and subsequently write to sctlr_user and/or SCTLR_EL1, so that we don't end up writing a stale value (based on the previous CPU's TCF preference) to either of them. We currently have four such sequences, in the prctl handlers for PR_SET_TAGGED_ADDR_CTRL and PR_PAC_SET_ENABLED_KEYS, as well as in the task initialization code that resets the prctl settings. Change the prctl handlers to disable preemption in the handlers themselves rather than the functions that they call, and change the task initialization code to call the respective prctl handlers instead of setting sctlr_user directly. As a result of this change, we no longer need the helper function set_task_sctlr_el1, nor does its behavior make sense any more, so remove it. Signed-off-by: Peter Collingbourne Link: https://linux-review.googlesource.com/id/Ic0e8a0c00bb47d786c1e8011df0b7fe99bee4bb5 Link: https://lore.kernel.org/linux-arm-kernel/20210713234801.3858018-4-pcc@google.com/ Bug: 189966263 Change-Id: Ic0e8a0c00bb47d786c1e8011df0b7fe99bee4bb5 --- arch/arm64/include/asm/pointer_auth.h | 12 ++++++------ arch/arm64/include/asm/processor.h | 2 +- arch/arm64/kernel/mte.c | 8 ++++---- arch/arm64/kernel/pointer_auth.c | 10 ++++++---- arch/arm64/kernel/process.c | 21 +++++++-------------- 5 files changed, 24 insertions(+), 29 deletions(-) diff --git a/arch/arm64/include/asm/pointer_auth.h b/arch/arm64/include/asm/pointer_auth.h index d50416be99be..592968f0bc22 100644 --- a/arch/arm64/include/asm/pointer_auth.h +++ b/arch/arm64/include/asm/pointer_auth.h @@ -10,6 +10,9 @@ #include #include +#define PR_PAC_ENABLED_KEYS_MASK \ + (PR_PAC_APIAKEY | PR_PAC_APIBKEY | PR_PAC_APDAKEY | PR_PAC_APDBKEY) + #ifdef CONFIG_ARM64_PTR_AUTH /* * Each key is a 128-bit quantity which is split across a pair of 64-bit @@ -113,9 +116,9 @@ static __always_inline void ptrauth_enable(void) \ /* enable all keys */ \ if (system_supports_address_auth()) \ - set_task_sctlr_el1(current->thread.sctlr_user | \ - SCTLR_ELx_ENIA | SCTLR_ELx_ENIB | \ - SCTLR_ELx_ENDA | SCTLR_ELx_ENDB); \ + ptrauth_set_enabled_keys(current, \ + PR_PAC_ENABLED_KEYS_MASK, \ + PR_PAC_ENABLED_KEYS_MASK); \ } while (0) #define ptrauth_thread_switch_user(tsk) \ @@ -139,7 +142,4 @@ static __always_inline void ptrauth_enable(void) #define ptrauth_thread_switch_kernel(tsk) #endif /* CONFIG_ARM64_PTR_AUTH */ -#define PR_PAC_ENABLED_KEYS_MASK \ - (PR_PAC_APIAKEY | PR_PAC_APIBKEY | PR_PAC_APDAKEY | PR_PAC_APDBKEY) - #endif /* __ASM_POINTER_AUTH_H */ diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h index 6788ddddd1d0..e85a712f1e3d 100644 --- a/arch/arm64/include/asm/processor.h +++ b/arch/arm64/include/asm/processor.h @@ -262,7 +262,7 @@ extern void release_thread(struct task_struct *); unsigned long get_wchan(struct task_struct *p); -void set_task_sctlr_el1(u64 sctlr); +void update_sctlr_el1(u64 sctlr); /* Thread switching */ extern struct task_struct *cpu_switch_to(struct task_struct *prev, diff --git a/arch/arm64/kernel/mte.c b/arch/arm64/kernel/mte.c index 53d89915029d..432d9b641e9c 100644 --- a/arch/arm64/kernel/mte.c +++ b/arch/arm64/kernel/mte.c @@ -222,9 +222,7 @@ void mte_thread_init_user(void) write_sysreg_s(0, SYS_TFSRE0_EL1); clear_thread_flag(TIF_MTE_ASYNC_FAULT); /* disable tag checking and reset tag generation mask */ - current->thread.mte_ctrl = MTE_CTRL_GCR_USER_EXCL_MASK; - mte_update_sctlr_user(current); - set_task_sctlr_el1(current->thread.sctlr_user); + set_mte_ctrl(current, 0); } void mte_thread_switch(struct task_struct *next) @@ -281,8 +279,10 @@ long set_mte_ctrl(struct task_struct *task, unsigned long arg) task->thread.mte_ctrl = mte_ctrl; if (task == current) { + preempt_disable(); mte_update_sctlr_user(task); - set_task_sctlr_el1(task->thread.sctlr_user); + update_sctlr_el1(task->thread.sctlr_user); + preempt_enable(); } return 0; diff --git a/arch/arm64/kernel/pointer_auth.c b/arch/arm64/kernel/pointer_auth.c index 60901ab0a7fe..2708b620b4ae 100644 --- a/arch/arm64/kernel/pointer_auth.c +++ b/arch/arm64/kernel/pointer_auth.c @@ -67,7 +67,7 @@ static u64 arg_to_enxx_mask(unsigned long arg) int ptrauth_set_enabled_keys(struct task_struct *tsk, unsigned long keys, unsigned long enabled) { - u64 sctlr = tsk->thread.sctlr_user; + u64 sctlr; if (!system_supports_address_auth()) return -EINVAL; @@ -78,12 +78,14 @@ int ptrauth_set_enabled_keys(struct task_struct *tsk, unsigned long keys, if ((keys & ~PR_PAC_ENABLED_KEYS_MASK) || (enabled & ~keys)) return -EINVAL; + preempt_disable(); + sctlr = tsk->thread.sctlr_user; sctlr &= ~arg_to_enxx_mask(keys); sctlr |= arg_to_enxx_mask(enabled); + tsk->thread.sctlr_user = sctlr; if (tsk == current) - set_task_sctlr_el1(sctlr); - else - tsk->thread.sctlr_user = sctlr; + update_sctlr_el1(sctlr); + preempt_enable(); return 0; } diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c index 9b93be9ec1bb..132261037b42 100644 --- a/arch/arm64/kernel/process.c +++ b/arch/arm64/kernel/process.c @@ -537,7 +537,13 @@ static void erratum_1418040_thread_switch(struct task_struct *prev, write_sysreg(val, cntkctl_el1); } -static void update_sctlr_el1(u64 sctlr) +/* + * __switch_to() checks current->thread.sctlr_user as an optimisation. Therefore + * this function must be called with preemption disabled and the update to + * sctlr_user must be made in the same preemption disabled block so that + * __switch_to() does not see the variable update before the SCTLR_EL1 one. + */ +void update_sctlr_el1(u64 sctlr) { /* * EnIA must not be cleared while in the kernel as this is necessary for @@ -549,19 +555,6 @@ static void update_sctlr_el1(u64 sctlr) isb(); } -void set_task_sctlr_el1(u64 sctlr) -{ - /* - * __switch_to() checks current->thread.sctlr as an - * optimisation. Disable preemption so that it does not see - * the variable update before the SCTLR_EL1 one. - */ - preempt_disable(); - current->thread.sctlr_user = sctlr; - update_sctlr_el1(sctlr); - preempt_enable(); -} - /* * Thread switching. */ From 5adf29adb5ce36b27373c8e9497f7f6047be2f71 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Wed, 30 Jun 2021 15:12:24 -0700 Subject: [PATCH 67/73] FROMLIST: arm64: mte: introduce a per-CPU tag checking mode preference Add a per-CPU sysfs node, mte_tcf_preferred, that allows the preferred tag checking mode to be configured. The current possible values are async and sync. Link: https://linux-review.googlesource.com/id/I7493dcd533a2785a1437b16c3f6b50919f840854 Signed-off-by: Peter Collingbourne Reviewed-by: Catalin Marinas Link: https://lore.kernel.org/linux-arm-kernel/20210713234801.3858018-5-pcc@google.com/ Bug: 189966263 Change-Id: I7493dcd533a2785a1437b16c3f6b50919f840854 --- arch/arm64/kernel/mte.c | 65 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 63 insertions(+), 2 deletions(-) diff --git a/arch/arm64/kernel/mte.c b/arch/arm64/kernel/mte.c index 432d9b641e9c..50ae1a7435ae 100644 --- a/arch/arm64/kernel/mte.c +++ b/arch/arm64/kernel/mte.c @@ -4,6 +4,7 @@ */ #include +#include #include #include #include @@ -26,6 +27,8 @@ u64 gcr_kernel_excl __ro_after_init; static bool report_fault_once = true; +static DEFINE_PER_CPU_READ_MOSTLY(u64, mte_tcf_preferred); + #ifdef CONFIG_KASAN_HW_TAGS /* Whether the MTE asynchronous mode is enabled. */ DEFINE_STATIC_KEY_FALSE(mte_async_mode); @@ -199,11 +202,18 @@ static void update_gcr_el1_excl(u64 excl) static void mte_update_sctlr_user(struct task_struct *task) { + /* + * This must be called with preemption disabled and can only be called + * on the current or next task since the CPU must match where the thread + * is going to run. The caller is responsible for calling + * update_sctlr_el1() later in the same preemption disabled block. + */ unsigned long sctlr = task->thread.sctlr_user; - unsigned long pref = MTE_CTRL_TCF_ASYNC; unsigned long mte_ctrl = task->thread.mte_ctrl; - unsigned long resolved_mte_tcf = (mte_ctrl & pref) ? pref : mte_ctrl; + unsigned long pref, resolved_mte_tcf; + pref = __this_cpu_read(mte_tcf_preferred); + resolved_mte_tcf = (mte_ctrl & pref) ? pref : mte_ctrl; sctlr &= ~SCTLR_EL1_TCF0_MASK; if (resolved_mte_tcf & MTE_CTRL_TCF_ASYNC) sctlr |= SCTLR_EL1_TCF0_ASYNC; @@ -441,3 +451,54 @@ int mte_ptrace_copy_tags(struct task_struct *child, long request, return ret; } + +static ssize_t mte_tcf_preferred_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + switch (per_cpu(mte_tcf_preferred, dev->id)) { + case MTE_CTRL_TCF_ASYNC: + return sysfs_emit(buf, "async\n"); + case MTE_CTRL_TCF_SYNC: + return sysfs_emit(buf, "sync\n"); + default: + return sysfs_emit(buf, "???\n"); + } +} + +static ssize_t mte_tcf_preferred_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + u64 tcf; + + if (sysfs_streq(buf, "async")) + tcf = MTE_CTRL_TCF_ASYNC; + else if (sysfs_streq(buf, "sync")) + tcf = MTE_CTRL_TCF_SYNC; + else + return -EINVAL; + + device_lock(dev); + per_cpu(mte_tcf_preferred, dev->id) = tcf; + device_unlock(dev); + + return count; +} +static DEVICE_ATTR_RW(mte_tcf_preferred); + +static int register_mte_tcf_preferred_sysctl(void) +{ + unsigned int cpu; + + if (!system_supports_mte()) + return 0; + + for_each_possible_cpu(cpu) { + per_cpu(mte_tcf_preferred, cpu) = MTE_CTRL_TCF_ASYNC; + device_create_file(get_cpu_device(cpu), + &dev_attr_mte_tcf_preferred); + } + + return 0; +} +subsys_initcall(register_mte_tcf_preferred_sysctl); From 3972be647aae12b6cd7a5b3d3b8b2f1b1bb20c07 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Wed, 30 Jun 2021 15:11:22 -0700 Subject: [PATCH 68/73] FROMLIST: Documentation: document the preferred tag checking mode feature Document the functionality added in the previous patches. Link: https://linux-review.googlesource.com/id/I48217cc3e8b8da33abc08cbaddc11cf4360a1b86 Signed-off-by: Peter Collingbourne Reviewed-by: Catalin Marinas Link: https://lore.kernel.org/linux-arm-kernel/20210713234801.3858018-6-pcc@google.com/ Bug: 189966263 Change-Id: I48217cc3e8b8da33abc08cbaddc11cf4360a1b86 --- .../ABI/testing/sysfs-devices-system-cpu | 18 +++++++ .../arm64/memory-tagging-extension.rst | 48 ++++++++++++++++--- 2 files changed, 59 insertions(+), 7 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-devices-system-cpu b/Documentation/ABI/testing/sysfs-devices-system-cpu index 8a2e377b0dde..1a9b6ac22c38 100644 --- a/Documentation/ABI/testing/sysfs-devices-system-cpu +++ b/Documentation/ABI/testing/sysfs-devices-system-cpu @@ -648,3 +648,21 @@ Description: SPURR ticks for cpuX when it was idle. This sysfs interface exposes the number of SPURR ticks for cpuX when it was idle. + +What: /sys/devices/system/cpu/cpuX/mte_tcf_preferred +Date: July 2021 +Contact: Linux ARM Kernel Mailing list +Description: Preferred MTE tag checking mode + + When a user program specifies more than one MTE tag checking + mode, this sysfs node is used to specify which mode should + be preferred when running on that CPU. Possible values: + + ================ ============================================== + "sync" Prefer synchronous mode + "async" Prefer asynchronous mode + ================ ============================================== + + Changes to this sysfs node may not take effect immediately. + + See also: Documentation/arm64/memory-tagging-extension.rst diff --git a/Documentation/arm64/memory-tagging-extension.rst b/Documentation/arm64/memory-tagging-extension.rst index b540178a93f8..7b99c8f428eb 100644 --- a/Documentation/arm64/memory-tagging-extension.rst +++ b/Documentation/arm64/memory-tagging-extension.rst @@ -77,14 +77,20 @@ configurable behaviours: address is unknown). The user can select the above modes, per thread, using the -``prctl(PR_SET_TAGGED_ADDR_CTRL, flags, 0, 0, 0)`` system call where -``flags`` contain one of the following values in the ``PR_MTE_TCF_MASK`` +``prctl(PR_SET_TAGGED_ADDR_CTRL, flags, 0, 0, 0)`` system call where ``flags`` +contains any number of the following values in the ``PR_MTE_TCF_MASK`` bit-field: -- ``PR_MTE_TCF_NONE`` - *Ignore* tag check faults +- ``PR_MTE_TCF_NONE``  - *Ignore* tag check faults + (ignored if combined with other options) - ``PR_MTE_TCF_SYNC`` - *Synchronous* tag check fault mode - ``PR_MTE_TCF_ASYNC`` - *Asynchronous* tag check fault mode +If no modes are specified, tag check faults are ignored. If a single +mode is specified, the program will run in that mode. If multiple +modes are specified, the mode is selected as described in the "Per-CPU +preferred tag checking modes" section below. + The current tag check fault mode can be read using the ``prctl(PR_GET_TAGGED_ADDR_CTRL, 0, 0, 0, 0)`` system call. @@ -120,13 +126,39 @@ in the ``PR_MTE_TAG_MASK`` bit-field. interface provides an include mask. An include mask of ``0`` (exclusion mask ``0xffff``) results in the CPU always generating tag ``0``. +Per-CPU preferred tag checking mode +----------------------------------- + +On some CPUs the performance of MTE in stricter tag checking modes +is similar to that of less strict tag checking modes. This makes it +worthwhile to enable stricter checks on those CPUs when a less strict +checking mode is requested, in order to gain the error detection +benefits of the stricter checks without the performance downsides. To +support this scenario, a privileged user may configure a stricter +tag checking mode as the CPU's preferred tag checking mode. + +The preferred tag checking mode for each CPU is controlled by +``/sys/devices/system/cpu/cpu/mte_tcf_preferred``, to which a +privileged user may write the value ``async`` or ``sync``. The default +preferred mode for each CPU is ``async``. + +To allow a program to potentially run in the CPU's preferred tag +checking mode, the user program may set multiple tag check fault mode +bits in the ``flags`` argument to the ``prctl(PR_SET_TAGGED_ADDR_CTRL, +flags, 0, 0, 0)`` system call. If the CPU's preferred tag checking +mode is in the task's set of provided tag checking modes (this will +always be the case at present because the kernel only supports two +tag checking modes, but future kernels may support more modes), that +mode will be selected. Otherwise, one of the modes in the task's mode +set will be selected in a currently unspecified manner. + Initial process state --------------------- On ``execve()``, the new process has the following configuration: - ``PR_TAGGED_ADDR_ENABLE`` set to 0 (disabled) -- Tag checking mode set to ``PR_MTE_TCF_NONE`` +- No tag checking modes are selected (tag check faults ignored) - ``PR_MTE_TAG_MASK`` set to 0 (all tags excluded) - ``PSTATE.TCO`` set to 0 - ``PROT_MTE`` not set on any of the initial memory maps @@ -251,11 +283,13 @@ Example of correct usage return EXIT_FAILURE; /* - * Enable the tagged address ABI, synchronous MTE tag check faults and - * allow all non-zero tags in the randomly generated set. + * Enable the tagged address ABI, synchronous or asynchronous MTE + * tag check faults (based on per-CPU preference) and allow all + * non-zero tags in the randomly generated set. */ if (prctl(PR_SET_TAGGED_ADDR_CTRL, - PR_TAGGED_ADDR_ENABLE | PR_MTE_TCF_SYNC | (0xfffe << PR_MTE_TAG_SHIFT), + PR_TAGGED_ADDR_ENABLE | PR_MTE_TCF_SYNC | PR_MTE_TCF_ASYNC | + (0xfffe << PR_MTE_TAG_SHIFT), 0, 0, 0)) { perror("prctl() failed"); return EXIT_FAILURE; From a20103c331f3fde700175970b8dbdea3c603fb80 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Thu, 8 Jul 2021 19:35:32 -0700 Subject: [PATCH 69/73] BACKPORT: FROMLIST: arm64: mte: avoid TFSR related operations unless in async mode There is no reason to touch TFSR nor issue a DSB unless our task is in asynchronous mode. Since these operations (especially the DSB) may be expensive on certain microarchitectures, only perform them if necessary. Furthermore, stop clearing TFSR on entry because it will be cleared on exit and it is not necessary to have any particular value in TFSR between entry and exit. Signed-off-by: Peter Collingbourne Link: https://linux-review.googlesource.com/id/Ib353a63e3d0abc2b0b008e96aa2d9692cfc1b815 Change-Id: I9132dd39ce6f994ee993cae67b2476dfa73ef64a Bug: 192536783 Link: https://lore.kernel.org/linux-arm-kernel/20210709023532.2133673-1-pcc@google.com/ Signed-off-by: Elliot Berman Signed-off-by: Peter Collingbourne --- arch/arm64/kernel/entry.S | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index 2fbb4b35be6e..530d9a0f66b6 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -148,29 +148,37 @@ alternative_cb_end .endm /* Check for MTE asynchronous tag check faults */ - .macro check_mte_async_tcf, tmp, ti_flags + .macro check_mte_async_tcf, tmp, ti_flags, thread_sctlr #ifdef CONFIG_ARM64_MTE .arch_extension lse alternative_if_not ARM64_MTE b 1f alternative_else_nop_endif + /* + * Asynchronous tag check faults are only possible in ASYNC (2) or + * ASYM (3) modes. In each of these modes bit 1 of SCTLR_EL1.TCF0 is + * set, so skip the check if it is unset. + */ + tbz \thread_sctlr, #(SCTLR_EL1_TCF0_SHIFT + 1), 1f mrs_s \tmp, SYS_TFSRE0_EL1 tbz \tmp, #SYS_TFSR_EL1_TF0_SHIFT, 1f /* Asynchronous TCF occurred for TTBR0 access, set the TI flag */ mov \tmp, #_TIF_MTE_ASYNC_FAULT add \ti_flags, tsk, #TSK_TI_FLAGS stset \tmp, [\ti_flags] - msr_s SYS_TFSRE0_EL1, xzr 1: #endif .endm /* Clear the MTE asynchronous tag check faults */ - .macro clear_mte_async_tcf + .macro clear_mte_async_tcf thread_sctlr #ifdef CONFIG_ARM64_MTE alternative_if ARM64_MTE + /* See comment in check_mte_async_tcf above. */ + tbz \thread_sctlr, #(SCTLR_EL1_TCF0_SHIFT + 1), 1f dsb ish msr_s SYS_TFSRE0_EL1, xzr +1: alternative_else_nop_endif #endif .endm @@ -246,8 +254,8 @@ alternative_else_nop_endif disable_step_tsk x19, x20 /* Check for asynchronous tag check faults in user space */ - check_mte_async_tcf x22, x23 - apply_ssbd 1, x22, x23 + ldr x0, [tsk, THREAD_SCTLR_USER] + check_mte_async_tcf x22, x23, x0 #ifdef CONFIG_ARM64_PTR_AUTH alternative_if ARM64_HAS_ADDRESS_AUTH @@ -260,7 +268,6 @@ alternative_if ARM64_HAS_ADDRESS_AUTH * was disabled on kernel exit then we would have left the kernel IA * installed so there is no need to install it again. */ - ldr x0, [tsk, THREAD_SCTLR_USER] tbz x0, SCTLR_ELx_ENIA_SHIFT, 1f __ptrauth_keys_install_kernel_nosync tsk, x20, x22, x23 b 2f @@ -273,6 +280,8 @@ alternative_if ARM64_HAS_ADDRESS_AUTH alternative_else_nop_endif #endif + apply_ssbd 1, x22, x23 + mte_set_kernel_gcr x22, x23 scs_load tsk, x20 @@ -389,6 +398,10 @@ alternative_else_nop_endif 3: scs_save tsk, x0 + /* Ignore asynchronous tag check faults in the uaccess routines */ + ldr x0, [tsk, THREAD_SCTLR_USER] + clear_mte_async_tcf x0 + #ifdef CONFIG_ARM64_PTR_AUTH alternative_if ARM64_HAS_ADDRESS_AUTH /* @@ -398,7 +411,6 @@ alternative_if ARM64_HAS_ADDRESS_AUTH * * No kernel C function calls after this. */ - ldr x0, [tsk, THREAD_SCTLR_USER] tbz x0, SCTLR_ELx_ENIA_SHIFT, 1f __ptrauth_keys_install_user tsk, x0, x1, x2 b 2f @@ -824,8 +836,6 @@ SYM_CODE_START_LOCAL(ret_to_user) cbnz x2, work_pending finish_ret_to_user: user_enter_irqoff - /* Ignore asynchronous tag check faults in the uaccess routines */ - clear_mte_async_tcf enable_step_tsk x19, x2 #ifdef CONFIG_GCC_PLUGIN_STACKLEAK bl stackleak_erase From 98b2c1dd1c7a15c0ee4aa33fa0e38e16c4d43f77 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Tue, 13 Jul 2021 19:00:08 -0700 Subject: [PATCH 70/73] FROMLIST: arm64: mte: optimize GCR_EL1 modification on kernel entry/exit Accessing GCR_EL1 and issuing an ISB can be expensive on some microarchitectures. Although we must write to GCR_EL1, we can restructure the code to avoid reading from it because the new value can be derived entirely from the exclusion mask, which is already in a GPR. Do so. Signed-off-by: Peter Collingbourne Link: https://linux-review.googlesource.com/id/I560a190a74176ca4cc5191dad08f77f6b1577c75 Change-Id: If73813daf8a24209b7582ae7b5e9a2a30004b086 Bug: 192536783 Link: https://lore.kernel.org/linux-arm-kernel/20210714013638.3995315-1-pcc@google.com/T/ --- arch/arm64/kernel/entry.S | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index 530d9a0f66b6..d968b144aa73 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -183,15 +183,11 @@ alternative_else_nop_endif #endif .endm - .macro mte_set_gcr, tmp, tmp2 + .macro mte_set_gcr, mte_ctrl, tmp #ifdef CONFIG_ARM64_MTE - /* - * Calculate and set the exclude mask preserving - * the RRND (bit[16]) setting. - */ - mrs_s \tmp2, SYS_GCR_EL1 - bfxil \tmp2, \tmp, #MTE_CTRL_GCR_USER_EXCL_SHIFT, #16 - msr_s SYS_GCR_EL1, \tmp2 + ubfx \tmp, \mte_ctrl, #MTE_CTRL_GCR_USER_EXCL_SHIFT, #16 + orr \tmp, \tmp, #SYS_GCR_EL1_RRND + msr_s SYS_GCR_EL1, \tmp #endif .endm From ec2190fd3f86c485cdb368b35d36a3f6106214a3 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Tue, 13 Jul 2021 18:22:25 -0700 Subject: [PATCH 71/73] FROMLIST: arm64: avoid double ISB on kernel entry Although an ISB is required in order to make the MTE-related system register update to GCR_EL1 effective, and the same is true for PAC-related updates to SCTLR_EL1 or APIAKey{Hi,Lo}_EL1, we issue two ISBs on machines that support both features while we only need to issue one. To avoid the unnecessary additional ISB, remove the ISBs from the PAC and MTE-specific alternative blocks and add a couple of additional blocks that cause us to only execute one ISB if both features are supported. Signed-off-by: Peter Collingbourne Link: https://linux-review.googlesource.com/id/Idee7e8114d5ae5a0b171d06220a0eb4bb015a51c Change-Id: Idee7e8114d5ae5a0b171d06220a0eb4bb015a51c Bug: 192536783 Link: https://lore.kernel.org/linux-arm-kernel/20210714013631.3994485-1-pcc@google.com/T/ --- arch/arm64/kernel/entry.S | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index d968b144aa73..29c423933e99 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -199,7 +199,6 @@ alternative_else_nop_endif ldr_l \tmp, gcr_kernel_excl mte_set_gcr \tmp, \tmp2 - isb 1: #endif .endm @@ -272,7 +271,6 @@ alternative_if ARM64_HAS_ADDRESS_AUTH orr x0, x0, SCTLR_ELx_ENIA msr sctlr_el1, x0 2: - isb alternative_else_nop_endif #endif @@ -280,6 +278,19 @@ alternative_else_nop_endif mte_set_kernel_gcr x22, x23 + /* + * Any non-self-synchronizing system register updates required for + * kernel entry should be placed before this point. + */ +alternative_if ARM64_MTE + isb + b 1f +alternative_else_nop_endif +alternative_if ARM64_HAS_ADDRESS_AUTH + isb +alternative_else_nop_endif +1: + scs_load tsk, x20 .else add x21, sp, #S_FRAME_SIZE From e9742a9ea5dbbcb536593e72c1fd10d20e92549c Mon Sep 17 00:00:00 2001 From: "J. Avila" Date: Wed, 14 Jul 2021 20:02:26 +0000 Subject: [PATCH 72/73] ANDROID: Update the ABI symbol list Update the generic symbol list. Leaf changes summary: 4 artifacts changed Changed leaf types summary: 0 leaf type changed Removed/Changed/Added functions summary: 0 Removed, 0 Changed, 2 Added functions Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 2 Added variables 2 Added functions: [A] 'function int __traceiter_android_vh_snd_compr_use_pause_in_drain(void*, bool*, bool*)' [A] 'function int __traceiter_android_vh_sound_usb_support_cpu_suspend(void*, usb_device*, int, bool*)' 2 Added variables: [A] 'tracepoint __tracepoint_android_vh_snd_compr_use_pause_in_drain' [A] 'tracepoint __tracepoint_android_vh_sound_usb_support_cpu_suspend' Bug: 184020292 Bug: 178992384 Bug: 192206510 Signed-off-by: J. Avila Change-Id: Ic27a610ee09cef7b0cdc772197ea5da111fa5dc3 --- android/abi_gki_aarch64_generic | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/android/abi_gki_aarch64_generic b/android/abi_gki_aarch64_generic index 0f9777cc52e8..c13cbabe6d35 100644 --- a/android/abi_gki_aarch64_generic +++ b/android/abi_gki_aarch64_generic @@ -1931,6 +1931,8 @@ __traceiter_android_vh_pagecache_get_page __traceiter_android_vh_rmqueue __traceiter_android_vh_setscheduler_uclamp + __traceiter_android_vh_snd_compr_use_pause_in_drain + __traceiter_android_vh_sound_usb_support_cpu_suspend __traceiter_android_vh_thermal_pm_notify_suspend __traceiter_android_vh_timerfd_create __traceiter_android_vh_typec_store_partner_src_caps @@ -2002,6 +2004,8 @@ __tracepoint_android_vh_pagecache_get_page __tracepoint_android_vh_rmqueue __tracepoint_android_vh_setscheduler_uclamp + __tracepoint_android_vh_snd_compr_use_pause_in_drain + __tracepoint_android_vh_sound_usb_support_cpu_suspend __tracepoint_android_vh_thermal_pm_notify_suspend __tracepoint_android_vh_timerfd_create __tracepoint_android_vh_typec_store_partner_src_caps From 870488eb0745645feff5bddfd44fe538660b9cf8 Mon Sep 17 00:00:00 2001 From: Todd Kjos Date: Wed, 14 Jul 2021 12:37:31 -0700 Subject: [PATCH 73/73] ANDROID: GKI: 7/14/2021 KMI update Set KMI_GENERATION=9 for 7/14 KMI update Leaf changes summary: 3999 artifacts changed (1 filtered out) Changed leaf types summary: 349 (1 filtered out) leaf types changed Removed/Changed/Added functions summary: 0 Removed, 3579 Changed, 4 Added functions Removed/Changed/Added variables summary: 0 Removed, 65 Changed, 2 Added variables 4 Added functions: [A] 'function int __traceiter_android_vh_snd_compr_use_pause_in_drain(void*, bool*, bool*)' [A] 'function int __traceiter_android_vh_sound_usb_support_cpu_suspend(void*, usb_device*, int, bool*)' [A] 'function void lru_cache_disable()' [A] 'function void lru_cache_enable()' 3579 functions with some sub-type change: [C] 'function void shmem_mark_page_lazyfree(page*)' at shmem.c:4298:1 has some sub-type changes: CRC (modversions) changed from 0x81dbf5b0 to 0xf81c42a3 parameter 2 of type 'typedef bool' was added [C] 'function void* PDE_DATA(const inode*)' at generic.c:799:1 has some sub-type changes: CRC (modversions) changed from 0xf1429f7e to 0xfb24a559 [C] 'function void __ClearPageMovable(page*)' at compaction.c:138:1 has some sub-type changes: CRC (modversions) changed from 0xd8bcfba7 to 0x12641630 [C] 'function void __SetPageMovable(page*, address_space*)' at compaction.c:130:1 has some sub-type changes: CRC (modversions) changed from 0x7389406a to 0xba0d0a4a ... 3575 omitted; 3578 symbols have only CRC changes 2 Added variables: [A] 'tracepoint __tracepoint_android_vh_snd_compr_use_pause_in_drain' [A] 'tracepoint __tracepoint_android_vh_sound_usb_support_cpu_suspend' 65 Changed variables: [C] 'bus_type amba_bustype' was changed at bus.c:215:1: size of symbol changed from 176 to 208 CRC (modversions) changed from 0x1f5d98ee to 0x8ae4a6d8 type of variable changed: type size changed from 1408 to 1664 (in bits) 4 data member insertions: 'u64 android_kabi_reserved1', at offset 1408 (in bits) at bus.h:116:1 'u64 android_kabi_reserved2', at offset 1472 (in bits) at bus.h:117:1 'u64 android_kabi_reserved3', at offset 1536 (in bits) at bus.h:118:1 'u64 android_kabi_reserved4', at offset 1600 (in bits) at bus.h:119:1 3982 impacted interfaces [C] 'neigh_table arp_tbl' was changed at arp.c:152:1: size of symbol changed from 520 to 568 CRC (modversions) changed from 0x16be2042 to 0x8cf42e34 type of variable changed: type size changed from 4160 to 4544 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 4480 (in bits) at neighbour.h:236:1 there are data member changes: type 'struct neigh_parms' of 'neigh_table::parms' changed: type size changed from 1152 to 1216 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 1152 (in bits) at neighbour.h:88:1 3982 impacted interfaces 6 ('list_head parms_list' .. 'unsigned long int last_flush') offsets changed (by +64 bits) type 'struct delayed_work' of 'neigh_table::gc_work' changed: type size changed from 832 to 1088 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 960 (in bits) at workqueue.h:126:1 'u64 android_kabi_reserved2', at offset 1024 (in bits) at workqueue.h:127:1 there are data member changes: type 'struct work_struct' of 'delayed_work::work' changed: type size changed from 256 to 384 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 256 (in bits) at workqueue.h:110:1 'u64 android_kabi_reserved2', at offset 320 (in bits) at workqueue.h:111:1 3998 impacted interfaces 3 ('timer_list timer' .. 'int cpu') offsets changed (by +128 bits) 3982 impacted interfaces and offset changed from 2176 to 2240 (in bits) (by +64 bits) 10 ('timer_list proxy_timer' .. 'pneigh_entry** phash_buckets') offsets changed (by +320 bits) 3982 impacted interfaces [C] 'const address_space_operations balloon_aops' was changed at balloon_compaction.c:253:1: size of symbol changed from 176 to 208 CRC (modversions) changed from 0xf3018b56 to 0x71fb77bb type of variable changed: [C] 'pglist_data contig_page_data' was changed at memblock.c:96:1: CRC (modversions) changed from 0xe3d4cd2a to 0xa714dd23 type of variable changed: type size hasn't changed 1 data member insertion: 'u64 android_oem_data1', at offset 40832 (in bits) at mmzone.h:781:1 there are data member changes: 2 ('int kcompactd_max_order' .. 'zone_type kcompactd_highest_zoneidx') offsets changed (by +96 bits) 4 ('wait_queue_head_t kcompactd_wait' .. 'unsigned long int totalreserve_pages') offsets changed (by +64 bits) type 'struct lruvec' of 'pglist_data::__lruvec' changed: type size changed from 1024 to 1088 (in bits) 1 data member insertion: 'pglist_data* pgdat', at offset 1024 (in bits) at mmzone.h:296:1 3982 impacted interfaces 'unsigned long int flags' offset changed (by +64 bits) 3982 impacted interfaces [C] 'bus_type cpu_subsys' was changed at cpu.c:128:1: size of symbol changed from 176 to 208 CRC (modversions) changed from 0x214ff238 to 0xbcb22632 type 'struct bus_type' changed at bus.h:82:1, as reported earlier [C] 'bio_set fs_bio_set' was changed at bio.c:48:1: size of symbol changed from 224 to 272 CRC (modversions) changed from 0x4b591f1c to 0x855d0cea type of variable changed: type size changed from 1792 to 2176 (in bits) 4 data member insertions: 'u64 android_kabi_reserved1', at offset 1920 (in bits) at bio.h:707:1 'u64 android_kabi_reserved2', at offset 1984 (in bits) at bio.h:708:1 'u64 android_kabi_reserved3', at offset 2048 (in bits) at bio.h:709:1 'u64 android_kabi_reserved4', at offset 2112 (in bits) at bio.h:710:1 there are data member changes: type 'struct work_struct' of 'bio_set::rescue_work' changed, as reported earlier 'workqueue_struct* rescue_workqueue' offset changed (by +128 bits) 3982 impacted interfaces [C] 'bus_type i2c_bus_type' was changed at i2c-core-base.c:629:1: size of symbol changed from 176 to 208 CRC (modversions) changed from 0xd6701d07 to 0xc515b69b type 'struct bus_type' changed at bus.h:82:1, as reported earlier [C] 'net init_net' was changed at net_namespace.c:47:1: size of symbol changed from 4544 to 4672 CRC (modversions) changed from 0x661d880a to 0xc427c067 type of variable changed: type size changed from 36352 to 37376 (in bits) there are data member changes: type 'struct netns_ipv4' of 'net::ipv4' changed: type size hasn't changed 1 data member insertion: 'u64 android_kabi_reserved1', at offset 7488 (in bits) at ipv4.h:233:1 3982 impacted interfaces type 'struct netns_ipv6' of 'net::ipv6' changed: type size hasn't changed 1 data member insertion: 'u64 android_kabi_reserved1', at offset 5888 (in bits) at ipv6.h:120:1 3982 impacted interfaces type 'struct netns_nf' of 'net::nf' changed: type size changed from 1920 to 1984 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 1920 (in bits) at netfilter.h:39:1 3982 impacted interfaces 'netns_xt xt' offset changed (by +64 bits) type 'struct netns_ct' of 'net::ct' changed: type size changed from 3072 to 3328 (in bits) there are data member changes: type 'struct delayed_work' of 'netns_ct::ecache_dwork' changed, as reported earlier 14 ('bool ecache_dwork_pending' .. 'nf_ip_net nf_ct_proto') offsets changed (by +256 bits) 3982 impacted interfaces and offset changed from 23232 to 23296 (in bits) (by +64 bits) 7 ('netns_nf_frag nf_frag' .. 'netns_bpf bpf') offsets changed (by +320 bits) type 'struct netns_xfrm' of 'net::xfrm' changed: type size changed from 6656 to 7680 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 7168 (in bits) at xfrm.h:82:1 there are data member changes: type 'struct work_struct' of 'netns_xfrm::state_hash_work' changed, as reported earlier 6 ('list_head policy_all' .. 'unsigned int policy_count[6]') offsets changed (by +128 bits) type 'struct work_struct' of 'netns_xfrm::policy_hash_work' changed, as reported earlier and offset changed from 1664 to 1792 (in bits) (by +128 bits) type 'struct xfrm_policy_hthresh' of 'netns_xfrm::policy_hthresh' changed: type size changed from 384 to 512 (in bits) there are data member changes: type 'struct work_struct' of 'xfrm_policy_hthresh::work' changed, as reported earlier 5 ('seqlock_t lock' .. 'u8 rbits6') offsets changed (by +128 bits) 3982 impacted interfaces and offset changed from 1920 to 2176 (in bits) (by +256 bits) 8 ('list_head inexact_bins' .. 'ctl_table_header* sysctl_hdr') offsets changed (by +384 bits) 6 ('dst_ops xfrm4_dst_ops' .. 'mutex xfrm_cfg_mutex') offsets changed (by +512 bits) 3982 impacted interfaces 'atomic64_t net_cookie' offset changed (by +1024 bits) type 'struct netns_can' of 'net::can' changed: type size changed from 1408 to 1472 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 1408 (in bits) at can.h:40:1 3982 impacted interfaces and offset changed from 34368 to 35392 (in bits) (by +1024 bits) 2 ('netns_xdp xdp' .. 'sock* diag_nlsk') offsets changed (by +1088 bits) 3982 impacted interfaces [C] 'task_struct init_task' was changed at init_task.c:64:1: size of symbol changed from 4672 to 4736 CRC (modversions) changed from 0x64ee80bd to 0xb1307de2 type of variable changed: type size changed from 37376 to 37888 (in bits) 6 data member insertions: 'unsigned int in_user_fault', at offset 3 (in bits) at sched.h:828:1 'mem_cgroup* memcg_in_oom', at offset 21568 (in bits) at sched.h:1313:1 'gfp_t memcg_oom_gfp_mask', at offset 21632 (in bits) at sched.h:1314:1 'int memcg_oom_order', at offset 21664 (in bits) at sched.h:1315:1 'unsigned int memcg_nr_pages_over_high', at offset 21696 (in bits) at sched.h:1318:1 'mem_cgroup* active_memcg', at offset 21760 (in bits) at sched.h:1321:1 there are data member changes: 4 ('unsigned int no_cgroup_migration' .. 'unsigned int in_memstall') offsets changed (by +1 bits) 17 ('request_queue* throttle_queue' .. 'u64 android_kabi_reserved8') offsets changed (by +256 bits) type 'struct thread_struct' of 'task_struct::thread' changed: type size hasn't changed 3982 impacted interfaces and offset changed from 28672 to 28928 (in bits) (by +256 bits) 3982 impacted interfaces [C] 'neigh_table nd_tbl' was changed at ndisc.c:109:1: size of symbol changed from 520 to 568 CRC (modversions) changed from 0xe9f2d8cc to 0x5023214d type 'struct neigh_table' changed at neighbour.h:194:1, as reported earlier [C] 'bus_type pci_bus_type' was changed at pci-driver.c:1598:1: size of symbol changed from 176 to 208 CRC (modversions) changed from 0xc367e487 to 0x34945c88 type 'struct bus_type' changed at bus.h:82:1, as reported earlier [C] 'bus_type platform_bus_type' was changed at platform.c:1360:1: size of symbol changed from 176 to 208 CRC (modversions) changed from 0xd8ba6494 to 0xb1454ef1 type 'struct bus_type' changed at bus.h:82:1, as reported earlier [C] 'task_group root_task_group' was changed at core.c:7408:1: CRC (modversions) changed from 0xc4eaf5e4 to 0xfe4b2c1d type of variable changed: type size hasn't changed there are data member changes: type 'struct cgroup_subsys_state' of 'task_group::css' changed: type size changed from 1600 to 1856 (in bits) there are data member changes: type 'struct work_struct' of 'cgroup_subsys_state::destroy_work' changed, as reported earlier type 'struct rcu_work' of 'cgroup_subsys_state::destroy_rwork' changed: type size changed from 448 to 576 (in bits) there are data member changes: type 'struct work_struct' of 'rcu_work::work' changed, as reported earlier 2 ('callback_head rcu' .. 'workqueue_struct* wq') offsets changed (by +128 bits) 3982 impacted interfaces and offset changed from 1088 to 1216 (in bits) (by +128 bits) 'cgroup_subsys_state* parent' offset changed (by +256 bits) 3982 impacted interfaces 3 ('sched_entity** se' .. 'unsigned long int shares') offsets changed (by +256 bits) 3982 impacted interfaces [C] 'const inode_operations simple_dir_inode_operations' was changed at libfs.c:240:1: size of symbol changed from 192 to 256 CRC (modversions) changed from 0x7305c43b to 0x4c3debd6 type of variable changed: [C] 'const file_operations simple_dir_operations' was changed at libfs.c:230:1: size of symbol changed from 256 to 288 CRC (modversions) changed from 0x4e9b00a7 to 0xb8416127 type of variable changed: [C] 'const dev_pm_ops snd_soc_pm_ops' was changed at soc-core.c:2028:1: size of symbol changed from 184 to 192 CRC (modversions) changed from 0x258e1260 to 0x7ce1303 type of variable changed: [C] 'bus_type spi_bus_type' was changed at spi.c:377:1: size of symbol changed from 176 to 208 CRC (modversions) changed from 0xc53cfd77 to 0xe181fe91 type 'struct bus_type' changed at bus.h:82:1, as reported earlier [C] 'srcu_struct tracepoint_srcu' was changed at tracepoint.c:21:1: size of symbol changed from 664 to 696 CRC (modversions) changed from 0xba00b9a5 to 0xbf451872 type of variable changed: type size changed from 5312 to 5568 (in bits) there are data member changes: type 'struct delayed_work' of 'srcu_struct::work' changed, as reported earlier 3982 impacted interfaces [C] 'const dev_pm_ops usb_hcd_pci_pm_ops' was changed at hcd-pci.c:612:1: size of symbol changed from 184 to 192 CRC (modversions) changed from 0xaed58e3a to 0x57b277fa type of variable changed: [C] 'const clk_ops clk_divider_ops' was changed at clk-divider.c:453:1: CRC (modversions) changed from 0xa960c8fe to 0x4ed3c288 [C] 'const clk_ops clk_fixed_factor_ops' was changed at clk-fixed-factor.c:60:1: CRC (modversions) changed from 0xbc9ab1de to 0x274e799a [C] 'const clk_ops clk_fixed_rate_ops' was changed at clk-fixed-rate.c:46:1: CRC (modversions) changed from 0x2c7fabbe to 0xd484b507 ... 43 omitted; 46 symbols have only CRC changes 'enum android_debug_symbol at android_debug_symbols.h:9:1' changed: type size hasn't changed 3 enumerator insertions: 'android_debug_symbol::ADS_MMAP_MIN_ADDR' value '15' 'android_debug_symbol::ADS_STACK_GUARD_GAP' value '16' 'android_debug_symbol::ADS_SYSCTL_LEGACY_VA_LAYOUT' value '17' 1 enumerator change: 'android_debug_symbol::ADS_END' from value '15' to '18' at android_debug_symbols.h:9:1 one impacted interface 'enum cpuhp_state at cpuhotplug.h:25:1' changed: type size hasn't changed 4 enumerator insertions: 'cpuhp_state::CPUHP_ANDROID_RESERVED_1' value '218' 'cpuhp_state::CPUHP_ANDROID_RESERVED_2' value '219' 'cpuhp_state::CPUHP_ANDROID_RESERVED_3' value '220' 'cpuhp_state::CPUHP_ANDROID_RESERVED_4' value '221' 1 enumerator change: 'cpuhp_state::CPUHP_ONLINE' from value '218' to '222' at cpuhotplug.h:25:1 5 impacted interfaces 'struct Qdisc at sch_generic.h:58:1' changed: type size hasn't changed 1 data member insertion: 'u64 android_kabi_reserved1', at offset 2304 (in bits) at sch_generic.h:118:1 3982 impacted interfaces 'struct Qdisc_class_ops at sch_generic.h:231:1' changed: type size changed from 896 to 960 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 896 (in bits) at sch_generic.h:266:1 3982 impacted interfaces 'struct Qdisc_ops at sch_generic.h:271:1' changed: type size changed from 1344 to 1408 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 1344 (in bits) at sch_generic.h:311:1 3982 impacted interfaces 'struct Scsi_Host at scsi_host.h:524:1' changed: type size changed from 18432 to 20032 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 19968 (in bits) at scsi_host.h:701:1 there are data member changes: type 'struct device' of 'Scsi_Host::shost_gendev' changed: type size changed from 6400 to 7168 (in bits) 8 data member insertions: 'u64 android_kabi_reserved1', at offset 6656 (in bits) at device.h:557:1 'u64 android_kabi_reserved2', at offset 6720 (in bits) at device.h:558:1 'u64 android_kabi_reserved3', at offset 6784 (in bits) at device.h:559:1 'u64 android_kabi_reserved4', at offset 6848 (in bits) at device.h:560:1 'u64 android_kabi_reserved5', at offset 6912 (in bits) at device.h:561:1 'u64 android_kabi_reserved6', at offset 6976 (in bits) at device.h:562:1 'u64 android_kabi_reserved7', at offset 7040 (in bits) at device.h:563:1 'u64 android_kabi_reserved8', at offset 7104 (in bits) at device.h:564:1 there are data member changes: type 'struct dev_pm_info' of 'device::power' changed: type size changed from 2496 to 2752 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 2624 (in bits) at pm.h:628:1 'u64 android_kabi_reserved2', at offset 2688 (in bits) at pm.h:629:1 there are data member changes: type 'struct work_struct' of 'dev_pm_info::work' changed, as reported earlier 16 ('wait_queue_head_t wait_queue' .. 'dev_pm_qos* qos') offsets changed (by +128 bits) 3982 impacted interfaces 26 ('dev_pm_domain* pm_domain' .. 'dev_iommu* iommu') offsets changed (by +256 bits) 3982 impacted interfaces type 'struct device' of 'Scsi_Host::shost_dev' changed, as reported earlier and offset changed from 11904 to 12672 (in bits) (by +768 bits) 2 ('void* shost_data' .. 'device* dma_dev') offsets changed (by +1536 bits) 'unsigned long int hostdata[]' offset changed (by +1600 bits) 67 impacted interfaces 'struct address_space at fs.h:451:1' changed: type size changed from 1536 to 1792 (in bits) 4 data member insertions: 'u64 android_kabi_reserved1', at offset 1536 (in bits) at fs.h:479:1 'u64 android_kabi_reserved2', at offset 1600 (in bits) at fs.h:480:1 'u64 android_kabi_reserved3', at offset 1664 (in bits) at fs.h:481:1 'u64 android_kabi_reserved4', at offset 1728 (in bits) at fs.h:482:1 3982 impacted interfaces 'struct address_space_operations at fs.h:367:1' changed: type size changed from 1408 to 1664 (in bits) 4 data member insertions: 'u64 android_kabi_reserved1', at offset 1408 (in bits) at fs.h:419:1 'u64 android_kabi_reserved2', at offset 1472 (in bits) at fs.h:420:1 'u64 android_kabi_reserved3', at offset 1536 (in bits) at fs.h:421:1 'u64 android_kabi_reserved4', at offset 1600 (in bits) at fs.h:422:1 3982 impacted interfaces 'struct amba_device at bus.h:64:1' changed: type size changed from 8000 to 8832 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 8768 (in bits) at bus.h:76:1 there are data member changes: type 'struct device' of 'amba_device::dev' changed, as reported earlier 8 ('resource res' .. 'char* driver_override') offsets changed (by +768 bits) 4 impacted interfaces 'struct amba_driver at bus.h:76:1' changed: type size changed from 1408 to 1728 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 1664 (in bits) at bus.h:86:1 there are data member changes: type 'struct device_driver' of 'amba_driver::drv' changed: type size changed from 1152 to 1408 (in bits) 4 data member insertions: 'u64 android_kabi_reserved1', at offset 1152 (in bits) at driver.h:122:1 'u64 android_kabi_reserved2', at offset 1216 (in bits) at driver.h:123:1 'u64 android_kabi_reserved3', at offset 1280 (in bits) at driver.h:124:1 'u64 android_kabi_reserved4', at offset 1344 (in bits) at driver.h:125:1 3982 impacted interfaces 4 ('int (amba_device*, const amba_id*)* probe' .. 'const amba_id* id_table') offsets changed (by +256 bits) 2 impacted interfaces 'struct backing_dev_info at backing-dev-defs.h:165:1' changed: type size changed from 6464 to 9280 (in bits) 5 data member insertions: 'xarray cgwb_tree', at offset 6784 (in bits) at backing-dev-defs.h:190:1 'mutex cgwb_release_mutex', at offset 6912 (in bits) at backing-dev-defs.h:191:1 'rw_semaphore wb_switch_rwsem', at offset 7296 (in bits) at backing-dev-defs.h:192:1 'u64 android_kabi_reserved1', at offset 9152 (in bits) at backing-dev-defs.h:206:1 'u64 android_kabi_reserved2', at offset 9216 (in bits) at backing-dev-defs.h:207:1 there are data member changes: type 'struct bdi_writeback' of 'backing_dev_info::wb' changed: type size changed from 4224 to 5888 (in bits) 9 data member insertions: 'percpu_ref refcnt', at offset 4480 (in bits) at backing-dev-defs.h:152:1 'fprop_local_percpu memcg_completions', at offset 4608 (in bits) at backing-dev-defs.h:153:1 'cgroup_subsys_state* memcg_css', at offset 4992 (in bits) at backing-dev-defs.h:154:1 'cgroup_subsys_state* blkcg_css', at offset 5056 (in bits) at backing-dev-defs.h:155:1 'list_head memcg_node', at offset 5120 (in bits) at backing-dev-defs.h:156:1 'list_head blkcg_node', at offset 5248 (in bits) at backing-dev-defs.h:157:1 'union {work_struct release_work; callback_head rcu;}', at offset 5376 (in bits) at backing-dev-defs.h:159:1 'u64 android_kabi_reserved1', at offset 5760 (in bits) at backing-dev-defs.h:165:1 'u64 android_kabi_reserved2', at offset 5824 (in bits) at backing-dev-defs.h:166:1 there are data member changes: type 'struct delayed_work' of 'bdi_writeback::dwork' changed, as reported earlier 2 ('unsigned long int dirty_sleep' .. 'list_head bdi_node') offsets changed (by +256 bits) 3982 impacted interfaces 'list_head wb_list' offset changed (by +1664 bits) 6 ('wait_queue_head_t wb_waitq' .. 'dentry* debug_dir') offsets changed (by +2688 bits) 3982 impacted interfaces 'struct backlight_device at backlight.h:280:1' changed (indirectly): type size changed from 8128 to 8896 (in bits) there are data member changes: type 'struct device' of 'backlight_device::dev' changed, as reported earlier 2 ('bool fb_bl_on[32]' .. 'int use_count') offsets changed (by +768 bits) 17 impacted interfaces 'struct bdi_writeback at backing-dev-defs.h:107:1' changed: details were reported earlier 'struct bio_set at bio.h:682:1' changed: details were reported earlier 'struct blk_mq_hw_ctx at blk-mq.h:16:1' changed (indirectly): type size changed from 5120 to 5632 (in bits) there are data member changes: type 'struct delayed_work' of 'blk_mq_hw_ctx::run_work' changed, as reported earlier 35 ('cpumask_var_t cpumask' .. 'srcu_struct srcu[]') offsets changed (by +256 bits) 3982 impacted interfaces 'struct blkcg at blk-cgroup.h:46:1' changed: type size changed from 2368 to 2752 (in bits) 1 data member insertion: 'list_head cgwb_list', at offset 2624 (in bits) at blk-cgroup.h:59:1 there are data member changes: type 'struct cgroup_subsys_state' of 'blkcg::css' changed, as reported earlier 7 ('spinlock_t lock' .. 'list_head all_blkcgs_node') offsets changed (by +256 bits) 3982 impacted interfaces 'struct blkcg_gq at blk-cgroup.h:105:1' changed (indirectly): type size changed from 2688 to 2816 (in bits) there are data member changes: type 'struct work_struct' of 'blkcg_gq::async_bio_work' changed, as reported earlier 6 ('atomic_t use_delay' .. 'callback_head callback_head') offsets changed (by +128 bits) 3982 impacted interfaces 'struct block_device at blk_types.h:23:1' changed: type size changed from 1792 to 2048 (in bits) 4 data member insertions: 'u64 android_kabi_reserved1', at offset 1792 (in bits) at blk_types.h:52:1 'u64 android_kabi_reserved2', at offset 1856 (in bits) at blk_types.h:53:1 'u64 android_kabi_reserved3', at offset 1920 (in bits) at blk_types.h:54:1 'u64 android_kabi_reserved4', at offset 1984 (in bits) at blk_types.h:55:1 3982 impacted interfaces 'struct block_device_operations at blkdev.h:1842:1' changed: type size changed from 960 to 1152 (in bits) 3 data member insertions: 'u64 android_kabi_reserved1', at offset 960 (in bits) at blkdev.h:1872:1 'u64 android_kabi_reserved2', at offset 1024 (in bits) at blkdev.h:1873:1 'u64 android_oem_data1', at offset 1088 (in bits) at blkdev.h:1874:1 3982 impacted interfaces 'struct bpf_link at bpf.h:871:1' changed (indirectly): type size changed from 512 to 640 (in bits) there are data member changes: type 'struct work_struct' of 'bpf_link::work' changed, as reported earlier 3982 impacted interfaces 'struct bpf_local_storage_map at bpf_local_storage.h:42:1' changed (indirectly): type size hasn't changed there are data member changes: type 'struct bpf_map' of 'bpf_local_storage_map::map' changed: type size hasn't changed there are data member changes: type 'struct work_struct' of 'bpf_map::work' changed, as reported earlier 2 ('mutex freeze_mutex' .. 'u64 writecnt') offsets changed (by +128 bits) 3982 impacted interfaces 3982 impacted interfaces 'struct bpf_map at bpf.h:142:1' changed (indirectly): details were reported earlier 'struct bpf_map_dev_ops at bpf.h:213:1' changed: type size changed from 256 to 320 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 256 (in bits) at bpf.h:226:1 3982 impacted interfaces 'struct bpf_map_ops at bpf.h:55:1' changed: type size changed from 2368 to 2496 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 2368 (in bits) at bpf.h:137:1 'u64 android_kabi_reserved2', at offset 2432 (in bits) at bpf.h:138:1 3982 impacted interfaces 'struct bpf_offloaded_map at bpf.h:223:1' changed (indirectly): type size hasn't changed there are data member changes: type 'struct bpf_map' of 'bpf_offloaded_map::map' changed, as reported earlier 3982 impacted interfaces 'struct bpf_prog_aux at bpf.h:774:1' changed: type size changed from 5312 to 5504 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 5440 (in bits) at bpf.h:862:1 there are data member changes: type 'union {work_struct work; callback_head rcu;}' of 'anonymous data member' changed: type size changed from 256 to 384 (in bits) there are data member changes: type 'struct work_struct' of '__anonymous_union__::work' changed, as reported earlier 3982 impacted interfaces 'struct bpf_tramp_image at bpf.h:590:1' changed (indirectly): type size changed from 2304 to 2432 (in bits) there are data member changes: type 'union {callback_head rcu; work_struct work;}' of 'anonymous data member' changed: type size changed from 256 to 384 (in bits) there are data member changes: type 'struct work_struct' of '__anonymous_union__::work' changed, as reported earlier 3982 impacted interfaces 'struct bpf_xdp_link at dev.c:8958:1' changed (indirectly): type size changed from 640 to 768 (in bits) there are data member changes: type 'struct bpf_link' of 'bpf_xdp_link::link' changed, as reported earlier 2 ('net_device* dev' .. 'int flags') offsets changed (by +128 bits) 3982 impacted interfaces 'struct bus_type at bus.h:82:1' changed: details were reported earlier 'struct cec_adapter at cec.h:201:1' changed (indirectly): type size changed from 12224 to 12992 (in bits) there are data member changes: type 'struct cec_devnode' of 'cec_adapter::devnode' changed: type size changed from 8064 to 8832 (in bits) there are data member changes: type 'struct device' of 'cec_devnode::dev' changed, as reported earlier 6 ('cdev cdev' .. 'mutex lock') offsets changed (by +768 bits) 36 impacted interfaces 36 ('mutex lock' .. 'char input_phys[32]') offsets changed (by +768 bits) 36 impacted interfaces 'struct cec_data at cec.h:57:1' changed (indirectly): type size changed from 1984 to 2240 (in bits) there are data member changes: type 'struct delayed_work' of 'cec_data::work' changed, as reported earlier 4 ('completion c' .. 'bool completed') offsets changed (by +256 bits) 36 impacted interfaces 'struct cec_devnode at cec.h:39:1' changed (indirectly): details were reported earlier 'struct cfg80211_sched_scan_request at cfg80211.h:2321:1' changed: type size changed from 1536 to 1600 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 1536 (in bits) at cfg80211.h:2373:1 there are data member changes: 'ieee80211_channel* channels[]' offset changed (by +64 bits) 3982 impacted interfaces 'struct cgroup at cgroup-defs.h:357:1' changed: type size changed from 20864 to 22016 (in bits) there are data member changes: type 'struct cgroup_subsys_state' of 'cgroup::self' changed, as reported earlier 17 ('unsigned long int flags' .. 'u16 old_subtree_ss_mask') offsets changed (by +256 bits) type 'cgroup_subsys_state*[5]' of 'cgroup::subsys' changed: type name changed from 'cgroup_subsys_state*[5]' to 'cgroup_subsys_state*[7]' array type size changed from 320 to 448 array type subrange 1 changed length from 5 to 7 and offset changed from 3264 to 3520 (in bits) (by +256 bits) 2 ('cgroup_root* root' .. 'list_head cset_links') offsets changed (by +384 bits) type 'list_head[5]' of 'cgroup::e_csets' changed: type name changed from 'list_head[5]' to 'list_head[7]' array type size changed from 640 to 896 array type subrange 1 changed length from 5 to 7 and offset changed from 3776 to 4160 (in bits) (by +384 bits) 10 ('cgroup* dom_cgrp' .. 'wait_queue_head_t offline_waitq') offsets changed (by +640 bits) type 'struct work_struct' of 'cgroup::release_agent_work' changed, as reported earlier and offset changed from 6016 to 6656 (in bits) (by +640 bits) type 'struct psi_group' of 'cgroup::psi' changed: type size changed from 5312 to 5568 (in bits) 1 data member insertion: 'atomic_t poll_scheduled', at offset 4320 (in bits) at psi_types.h:160:1 there are data member changes: type 'struct delayed_work' of 'psi_group::avgs_work' changed, as reported earlier 14 ('u64 total[2][5]' .. 'u64 polling_until') offsets changed (by +256 bits) 3982 impacted interfaces and offset changed from 6272 to 7040 (in bits) (by +768 bits) type 'struct cgroup_bpf' of 'cgroup::bpf' changed: type size changed from 9088 to 9216 (in bits) there are data member changes: type 'struct work_struct' of 'cgroup_bpf::release_work' changed, as reported earlier 3982 impacted interfaces and offset changed from 11584 to 12608 (in bits) (by +1024 bits) 3 ('atomic_t congestion_count' .. 'u64 ancestor_ids[]') offsets changed (by +1152 bits) 3982 impacted interfaces 'struct cgroup_bpf at bpf-cgroup.h:70:1' changed (indirectly): details were reported earlier 'struct cgroup_root at cgroup-defs.h:495:1' changed (indirectly): type size changed from 54592 to 55744 (in bits) there are data member changes: type 'struct cgroup' of 'cgroup_root::cgrp' changed, as reported earlier 6 ('u64 cgrp_ancestor_id_storage' .. 'char name[64]') offsets changed (by +1152 bits) 3982 impacted interfaces 'struct cgroup_subsys_state at cgroup-defs.h:139:1' changed (indirectly): details were reported earlier 'struct class at class.h:55:1' changed: type size changed from 1024 to 1216 (in bits) 3 data member insertions: 'u64 android_kabi_reserved2', at offset 1024 (in bits) at class.h:81:1 'u64 android_kabi_reserved3', at offset 1088 (in bits) at class.h:82:1 'u64 android_kabi_reserved4', at offset 1152 (in bits) at class.h:83:1 3982 impacted interfaces 'struct cpufreq_policy at cpufreq.h:51:1' changed (indirectly): type size changed from 5952 to 6080 (in bits) there are data member changes: type 'struct work_struct' of 'cpufreq_policy::update' changed, as reported earlier 25 ('freq_constraints constraints' .. 'notifier_block nb_max') offsets changed (by +128 bits) 32 impacted interfaces 'struct cpuidle_device at cpuidle.h:92:1' changed: type size changed from 6400 to 6464 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 6400 (in bits) at cpuidle.h:115:1 3986 impacted interfaces 'struct cpuidle_driver at cpuidle.h:122:1' changed: type size changed from 8704 to 8768 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 8704 (in bits) at cpuidle.h:142:1 3982 impacted interfaces 'struct css_set at cgroup-defs.h:196:1' changed: type size changed from 2880 to 3264 (in bits) there are data member changes: type 'cgroup_subsys_state*[5]' of 'css_set::subsys' changed: type name changed from 'cgroup_subsys_state*[5]' to 'cgroup_subsys_state*[7]' array type size changed from 320 to 448 array type subrange 1 changed length from 5 to 7 8 ('refcount_t refcount' .. 'list_head task_iters') offsets changed (by +128 bits) type 'list_head[5]' of 'css_set::e_cset_node' changed: type name changed from 'list_head[5]' to 'list_head[7]' array type size changed from 640 to 896 array type subrange 1 changed length from 5 to 7 and offset changed from 1088 to 1216 (in bits) (by +128 bits) 11 ('list_head threaded_csets' .. 'callback_head callback_head') offsets changed (by +384 bits) 3982 impacted interfaces 'struct delayed_work at workqueue.h:115:1' changed: details were reported earlier 'struct dentry at dcache.h:89:1' changed: type size changed from 1536 to 1664 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 1536 (in bits) at dcache.h:123:1 'u64 android_kabi_reserved2', at offset 1600 (in bits) at dcache.h:124:1 3982 impacted interfaces 'struct dentry_operations at dcache.h:135:1' changed: type size changed from 1024 to 1536 (in bits) 4 data member insertions: 'u64 android_kabi_reserved1', at offset 896 (in bits) at dcache.h:155:1 'u64 android_kabi_reserved2', at offset 960 (in bits) at dcache.h:156:1 'u64 android_kabi_reserved3', at offset 1024 (in bits) at dcache.h:157:1 'u64 android_kabi_reserved4', at offset 1088 (in bits) at dcache.h:158:1 3982 impacted interfaces 'struct dev_pm_domain at pm.h:643:1' changed: type size changed from 1792 to 1920 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 1856 (in bits) at pm.h:657:1 there are data member changes: type 'struct dev_pm_ops' of 'dev_pm_domain::ops' changed: type size changed from 1472 to 1536 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 1472 (in bits) at pm.h:304:1 3982 impacted interfaces 5 ('int (device*)* start' .. 'void (device*)* dismiss') offsets changed (by +64 bits) 3982 impacted interfaces 'struct dev_pm_info at pm.h:565:1' changed: details were reported earlier 'struct dev_pm_ops at pm.h:278:1' changed: details were reported earlier 'struct devfreq at devfreq.h:172:1' changed (indirectly): type size changed from 16768 to 18048 (in bits) there are data member changes: type 'struct device' of 'devfreq::dev' changed, as reported earlier 4 ('devfreq_dev_profile* profile' .. 'notifier_block nb') offsets changed (by +768 bits) type 'struct delayed_work' of 'devfreq::work' changed, as reported earlier and offset changed from 7360 to 8128 (in bits) (by +768 bits) 12 ('unsigned long int previous_freq' .. 'devfreq_stats stats') offsets changed (by +1024 bits) type 'struct srcu_notifier_head' of 'devfreq::transition_notifier_list' changed: type size changed from 5760 to 6016 (in bits) there are data member changes: type 'struct srcu_struct' of 'srcu_notifier_head::srcu' changed, as reported earlier 'notifier_block* head' offset changed (by +256 bits) 65 impacted interfaces and offset changed from 10624 to 11648 (in bits) (by +1024 bits) 2 ('notifier_block nb_min' .. 'notifier_block nb_max') offsets changed (by +1280 bits) 61 impacted interfaces 'struct device at device.h:458:1' changed: details were reported earlier 'struct device_driver at driver.h:95:1' changed: details were reported earlier 'struct device_link at device.h:572:1' changed (indirectly): type size changed from 7488 to 8384 (in bits) there are data member changes: type 'struct device' of 'device_link::link_dev' changed, as reported earlier 5 ('device_link_state status' .. 'callback_head callback_head') offsets changed (by +768 bits) type 'struct work_struct' of 'device_link::rm_work' changed, as reported earlier and offset changed from 7040 to 7808 (in bits) (by +768 bits) 3 ('bool supplier_preactivated' .. 'u64 android_kabi_reserved2') offsets changed (by +896 bits) 2 impacted interfaces 'struct disk_events at genhd.c:1887:1' changed (indirectly): type size changed from 1664 to 1920 (in bits) there are data member changes: type 'struct delayed_work' of 'disk_events::dwork' changed, as reported earlier 3982 impacted interfaces 'struct dma_buf at dma-buf.h:394:1' changed: type size changed from 2240 to 2368 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 2240 (in bits) at dma-buf.h:429:1 'u64 android_kabi_reserved2', at offset 2304 (in bits) at dma-buf.h:430:1 466 impacted interfaces 'struct dma_buf_attachment at dma-buf.h:490:1' changed: type size changed from 704 to 768 (in bits) 1 data member insertion: 'u64 android_kabi_reserved2', at offset 704 (in bits) at dma-buf.h:505:1 there are data member changes: type 'dma_buf_attach_sysfs_entry*' of 'dma_buf_attachment::sysfs_entry' changed: entity changed from 'dma_buf_attach_sysfs_entry*' to 'typedef u64' at int-ll64.h:23:1 type size hasn't changed and name of 'dma_buf_attachment::sysfs_entry' changed to 'dma_buf_attachment::android_kabi_reserved1' at dma-buf.h:504:1 466 impacted interfaces 'struct dma_buf_export_info at dma-buf.h:523:1' changed: type size changed from 448 to 576 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 448 (in bits) at dma-buf.h:530:1 'u64 android_kabi_reserved2', at offset 512 (in bits) at dma-buf.h:531:1 one impacted interface 'struct dma_buf_ops at dma-buf.h:35:1' changed: type size changed from 1088 to 1216 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 1088 (in bits) at dma-buf.h:358:1 'u64 android_kabi_reserved2', at offset 1152 (in bits) at dma-buf.h:359:1 466 impacted interfaces 'struct dma_buf_sysfs_entry at dma-buf.h:421:1' changed: type size changed from 960 to 832 (in bits) 2 data member deletions: 'unsigned int attachment_uid', at offset 832 (in bits) at dma-buf.h:424:1 'kset* attach_stats_kset', at offset 896 (in bits) at dma-buf.h:425:1 466 impacted interfaces 'struct dma_chan_dev at dmaengine.h:361:1' changed (indirectly): type size changed from 6528 to 7296 (in bits) there are data member changes: type 'struct device' of 'dma_chan_dev::device' changed, as reported earlier 'int dev_id' offset changed (by +768 bits) 40 impacted interfaces 'struct dma_device at dmaengine.h:849:1' changed: type size changed from 3392 to 3648 (in bits) 4 data member insertions: 'u64 android_kabi_reserved1', at offset 3392 (in bits) at dmaengine.h:946:1 'u64 android_kabi_reserved2', at offset 3456 (in bits) at dmaengine.h:947:1 'u64 android_kabi_reserved3', at offset 3520 (in bits) at dmaengine.h:948:1 'u64 android_kabi_reserved4', at offset 3584 (in bits) at dmaengine.h:949:1 40 impacted interfaces 'struct drm_atomic_state at drm_atomic.h:325:1' changed (indirectly): type size changed from 960 to 1088 (in bits) there are data member changes: type 'struct work_struct' of 'drm_atomic_state::commit_work' changed, as reported earlier 346 impacted interfaces 'struct drm_device at drm_device.h:53:1' changed (indirectly): type size changed from 14080 to 14464 (in bits) there are data member changes: type 'struct drm_mode_config' of 'drm_device::mode_config' changed: type size changed from 9472 to 9856 (in bits) there are data member changes: type 'struct work_struct' of 'drm_mode_config::connector_free_work' changed, as reported earlier 17 ('int num_encoder' .. 'bool delayed_event') offsets changed (by +128 bits) type 'struct delayed_work' of 'drm_mode_config::output_poll_work' changed, as reported earlier and offset changed from 4160 to 4288 (in bits) (by +128 bits) 72 ('mutex blob_lock' .. 'const drm_mode_config_helper_funcs* helper_private') offsets changed (by +384 bits) 346 impacted interfaces 6 ('mutex object_name_lock' .. 'drm_fb_helper* fb_helper') offsets changed (by +384 bits) 346 impacted interfaces 'struct drm_dp_aux at drm_dp_helper.h:1580:1' changed (indirectly): type size changed from 11200 to 12352 (in bits) there are data member changes: type 'struct i2c_adapter' of 'drm_dp_aux::ddc' changed: type size changed from 8768 to 9536 (in bits) there are data member changes: type 'struct device' of 'i2c_adapter::dev' changed, as reported earlier 9 ('unsigned long int locked_flags' .. 'irq_domain* host_notify_domain') offsets changed (by +768 bits) 398 impacted interfaces 3 ('device* dev' .. 'mutex hw_mutex') offsets changed (by +768 bits) type 'struct work_struct' of 'drm_dp_aux::crc_work' changed, as reported earlier and offset changed from 9344 to 10112 (in bits) (by +768 bits) 4 ('u8 crc_count' .. 'unsigned int i2c_defer_count') offsets changed (by +896 bits) type 'struct drm_dp_aux_cec' of 'drm_dp_aux::cec' changed: type size changed from 1344 to 1600 (in bits) there are data member changes: type 'struct delayed_work' of 'drm_dp_aux_cec::unregister_work' changed, as reported earlier 26 impacted interfaces and offset changed from 9792 to 10688 (in bits) (by +896 bits) 'bool is_remote' offset changed (by +1152 bits) 26 impacted interfaces 'struct drm_dp_aux_cec at drm_dp_helper.h:1533:1' changed (indirectly): details were reported earlier 'struct drm_dp_mst_port at drm_dp_mst_helper.h:98:1' changed (indirectly): type size changed from 12032 to 13184 (in bits) there are data member changes: type 'struct drm_dp_aux' of 'drm_dp_mst_port::aux' changed, as reported earlier 7 ('drm_dp_mst_branch* parent' .. 'bool fec_capable') offsets changed (by +1152 bits) 19 impacted interfaces 'struct drm_dp_mst_topology_mgr at drm_dp_mst_helper.h:568:1' changed (indirectly): type size changed from 11136 to 11648 (in bits) there are data member changes: type 'struct work_struct' of 'drm_dp_mst_topology_mgr::work' changed, as reported earlier type 'struct work_struct' of 'drm_dp_mst_topology_mgr::tx_work' changed, as reported earlier and offset changed from 9152 to 9280 (in bits) (by +128 bits) 4 ('list_head destroy_port_list' .. 'workqueue_struct* delayed_destroy_wq') offsets changed (by +256 bits) type 'struct work_struct' of 'drm_dp_mst_topology_mgr::delayed_destroy_work' changed, as reported earlier and offset changed from 10112 to 10368 (in bits) (by +256 bits) 2 ('list_head up_req_list' .. 'mutex up_req_lock') offsets changed (by +384 bits) type 'struct work_struct' of 'drm_dp_mst_topology_mgr::up_req_work' changed, as reported earlier and offset changed from 10880 to 11264 (in bits) (by +384 bits) 19 impacted interfaces 'struct drm_fb_helper at drm_fb_helper.h:114:1' changed (indirectly): type size changed from 2880 to 3136 (in bits) there are data member changes: type 'struct work_struct' of 'drm_fb_helper::dirty_work' changed, as reported earlier type 'struct work_struct' of 'drm_fb_helper::resume_work' changed, as reported earlier and offset changed from 2048 to 2176 (in bits) (by +128 bits) 5 ('mutex lock' .. 'int preferred_bpp') offsets changed (by +256 bits) 346 impacted interfaces 'struct drm_flip_work at drm_flip_work.h:73:1' changed (indirectly): type size changed from 704 to 832 (in bits) there are data member changes: type 'struct work_struct' of 'drm_flip_work::worker' changed, as reported earlier 3 ('list_head queued' .. 'spinlock_t lock') offsets changed (by +128 bits) 4 impacted interfaces 'struct drm_mode_config at drm_mode_config.h:358:1' changed (indirectly): details were reported earlier 'struct drm_writeback_job at drm_writeback.h:90:1' changed (indirectly): type size changed from 704 to 832 (in bits) there are data member changes: type 'struct work_struct' of 'drm_writeback_job::cleanup_work' changed, as reported earlier 4 ('list_head list_entry' .. 'void* priv') offsets changed (by +128 bits) 346 impacted interfaces 'struct dwc3 at core.h:1098:1' changed: type size changed from 10112 to 10432 (in bits) 6 data member insertions: 'unsigned int async_callbacks', at offset 9 (in bits) at core.h:1307:1 'unsigned int do_fifo_resize', at offset 10 (in bits) at core.h:1273:1 'u8 tx_fifo_resize_max_num', at offset 9888 (in bits) at core.h:1259:1 'int max_cfg_eps', at offset 10048 (in bits) at core.h:1311:1 'int last_fifo_depth', at offset 10080 (in bits) at core.h:1312:1 'int num_ep_resized', at offset 10112 (in bits) at core.h:1313:1 there are data member changes: 'unsigned int dis_del_phy_power_chg_quirk' offset changed (by +1 bits) type 'struct work_struct' of 'dwc3::drd_work' changed, as reported earlier 27 ('unsigned int dis_tx_ipgap_linecheck_quirk' .. 'unsigned int dis_rxdet_inp3_quirk') offsets changed (by +1 bits) 'unsigned int dis_u2_freeclk_exists_quirk' offset changed (by -31 bits) 7 ('dwc3_trb* ep0_trb' .. 'dma_addr_t scratch_addr') offsets changed (by +128 bits) type 'struct dwc3_request' of 'dwc3::ep0_usb_req' changed: type size changed from 1600 to 1664 (in bits) there are data member changes: type 'struct usb_request' of 'dwc3_request::request' changed: type size changed from 768 to 832 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 768 (in bits) at gadget.h:127:1 108 impacted interfaces 14 ('list_head list' .. 'u64 android_kabi_reserved2') offsets changed (by +64 bits) 3 impacted interfaces and offset changed from 704 to 832 (in bits) (by +128 bits) 70 ('completion ep0_in_setup' .. 'u16 imod_interval') offsets changed (by +192 bits) 4 ('u64 android_kabi_reserved1' .. 'u64 android_kabi_reserved4') offsets changed (by +320 bits) 3 impacted interfaces 'struct dwc3_ep at core.h:704:1' changed (indirectly): type size changed from 1792 to 1856 (in bits) there are data member changes: type 'struct usb_ep' of 'dwc3_ep::endpoint' changed: type size changed from 576 to 640 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 576 (in bits) at gadget.h:249:1 108 impacted interfaces 21 ('list_head cancelled_list' .. 'u64 android_kabi_reserved2') offsets changed (by +64 bits) 3 impacted interfaces 'struct dwc3_request at core.h:916:1' changed (indirectly): details were reported earlier 'struct edac_device_ctl_info at edac_device.h:151:1' changed (indirectly): type size changed from 3392 to 3648 (in bits) there are data member changes: type 'struct delayed_work' of 'edac_device_ctl_info::work' changed, as reported earlier 13 ('void (edac_device_ctl_info*)* edac_check' .. 'kobject kobj') offsets changed (by +256 bits) 6 impacted interfaces 'struct elevator_mq_ops at elevator.h:29:1' changed: type size changed from 1408 to 1664 (in bits) 4 data member insertions: 'u64 android_kabi_reserved1', at offset 1408 (in bits) at elevator.h:55:1 'u64 android_kabi_reserved2', at offset 1472 (in bits) at elevator.h:56:1 'u64 android_kabi_reserved3', at offset 1536 (in bits) at elevator.h:57:1 'u64 android_kabi_reserved4', at offset 1600 (in bits) at elevator.h:58:1 3982 impacted interfaces 'struct elevator_type at elevator.h:66:1' changed: type size changed from 2368 to 2752 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 2624 (in bits) at elevator.h:96:1 'u64 android_kabi_reserved2', at offset 2688 (in bits) at elevator.h:97:1 there are data member changes: type 'struct elevator_mq_ops' of 'elevator_type::ops' changed, as reported earlier 11 ('size_t icq_size' .. 'list_head list') offsets changed (by +256 bits) 3982 impacted interfaces 'struct execute_work at workqueue.h:168:1' changed (indirectly): type size changed from 256 to 384 (in bits) there are data member changes: type 'struct work_struct' of 'execute_work::work' changed, as reported earlier 67 impacted interfaces 'struct extcon_dev at extcon.h:41:1' changed (indirectly): type size changed from 7872 to 8640 (in bits) there are data member changes: type 'struct device' of 'extcon_dev::dev' changed, as reported earlier 11 ('raw_notifier_head nh_all' .. 'device_attribute* d_attrs_muex') offsets changed (by +768 bits) 67 impacted interfaces 'struct fb_info at fb.h:437:1' changed (indirectly): type size changed from 6400 to 6528 (in bits) there are data member changes: type 'struct work_struct' of 'fb_info::queue' changed, as reported earlier 9 ('fb_pixmap pixmap' .. 'int class_flag') offsets changed (by +128 bits) anonymous data member 'union {char* screen_base; char* screen_buffer;}' offset changed from 5888 to 6016 (in bits) (by +128 bits) 7 ('unsigned long int screen_size' .. 'bool skip_vt_switch') offsets changed (by +128 bits) 353 impacted interfaces 'struct ff_device at input.h:534:1' changed: type size changed from 1088 to 1152 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 1088 (in bits) at input.h:564:1 there are data member changes: 'file* effect_owners[]' offset changed (by +64 bits) 146 impacted interfaces 'struct fib6_info at ip6_fib.h:163:1' changed: type size changed from 1280 to 1344 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 1280 (in bits) at ip6_fib.h:208:1 there are data member changes: 'fib6_nh fib6_nh[]' offset changed (by +64 bits) 3982 impacted interfaces 'struct fib6_node at ip6_fib.h:72:1' changed: type size changed from 512 to 576 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 512 (in bits) at ip6_fib.h:90:1 3982 impacted interfaces 'struct fib6_table at ip6_fib.h:390:1' changed (indirectly): type size changed from 960 to 1024 (in bits) there are data member changes: type 'struct fib6_node' of 'fib6_table::tb6_root' changed, as reported earlier 3 ('inet_peer_base tb6_peers' .. 'unsigned int fib_seq') offsets changed (by +64 bits) 3982 impacted interfaces 'struct file at fs.h:916:1' changed: type size changed from 2176 to 2368 (in bits) 3 data member insertions: 'u64 android_kabi_reserved1', at offset 2176 (in bits) at fs.h:971:1 'u64 android_kabi_reserved2', at offset 2240 (in bits) at fs.h:972:1 'u64 android_oem_data1', at offset 2304 (in bits) at fs.h:973:1 3982 impacted interfaces 'struct file_lock at fs.h:1062:1' changed: type size changed from 1728 to 1984 (in bits) 3 data member insertions: 'list_head android_reserved1', at offset 1728 (in bits) at fs.h:1124:1 'u64 android_kabi_reserved1', at offset 1856 (in bits) at fs.h:1125:1 'u64 android_kabi_reserved2', at offset 1920 (in bits) at fs.h:1126:1 3982 impacted interfaces 'struct file_lock_operations at fs.h:1011:1' changed: type size changed from 128 to 256 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 128 (in bits) at fs.h:1034:1 'u64 android_kabi_reserved2', at offset 192 (in bits) at fs.h:1035:1 3982 impacted interfaces 'struct file_operations at fs.h:1822:1' changed: type size changed from 2048 to 2304 (in bits) 4 data member insertions: 'u64 android_kabi_reserved1', at offset 2048 (in bits) at fs.h:1897:1 'u64 android_kabi_reserved2', at offset 2112 (in bits) at fs.h:1898:1 'u64 android_kabi_reserved3', at offset 2176 (in bits) at fs.h:1899:1 'u64 android_kabi_reserved4', at offset 2240 (in bits) at fs.h:1900:1 3982 impacted interfaces 'struct file_system_type at fs.h:2228:1' changed: type size changed from 576 to 832 (in bits) 4 data member insertions: 'u64 android_kabi_reserved1', at offset 576 (in bits) at fs.h:2305:1 'u64 android_kabi_reserved2', at offset 640 (in bits) at fs.h:2306:1 'u64 android_kabi_reserved3', at offset 704 (in bits) at fs.h:2307:1 'u64 android_kabi_reserved4', at offset 768 (in bits) at fs.h:2308:1 3982 impacted interfaces 'struct fqdir at inet_frag.h:9:1' changed (indirectly): type size hasn't changed there are data member changes: type 'struct rhashtable' of 'fqdir::rhashtable' changed: type size changed from 1216 to 1344 (in bits) there are data member changes: type 'struct work_struct' of 'rhashtable::run_work' changed, as reported earlier 3 ('mutex mutex' .. 'atomic_t nelems') offsets changed (by +128 bits) 3988 impacted interfaces type 'struct work_struct' of 'fqdir::destroy_work' changed, as reported earlier 3982 impacted interfaces 'struct fscrypt_operations at fscrypt.h:58:1' changed: type size changed from 704 to 1216 (in bits) 5 data member insertions: 'u64 android_kabi_reserved1', at offset 704 (in bits) at fscrypt.h:74:1 'u64 android_kabi_reserved2', at offset 768 (in bits) at fscrypt.h:75:1 'u64 android_kabi_reserved3', at offset 832 (in bits) at fscrypt.h:76:1 'u64 android_kabi_reserved4', at offset 896 (in bits) at fscrypt.h:77:1 'u64 android_oem_data1[4]', at offset 960 (in bits) at fscrypt.h:79:1 3982 impacted interfaces 'struct fsg_lun at storage_common.h:98:1' changed (indirectly): type size changed from 7168 to 7936 (in bits) there are data member changes: type 'struct device' of 'fsg_lun::dev' changed, as reported earlier 3 ('const char* name' .. 'char inquiry_string[29]') offsets changed (by +768 bits) 4 impacted interfaces 'struct gendisk at genhd.h:176:1' changed (indirectly): type size changed from 9600 to 10496 (in bits) there are data member changes: type 'struct hd_struct' of 'gendisk::part0' changed: type size changed from 7680 to 8576 (in bits) there are data member changes: type 'struct device' of 'hd_struct::__dev' changed, as reported earlier 4 ('kobject* holder_dir' .. 'partition_meta_info* info') offsets changed (by +768 bits) type 'struct rcu_work' of 'hd_struct::rcu_work' changed, as reported earlier and offset changed from 6976 to 7744 (in bits) (by +768 bits) 4 ('u64 android_kabi_reserved1' .. 'u64 android_kabi_reserved4') offsets changed (by +896 bits) 3982 impacted interfaces 17 ('const block_device_operations* fops' .. 'u64 android_kabi_reserved4') offsets changed (by +896 bits) 3982 impacted interfaces 'struct generic_pm_domain at pm_domain.h:109:1' changed (indirectly): type size changed from 11136 to 12160 (in bits) there are data member changes: type 'struct device' of 'generic_pm_domain::dev' changed, as reported earlier type 'struct dev_pm_domain' of 'generic_pm_domain::domain' changed, as reported earlier and offset changed from 6400 to 7168 (in bits) (by +768 bits) 5 ('list_head gpd_list_node' .. 'dev_power_governor* gov') offsets changed (by +896 bits) type 'struct work_struct' of 'generic_pm_domain::power_off_work' changed, as reported earlier and offset changed from 8768 to 9664 (in bits) (by +896 bits) 32 ('fwnode_handle* provider' .. 'const genpd_lock_ops* lock_ops') offsets changed (by +1024 bits) anonymous data member 'union {mutex mlock; struct {spinlock_t slock; unsigned long int lock_flags;};}' offset changed from 10752 to 11776 (in bits) (by +1024 bits) 8 impacted interfaces 'struct genl_family at genetlink.h:47:1' changed: type size changed from 768 to 832 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 768 (in bits) at genetlink.h:72:1 5 impacted interfaces 'struct genl_ops at genetlink.h:148:1' changed: type size changed from 384 to 448 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 384 (in bits) at genetlink.h:165:1 5 impacted interfaces 'struct gnss_device at gnss.h:37:1' changed (indirectly): type size changed from 9472 to 10240 (in bits) there are data member changes: type 'struct device' of 'gnss_device::dev' changed, as reported earlier 12 ('cdev cdev' .. 'char* write_buf') offsets changed (by +768 bits) 5 impacted interfaces 'struct gpio_chip at driver.h:358:1' changed: type size changed from 4672 to 4928 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 4800 (in bits) at driver.h:477:1 'u64 android_kabi_reserved2', at offset 4864 (in bits) at driver.h:478:1 there are data member changes: type 'struct gpio_irq_chip' of 'gpio_chip::irq' changed: type size changed from 2304 to 2432 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 2304 (in bits) at driver.h:271:1 'u64 android_kabi_reserved2', at offset 2368 (in bits) at driver.h:272:1 3982 impacted interfaces 4 ('unsigned long int* valid_mask' .. 'int (gpio_chip*, const of_phandle_args*, u32*)* of_xlate') offsets changed (by +128 bits) 3982 impacted interfaces 'struct gpio_device at gpiolib.h:46:1' changed (indirectly): type size changed from 8832 to 9600 (in bits) there are data member changes: type 'struct device' of 'gpio_device::dev' changed, as reported earlier 12 ('cdev chrdev' .. 'list_head pin_ranges') offsets changed (by +768 bits) 3982 impacted interfaces 'struct gpio_irq_chip at driver.h:31:1' changed: details were reported earlier 'struct gs_port at u_serial.c:98:1' changed (indirectly): type size changed from 5568 to 6016 (in bits) there are data member changes: type 'struct tty_port' of 'gs_port::port' changed: type size changed from 3200 to 3392 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 3328 (in bits) at tty.h:259:1 there are data member changes: type 'struct tty_bufhead' of 'tty_port::buf' changed: type size changed from 1216 to 1344 (in bits) there are data member changes: type 'struct work_struct' of 'tty_bufhead::work' changed, as reported earlier 7 ('mutex lock' .. 'tty_buffer* tail') offsets changed (by +128 bits) 3982 impacted interfaces 19 ('tty_struct* tty' .. 'void* client_data') offsets changed (by +128 bits) 3982 impacted interfaces 8 ('spinlock_t port_lock' .. 'unsigned int n_read') offsets changed (by +192 bits) type 'struct delayed_work' of 'gs_port::push' changed, as reported earlier and offset changed from 3776 to 3968 (in bits) (by +192 bits) 10 ('list_head write_pool' .. 'usb_cdc_line_coding port_line_coding') offsets changed (by +448 bits) 2 impacted interfaces 'struct hci_dev at hci_core.h:283:1' changed: type size changed from 37696 to 42176 (in bits) 4 data member insertions: 'u64 android_kabi_reserved1', at offset 41920 (in bits) at hci_core.h:569:1 'u64 android_kabi_reserved2', at offset 41984 (in bits) at hci_core.h:570:1 'u64 android_kabi_reserved3', at offset 42048 (in bits) at hci_core.h:571:1 'u64 android_kabi_reserved4', at offset 42112 (in bits) at hci_core.h:572:1 there are data member changes: type 'struct work_struct' of 'hci_dev::power_on' changed, as reported earlier type 'struct delayed_work' of 'hci_dev::power_off' changed, as reported earlier and offset changed from 13824 to 13952 (in bits) (by +128 bits) type 'struct work_struct' of 'hci_dev::error_reset' changed, as reported earlier and offset changed from 14656 to 15040 (in bits) (by +384 bits) '__u16 discov_timeout' offset changed (by +512 bits) type 'struct delayed_work' of 'hci_dev::discov_off' changed, as reported earlier and offset changed from 14976 to 15488 (in bits) (by +512 bits) type 'struct delayed_work' of 'hci_dev::service_cache' changed, as reported earlier and offset changed from 15808 to 16576 (in bits) (by +768 bits) type 'struct delayed_work' of 'hci_dev::cmd_timer' changed, as reported earlier and offset changed from 16640 to 17664 (in bits) (by +1024 bits) type 'struct work_struct' of 'hci_dev::rx_work' changed, as reported earlier and offset changed from 17472 to 18752 (in bits) (by +1280 bits) type 'struct work_struct' of 'hci_dev::cmd_work' changed, as reported earlier and offset changed from 17728 to 19136 (in bits) (by +1408 bits) type 'struct work_struct' of 'hci_dev::tx_work' changed, as reported earlier and offset changed from 17984 to 19520 (in bits) (by +1536 bits) type 'struct work_struct' of 'hci_dev::discov_update' changed, as reported earlier and offset changed from 18240 to 19904 (in bits) (by +1664 bits) type 'struct work_struct' of 'hci_dev::bg_scan_update' changed, as reported earlier and offset changed from 18496 to 20288 (in bits) (by +1792 bits) type 'struct work_struct' of 'hci_dev::scan_update' changed, as reported earlier and offset changed from 18752 to 20672 (in bits) (by +1920 bits) type 'struct work_struct' of 'hci_dev::connectable_update' changed, as reported earlier and offset changed from 19008 to 21056 (in bits) (by +2048 bits) type 'struct work_struct' of 'hci_dev::discoverable_update' changed, as reported earlier and offset changed from 19264 to 21440 (in bits) (by +2176 bits) type 'struct delayed_work' of 'hci_dev::le_scan_disable' changed, as reported earlier and offset changed from 19520 to 21824 (in bits) (by +2304 bits) type 'struct delayed_work' of 'hci_dev::le_scan_restart' changed, as reported earlier and offset changed from 20352 to 22912 (in bits) (by +2560 bits) 17 ('sk_buff_head rx_q' .. 'notifier_block suspend_notifier') offsets changed (by +2816 bits) type 'struct work_struct' of 'hci_dev::suspend_prepare' changed, as reported earlier and offset changed from 24064 to 26880 (in bits) (by +2816 bits) 29 ('suspended_state suspend_state_next' .. 'dentry* debugfs') offsets changed (by +2944 bits) type 'struct device' of 'hci_dev::dev' changed, as reported earlier and offset changed from 27456 to 30400 (in bits) (by +2944 bits) 11 ('rfkill* rfkill' .. '__u16 adv_instance_timeout') offsets changed (by +3712 bits) type 'struct delayed_work' of 'hci_dev::adv_instance_expire' changed, as reported earlier and offset changed from 34752 to 38464 (in bits) (by +3712 bits) 4 ('idr adv_monitors_idr' .. '__u32 rpa_timeout') offsets changed (by +3968 bits) type 'struct delayed_work' of 'hci_dev::rpa_expired' changed, as reported earlier and offset changed from 35968 to 39936 (in bits) (by +3968 bits) 14 ('bdaddr_t rpa' .. 'typedef bool (hci_dev*)* prevent_wake') offsets changed (by +4224 bits) 5 impacted interfaces 'struct hd_struct at genhd.h:54:1' changed (indirectly): details were reported earlier 'struct hid_device at hid.h:549:1' changed (indirectly): type size changed from 61632 to 62528 (in bits) there are data member changes: type 'struct work_struct' of 'hid_device::led_work' changed, as reported earlier 'semaphore driver_input_lock' offset changed (by +128 bits) type 'struct device' of 'hid_device::dev' changed, as reported earlier and offset changed from 50816 to 50944 (in bits) (by +128 bits) 35 ('hid_driver* driver' .. 'wait_queue_head_t debug_wait') offsets changed (by +896 bits) 5 impacted interfaces 'struct hid_driver at hid.h:740:1' changed (indirectly): type size changed from 2496 to 2752 (in bits) there are data member changes: type 'struct device_driver' of 'hid_driver::driver' changed, as reported earlier 5 impacted interfaces 'struct hvc_struct at hvc_console.h:35:1' changed (indirectly): type size changed from 4160 to 4480 (in bits) there are data member changes: type 'struct tty_port' of 'hvc_struct::port' changed, as reported earlier 11 ('spinlock_t lock' .. 'winsize ws') offsets changed (by +192 bits) type 'struct work_struct' of 'hvc_struct::tty_resize' changed, as reported earlier and offset changed from 3712 to 3904 (in bits) (by +192 bits) 2 ('list_head next' .. 'unsigned long int flags') offsets changed (by +320 bits) 5 impacted interfaces 'struct i2c_adapter at i2c.h:697:1' changed (indirectly): details were reported earlier 'struct i2c_client at i2c.h:314:1' changed (indirectly): type size changed from 6848 to 7616 (in bits) there are data member changes: type 'struct device' of 'i2c_client::dev' changed, as reported earlier 3 ('int init_irq' .. 'list_head detected') offsets changed (by +768 bits) 37 impacted interfaces 'struct i2c_driver at i2c.h:255:1' changed (indirectly): type size changed from 1920 to 2176 (in bits) there are data member changes: type 'struct device_driver' of 'i2c_driver::driver' changed, as reported earlier 4 ('const i2c_device_id* id_table' .. 'list_head clients') offsets changed (by +256 bits) 2 impacted interfaces 'struct i3c_device at master.h:229:1' changed (indirectly): type size changed from 6528 to 7296 (in bits) there are data member changes: type 'struct device' of 'i3c_device::dev' changed, as reported earlier 2 ('i3c_dev_desc* desc' .. 'i3c_bus* bus') offsets changed (by +768 bits) 14 impacted interfaces 'struct i3c_generic_ibi_slot at master.c:2274:1' changed (indirectly): type size changed from 576 to 704 (in bits) there are data member changes: type 'struct i3c_ibi_slot' of 'i3c_generic_ibi_slot::base' changed: type size changed from 448 to 576 (in bits) there are data member changes: type 'struct work_struct' of 'i3c_ibi_slot::work' changed, as reported earlier 3 ('i3c_dev_desc* dev' .. 'void* data') offsets changed (by +128 bits) 14 impacted interfaces 4 impacted interfaces 'struct i3c_ibi_slot at master.h:111:1' changed (indirectly): details were reported earlier 'struct i3c_master_controller at master.h:483:1' changed (indirectly): type size changed from 17024 to 18560 (in bits) there are data member changes: type 'struct device' of 'i3c_master_controller::dev' changed, as reported earlier 'i3c_dev_desc* this' offset changed (by +768 bits) type 'struct i2c_adapter' of 'i3c_master_controller::i2c' changed, as reported earlier and offset changed from 6464 to 7232 (in bits) (by +768 bits) 4 ('const i3c_master_controller_ops* ops' .. 'workqueue_struct* wq') offsets changed (by +1536 bits) 14 impacted interfaces 'struct iio_dev at iio.h:521:1' changed (indirectly): type size changed from 10176 to 10944 (in bits) there are data member changes: type 'struct device' of 'iio_dev::dev' changed, as reported earlier 25 ('iio_buffer* buffer' .. 'void* priv') offsets changed (by +768 bits) 23 impacted interfaces 'struct iio_trigger at trigger.h:59:1' changed (indirectly): type size changed from 9856 to 10624 (in bits) there are data member changes: type 'struct device' of 'iio_trigger::dev' changed, as reported earlier 9 ('list_head list' .. 'bool attached_own_device') offsets changed (by +768 bits) 23 impacted interfaces 'struct inode at fs.h:610:1' changed: type size changed from 5120 to 5632 (in bits) 6 data member insertions: 'bdi_writeback* i_wb', at offset 2176 (in bits) at fs.h:680:1 'int i_wb_frn_winner', at offset 2240 (in bits) at fs.h:683:1 'u16 i_wb_frn_avg_time', at offset 2272 (in bits) at fs.h:684:1 'u16 i_wb_frn_history', at offset 2288 (in bits) at fs.h:685:1 'u64 android_kabi_reserved1', at offset 5504 (in bits) at fs.h:734:1 'u64 android_kabi_reserved2', at offset 5568 (in bits) at fs.h:735:1 there are data member changes: 3 ('list_head i_lru' .. 'list_head i_wb_list') offsets changed (by +128 bits) anonymous data member 'union {hlist_head i_dentry; callback_head i_rcu;}' offset changed from 2560 to 2688 (in bits) (by +128 bits) 6 ('atomic64_t i_version' .. 'atomic_t i_readcount') offsets changed (by +128 bits) anonymous data member 'union {const file_operations* i_fop; void (inode*)* free_inode;}' offset changed from 2944 to 3072 (in bits) (by +128 bits) 'file_lock_context* i_flctx' offset changed (by +128 bits) type 'struct address_space' of 'inode::i_data' changed, as reported earlier and offset changed from 3072 to 3200 (in bits) (by +128 bits) 'list_head i_devices' offset changed (by +384 bits) anonymous data member 'union {pipe_inode_info* i_pipe; block_device* i_bdev; cdev* i_cdev; char* i_link; unsigned int i_dir_seq;}' offset changed from 4736 to 5120 (in bits) (by +384 bits) 6 ('__u32 i_generation' .. 'void* i_private') offsets changed (by +384 bits) 3982 impacted interfaces 'struct inode_operations at fs.h:1864:1' changed: type size changed from 1536 to 2048 (in bits) 4 data member insertions: 'u64 android_kabi_reserved1', at offset 1344 (in bits) at fs.h:1932:1 'u64 android_kabi_reserved2', at offset 1408 (in bits) at fs.h:1933:1 'u64 android_kabi_reserved3', at offset 1472 (in bits) at fs.h:1934:1 'u64 android_kabi_reserved4', at offset 1536 (in bits) at fs.h:1935:1 3982 impacted interfaces 'struct input_dev at input.h:131:1' changed: type size changed from 11648 to 12672 (in bits) 4 data member insertions: 'u64 android_kabi_reserved1', at offset 12416 (in bits) at input.h:206:1 'u64 android_kabi_reserved2', at offset 12480 (in bits) at input.h:207:1 'u64 android_kabi_reserved3', at offset 12544 (in bits) at input.h:208:1 'u64 android_kabi_reserved4', at offset 12608 (in bits) at input.h:209:1 there are data member changes: type 'struct device' of 'input_dev::dev' changed, as reported earlier 7 ('list_head h_list' .. 'ktime_t timestamp[3]') offsets changed (by +768 bits) 146 impacted interfaces 'struct input_handle at input.h:337:1' changed: type size changed from 576 to 640 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 576 (in bits) at input.h:358:1 146 impacted interfaces 'struct input_handler at input.h:302:1' changed: type size changed from 960 to 1024 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 960 (in bits) at input.h:330:1 146 impacted interfaces 'struct io_context at iocontext.h:99:1' changed (indirectly): type size changed from 704 to 832 (in bits) there are data member changes: type 'struct work_struct' of 'io_context::release_work' changed, as reported earlier 3982 impacted interfaces 'struct irq_affinity_notify at interrupt.h:270:1' changed (indirectly): type size changed from 448 to 576 (in bits) there are data member changes: type 'struct work_struct' of 'irq_affinity_notify::work' changed, as reported earlier 2 ('void (irq_affinity_notify*, const cpumask_t*)* notify' .. 'void (kref*)* release') offsets changed (by +128 bits) 3983 impacted interfaces 'struct kernfs_node at kernfs.h:124:1' changed: type size changed from 1024 to 1088 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 1024 (in bits) at kernfs.h:161:1 3982 impacted interfaces 'struct kernfs_open_file at kernfs.h:203:1' changed: type size changed from 1472 to 1536 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 1472 (in bits) at kernfs.h:226:1 3982 impacted interfaces 'struct kernfs_root at kernfs.h:186:1' changed: type size changed from 768 to 832 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 768 (in bits) at kernfs.h:204:1 3982 impacted interfaces 'struct key_type at key-type.h:63:1' changed: type size changed from 1344 to 1472 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 1216 (in bits) at key-type.h:159:1 'u64 android_kabi_reserved2', at offset 1280 (in bits) at key-type.h:160:1 there are data member changes: 2 ('list_head link' .. 'lock_class_key lock_class') offsets changed (by +128 bits) 3982 impacted interfaces 'struct led_classdev at leds.h:64:1' changed (indirectly): type size changed from 3264 to 3392 (in bits) there are data member changes: type 'struct work_struct' of 'led_classdev::set_brightness_work' changed, as reported earlier 8 ('int delayed_set_value' .. 'mutex led_access') offsets changed (by +128 bits) 164 impacted interfaces 'struct led_classdev_flash at led-class-flash.h:65:1' changed (indirectly): type size changed from 3904 to 4032 (in bits) there are data member changes: type 'struct led_classdev' of 'led_classdev_flash::led_cdev' changed, as reported earlier 4 ('const led_flash_ops* ops' .. 'const attribute_group* sysfs_groups[5]') offsets changed (by +128 bits) 6 impacted interfaces 'struct list_lru at list_lru.h:52:1' changed: type size changed from 64 to 256 (in bits) 3 data member insertions: 'list_head list', at offset 64 (in bits) at list_lru.h:55:1 'int shrinker_id', at offset 192 (in bits) at list_lru.h:56:1 'bool memcg_aware', at offset 224 (in bits) at list_lru.h:57:1 3982 impacted interfaces 'struct list_lru_node at list_lru.h:40:1' changed: type size hasn't changed 1 data member insertion: 'list_lru_memcg* memcg_lrus', at offset 256 (in bits) at list_lru.h:47:1 there are data member changes: 'long int nr_items' offset changed (by +64 bits) 3982 impacted interfaces 'struct lock_manager_operations at fs.h:1016:1' changed: type size changed from 512 to 640 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 512 (in bits) at fs.h:1048:1 'u64 android_kabi_reserved2', at offset 576 (in bits) at fs.h:1049:1 3982 impacted interfaces 'struct lruvec at mmzone.h:280:1' changed: details were reported earlier 'struct mdio_device at mdio.h:34:1' changed (indirectly): type size changed from 7168 to 7936 (in bits) there are data member changes: type 'struct device' of 'mdio_device::dev' changed, as reported earlier 11 ('mii_bus* bus' .. 'unsigned int reset_deassert_delay') offsets changed (by +768 bits) 3982 impacted interfaces 'struct mdio_driver_common at mdio.h:55:1' changed (indirectly): type size changed from 1216 to 1472 (in bits) there are data member changes: type 'struct device_driver' of 'mdio_driver_common::driver' changed, as reported earlier 'int flags' offset changed (by +256 bits) 3982 impacted interfaces 'struct media_devnode at media-devnode.h:75:1' changed (indirectly): type size changed from 7872 to 8640 (in bits) there are data member changes: type 'struct device' of 'media_devnode::dev' changed, as reported earlier 5 ('cdev cdev' .. 'void (media_devnode*)* release') offsets changed (by +768 bits) 111 impacted interfaces 'struct mii_bus at phy.h:301:1' changed (indirectly): type size changed from 21760 to 22528 (in bits) there are data member changes: type 'struct device' of 'mii_bus::dev' changed, as reported earlier 10 ('mdio_device* mdio_map[32]' .. 'phy_package_shared* shared[32]') offsets changed (by +768 bits) 3982 impacted interfaces 'struct mipi_dsi_device at drm_mipi_dsi.h:188:1' changed (indirectly): type size changed from 6912 to 7680 (in bits) there are data member changes: type 'struct device' of 'mipi_dsi_device::dev' changed, as reported earlier 7 ('char name[20]' .. 'unsigned long int lp_rate') offsets changed (by +768 bits) 20 impacted interfaces 'struct mipi_dsi_driver at drm_mipi_dsi.h:306:1' changed (indirectly): type size changed from 1344 to 1600 (in bits) there are data member changes: type 'struct device_driver' of 'mipi_dsi_driver::driver' changed, as reported earlier 3 ('int (mipi_dsi_device*)* probe' .. 'void (mipi_dsi_device*)* shutdown') offsets changed (by +256 bits) 2 impacted interfaces 'struct mm_struct at mm_types.h:407:1' changed: type size changed from 7360 to 7616 (in bits) there are data member changes: anonymous data member at offset 0 (in bits) changed from: struct {vm_area_struct* mmap; rb_root mm_rb; u64 vmacache_seqnum; rwlock_t mm_rb_lock; unsigned long int (file*, unsigned long int, unsigned long int, unsigned long int, unsigned long int)* get_unmapped_area; unsigned long int mmap_base; unsigned long int mmap_legacy_base; unsigned long int task_size; unsigned long int highest_vm_end; pgd_t* pgd; atomic_t membarrier_state; atomic_t mm_users; atomic_t mm_count; atomic_t has_pinned; atomic_long_t pgtables_bytes; int map_count; spinlock_t page_table_lock; rw_semaphore mmap_lock; list_head mmlist; unsigned long int hiwater_rss; unsigned long int hiwater_vm; unsigned long int total_vm; unsigned long int locked_vm; atomic64_t pinned_vm; unsigned long int data_vm; unsigned long int exec_vm; unsigned long int stack_vm; unsigned long int def_flags; seqcount_t write_protect_seq; spinlock_t arg_lock; unsigned long int start_code; unsigned long int end_code; unsigned long int start_data; unsigned long int end_data; unsigned long int start_brk; unsigned long int brk; unsigned long int start_stack; unsigned long int arg_start; unsigned long int arg_end; unsigned long int env_start; unsigned long int env_end; unsigned long int saved_auxv[46]; mm_rss_stat rss_stat; linux_binfmt* binfmt; mm_context_t context; unsigned long int flags; core_state* core_state; spinlock_t ioctx_lock; kioctx_table* ioctx_table; user_namespace* user_ns; file* exe_file; mmu_notifier_subscriptions* notifier_subscriptions; atomic_t tlb_flush_pending; uprobes_state uprobes_state; work_struct async_put_work; u32 pasid;} to: struct {vm_area_struct* mmap; rb_root mm_rb; u64 vmacache_seqnum; rwlock_t mm_rb_lock; unsigned long int (file*, unsigned long int, unsigned long int, unsigned long int, unsigned long int)* get_unmapped_area; unsigned long int mmap_base; unsigned long int mmap_legacy_base; unsigned long int task_size; unsigned long int highest_vm_end; pgd_t* pgd; atomic_t membarrier_state; atomic_t mm_users; atomic_t mm_count; atomic_t has_pinned; atomic_long_t pgtables_bytes; int map_count; spinlock_t page_table_lock; rw_semaphore mmap_lock; list_head mmlist; unsigned long int hiwater_rss; unsigned long int hiwater_vm; unsigned long int total_vm; unsigned long int locked_vm; atomic64_t pinned_vm; unsigned long int data_vm; unsigned long int exec_vm; unsigned long int stack_vm; unsigned long int def_flags; seqcount_t write_protect_seq; spinlock_t arg_lock; unsigned long int start_code; unsigned long int end_code; unsigned long int start_data; unsigned long int end_data; unsigned long int start_brk; unsigned long int brk; unsigned long int start_stack; unsigned long int arg_start; unsigned long int arg_end; unsigned long int env_start; unsigned long int env_end; unsigned long int saved_auxv[46]; mm_rss_stat rss_stat; linux_binfmt* binfmt; mm_context_t context; unsigned long int flags; core_state* core_state; spinlock_t ioctx_lock; kioctx_table* ioctx_table; task_struct* owner; user_namespace* user_ns; file* exe_file; mmu_notifier_subscriptions* notifier_subscriptions; atomic_t tlb_flush_pending; uprobes_state uprobes_state; work_struct async_put_work; u32 pasid; u64 android_kabi_reserved1;} and size changed from 7360 to 7616 (in bits) (by +256 bits) 'unsigned long int cpu_bitmap[]' offset changed (by +256 bits) 3982 impacted interfaces 'struct mmc_card at card.h:244:1' changed: type size changed from 13568 to 14912 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 14720 (in bits) at card.h:320:1 'u64 android_kabi_reserved2', at offset 14784 (in bits) at card.h:321:1 there are data member changes: type 'struct device' of 'mmc_card::dev' changed, as reported earlier 38 ('u32 ocr' .. 'dentry* debugfs_root') offsets changed (by +768 bits) 'mmc_part part[7]' offset changed (by +448 bits) 3 ('unsigned int nr_parts' .. 'workqueue_struct* complete_wq') offsets changed (by +1216 bits) 'u64 android_vendor_data1' offset changed (by +1344 bits) 89 impacted interfaces 'struct mmc_cqe_ops at host.h:181:1' changed: type size changed from 576 to 704 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 576 (in bits) at host.h:228:1 'u64 android_kabi_reserved2', at offset 640 (in bits) at host.h:229:1 89 impacted interfaces 'struct mmc_driver at bus.h:32:1' changed (indirectly): type size changed from 1344 to 1600 (in bits) there are data member changes: type 'struct device_driver' of 'mmc_driver::drv' changed, as reported earlier 3 ('int (mmc_card*)* probe' .. 'void (mmc_card*)* shutdown') offsets changed (by +256 bits) 2 impacted interfaces 'struct mmc_host at host.h:279:1' changed: type size changed from 13824 to 15360 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 14720 (in bits) at host.h:495:1 'u64 android_kabi_reserved2', at offset 14784 (in bits) at host.h:496:1 there are data member changes: type 'struct device' of 'mmc_host::class_dev' changed, as reported earlier 39 ('int index' .. 'mmc_ctx default_ctx') offsets changed (by +768 bits) type 'struct delayed_work' of 'mmc_host::detect' changed, as reported earlier and offset changed from 8768 to 9536 (in bits) (by +768 bits) 6 ('int detect_change' .. 'task_struct* sdio_irq_thread') offsets changed (by +1024 bits) type 'struct delayed_work' of 'mmc_host::sdio_irq_work' changed, as reported earlier and offset changed from 10112 to 11136 (in bits) (by +1024 bits) 19 ('bool sdio_irq_pending' .. 'bool hsq_enabled') offsets changed (by +1280 bits) 2 ('u64 android_vendor_data1' .. 'u64 android_oem_data1') offsets changed (by +1408 bits) 'unsigned long int private[]' offset changed (by +1536 bits) 89 impacted interfaces 'struct mmc_host_ops at host.h:85:1' changed: type size changed from 1408 to 1536 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 1408 (in bits) at host.h:181:1 'u64 android_kabi_reserved2', at offset 1472 (in bits) at host.h:182:1 89 impacted interfaces 'struct mmc_part at card.h:229:1' changed: type size changed from 320 to 384 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 320 (in bits) at card.h:241:1 89 impacted interfaces 'struct nd_region at nd.h:138:1' changed (indirectly): type size changed from 8512 to 9280 (in bits) there are data member changes: type 'struct device' of 'nd_region::dev' changed, as reported earlier 25 ('ida ns_ida' .. 'nd_mapping mapping[]') offsets changed (by +768 bits) one impacted interface 'struct neigh_parms at neighbour.h:70:1' changed: details were reported earlier 'struct neigh_table at neighbour.h:194:1' changed: details were reported earlier 'struct neighbour at neighbour.h:134:1' changed: type size changed from 2944 to 3008 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 2944 (in bits) at neighbour.h:164:1 there are data member changes: 'u8 primary_key[]' offset changed (by +64 bits) 3982 impacted interfaces 'struct net at net_namespace.h:56:1' changed (indirectly): details were reported earlier 'struct net_device at netdevice.h:1898:1' changed: type size changed from 18944 to 19968 (in bits) 1 data member insertion: 'netprio_map* priomap', at offset 18176 (in bits) at netdevice.h:2189:1 there are data member changes: type 'struct device' of 'net_device::dev' changed, as reported earlier 8 ('const attribute_group* sysfs_groups[4]' .. 'u8 prio_tc_map[16]') offsets changed (by +768 bits) 17 ('phy_device* phydev' .. 'u64 android_kabi_reserved8') offsets changed (by +832 bits) 3982 impacted interfaces 'struct netns_can at can.h:15:1' changed: details were reported earlier 'struct netns_ct at conntrack.h:95:1' changed (indirectly): details were reported earlier 'struct netns_ipv4 at ipv4.h:43:1' changed: details were reported earlier 'struct netns_ipv6 at ipv6.h:56:1' changed: details were reported earlier 'struct netns_nf at netfilter.h:11:1' changed: details were reported earlier 'struct netns_xfrm at xfrm.h:32:1' changed: details were reported earlier 'struct nf_conn at nf_conntrack.h:59:1' changed: type size changed from 2176 to 2240 (in bits) 1 data member insertion: 'u64 android_oem_data1', at offset 2176 (in bits) at nf_conntrack.h:114:1 3982 impacted interfaces 'struct nvdimm at nd-core.h:31:1' changed (indirectly): type size changed from 8064 to 9088 (in bits) there are data member changes: type 'struct device' of 'nvdimm::dev' changed, as reported earlier 6 ('atomic_t busy' .. 'struct {const nvdimm_security_ops* ops; unsigned long int flags; unsigned long int ext_flags; unsigned int overwrite_tmo; kernfs_node* overwrite_state;} sec') offsets changed (by +768 bits) type 'struct delayed_work' of 'nvdimm::dwork' changed, as reported earlier and offset changed from 7168 to 7936 (in bits) (by +768 bits) 'const nvdimm_fw_ops* fw_ops' offset changed (by +1024 bits) 3 impacted interfaces 'struct nvdimm_bus at nd-core.h:19:1' changed (indirectly): type size changed from 7616 to 8384 (in bits) there are data member changes: type 'struct device' of 'nvdimm_bus::dev' changed, as reported earlier 6 ('int id' .. 'badrange badrange') offsets changed (by +768 bits) 3 impacted interfaces 'struct nvmem_device at core.c:22:1' changed (indirectly): type size changed from 7680 to 8448 (in bits) there are data member changes: type 'struct device' of 'nvmem_device::dev' changed, as reported earlier 16 ('int stride' .. 'void* priv') offsets changed (by +768 bits) 14 impacted interfaces 'struct page at mm_types.h:71:1' changed: type size hasn't changed 1 data member insertion: 'union {mem_cgroup* mem_cgroup; obj_cgroup** obj_cgroups;}', at offset 448 (in bits) at mm_types.h:205:1 3982 impacted interfaces 'struct page_reporting_dev_info at page_reporting.h:11:1' changed (indirectly): type size changed from 960 to 1216 (in bits) there are data member changes: type 'struct delayed_work' of 'page_reporting_dev_info::work' changed, as reported earlier 'atomic_t state' offset changed (by +256 bits) 2 impacted interfaces 'struct pci_bus at pci.h:611:1' changed (indirectly): type size changed from 9472 to 10240 (in bits) there are data member changes: type 'struct device' of 'pci_bus::dev' changed, as reported earlier 6 ('bin_attribute* legacy_io' .. 'u64 android_kabi_reserved4') offsets changed (by +768 bits) 446 impacted interfaces 'struct pci_dev at pci.h:310:1' changed (indirectly): type size changed from 24768 to 25536 (in bits) there are data member changes: type 'struct device' of 'pci_dev::dev' changed, as reported earlier 14 ('int cfg_size' .. 'pci_vpd* vpd') offsets changed (by +768 bits) anonymous data member 'union {pci_sriov* sriov; pci_dev* physfn;}' offset changed from 24128 to 24896 (in bits) (by +768 bits) 11 ('u16 ats_cap' .. 'u64 android_kabi_reserved4') offsets changed (by +768 bits) 446 impacted interfaces 'struct pci_driver at pci.h:869:1' changed (indirectly): type size changed from 2368 to 2624 (in bits) there are data member changes: type 'struct device_driver' of 'pci_driver::driver' changed, as reported earlier 5 ('pci_dynids dynids' .. 'u64 android_kabi_reserved4') offsets changed (by +256 bits) 446 impacted interfaces 'struct pci_epc at pci-epc.h:111:1' changed (indirectly): type size changed from 7424 to 8192 (in bits) there are data member changes: type 'struct device' of 'pci_epc::dev' changed, as reported earlier 10 ('list_head pci_epf' .. 'atomic_notifier_head notifier') offsets changed (by +768 bits) 9 impacted interfaces 'struct pci_error_handlers at pci.h:806:1' changed: type size changed from 384 to 448 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 384 (in bits) at pci.h:830:1 446 impacted interfaces 'struct pci_host_bridge at pci.h:530:1' changed: type size changed from 7680 to 8704 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 8192 (in bits) at pci.h:562:1 'u64 android_kabi_reserved2', at offset 8256 (in bits) at pci.h:563:1 there are data member changes: type 'struct device' of 'pci_host_bridge::dev' changed, as reported earlier 13 ('pci_bus* bus' .. 'typedef resource_size_t (pci_dev*, const resource*, typedef resource_size_t, typedef resource_size_t, typedef resource_size_t)* align_resource') offsets changed (by +768 bits) 'unsigned long int private[]' offset changed (by +1024 bits) 8 impacted interfaces 'struct pci_ops at pci.h:742:1' changed: type size changed from 320 to 384 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 320 (in bits) at pci.h:753:1 446 impacted interfaces 'struct pglist_data at mmzone.h:729:1' changed: details were reported earlier 'struct phy at phy.h:138:1' changed (indirectly): type size changed from 7168 to 7936 (in bits) there are data member changes: type 'struct device' of 'phy::dev' changed, as reported earlier 7 ('int id' .. 'regulator* pwr') offsets changed (by +768 bits) 70 impacted interfaces 'struct phy_device at phy.h:540:1' changed: type size changed from 11328 to 12608 (in bits) 4 data member insertions: 'u64 android_kabi_reserved1', at offset 12352 (in bits) at phy.h:650:1 'u64 android_kabi_reserved2', at offset 12416 (in bits) at phy.h:651:1 'u64 android_kabi_reserved3', at offset 12480 (in bits) at phy.h:652:1 'u64 android_kabi_reserved4', at offset 12544 (in bits) at phy.h:653:1 there are data member changes: type 'struct mdio_device' of 'phy_device::mdio' changed, as reported earlier 25 ('phy_driver* drv' .. 'nlattr* nest') offsets changed (by +768 bits) type 'struct delayed_work' of 'phy_device::state_queue' changed, as reported earlier and offset changed from 9600 to 10368 (in bits) (by +768 bits) 10 ('mutex lock' .. 'void (net_device*)* adjust_link') offsets changed (by +1024 bits) 3982 impacted interfaces 'struct phy_driver at phy.h:696:1' changed: type size changed from 3840 to 4224 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 4096 (in bits) at phy.h:885:1 'u64 android_kabi_reserved2', at offset 4160 (in bits) at phy.h:886:1 there are data member changes: type 'struct mdio_driver_common' of 'phy_driver::mdiodrv' changed, as reported earlier 41 ('u32 phy_id' .. 'int (phy_device*)* get_sqi_max') offsets changed (by +256 bits) 3982 impacted interfaces 'struct phylink at phylink.c:40:1' changed (indirectly): type size changed from 3392 to 3520 (in bits) there are data member changes: type 'struct work_struct' of 'phylink::resolve' changed, as reported earlier 5 ('bool mac_link_dropped' .. 'u8 sfp_port') offsets changed (by +128 bits) 3982 impacted interfaces 'struct platform_device at platform_device.h:22:1' changed: type size changed from 7040 to 7936 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 7808 (in bits) at platform_device.h:42:1 'u64 android_kabi_reserved2', at offset 7872 (in bits) at platform_device.h:43:1 there are data member changes: type 'struct device' of 'platform_device::dev' changed, as reported earlier 8 ('u64 platform_dma_mask' .. 'pdev_archdata archdata') offsets changed (by +768 bits) 38 impacted interfaces 'struct platform_device_info at platform_device.h:81:1' changed: type size changed from 704 to 768 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 704 (in bits) at platform_device.h:102:1 one impacted interface 'struct platform_driver at platform_device.h:200:1' changed: type size changed from 1600 to 1920 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 1856 (in bits) at platform_device.h:216:1 there are data member changes: type 'struct device_driver' of 'platform_driver::driver' changed, as reported earlier 2 ('const platform_device_id* id_table' .. 'bool prevent_deferred_probe') offsets changed (by +256 bits) 5 impacted interfaces 'struct platform_suspend_ops at suspend.h:177:1' changed: type size changed from 640 to 704 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 640 (in bits) at suspend.h:190:1 one impacted interface 'struct pool_workqueue at workqueue.c:204:1' changed (indirectly): type size hasn't changed there are data member changes: type 'struct work_struct' of 'pool_workqueue::unbound_release_work' changed, as reported earlier 'callback_head rcu' offset changed (by +128 bits) 3982 impacted interfaces 'struct power_supply at power_supply.h:279:1' changed: type size changed from 8832 to 10048 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 9984 (in bits) at power_supply.h:324:1 there are data member changes: type 'struct device' of 'power_supply::dev' changed, as reported earlier type 'struct work_struct' of 'power_supply::changed_work' changed, as reported earlier and offset changed from 6848 to 7616 (in bits) (by +768 bits) type 'struct delayed_work' of 'power_supply::deferred_register_work' changed, as reported earlier and offset changed from 7104 to 8000 (in bits) (by +896 bits) 17 ('spinlock_t changed_lock' .. 'char* charging_blink_full_solid_trig_name') offsets changed (by +1152 bits) 43 impacted interfaces 'struct power_supply_config at power_supply.h:224:1' changed: type size changed from 384 to 448 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 384 (in bits) at power_supply.h:238:1 2 impacted interfaces 'struct power_supply_desc at power_supply.h:239:1' changed: type size changed from 768 to 832 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 768 (in bits) at power_supply.h:281:1 43 impacted interfaces 'struct psi_group at psi_types.h:136:1' changed: details were reported earlier 'struct pwm_chip at pwm.h:314:1' changed: type size changed from 512 to 576 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 512 (in bits) at pwm.h:333:1 10 impacted interfaces 'struct pwm_device at pwm.h:89:1' changed: type size changed from 960 to 1024 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 960 (in bits) at pwm.h:102:1 10 impacted interfaces 'struct pwm_ops at pwm.h:281:1' changed: type size changed from 704 to 768 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 704 (in bits) at pwm.h:305:1 10 impacted interfaces 'struct queue_limits at blkdev.h:318:1' changed: type size changed from 896 to 960 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 896 (in bits) at blkdev.h:354:1 3983 impacted interfaces 'struct rc_dev at rc-core.h:162:1' changed (indirectly): type size changed from 18688 to 20224 (in bits) there are data member changes: type 'struct device' of 'rc_dev::dev' changed, as reported earlier 38 ('bool managed_alloc' .. 'u32 tx_resolution') offsets changed (by +768 bits) type 'struct device' of 'rc_dev::lirc_dev' changed, as reported earlier and offset changed from 9920 to 10688 (in bits) (by +768 bits) 21 ('cdev lirc_cdev' .. 'int (rc_dev*, unsigned int)* s_timeout') offsets changed (by +1536 bits) 38 impacted interfaces 'struct rcu_work at workqueue.h:124:1' changed (indirectly): details were reported earlier 'struct regmap_bus at regmap.h:501:1' changed: type size changed from 896 to 960 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 896 (in bits) at regmap.h:523:1 443 impacted interfaces 'struct regmap_config at regmap.h:347:1' changed: type size changed from 2176 to 2240 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 2176 (in bits) at regmap.h:406:1 5 impacted interfaces 'struct regmap_range_cfg at regmap.h:426:1' changed: type size changed from 320 to 384 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 320 (in bits) at regmap.h:445:1 5 impacted interfaces 'struct regulator_desc at driver.h:315:1' changed: type size changed from 2304 to 2368 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 2304 (in bits) at driver.h:388:1 396 impacted interfaces 'struct regulator_dev at driver.h:437:1' changed: type size changed from 9664 to 10752 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 10688 (in bits) at driver.h:482:1 there are data member changes: type 'struct device' of 'regulator_dev::dev' changed, as reported earlier 4 ('regulation_constraints* constraints' .. 'regmap* regmap') offsets changed (by +768 bits) type 'struct delayed_work' of 'regulator_dev::disable_work' changed, as reported earlier and offset changed from 8512 to 9280 (in bits) (by +768 bits) 4 ('void* reg_data' .. 'unsigned long int last_off_jiffy') offsets changed (by +1024 bits) 396 impacted interfaces 'struct regulator_ops at driver.h:127:1' changed: type size changed from 2112 to 2176 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 2112 (in bits) at driver.h:207:1 396 impacted interfaces 'struct request at blkdev.h:127:1' changed: type size changed from 2368 to 2432 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 2368 (in bits) at blkdev.h:248:1 3982 impacted interfaces 'struct request_queue at blkdev.h:396:1' changed: type size changed from 15680 to 16768 (in bits) 4 data member insertions: 'u64 android_kabi_reserved1', at offset 16448 (in bits) at blkdev.h:598:1 'u64 android_kabi_reserved2', at offset 16512 (in bits) at blkdev.h:599:1 'u64 android_kabi_reserved3', at offset 16576 (in bits) at blkdev.h:600:1 'u64 android_kabi_reserved4', at offset 16640 (in bits) at blkdev.h:601:1 there are data member changes: type 'struct work_struct' of 'request_queue::timeout_work' changed, as reported earlier 5 ('atomic_t nr_active_requests_shared_sbitmap' .. 'list_head blkg_list') offsets changed (by +128 bits) type 'struct queue_limits' of 'request_queue::limits' changed, as reported earlier and offset changed from 8576 to 8704 (in bits) (by +128 bits) 8 ('unsigned int required_elevator_features' .. 'spinlock_t requeue_lock') offsets changed (by +192 bits) type 'struct delayed_work' of 'request_queue::requeue_work' changed, as reported earlier and offset changed from 10240 to 10432 (in bits) (by +192 bits) 11 ('mutex sysfs_lock' .. 'list_head tag_set_list') offsets changed (by +448 bits) type 'struct bio_set' of 'request_queue::bio_split' changed, as reported earlier and offset changed from 13184 to 13632 (in bits) (by +448 bits) 6 ('dentry* debugfs_dir' .. 'u64 write_hints[5]') offsets changed (by +832 bits) 'u64 android_oem_data1' offset changed (by +1088 bits) 3982 impacted interfaces 'struct rfkill at core.c:37:1' changed (indirectly): type size changed from 8896 to 10176 (in bits) there are data member changes: type 'struct device' of 'rfkill::dev' changed, as reported earlier 'list_head node' offset changed (by +768 bits) type 'struct delayed_work' of 'rfkill::poll_work' changed, as reported earlier and offset changed from 7552 to 8320 (in bits) (by +768 bits) type 'struct work_struct' of 'rfkill::uevent_work' changed, as reported earlier and offset changed from 8384 to 9408 (in bits) (by +1024 bits) type 'struct work_struct' of 'rfkill::sync_work' changed, as reported earlier and offset changed from 8640 to 9792 (in bits) (by +1152 bits) 'char name[]' offset changed (by +1280 bits) 14 impacted interfaces 'struct rhashtable at rhashtable-types.h:81:1' changed (indirectly): details were reported earlier 'struct rhltable at rhashtable-types.h:97:1' changed (indirectly): type size changed from 1216 to 1344 (in bits) there are data member changes: type 'struct rhashtable' of 'rhltable::ht' changed, as reported earlier one impacted interface 'struct rpmsg_device at rpmsg.h:51:1' changed (indirectly): type size changed from 6976 to 7744 (in bits) there are data member changes: type 'struct device' of 'rpmsg_device::dev' changed, as reported earlier 7 ('rpmsg_device_id id' .. 'const rpmsg_device_ops* ops') offsets changed (by +768 bits) 10 impacted interfaces 'struct rpmsg_driver at rpmsg.h:111:1' changed (indirectly): type size changed from 1472 to 1728 (in bits) there are data member changes: type 'struct device_driver' of 'rpmsg_driver::drv' changed, as reported earlier 5 ('const rpmsg_device_id* id_table' .. 'int (rpmsg_device*, void*, typedef u32, typedef u32)* signals') offsets changed (by +256 bits) 2 impacted interfaces 'struct rproc at remoteproc.h:520:1' changed (indirectly): type size changed from 10432 to 11328 (in bits) there are data member changes: type 'struct device' of 'rproc::dev' changed, as reported earlier 14 ('atomic_t power' .. 'int index') offsets changed (by +768 bits) type 'struct work_struct' of 'rproc::crash_handler' changed, as reported earlier and offset changed from 8448 to 9216 (in bits) (by +768 bits) 15 ('unsigned int crash_cnt' .. 'bool cdev_put_on_release') offsets changed (by +896 bits) 22 impacted interfaces 'struct rt6_info at ip6_fib.h:205:1' changed: type size changed from 1856 to 1920 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 1856 (in bits) at ip6_fib.h:230:1 3982 impacted interfaces 'struct rtc_class_ops at rtc.h:59:1' changed: type size changed from 576 to 640 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 576 (in bits) at rtc.h:71:1 10 impacted interfaces 'struct rtc_device at rtc.h:84:1' changed: type size changed from 11200 to 12160 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 12096 (in bits) at rtc.h:147:1 there are data member changes: type 'struct device' of 'rtc_device::dev' changed, as reported earlier 17 ('module* owner' .. 'int pie_enabled') offsets changed (by +768 bits) type 'struct work_struct' of 'rtc_device::irqwork' changed, as reported earlier and offset changed from 10368 to 11136 (in bits) (by +768 bits) 10 ('int uie_unsupported' .. 'bool set_start_time') offsets changed (by +896 bits) 10 impacted interfaces 'struct sched_domain at topology.h:82:1' changed: type size changed from 2304 to 2432 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 2304 (in bits) at topology.h:151:1 'u64 android_kabi_reserved2', at offset 2368 (in bits) at topology.h:152:1 there are data member changes: 'unsigned long int span[]' offset changed (by +128 bits) 3982 impacted interfaces 'struct scmi_device at scmi_protocol.h:650:1' changed: type size changed from 6592 to 7424 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 7360 (in bits) at scmi_protocol.h:672:1 there are data member changes: type 'struct device' of 'scmi_device::dev' changed, as reported earlier 'scmi_handle* handle' offset changed (by +768 bits) 2 impacted interfaces 'struct scmi_driver at scmi_protocol.h:670:1' changed (indirectly): type size changed from 1408 to 1664 (in bits) there are data member changes: type 'struct device_driver' of 'scmi_driver::driver' changed, as reported earlier 2 impacted interfaces 'struct scmi_handle at scmi_protocol.h:616:1' changed: type size changed from 384 to 448 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 384 (in bits) at scmi_protocol.h:642:1 2 impacted interfaces 'struct scsi_cmnd at scsi_cmnd.h:68:1' changed: type size changed from 3264 to 3776 (in bits) 4 data member insertions: 'u64 android_kabi_reserved1', at offset 3520 (in bits) at scsi_cmnd.h:147:1 'u64 android_kabi_reserved2', at offset 3584 (in bits) at scsi_cmnd.h:148:1 'u64 android_kabi_reserved3', at offset 3648 (in bits) at scsi_cmnd.h:149:1 'u64 android_kabi_reserved4', at offset 3712 (in bits) at scsi_cmnd.h:150:1 there are data member changes: type 'struct delayed_work' of 'scsi_cmnd::abort_work' changed, as reported earlier 25 ('callback_head rcu' .. 'unsigned int extra_len') offsets changed (by +256 bits) 67 impacted interfaces 'struct scsi_device at scsi_device.h:101:1' changed: type size changed from 17280 to 19456 (in bits) 4 data member insertions: 'u64 android_kabi_reserved1', at offset 19200 (in bits) at scsi_device.h:242:1 'u64 android_kabi_reserved2', at offset 19264 (in bits) at scsi_device.h:243:1 'u64 android_kabi_reserved3', at offset 19328 (in bits) at scsi_device.h:244:1 'u64 android_kabi_reserved4', at offset 19392 (in bits) at scsi_device.h:245:1 there are data member changes: type 'struct work_struct' of 'scsi_device::event_work' changed, as reported earlier 4 ('unsigned int max_device_blocked' .. 'atomic_t ioerr_cnt') offsets changed (by +128 bits) type 'struct device' of 'scsi_device::sdev_gendev' changed, as reported earlier and offset changed from 3136 to 3264 (in bits) (by +128 bits) type 'struct device' of 'scsi_device::sdev_dev' changed, as reported earlier and offset changed from 9536 to 10432 (in bits) (by +896 bits) type 'struct execute_work' of 'scsi_device::ew' changed, as reported earlier and offset changed from 15936 to 17600 (in bits) (by +1664 bits) type 'struct work_struct' of 'scsi_device::requeue_work' changed, as reported earlier and offset changed from 16192 to 17984 (in bits) (by +1792 bits) 8 ('scsi_device_handler* handler' .. 'task_struct* quiesced_by') offsets changed (by +1920 bits) 'unsigned long int sdev_data[]' offset changed (by +2176 bits) 67 impacted interfaces 'struct scsi_host_template at scsi_host.h:32:1' changed: type size changed from 2944 to 3200 (in bits) 4 data member insertions: 'u64 android_kabi_reserved1', at offset 2944 (in bits) at scsi_host.h:491:1 'u64 android_kabi_reserved2', at offset 3008 (in bits) at scsi_host.h:492:1 'u64 android_kabi_reserved3', at offset 3072 (in bits) at scsi_host.h:493:1 'u64 android_kabi_reserved4', at offset 3136 (in bits) at scsi_host.h:494:1 67 impacted interfaces 'struct scsi_target at scsi_device.h:289:1' changed (indirectly): type size changed from 7104 to 7872 (in bits) there are data member changes: type 'struct device' of 'scsi_target::dev' changed, as reported earlier 11 ('kref reap_ref' .. 'unsigned long int starget_data[]') offsets changed (by +768 bits) 67 impacted interfaces 'struct sdhci_host at sdhci.h:361:1' changed: type size changed from 9728 to 10240 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 10048 (in bits) at sdhci.h:609:1 there are data member changes: type 'struct mmc_host_ops' of 'sdhci_host::mmc_host_ops' changed, as reported earlier 'u64 dma_mask' offset changed (by +128 bits) type 'struct led_classdev' of 'sdhci_host::led' changed, as reported earlier and offset changed from 2112 to 2240 (in bits) (by +128 bits) 34 ('char led_name[32]' .. 'workqueue_struct* complete_wq') offsets changed (by +256 bits) type 'struct work_struct' of 'sdhci_host::complete_work' changed, as reported earlier and offset changed from 7552 to 7808 (in bits) (by +256 bits) 26 ('timer_list timer' .. 'u64 data_timeout') offsets changed (by +384 bits) 'unsigned long int private[]' offset changed (by +512 bits) 11 impacted interfaces 'struct sdhci_ops at sdhci.h:611:1' changed: type size changed from 1920 to 1984 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 1920 (in bits) at sdhci.h:659:1 11 impacted interfaces 'struct sdio_driver at sdio_func.h:75:1' changed (indirectly): type size changed from 1408 to 1664 (in bits) there are data member changes: type 'struct device_driver' of 'sdio_driver::drv' changed, as reported earlier 2 impacted interfaces 'struct sdio_func at sdio_func.h:34:1' changed (indirectly): type size changed from 7040 to 7808 (in bits) there are data member changes: type 'struct device' of 'sdio_func::dev' changed, as reported earlier 15 ('sdio_irq_handler_t* irq_handler' .. 'sdio_func_tuple* tuples') offsets changed (by +768 bits) 89 impacted interfaces 'struct serdev_controller at serdev.h:103:1' changed (indirectly): type size changed from 6592 to 7360 (in bits) there are data member changes: type 'struct device' of 'serdev_controller::dev' changed, as reported earlier 3 ('unsigned int nr' .. 'const serdev_controller_ops* ops') offsets changed (by +768 bits) 7 impacted interfaces 'struct serdev_device at serdev.h:41:1' changed (indirectly): type size changed from 7232 to 8000 (in bits) there are data member changes: type 'struct device' of 'serdev_device::dev' changed, as reported earlier 5 ('int nr' .. 'mutex write_lock') offsets changed (by +768 bits) 7 impacted interfaces 'struct serio at serio.h:20:1' changed: type size changed from 9472 to 10304 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 10240 (in bits) at serio.h:66:1 there are data member changes: type 'struct device' of 'serio::dev' changed, as reported earlier 2 ('list_head node' .. 'mutex* ps2_cmd_mutex') offsets changed (by +768 bits) 20 impacted interfaces 'struct serio_driver at serio.h:67:1' changed: type size changed from 1792 to 2112 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 2048 (in bits) at serio.h:86:1 there are data member changes: type 'struct device_driver' of 'serio_driver::driver' changed, as reported earlier 20 impacted interfaces 'struct shrinker at shrinker.h:63:1' changed: type size changed from 448 to 512 (in bits) 1 data member insertion: 'int id', at offset 384 (in bits) at shrinker.h:77:1 there are data member changes: 'atomic_long_t* nr_deferred' offset changed (by +64 bits) 3984 impacted interfaces 'struct snd_card at core.h:79:1' changed: type size changed from 18944 to 20608 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 20480 (in bits) at core.h:141:1 'u64 android_kabi_reserved2', at offset 20544 (in bits) at core.h:142:1 there are data member changes: type 'struct device' of 'snd_card::ctl_dev' changed, as reported earlier 15 ('unsigned int last_numid' .. 'device* dev') offsets changed (by +768 bits) type 'struct device' of 'snd_card::card_dev' changed, as reported earlier and offset changed from 11328 to 12096 (in bits) (by +768 bits) 8 ('const attribute_group* dev_groups[4]' .. 'wait_queue_head_t power_sleep') offsets changed (by +1536 bits) 159 impacted interfaces 'struct snd_compr at compress_driver.h:146:1' changed: type size changed from 7808 to 8640 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 8576 (in bits) at compress_driver.h:168:1 there are data member changes: type 'struct device' of 'snd_compr::dev' changed, as reported earlier 9 ('snd_compr_ops* ops' .. 'snd_info_entry* proc_info_entry') offsets changed (by +768 bits) 75 impacted interfaces 'struct snd_compr_ops at compress_driver.h:110:1' changed: type size changed from 832 to 896 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 832 (in bits) at compress_driver.h:139:1 75 impacted interfaces 'struct snd_compr_runtime at compress_driver.h:41:1' changed: type size changed from 960 to 1024 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 960 (in bits) at compress_driver.h:59:1 75 impacted interfaces 'struct snd_compr_stream at compress_driver.h:73:1' changed: type size changed from 1600 to 1920 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 1856 (in bits) at compress_driver.h:89:1 there are data member changes: type 'struct delayed_work' of 'snd_compr_stream::error_work' changed, as reported earlier 6 ('snd_compr_direction direction' .. 'snd_dma_buffer dma_buffer') offsets changed (by +256 bits) 75 impacted interfaces 'struct snd_device at core.h:66:1' changed: type size changed from 384 to 448 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 384 (in bits) at core.h:77:1 one impacted interface 'struct snd_device_ops at core.h:60:1' changed: type size changed from 192 to 256 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 192 (in bits) at core.h:66:1 one impacted interface 'struct snd_hwdep at hwdep.h:39:1' changed: type size changed from 9088 to 9984 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 9920 (in bits) at hwdep.h:66:1 there are data member changes: type 'struct snd_hwdep_ops' of 'snd_hwdep::ops' changed: type size changed from 704 to 768 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 704 (in bits) at hwdep.h:39:1 one impacted interface 3 ('wait_queue_head_t open_wait' .. 'void (snd_hwdep*)* private_free') offsets changed (by +64 bits) type 'struct device' of 'snd_hwdep::dev' changed, as reported earlier and offset changed from 2176 to 2240 (in bits) (by +64 bits) 3 ('mutex open_mutex' .. 'unsigned int dsp_loaded') offsets changed (by +832 bits) one impacted interface 'struct snd_hwdep_ops at hwdep.h:16:1' changed: details were reported earlier 'struct snd_info_entry at info.h:60:1' changed: type size changed from 1344 to 1408 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 1344 (in bits) at info.h:81:1 162 impacted interfaces 'struct snd_info_entry_ops at info.h:36:1' changed: type size changed from 512 to 576 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 512 (in bits) at info.h:60:1 162 impacted interfaces 'struct snd_jack at jack.h:59:1' changed: type size changed from 1536 to 1600 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 1536 (in bits) at jack.h:74:1 77 impacted interfaces 'struct snd_pcm at pcm.h:509:1' changed (indirectly): type size changed from 15808 to 17344 (in bits) there are data member changes: 'snd_pcm_str streams[2]' size changed from 13568 to 15104 (in bits) (by +1536 bits) 7 ('mutex open_mutex' .. 'bool no_device_suspend') offsets changed (by +1536 bits) 103 impacted interfaces 'struct snd_pcm_str at pcm.h:488:1' changed (indirectly): type size changed from 6784 to 7552 (in bits) there are data member changes: type 'struct device' of 'snd_pcm_str::dev' changed, as reported earlier 103 impacted interfaces 'struct snd_soc_card at soc.h:982:1' changed: type size changed from 6208 to 6592 (in bits) 4 data member insertions: 'u64 android_kabi_reserved1', at offset 6336 (in bits) at soc.h:1103:1 'u64 android_kabi_reserved2', at offset 6400 (in bits) at soc.h:1104:1 'u64 android_kabi_reserved3', at offset 6464 (in bits) at soc.h:1105:1 'u64 android_kabi_reserved4', at offset 6528 (in bits) at soc.h:1106:1 there are data member changes: type 'struct work_struct' of 'snd_soc_card::deferred_resume_work' changed, as reported earlier 2 ('u32 pop_time' .. 'void* drvdata') offsets changed (by +128 bits) 74 impacted interfaces 'struct snd_soc_dai_link at soc.h:749:1' changed: type size changed from 1600 to 1664 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 1600 (in bits) at soc.h:851:1 74 impacted interfaces 'struct snd_soc_jack_gpio at soc.h:679:1' changed (indirectly): type size changed from 1600 to 1856 (in bits) there are data member changes: type 'struct delayed_work' of 'snd_soc_jack_gpio::work' changed, as reported earlier 4 ('notifier_block pm_notifier' .. 'int (void*)* jack_status_check') offsets changed (by +256 bits) one impacted interface 'struct snd_soc_pcm_runtime at soc.h:1132:1' changed: type size changed from 13760 to 14080 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 14016 (in bits) at soc.h:1189:1 there are data member changes: type 'struct delayed_work' of 'snd_soc_pcm_runtime::delayed_work' changed, as reported earlier 6 ('void (snd_soc_pcm_runtime*)* close_delayed_work_func' .. 'int num_components') offsets changed (by +256 bits) 'snd_soc_component* components[]' offset changed (by +320 bits) 74 impacted interfaces 'struct snd_timer at timer.h:57:1' changed: type size changed from 3456 to 3712 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 3648 (in bits) at timer.h:84:1 there are data member changes: type 'struct snd_timer_hardware' of 'snd_timer::hw' changed: type size changed from 768 to 832 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 768 (in bits) at timer.h:57:1 103 impacted interfaces 6 ('spinlock_t lock' .. 'list_head sack_list_head') offsets changed (by +64 bits) type 'struct work_struct' of 'snd_timer::task_work' changed, as reported earlier and offset changed from 3136 to 3200 (in bits) (by +64 bits) 2 ('int max_instances' .. 'int num_instances') offsets changed (by +192 bits) 103 impacted interfaces 'struct snd_timer_hardware at timer.h:40:1' changed: details were reported earlier 'struct snd_usb_audio at usbaudio.h:24:1' changed: type size changed from 3520 to 3776 (in bits) 4 data member insertions: 'u64 android_kabi_reserved1', at offset 3520 (in bits) at usbaudio.h:70:1 'u64 android_kabi_reserved2', at offset 3584 (in bits) at usbaudio.h:71:1 'u64 android_kabi_reserved3', at offset 3648 (in bits) at usbaudio.h:72:1 'u64 android_kabi_reserved4', at offset 3712 (in bits) at usbaudio.h:73:1 3 impacted interfaces 'struct snd_usb_audio_vendor_ops at usbaudio.h:160:1' changed: type size changed from 576 to 704 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 576 (in bits) at usbaudio.h:187:1 'u64 android_kabi_reserved2', at offset 640 (in bits) at usbaudio.h:188:1 one impacted interface 'struct snd_usb_stream at card.h:183:1' changed (indirectly): type size changed from 4288 to 4416 (in bits) there are data member changes: 'snd_usb_substream substream[2]' size changed from 3968 to 4096 (in bits) (by +128 bits) 'list_head list' offset changed (by +128 bits) 2 impacted interfaces 'struct snd_usb_substream at card.h:126:1' changed: type size changed from 1984 to 2048 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 1984 (in bits) at card.h:182:1 2 impacted interfaces 'struct soc_device at soc.c:24:1' changed (indirectly): type size changed from 6528 to 7296 (in bits) there are data member changes: type 'struct device' of 'soc_device::dev' changed, as reported earlier 2 ('soc_device_attribute* attr' .. 'int soc_dev_num') offsets changed (by +768 bits) 2 impacted interfaces 'struct soc_enum at soc.h:1257:1' changed: type size changed from 832 to 896 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 832 (in bits) at soc.h:1283:1 one impacted interface 'struct sock at sock.h:348:1' changed: type size changed from 6656 to 6720 (in bits) 1 data member insertion: 'u64 android_oem_data1', at offset 6656 (in bits) at sock.h:535:1 3982 impacted interfaces 'struct spi_controller at spi.h:466:1' changed: type size changed from 12544 to 13440 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 13312 (in bits) at spi.h:677:1 'u64 android_kabi_reserved2', at offset 13376 (in bits) at spi.h:678:1 there are data member changes: type 'struct device' of 'spi_controller::dev' changed, as reported earlier 66 ('list_head list' .. 'unsigned long int irq_flags') offsets changed (by +768 bits) 18 impacted interfaces 'struct spi_device at spi.h:159:1' changed: type size changed from 9152 to 10048 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 9920 (in bits) at spi.h:201:1 'u64 android_kabi_reserved2', at offset 9984 (in bits) at spi.h:202:1 there are data member changes: type 'struct device' of 'spi_device::dev' changed, as reported earlier 16 ('spi_controller* controller' .. 'spi_statistics statistics') offsets changed (by +768 bits) 18 impacted interfaces 'struct spi_driver at spi.h:278:1' changed: type size changed from 1408 to 1728 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 1664 (in bits) at spi.h:289:1 there are data member changes: type 'struct device_driver' of 'spi_driver::driver' changed, as reported earlier one impacted interface 'struct spi_message at spi.h:999:1' changed: type size changed from 832 to 896 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 832 (in bits) at spi.h:1045:1 18 impacted interfaces 'struct spi_transfer at spi.h:926:1' changed: type size changed from 1152 to 1216 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 1152 (in bits) at spi.h:977:1 19 impacted interfaces 'struct spmi_controller at spmi.h:80:1' changed: type size changed from 6656 to 7488 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 7424 (in bits) at spmi.h:89:1 there are data member changes: type 'struct device' of 'spmi_controller::dev' changed, as reported earlier 4 ('unsigned int nr' .. 'int (spmi_controller*, typedef u8, typedef u8, typedef u16, const u8*, typedef size_t)* write_cmd') offsets changed (by +768 bits) 11 impacted interfaces 'struct spmi_device at spmi.h:39:1' changed (indirectly): type size changed from 6528 to 7296 (in bits) there are data member changes: type 'struct device' of 'spmi_device::dev' changed, as reported earlier 2 ('spmi_controller* ctrl' .. 'u8 usid') offsets changed (by +768 bits) 8 impacted interfaces 'struct spmi_driver at spmi.h:137:1' changed: type size changed from 1280 to 1600 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 1536 (in bits) at spmi.h:143:1 there are data member changes: type 'struct device_driver' of 'spmi_driver::driver' changed, as reported earlier 2 ('int (spmi_device*)* probe' .. 'void (spmi_device*)* remove') offsets changed (by +256 bits) one impacted interface 'struct srcu_data at srcutree.h:24:1' changed (indirectly): type size changed from 2560 to 3072 (in bits) there are data member changes: type 'struct work_struct' of 'srcu_data::work' changed, as reported earlier 5 ('callback_head srcu_barrier_head' .. 'srcu_struct* ssp') offsets changed (by +128 bits) 3982 impacted interfaces 'struct srcu_notifier_head at notifier.h:74:1' changed (indirectly): details were reported earlier 'struct srcu_struct at srcutree.h:64:1' changed (indirectly): details were reported earlier 'struct super_block at fs.h:1416:1' changed: type size changed from 11776 to 12800 (in bits) 4 data member insertions: 'u64 android_kabi_reserved1', at offset 12160 (in bits) at fs.h:1580:1 'u64 android_kabi_reserved2', at offset 12224 (in bits) at fs.h:1581:1 'u64 android_kabi_reserved3', at offset 12288 (in bits) at fs.h:1582:1 'u64 android_kabi_reserved4', at offset 12352 (in bits) at fs.h:1583:1 there are data member changes: type 'struct shrinker' of 'super_block::s_shrink' changed, as reported earlier 7 ('atomic_long_t s_remove_count' .. 'user_namespace* s_user_ns') offsets changed (by +64 bits) type 'struct list_lru' of 'super_block::s_dentry_lru' changed, as reported earlier and offset changed from 9984 to 10048 (in bits) (by +64 bits) type 'struct list_lru' of 'super_block::s_inode_lru' changed, as reported earlier and offset changed from 10048 to 10304 (in bits) (by +256 bits) 'callback_head rcu' offset changed (by +448 bits) type 'struct work_struct' of 'super_block::destroy_work' changed, as reported earlier and offset changed from 10240 to 10688 (in bits) (by +448 bits) 2 ('mutex s_sync_lock' .. 'int s_stack_depth') offsets changed (by +576 bits) 4 ('spinlock_t s_inode_list_lock' .. 'list_head s_inodes_wb') offsets changed (by +512 bits) 3982 impacted interfaces 'struct super_operations at fs.h:1935:1' changed: type size changed from 1664 to 1920 (in bits) 4 data member insertions: 'u64 android_kabi_reserved1', at offset 1664 (in bits) at fs.h:2013:1 'u64 android_kabi_reserved2', at offset 1728 (in bits) at fs.h:2014:1 'u64 android_kabi_reserved3', at offset 1792 (in bits) at fs.h:2015:1 'u64 android_kabi_reserved4', at offset 1856 (in bits) at fs.h:2016:1 3982 impacted interfaces 'struct task_group at sched.h:387:1' changed (indirectly): details were reported earlier 'struct task_struct at sched.h:652:1' changed: details were reported earlier 'struct tcpm_port at tcpm.c:298:1' changed (indirectly): type size changed from 99520 to 99648 (in bits) there are data member changes: type 'struct typec_capability' of 'tcpm_port::typec_caps' changed: type size changed from 512 to 576 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 512 (in bits) at typec.h:257:1 34 impacted interfaces 81 ('typec_port* typec_port' .. 'power_supply* psy') offsets changed (by +64 bits) type 'struct power_supply_desc' of 'tcpm_port::psy_desc' changed, as reported earlier and offset changed from 9472 to 9536 (in bits) (by +64 bits) 30 ('power_supply_usb_type usb_type' .. 'u8* logbuffer[1024]') offsets changed (by +128 bits) 17 impacted interfaces 'struct thermal_bind_params at thermal.h:205:1' changed: type size changed from 256 to 320 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 256 (in bits) at thermal.h:248:1 61 impacted interfaces 'struct thermal_cooling_device at thermal.h:93:1' changed: type size changed from 7552 to 8384 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 8320 (in bits) at thermal.h:110:1 there are data member changes: type 'struct device' of 'thermal_cooling_device::device' changed, as reported earlier 8 ('device_node* np' .. 'list_head node') offsets changed (by +768 bits) 102 impacted interfaces 'struct thermal_cooling_device_ops at thermal.h:84:1' changed: type size changed from 384 to 448 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 384 (in bits) at thermal.h:94:1 102 impacted interfaces 'struct thermal_governor at thermal.h:196:1' changed: type size changed from 512 to 576 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 512 (in bits) at thermal.h:211:1 61 impacted interfaces 'struct thermal_zone_device at thermal.h:150:1' changed: type size changed from 9600 to 10688 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 10624 (in bits) at thermal.h:189:1 there are data member changes: type 'struct device' of 'thermal_zone_device::device' changed, as reported earlier 26 ('attribute_group trips_attribute_group' .. 'list_head node') offsets changed (by +768 bits) type 'struct delayed_work' of 'thermal_zone_device::poll_queue' changed, as reported earlier and offset changed from 8704 to 9472 (in bits) (by +768 bits) 'thermal_notify_event notify_event' offset changed (by +1024 bits) 61 impacted interfaces 'struct thermal_zone_device_ops at thermal.h:61:1' changed: type size changed from 896 to 960 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 896 (in bits) at thermal.h:83:1 61 impacted interfaces 'struct thermal_zone_of_device_ops at thermal.h:308:1' changed: type size changed from 320 to 384 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 320 (in bits) at thermal.h:329:1 2 impacted interfaces 'struct thermal_zone_params at thermal.h:240:1' changed: type size changed from 576 to 640 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 576 (in bits) at thermal.h:303:1 61 impacted interfaces 'struct thread_struct at processor.h:131:1' changed: details were reported earlier 'struct ttm_bo_device at ttm_bo_driver.h:316:1' changed (indirectly): type size changed from 2688 to 2944 (in bits) there are data member changes: type 'struct delayed_work' of 'ttm_bo_device::wq' changed, as reported earlier 2 ('bool need_dma32' .. 'bool no_retry') offsets changed (by +256 bits) 27 impacted interfaces 'struct tty_bufhead at tty.h:85:1' changed (indirectly): details were reported earlier 'struct tty_driver at tty_driver.h:297:1' changed: type size changed from 1472 to 1600 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 1472 (in bits) at tty_driver.h:334:1 'u64 android_kabi_reserved2', at offset 1536 (in bits) at tty_driver.h:335:1 3982 impacted interfaces 'struct tty_ldisc_ops at tty_ldisc.h:175:1' changed: type size changed from 1216 to 1344 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 1216 (in bits) at tty_ldisc.h:216:1 'u64 android_kabi_reserved2', at offset 1280 (in bits) at tty_ldisc.h:217:1 3982 impacted interfaces 'struct tty_operations at tty_driver.h:246:1' changed: type size changed from 2176 to 2304 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 2176 (in bits) at tty_driver.h:297:1 'u64 android_kabi_reserved2', at offset 2240 (in bits) at tty_driver.h:298:1 3982 impacted interfaces 'struct tty_port at tty.h:230:1' changed: details were reported earlier 'struct tty_port_operations at tty.h:205:1' changed: type size changed from 320 to 384 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 320 (in bits) at tty.h:223:1 3982 impacted interfaces 'struct tty_struct at tty.h:285:1' changed: type size changed from 6336 to 6720 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 6592 (in bits) at tty.h:354:1 'u64 android_kabi_reserved2', at offset 6656 (in bits) at tty.h:355:1 there are data member changes: type 'struct work_struct' of 'tty_struct::hangup_work' changed, as reported earlier 7 ('void* disc_data' .. 'int write_cnt') offsets changed (by +128 bits) type 'struct work_struct' of 'tty_struct::SAK_work' changed, as reported earlier and offset changed from 6016 to 6144 (in bits) (by +128 bits) 'tty_port* port' offset changed (by +256 bits) 3982 impacted interfaces 'struct typec_altmode at typec_altmode.h:24:1' changed: type size changed from 6656 to 7488 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 7424 (in bits) at typec_altmode.h:33:1 there are data member changes: type 'struct device' of 'typec_altmode::dev' changed, as reported earlier 5 ('u16 svid' .. 'const typec_altmode_ops* ops') offsets changed (by +768 bits) 42 impacted interfaces 'struct typec_altmode_ops at typec_altmode.h:57:1' changed: type size changed from 384 to 448 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 384 (in bits) at typec_altmode.h:67:1 42 impacted interfaces 'struct typec_capability at typec.h:241:1' changed: details were reported earlier 'struct typec_mux at bus.h:43:1' changed (indirectly): type size changed from 6464 to 7232 (in bits) there are data member changes: type 'struct device' of 'typec_mux::dev' changed, as reported earlier type 'typedef typec_mux_set_fn_t' of 'typec_mux::set' changed: underlying type 'int (typec_mux*, typec_mux_state*)*' changed: and offset changed from 6400 to 7168 (in bits) (by +768 bits) 38 impacted interfaces 'struct typec_operations at typec.h:211:1' changed: type size changed from 320 to 384 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 320 (in bits) at typec.h:219:1 34 impacted interfaces 'struct typec_partner at class.c:33:1' changed: type size changed from 6848 to 7680 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 7616 (in bits) at class.c:45:1 there are data member changes: type 'struct device' of 'typec_partner::dev' changed, as reported earlier 6 ('usb_pd_identity* identity' .. 'usb_pd_svdm_ver svdm_version') offsets changed (by +768 bits) 28 impacted interfaces 'struct typec_port at class.c:44:1' changed: type size changed from 7488 to 8320 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 8256 (in bits) at class.c:67:1 there are data member changes: type 'struct device' of 'typec_port::dev' changed, as reported earlier 13 ('ida mode_ids' .. 'const typec_operations* ops') offsets changed (by +768 bits) 34 impacted interfaces 'struct typec_switch at bus.h:38:1' changed (indirectly): type size changed from 6464 to 7232 (in bits) there are data member changes: type 'struct device' of 'typec_switch::dev' changed, as reported earlier type 'typedef typec_switch_set_fn_t' of 'typec_switch::set' changed: underlying type 'int (typec_switch*, enum typec_orientation)*' changed: and offset changed from 6400 to 7168 (in bits) (by +768 bits) 37 impacted interfaces 'struct uart_8250_port at serial_8250.h:94:1' changed (indirectly): type size changed from 6080 to 6464 (in bits) there are data member changes: type 'struct uart_port' of 'uart_8250_port::port' changed: type size changed from 3776 to 3904 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 3776 (in bits) at serial_core.h:264:1 'u64 android_kabi_reserved2', at offset 3840 (in bits) at serial_core.h:265:1 21 impacted interfaces 27 ('timer_list timer' .. 'void (uart_8250_port*)* rs485_stop_tx') offsets changed (by +128 bits) type 'struct delayed_work' of 'uart_8250_port::overrun_backoff' changed, as reported earlier and offset changed from 5184 to 5312 (in bits) (by +128 bits) 'u32 overrun_backoff_time_ms' offset changed (by +384 bits) 4 impacted interfaces 'struct uart_driver at serial_core.h:306:1' changed: type size changed from 512 to 576 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 512 (in bits) at serial_core.h:329:1 6 impacted interfaces 'struct uart_ops at serial_core.h:38:1' changed: type size changed from 1472 to 1600 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 1472 (in bits) at serial_core.h:85:1 'u64 android_kabi_reserved2', at offset 1536 (in bits) at serial_core.h:86:1 21 impacted interfaces 'struct uart_port at serial_core.h:106:1' changed: details were reported earlier 'struct uart_state at serial_core.h:286:1' changed (indirectly): type size changed from 3712 to 3904 (in bits) there are data member changes: type 'struct tty_port' of 'uart_state::port' changed, as reported earlier 5 ('uart_pm_state pm_state' .. 'uart_port* uart_port') offsets changed (by +192 bits) 21 impacted interfaces 'struct ucsi at ucsi.h:281:1' changed (indirectly): type size changed from 1216 to 1344 (in bits) there are data member changes: type 'struct work_struct' of 'ucsi::work' changed, as reported earlier 3 ('mutex ppm_lock' .. 'unsigned long int flags') offsets changed (by +128 bits) 7 impacted interfaces 'struct ucsi_connector at ucsi.h:314:1' changed (indirectly): type size changed from 6848 to 7104 (in bits) there are data member changes: type 'struct work_struct' of 'ucsi_connector::work' changed, as reported earlier 5 ('completion complete' .. 'typec_altmode* partner_altmode[30]') offsets changed (by +128 bits) type 'struct typec_capability' of 'ucsi_connector::typec_cap' changed, as reported earlier and offset changed from 4992 to 5120 (in bits) (by +128 bits) 4 ('u16 unprocessed_changes' .. 'power_supply* psy') offsets changed (by +192 bits) type 'struct power_supply_desc' of 'ucsi_connector::psy_desc' changed, as reported earlier and offset changed from 5696 to 5888 (in bits) (by +192 bits) 4 ('u32 rdo' .. 'usb_role_switch* usb_role_sw') offsets changed (by +256 bits) 7 impacted interfaces 'struct ufs_clk_gating at ufshcd.h:383:1' changed: type size changed from 1920 to 2368 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 2304 (in bits) at ufshcd.h:404:1 there are data member changes: type 'struct delayed_work' of 'ufs_clk_gating::gate_work' changed, as reported earlier type 'struct work_struct' of 'ufs_clk_gating::ungate_work' changed, as reported earlier and offset changed from 832 to 1088 (in bits) (by +256 bits) 9 ('clk_gating_state state' .. 'workqueue_struct* clk_gating_workq') offsets changed (by +384 bits) 39 impacted interfaces 'struct ufs_clk_scaling at ufshcd.h:425:1' changed: type size changed from 1472 to 1792 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 1728 (in bits) at ufshcd.h:452:1 there are data member changes: type 'struct work_struct' of 'ufs_clk_scaling::suspend_work' changed, as reported earlier type 'struct work_struct' of 'ufs_clk_scaling::resume_work' changed, as reported earlier and offset changed from 1088 to 1216 (in bits) (by +128 bits) 6 ('u32 min_gear' .. 'bool is_suspended') offsets changed (by +256 bits) 39 impacted interfaces 'struct ufs_dev_info at ufs.h:578:1' changed: type size changed from 320 to 384 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 320 (in bits) at ufs.h:598:1 39 impacted interfaces 'struct ufs_hba at ufshcd.h:774:1' changed: type size changed from 35328 to 37696 (in bits) 4 data member insertions: 'u64 android_kabi_reserved1', at offset 37440 (in bits) at ufshcd.h:931:1 'u64 android_kabi_reserved2', at offset 37504 (in bits) at ufshcd.h:932:1 'u64 android_kabi_reserved3', at offset 37568 (in bits) at ufshcd.h:933:1 'u64 android_kabi_reserved4', at offset 37632 (in bits) at ufshcd.h:934:1 there are data member changes: type 'struct work_struct' of 'ufs_hba::eh_work' changed, as reported earlier type 'struct work_struct' of 'ufs_hba::eeh_work' changed, as reported earlier and offset changed from 5952 to 6080 (in bits) (by +128 bits) 10 ('u32 errors' .. 'ktime_t last_dme_cmd_tstamp') offsets changed (by +256 bits) type 'struct ufs_dev_info' of 'ufs_hba::dev_info' changed, as reported earlier and offset changed from 19328 to 19584 (in bits) (by +256 bits) 8 ('bool auto_bkops_enabled' .. 'ufs_pwr_mode_info max_pwr_info') offsets changed (by +320 bits) type 'struct ufs_clk_gating' of 'ufs_hba::clk_gating' changed, as reported earlier and offset changed from 20672 to 20992 (in bits) (by +320 bits) 2 ('u32 caps' .. 'devfreq* devfreq') offsets changed (by +768 bits) type 'struct ufs_clk_scaling' of 'ufs_hba::clk_scaling' changed, as reported earlier and offset changed from 22720 to 23488 (in bits) (by +768 bits) 6 ('bool is_sys_suspended' .. 'atomic_t scsi_block_reqs_cnt') offsets changed (by +1088 bits) type 'struct device' of 'ufs_hba::bsg_dev' changed, as reported earlier and offset changed from 24960 to 26048 (in bits) (by +1088 bits) 3 ('request_queue* bsg_queue' .. 'bool wb_enabled') offsets changed (by +1856 bits) type 'struct delayed_work' of 'ufs_hba::rpm_dev_flush_recheck_work' changed, as reported earlier and offset changed from 31488 to 33344 (in bits) (by +1856 bits) 6 ('ufs_hba_monitor monitor' .. 'dentry* debugfs_root') offsets changed (by +2112 bits) 39 impacted interfaces 'struct ufs_hba_variant_ops at ufshcd.h:320:1' changed: type size changed from 1472 to 1728 (in bits) 4 data member insertions: 'u64 android_kabi_reserved1', at offset 1472 (in bits) at ufshcd.h:360:1 'u64 android_kabi_reserved2', at offset 1536 (in bits) at ufshcd.h:361:1 'u64 android_kabi_reserved3', at offset 1600 (in bits) at ufshcd.h:362:1 'u64 android_kabi_reserved4', at offset 1664 (in bits) at ufshcd.h:363:1 39 impacted interfaces 'struct ufshcd_lrb at ufshcd.h:192:1' changed: type size changed from 1152 to 1216 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 1152 (in bits) at ufshcd.h:222:1 39 impacted interfaces 'struct uio_device at uio_driver.h:69:1' changed: type size changed from 7360 to 8192 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 8128 (in bits) at uio_driver.h:82:1 there are data member changes: type 'struct device' of 'uio_device::dev' changed, as reported earlier 8 ('int minor' .. 'kobject* portio_dir') offsets changed (by +768 bits) 2 impacted interfaces 'struct uio_info at uio_driver.h:98:1' changed: type size changed from 4544 to 4608 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 4544 (in bits) at uio_driver.h:115:1 2 impacted interfaces 'struct usb_composite_driver at composite.h:388:1' changed (indirectly): type size changed from 2560 to 2816 (in bits) there are data member changes: type 'struct usb_gadget_driver' of 'usb_composite_driver::gadget_driver' changed: type size changed from 1984 to 2240 (in bits) there are data member changes: type 'struct device_driver' of 'usb_gadget_driver::driver' changed, as reported earlier 2 ('char* udc_name' .. 'list_head pending') offsets changed (by +256 bits) 94 impacted interfaces 24 impacted interfaces 'struct usb_device at usb.h:647:1' changed (indirectly): type size changed from 11712 to 12480 (in bits) there are data member changes: type 'struct device' of 'usb_device::dev' changed, as reported earlier 33 ('usb_device_descriptor descriptor' .. 'u64 android_kabi_reserved4') offsets changed (by +768 bits) 89 impacted interfaces 'struct usb_driver at usb.h:1207:1' changed (indirectly): type size changed from 2432 to 2688 (in bits) there are data member changes: type 'struct usbdrv_wrap' of 'usb_driver::drvwrap' changed: type size changed from 1216 to 1472 (in bits) there are data member changes: type 'struct device_driver' of 'usbdrv_wrap::driver' changed, as reported earlier 'int for_devices' offset changed (by +256 bits) 2 impacted interfaces 4 ('u64 android_kabi_reserved1' .. 'u64 android_kabi_reserved4') offsets changed (by +256 bits) 2 impacted interfaces 'struct usb_ep at gadget.h:227:1' changed: details were reported earlier 'struct usb_ep_ops at gadget.h:137:1' changed: type size changed from 704 to 768 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 704 (in bits) at gadget.h:159:1 108 impacted interfaces 'struct usb_gadget at gadget.h:407:1' changed (indirectly): type size changed from 7744 to 8640 (in bits) there are data member changes: type 'struct work_struct' of 'usb_gadget::work' changed, as reported earlier 10 ('usb_udc* udc' .. 'const char* name') offsets changed (by +128 bits) type 'struct device' of 'usb_gadget::dev' changed, as reported earlier and offset changed from 832 to 960 (in bits) (by +128 bits) 10 ('unsigned int isoch_delay' .. 'u64 android_kabi_reserved4') offsets changed (by +896 bits) 94 impacted interfaces 'struct usb_gadget_driver at gadget.h:716:1' changed (indirectly): details were reported earlier 'struct usb_gadget_ops at gadget.h:312:1' changed: type size changed from 832 to 1216 (in bits) 6 data member insertions: 'void (usb_gadget*, typedef bool)* udc_async_callbacks', at offset 768 (in bits) at gadget.h:335:1 'int (usb_gadget*)* check_config', at offset 896 (in bits) at gadget.h:339:1 'u64 android_kabi_reserved1', at offset 960 (in bits) at gadget.h:341:1 'u64 android_kabi_reserved2', at offset 1024 (in bits) at gadget.h:342:1 'u64 android_kabi_reserved3', at offset 1088 (in bits) at gadget.h:343:1 'u64 android_kabi_reserved4', at offset 1152 (in bits) at gadget.h:344:1 there are data member changes: 'usb_ep* (usb_gadget*, usb_endpoint_descriptor*, usb_ss_ep_comp_descriptor*)* match_ep' offset changed (by +64 bits) 94 impacted interfaces 'struct usb_hcd at hcd.h:82:1' changed (indirectly): type size changed from 5504 to 5760 (in bits) there are data member changes: type 'struct work_struct' of 'usb_hcd::wakeup_work' changed, as reported earlier type 'struct work_struct' of 'usb_hcd::died_work' changed, as reported earlier and offset changed from 2560 to 2688 (in bits) (by +128 bits) 24 ('const hc_driver* driver' .. 'unsigned long int hcd_priv[]') offsets changed (by +256 bits) 43 impacted interfaces 'struct usb_interface at usb.h:233:1' changed (indirectly): type size changed from 7360 to 8256 (in bits) there are data member changes: type 'struct device' of 'usb_interface::dev' changed, as reported earlier 'device* usb_dev' offset changed (by +768 bits) type 'struct work_struct' of 'usb_interface::reset_ws' changed, as reported earlier and offset changed from 6848 to 7616 (in bits) (by +768 bits) 4 ('u64 android_kabi_reserved1' .. 'u64 android_kabi_reserved4') offsets changed (by +896 bits) 97 impacted interfaces 'struct usb_otg at otg.h:16:1' changed: type size changed from 704 to 768 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 704 (in bits) at otg.h:44:1 52 impacted interfaces 'struct usb_phy at phy.h:88:1' changed: type size changed from 2688 to 2880 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 2816 (in bits) at phy.h:160:1 there are data member changes: type 'struct work_struct' of 'usb_phy::chg_work' changed, as reported earlier 13 ('atomic_notifier_head notifier' .. 'enum usb_charger_type (usb_phy*)* charger_detect') offsets changed (by +128 bits) 52 impacted interfaces 'struct usb_request at gadget.h:101:1' changed: details were reported earlier 'struct usb_role_switch at class.c:19:1' changed (indirectly): type size changed from 7232 to 8000 (in bits) there are data member changes: type 'struct device' of 'usb_role_switch::dev' changed, as reported earlier 5 ('mutex lock' .. 'device* udc') offsets changed (by +768 bits) type 'typedef usb_role_switch_set_t' of 'usb_role_switch::set' changed: underlying type 'int (usb_role_switch*, enum usb_role)*' changed: and offset changed from 7040 to 7808 (in bits) (by +768 bits) type 'typedef usb_role_switch_get_t' of 'usb_role_switch::get' changed: underlying type 'enum usb_role (usb_role_switch*)*' changed: and offset changed from 7104 to 7872 (in bits) (by +768 bits) 'bool allow_userspace_control' offset changed (by +768 bits) 35 impacted interfaces 'struct usb_tt at hcd.h:564:1' changed (indirectly): type size changed from 896 to 1024 (in bits) there are data member changes: type 'struct work_struct' of 'usb_tt::clear_work' changed, as reported earlier 4 ('u64 android_kabi_reserved1' .. 'u64 android_kabi_reserved4') offsets changed (by +128 bits) 89 impacted interfaces 'struct usb_udc at core.c:37:1' changed (indirectly): type size changed from 6720 to 7488 (in bits) there are data member changes: type 'struct device' of 'usb_udc::dev' changed, as reported earlier 3 ('list_head list' .. 'bool started') offsets changed (by +768 bits) 94 impacted interfaces 'struct usbdrv_wrap at usb.h:1136:1' changed (indirectly): details were reported earlier 'struct usbnet at usbnet.h:29:1' changed (indirectly): type size changed from 5376 to 5504 (in bits) there are data member changes: type 'struct work_struct' of 'usbnet::kevent' changed, as reported earlier 5 ('unsigned long int flags' .. 'u64 android_kabi_reserved4') offsets changed (by +128 bits) 10 impacted interfaces 'struct user_namespace at user_namespace.h:57:1' changed (indirectly): type size changed from 4608 to 4736 (in bits) there are data member changes: type 'struct work_struct' of 'user_namespace::work' changed, as reported earlier 6 ('ctl_table_set set' .. 'u64 android_kabi_reserved2') offsets changed (by +128 bits) 3982 impacted interfaces 'struct user_struct at user.h:13:1' changed: type size changed from 1088 to 1216 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 960 (in bits) at user.h:47:1 'u64 android_kabi_reserved2', at offset 1024 (in bits) at user.h:48:1 there are data member changes: 'u64 android_oem_data1[2]' offset changed (by +128 bits) 3982 impacted interfaces 'struct v4l2_ctrl at v4l2-ctrls.h:243:1' changed: type size changed from 1728 to 1792 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 1728 (in bits) at v4l2-ctrls.h:302:1 49 impacted interfaces 'struct v4l2_ctrl_config at v4l2-ctrls.h:415:1' changed: type size changed from 1088 to 1152 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 1088 (in bits) at v4l2-ctrls.h:448:1 one impacted interface 'struct v4l2_ctrl_handler at v4l2-ctrls.h:367:1' changed: type size changed from 1728 to 1792 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 1728 (in bits) at v4l2-ctrls.h:395:1 49 impacted interfaces 'struct v4l2_ctrl_ops at v4l2-ctrls.h:118:1' changed: type size changed from 192 to 256 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 192 (in bits) at v4l2-ctrls.h:127:1 49 impacted interfaces 'struct v4l2_ctrl_ref at v4l2-ctrls.h:323:1' changed: type size changed from 448 to 512 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 448 (in bits) at v4l2-ctrls.h:343:1 49 impacted interfaces 'struct v4l2_ctrl_type_ops at v4l2-ctrls.h:134:1' changed: type size changed from 256 to 320 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 256 (in bits) at v4l2-ctrls.h:150:1 49 impacted interfaces 'struct v4l2_file_operations at v4l2-dev.h:200:1' changed: type size changed from 640 to 704 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 640 (in bits) at v4l2-dev.h:216:1 39 impacted interfaces 'struct v4l2_m2m_dev at v4l2-mem2mem.c:94:1' changed (indirectly): type size changed from 4608 to 4736 (in bits) there are data member changes: type 'struct work_struct' of 'v4l2_m2m_dev::job_work' changed, as reported earlier 2 ('unsigned long int job_queue_flags' .. 'const v4l2_m2m_ops* m2m_ops') offsets changed (by +128 bits) 59 impacted interfaces 'struct vb2_v4l2_buffer at videobuf2-v4l2.h:44:1' changed: type size changed from 7488 to 7552 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 7488 (in bits) at videobuf2-v4l2.h:56:1 63 impacted interfaces 'struct video_device at v4l2-dev.h:263:1' changed: type size changed from 11456 to 12352 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 12224 (in bits) at v4l2-dev.h:314:1 'u64 android_kabi_reserved2', at offset 12288 (in bits) at v4l2-dev.h:315:1 there are data member changes: type 'struct device' of 'video_device::dev' changed, as reported earlier 21 ('cdev* cdev' .. 'mutex* lock') offsets changed (by +768 bits) 39 impacted interfaces 'struct virtio_device at virtio.h:107:1' changed (indirectly): type size changed from 6976 to 7744 (in bits) there are data member changes: type 'struct device' of 'virtio_device::dev' changed, as reported earlier 6 ('virtio_device_id id' .. 'void* priv') offsets changed (by +768 bits) 34 impacted interfaces 'struct virtio_driver at virtio.h:165:1' changed (indirectly): type size changed from 1920 to 2176 (in bits) there are data member changes: type 'struct device_driver' of 'virtio_driver::driver' changed, as reported earlier 12 ('const virtio_device_id* id_table' .. 'int (virtio_device*)* restore') offsets changed (by +256 bits) 2 impacted interfaces 'struct vsock_sock at af_vsock.h:27:1' changed (indirectly): type size changed from 10688 to 11520 (in bits) there are data member changes: type 'struct sock' of 'vsock_sock::sk' changed, as reported earlier 14 ('const vsock_transport* transport' .. 'bool rejected') offsets changed (by +64 bits) type 'struct delayed_work' of 'vsock_sock::connect_work' changed, as reported earlier and offset changed from 7808 to 7872 (in bits) (by +64 bits) type 'struct delayed_work' of 'vsock_sock::pending_work' changed, as reported earlier and offset changed from 8640 to 8960 (in bits) (by +320 bits) type 'struct delayed_work' of 'vsock_sock::close_work' changed, as reported earlier and offset changed from 9472 to 10048 (in bits) (by +576 bits) 8 ('bool close_work_scheduled' .. 'void* trans') offsets changed (by +832 bits) 30 impacted interfaces 'struct wiphy at cfg80211.h:4899:1' changed: type size changed from 10496 to 11264 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 11200 (in bits) at cfg80211.h:5075:1 there are data member changes: type 'struct device' of 'wiphy::dev' changed, as reported earlier 5 ('bool registered' .. 'list_head wdev_list') offsets changed (by +768 bits) type 'typedef possible_net_t' of 'wiphy::_net' changed: underlying type 'struct {net* net;}' at net_namespace.h:314:1 changed: and offset changed from 9472 to 10240 (in bits) (by +768 bits) 17 ('const wiphy_coalesce_support* coalesce' .. 'char priv[]') offsets changed (by +768 bits) 3982 impacted interfaces 'struct wiphy_vendor_command at cfg80211.h:4621:1' changed: type size changed from 384 to 448 (in bits) 1 data member insertion: 'u64 android_kabi_reserved1', at offset 384 (in bits) at cfg80211.h:4669:1 3982 impacted interfaces 'struct wireless_dev at cfg80211.h:5257:1' changed: type size changed from 3520 to 3904 (in bits) 2 data member insertions: 'u64 android_kabi_reserved1', at offset 3776 (in bits) at cfg80211.h:5377:1 'u64 android_kabi_reserved2', at offset 3840 (in bits) at cfg80211.h:5378:1 there are data member changes: type 'struct work_struct' of 'wireless_dev::disconnect_wk' changed, as reported earlier 20 ('u8 disconnect_bssid[6]' .. 'spinlock_t pmsr_lock') offsets changed (by +128 bits) type 'struct work_struct' of 'wireless_dev::pmsr_free_wk' changed, as reported earlier and offset changed from 3200 to 3328 (in bits) (by +128 bits) 'unsigned long int unprot_beacon_reported' offset changed (by +256 bits) 3982 impacted interfaces 'struct work_struct at workqueue.h:102:1' changed: details were reported earlier 'struct wpan_phy at cfg802154.h:176:1' changed (indirectly): type size changed from 8448 to 9216 (in bits) there are data member changes: type 'struct device' of 'wpan_phy::dev' changed, as reported earlier type 'typedef possible_net_t' of 'wpan_phy::_net' changed, as reported earlier and offset changed from 8320 to 9088 (in bits) (by +768 bits) 'char priv[]' offset changed (by +768 bits) 7 impacted interfaces 'struct wq_device at workqueue.c:5386:1' changed (indirectly): type size changed from 6464 to 7232 (in bits) there are data member changes: type 'struct device' of 'wq_device::dev' changed, as reported earlier 3982 impacted interfaces 'struct xdp_umem at xdp_sock.h:20:1' changed (indirectly): type size changed from 896 to 1024 (in bits) there are data member changes: type 'struct work_struct' of 'xdp_umem::work' changed, as reported earlier 3982 impacted interfaces 'struct xfrm_policy_hthresh at xfrm.h:23:1' changed (indirectly): details were reported earlier 'struct xhci_hcd at xhci.h:1753:1' changed (indirectly): type size changed from 59392 to 59648 (in bits) there are data member changes: type 'struct delayed_work' of 'xhci_hcd::cmd_timer' changed, as reported earlier 39 ('completion cmd_ring_stop_completion' .. 'unsigned long int priv[]') offsets changed (by +256 bits) 18 impacted interfaces 'struct xsk_buff_pool at xsk_buff_pool.h:41:1' changed (indirectly): type size hasn't changed there are data member changes: type 'struct work_struct' of 'xsk_buff_pool::work' changed, as reported earlier 3 ('list_head free_list' .. 'u16 queue_id') offsets changed (by +128 bits) 3982 impacted interfaces Bug: 193676678 Signed-off-by: Todd Kjos Change-Id: Iee206350c13a5227247fbf97832322ec4fa70b83 --- android/abi_gki_aarch64.xml | 29968 ++++++++++++++++++---------------- build.config.common | 2 +- 2 files changed, 15805 insertions(+), 14165 deletions(-) diff --git a/android/abi_gki_aarch64.xml b/android/abi_gki_aarch64.xml index 8f68437891a4..ea1e52bc57cd 100755 --- a/android/abi_gki_aarch64.xml +++ b/android/abi_gki_aarch64.xml @@ -1,16 +1,16 @@ - - - - + + + + - - + + - + @@ -26,62 +26,62 @@ - - - - + + + + - - - - + + + + - - - + + + - - - + + + - - - - - - + + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + @@ -91,25 +91,25 @@ - + - + - + - - + + - + - - - - - + + + + + @@ -118,8 +118,8 @@ - - + + @@ -127,204 +127,204 @@ - + - - + + - - + + - - - - - - + + + + + + - - - + + + - - - - - - + + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - + + + - + - - - - - - - - + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - + - - + + - + - - - + + + - + - - - - - + + + + + - - + + - - + + - + - - + + - - + + - - + + - - + + - - - - - - + + + + + + - + - - - + + + - - + + - + - - - - + + + + - + - - + + - - - - + + + + - + @@ -333,32 +333,32 @@ - + - + - - + + - + - + - - - - + + + + - - + + @@ -373,16 +373,18 @@ - - + + - + - + - + + + @@ -402,15 +404,15 @@ - + - + - - + + - + @@ -419,40 +421,40 @@ - - + + - - - - - + + + + + - + - - - - + + + + - - - - - + + + + + - + - - + + - - - - + + + + @@ -461,18 +463,18 @@ - - + + - - - - - - - - - + + + + + + + + + @@ -501,23 +503,23 @@ - - - - - + + + + + - + - - + + @@ -526,29 +528,29 @@ - + - - - - + + + + - - - - + + + + - + - - - - + + + + - + - - + + @@ -561,46 +563,46 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + @@ -613,259 +615,259 @@ - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - - - - + + + + - + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - + + + - - - - - - - - - + + + + + + + + + - + - - - - - - - - + + + + + + + + - - - - - - + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + - + - + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - + - - + + - + - + - - - - - + + + + + - - + + - - - - - - - - - + + + + + + + + + - - - - - - - + + + + + + + - + - + @@ -880,498 +882,498 @@ - - - - - - - - + + + + + + + + - - - - + + + + - + - - + + - - + + - - - - + + + + - - - + + + - + - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1389,61 +1391,61 @@ - - - - - - - - - + + + + + + + + + - + - - - - - + + + + + - + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + @@ -1457,197 +1459,197 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - - - - - - + + + + + + + - - - - - - + + + + + + - + - - - - + + + + - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + @@ -1656,342 +1658,342 @@ - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - + + + + - - - - + + + + - + - - - - - + + + + + - - + + - + - - - - + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - + - + - - - - - - - - - - + + + + + + + + + + - - - - - - + + + + + + - - - - - - - - + + + + + + + + - - - - - - + + + + + + - - + + - - - - - + + + + + - - - - - - - + + + + + + + - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - - + + + + + + - + - + - - + + - + - + - + - + - - - - - - - - - - - + + + + + + + + + + + @@ -2008,53 +2010,53 @@ - - - + + + - - - - - - - - - - + + + + + + + + + + - - - - + + + + - - - - + + + + - - + + - + - - - - - - + + + + + + - - - + + + @@ -2062,68 +2064,68 @@ - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + - - - - - + + + + + - + - - - - - + + + + + @@ -2132,95 +2134,95 @@ - - - - - - + + + + + + - - + + - - + + - - + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + @@ -2234,239 +2236,239 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - - - - - - - - - + + + + + + + + + + - + - + - - + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - + - - - - + + + + - + - + - - - + + + - - - - - + + + + + - - + + - + - + - - - - + + + + - - + + - - + + - - - - + + + + - - - - - - + + + + + + @@ -2474,26 +2476,26 @@ - - - - - - - - - - + + + + + + + + + + - - - + + + - + @@ -2513,27 +2515,27 @@ - - - - - - + + + + + + - - - - - + + + + + - - + + - - - - + + + + @@ -2552,34 +2554,36 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - + - - - + + + + + @@ -2588,32 +2592,32 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2641,105 +2645,105 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + @@ -2749,63 +2753,63 @@ - + - - - - - - - - - + + + + + + + + + - + - - + + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - + - + - - + + @@ -2815,451 +2819,451 @@ - - - - + + + + - + - - - - + + + + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - + - - + + - + @@ -3270,53 +3274,53 @@ - - - - + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - + + + + + + + - - - + + + @@ -3355,154 +3359,154 @@ - + - - - - - - + + + + + + - + - - - - - - - + + + + + + + - + - + - + - + - - + + - - + + - + - - + + - - - - - + + + + + - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + - - + + - + - - - - + + + + - + - + - - + + @@ -3512,81 +3516,81 @@ - - - - - + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - + - - + + - + - + - + @@ -3595,172 +3599,172 @@ - + - - - - - - - - - - - + + + + + + + + + + + - - - - + + + + - - - - - + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - + + + + - + - - - + + + - + - + @@ -3769,312 +3773,312 @@ - - - - - - + + + + + + - - - - - + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - - + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + - + @@ -4089,7 +4093,7 @@ - + @@ -4111,14 +4115,14 @@ - - - - - + + + + + - - + + @@ -4126,47 +4130,47 @@ - - - + + + - + - + - - - - - - - - + + + + + + + + - - - - - - - - - - + + + + + + + + + + - + - - - + + + - + @@ -4177,22 +4181,22 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + @@ -4201,591 +4205,591 @@ - - - + + + - - - - - - + + + + + + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - - - + + + + + - + - + - - - - + + + + - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - - + + - - + + - - + + - - - - - - - - - - - + + + + + + + + + + + - + - - - - - - + + + + + + - - - - - + + + + + - - + + - - - + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - + - - - - - - - + + + + + + + - - - - - + + + + + - + - - + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - + + - - + + - + - - - - - - + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + - + - + - + - - - + + + - - + + - - + + - - - + + + @@ -4800,82 +4804,82 @@ - - - - - - - - - - - + + + + + + + + + + + - + - + - - - + + + - + - - - - - - + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + + + - - - - - - - - - + + + + + + + + + - - + + - - + + @@ -5037,6 +5041,8 @@ + + @@ -5099,22 +5105,22 @@ - + - - + + - - - - - - + + + + + + - + @@ -5122,11 +5128,11 @@ - + - - - + + + @@ -5137,7 +5143,7 @@ - + @@ -5146,67 +5152,67 @@ - + - + - - - - + + + + - + - - - + + + - - + + - + - - - + + + - + - + - - + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + @@ -5214,20 +5220,20 @@ - + - + - - + + - - - + + + @@ -5246,17 +5252,17 @@ - - - - + + + + - + - - - + + + @@ -5301,18 +5307,18 @@ - + - + - + - + - + @@ -5336,39 +5342,42 @@ - + - + - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + + + + @@ -5393,78 +5402,81 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - + + - + - - - - - - - - + + - + + + + + + + + + + + + + + + + + + + @@ -5571,21 +5583,21 @@ - + - + - + - + - + - + @@ -5714,14 +5726,14 @@ - + - + - + @@ -5735,20 +5747,20 @@ - + - + - + - + - + - + @@ -5887,7 +5899,7 @@ - + @@ -6012,7 +6024,7 @@ - + @@ -6036,30 +6048,33 @@ - + - + - + - + - + - + - + - + - + + + + @@ -6351,7 +6366,7 @@ - + @@ -6363,36 +6378,39 @@ - + - + - + - + - + - + - + - + - + - + + + + - + @@ -6417,10 +6435,10 @@ - + - + @@ -6438,15 +6456,15 @@ - + - + - + - + @@ -6471,6 +6489,14 @@ + + + + + + + + @@ -6483,7 +6509,7 @@ - + @@ -6613,74 +6639,80 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + @@ -7133,26 +7165,26 @@ - + - + - + - + - + - + - + @@ -7198,7 +7230,7 @@ - + @@ -7207,7 +7239,7 @@ - + @@ -7259,40 +7291,43 @@ - + - + - + - + - + - + - + - + - + - + - - + + - - + + + + + @@ -7319,7 +7354,7 @@ - + @@ -7329,112 +7364,112 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -7594,7 +7629,7 @@ - + @@ -7681,12 +7716,12 @@ - + - + - + @@ -7926,39 +7961,39 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -7977,7 +8012,7 @@ - + @@ -8015,14 +8050,14 @@ - + - + @@ -8036,7 +8071,7 @@ - + @@ -8147,12 +8182,12 @@ - + - + - + @@ -8173,12 +8208,12 @@ - + - + - + @@ -8194,24 +8229,27 @@ - + - + - + - + - + - + - + + + + @@ -8307,13 +8345,13 @@ - + - + - + @@ -8400,171 +8438,174 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -8577,12 +8618,13 @@ + - + @@ -8622,10 +8664,10 @@ - + - + @@ -8642,7 +8684,7 @@ - + @@ -8707,33 +8749,36 @@ - + - + - + - + - + - + - + - + - + - + + + + @@ -9126,48 +9171,51 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -9331,58 +9379,58 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -9391,7 +9439,7 @@ - + @@ -9494,7 +9542,7 @@ - + @@ -9503,21 +9551,24 @@ - + - + - - + + - - + + - - + + - - + + + + + @@ -9600,180 +9651,192 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + @@ -9831,7 +9894,7 @@ - + @@ -9983,48 +10046,51 @@ - + - + - + - + - - - - + - + - - - - - - - - + + - + - - + + - - + + - - + + - - + + + + + + + + + + + + + + @@ -10125,7 +10191,7 @@ - + @@ -10328,54 +10394,66 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + @@ -10798,30 +10876,30 @@ - + - + - + - + - + - + - + - + - + @@ -10917,7 +10995,158 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -10988,7 +11217,7 @@ - + @@ -11016,19 +11245,19 @@ - + - + - + - + - + @@ -11121,18 +11350,18 @@ - + - + - + - + - + @@ -11170,7 +11399,7 @@ - + @@ -11189,47 +11418,50 @@ - + - + - + - + - + - + - - + + - - + + - - - - - - - - + + - + - - + + - - + + + + + + + + + + + @@ -11290,90 +11522,93 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -11413,7 +11648,7 @@ - + @@ -11697,42 +11932,45 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -12011,66 +12249,66 @@ - + - + - + - + - + - - + + - - + + - - + + - + - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + @@ -12102,48 +12340,51 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -12211,24 +12452,24 @@ - + - + - + - + - + - + - + @@ -12350,6 +12591,18 @@ + + + + + + + + + + + + @@ -12365,42 +12618,42 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -12519,21 +12772,21 @@ - + - + - + - + - + - + @@ -12559,18 +12812,18 @@ - + - + - + - + - + @@ -12819,60 +13072,60 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -12992,132 +13245,138 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + @@ -13217,51 +13476,51 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -13297,18 +13556,21 @@ - + - + - + - + - + + + + @@ -13358,45 +13620,45 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -13406,28 +13668,31 @@ - + - + - + - + - + - + + + + @@ -13490,18 +13755,18 @@ - + - + - + - + - + @@ -13532,27 +13797,30 @@ - + - + - + - + - + - + - + - + + + + @@ -13789,23 +14057,31 @@ + + + + + + + + - + - + - + - + - + @@ -13833,12 +14109,18 @@ - + - + - + + + + + + + @@ -14005,31 +14287,34 @@ - + - + - + - + - + - + - + - + + + + @@ -14159,17 +14444,17 @@ - + - + - + - + @@ -14178,13 +14463,13 @@ - + - + - + @@ -14278,180 +14563,192 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + @@ -14558,7 +14855,7 @@ - + @@ -14610,16 +14907,16 @@ - + - + - + - + @@ -14705,51 +15002,54 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -14833,7 +15133,7 @@ - + @@ -14894,6 +15194,18 @@ + + + + + + + + + + + + @@ -15582,39 +15894,42 @@ - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -15662,21 +15977,24 @@ - + - + - + - + - + - + + + + @@ -15862,7 +16180,7 @@ - + @@ -15872,13 +16190,13 @@ - + - + - + @@ -15987,53 +16305,56 @@ - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + - + - + @@ -16046,36 +16367,36 @@ - + - + - + - + - + - + - + - + - + - + @@ -16108,7 +16429,7 @@ - + @@ -16233,36 +16554,39 @@ - + - + - - - - - - - - - - - - - - - - - - - + - + + + + - + + + + + + + + + + + + + + + + + + + @@ -16303,15 +16627,15 @@ - + - + - + - + @@ -16378,11 +16702,11 @@ - + - + @@ -16393,15 +16717,18 @@ - + - + - + - + + + + @@ -16422,6 +16749,7 @@ + @@ -16472,138 +16800,141 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -16667,12 +16998,12 @@ - + - + - + @@ -16686,12 +17017,12 @@ - + - + - + @@ -16712,12 +17043,12 @@ - + - + - + @@ -16755,7 +17086,7 @@ - + @@ -16765,17 +17096,17 @@ - + - + - + - + @@ -16840,9 +17171,9 @@ - + - + @@ -17019,39 +17350,39 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -17266,23 +17597,23 @@ - + - + - + - + - + - + @@ -17459,66 +17790,75 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + @@ -17589,7 +17929,7 @@ - + @@ -17824,7 +18164,11 @@ - + + + + + @@ -17855,7 +18199,7 @@ - + @@ -17874,31 +18218,31 @@ - + - + - + - + - + - + - + - + - + @@ -17958,7 +18302,7 @@ - + @@ -18020,234 +18364,234 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -18507,7 +18851,7 @@ - + @@ -18689,14 +19033,6 @@ - - - - - - - - @@ -18860,7 +19196,7 @@ - + @@ -18923,45 +19259,51 @@ - + - + - - - - - - - - - - - - - + - + - + - + - + - + - + + + + + + + - + + + + + + + + + + + + + @@ -19005,15 +19347,15 @@ - + - + - + - - + + @@ -19070,63 +19412,66 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + @@ -19149,7 +19494,7 @@ - + @@ -19168,7 +19513,7 @@ - + @@ -19188,6 +19533,9 @@ + + + @@ -19270,9 +19618,9 @@ - + - + @@ -19453,21 +19801,24 @@ - + - + - + - + - + - + + + + @@ -19548,21 +19899,24 @@ - + - + - + - + - + - + + + + @@ -19900,195 +20254,207 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - - + + + + + + + + + + + + + + @@ -20150,7 +20516,7 @@ - + @@ -20190,6 +20556,9 @@ + + + @@ -20250,7 +20619,7 @@ - + @@ -20283,28 +20652,28 @@ - + - + - + - + - + - + - + @@ -20314,46 +20683,46 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -20370,12 +20739,12 @@ - + - + - + @@ -20719,12 +21088,12 @@ - + - + - + @@ -20767,18 +21136,18 @@ - + - + - + - + - + @@ -21009,18 +21378,18 @@ - + - + - + - + - + @@ -21114,7 +21483,7 @@ - + @@ -21356,13 +21725,13 @@ - + - + - + @@ -21485,30 +21854,30 @@ - + - + - + - + - + - + - + - + - + @@ -21542,150 +21911,162 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + + + + + + + + + + @@ -21705,6 +22086,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -21811,81 +22227,93 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + @@ -21900,32 +22328,32 @@ - + - + - + - + - + - + - + - + - + @@ -22014,15 +22442,15 @@ - + - + - + - + @@ -22068,18 +22496,18 @@ - + - + - + - + - + @@ -22249,99 +22677,105 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + - + - + - - + + @@ -22358,58 +22792,58 @@ - - + + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - + - + - - + + - - + + + + + + + + @@ -22468,51 +22902,54 @@ - + - + - + - + - + - + - + - + - - - - - + + - + - + - - + + - - + + - - + + + + + - + + + + @@ -22538,6 +22975,9 @@ + + + @@ -22615,15 +23055,15 @@ - + - + - + - + @@ -22867,7 +23307,7 @@ - + @@ -22919,44 +23359,44 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -22989,11 +23429,17 @@ - + - - + + + + + + + + @@ -23132,11 +23578,11 @@ - + - + @@ -23184,45 +23630,48 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -23328,7 +23777,7 @@ - + @@ -23371,99 +23820,99 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -23664,7 +24113,7 @@ - + @@ -23777,21 +24226,21 @@ - + - + - + - + - + - + @@ -23939,25 +24388,27 @@ - + + + + + + + + + - + - + - - - - - - - + @@ -24063,21 +24514,21 @@ - + - + - + - + - + - + @@ -24098,15 +24549,15 @@ - + - + - + - + @@ -24197,18 +24648,18 @@ - + - + - + - + - + @@ -24343,39 +24794,42 @@ - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -24401,72 +24855,84 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + @@ -24600,26 +25066,25 @@ - + - + - + - - + - + - + @@ -24668,28 +25133,28 @@ - + - + - + - + - + - + - - + + - + @@ -24714,22 +25179,22 @@ - + - + - + - + - + - + @@ -24768,61 +25233,61 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -24875,9 +25340,6 @@ - - - @@ -24952,15 +25414,15 @@ - + - + - + - + @@ -25003,37 +25465,37 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -25075,34 +25537,34 @@ - + - + - + - + - + - + - + - + - + - + @@ -25114,43 +25576,43 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -25645,18 +26107,18 @@ - + - + - + - + - + @@ -25687,39 +26149,42 @@ - + - + - + - + - - - - - - - - - - - - - - - - - - - - + + - + + + + + + + + + + + + + + + + + + + + + + @@ -25767,32 +26232,32 @@ - + - + - + - + - + - + - + - + - + @@ -25830,7 +26295,7 @@ - + @@ -25855,7 +26320,7 @@ - + @@ -25949,15 +26414,15 @@ - + - + - + - + @@ -26154,7 +26619,7 @@ - + @@ -26388,149 +26853,155 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - + + - - - - + - + - - + + - - + + - - - - - - - - - - - - - - + + - + + + + + + + - - - - + - + + + + - + + + + + + + - + - + + + + - + - - + + - - + + + + + + + + + + + - + - + - + - + - + @@ -26572,93 +27043,96 @@ - + - + - + - + - + - + - + - - - - + - - - - + - + - - + + - - + + - - + + - - + + - - + + - - - - - - - - - - - - - - - - - + + - + + + + + + + + + + + + + + + + + + + - + - - + + - - + + - - + + - - + + - - + + + + + + + + @@ -26980,75 +27454,78 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -27080,12 +27557,12 @@ - + - + - + @@ -27153,12 +27630,12 @@ - + - + - + @@ -27190,15 +27667,15 @@ - + - + - + - + @@ -27381,116 +27858,122 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + - + @@ -27509,96 +27992,102 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + @@ -27628,7 +28117,7 @@ - + @@ -27764,27 +28253,27 @@ - + - + - + - + - + - + - + - + @@ -27830,62 +28319,62 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -27907,94 +28396,94 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -28092,7 +28581,7 @@ - + @@ -28185,24 +28674,24 @@ - + - + - + - + - + - + - + @@ -28253,6 +28742,17 @@ + + + + + + + + + + + @@ -28410,7 +28910,7 @@ - + @@ -28420,19 +28920,19 @@ - + - + - + - + - + @@ -28810,7 +29310,7 @@ - + @@ -28865,21 +29365,24 @@ + + + - + - + - + - + @@ -28927,7 +29430,7 @@ - + @@ -29078,15 +29581,15 @@ - + - + - + - + @@ -29182,7 +29685,7 @@ - + @@ -29321,7 +29824,7 @@ - + @@ -29439,177 +29942,180 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -29726,7 +30232,7 @@ - + @@ -29787,24 +30293,24 @@ - + - + - + - + - + - + - + @@ -29907,7 +30413,7 @@ - + @@ -30078,30 +30584,33 @@ - + - + - + - + - + - + - + - + - + + + + @@ -30164,69 +30673,72 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -30256,65 +30768,65 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -30488,44 +31000,44 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -30537,10 +31049,10 @@ - + - + @@ -30573,9 +31085,9 @@ - + - + @@ -30630,45 +31142,48 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -30714,12 +31229,12 @@ - + - + - + @@ -31173,22 +31688,22 @@ - - + + - + - + - + - + - + @@ -31378,12 +31893,12 @@ - + - + - + @@ -31417,18 +31932,18 @@ - + - + - + - + - + @@ -31560,7 +32075,7 @@ - + @@ -31650,7 +32165,7 @@ - + @@ -31660,147 +32175,153 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - + - + - + + + + - - - - + - + - + - - + + + + + + + + + + + + + + @@ -32078,27 +32599,27 @@ - + - + - + - + - + - + - + - + @@ -32108,27 +32629,33 @@ - + - + - + - + - + - + - + - + + + + + + + @@ -32206,39 +32733,42 @@ - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -32259,7 +32789,7 @@ - + @@ -32445,7 +32975,7 @@ - + @@ -32725,6 +33255,7 @@ + @@ -32765,6 +33296,9 @@ + + + @@ -32826,6 +33360,11 @@ + + + + + @@ -32843,7 +33382,7 @@ - + @@ -32868,55 +33407,55 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -33057,15 +33596,15 @@ - + - + - + - + @@ -33157,7 +33696,7 @@ - + @@ -33203,274 +33742,274 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -33495,7 +34034,7 @@ - + @@ -33762,7 +34301,7 @@ - + @@ -33868,7 +34407,7 @@ - + @@ -33881,58 +34420,58 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -34212,17 +34751,17 @@ - + - + - + - + @@ -34468,46 +35007,46 @@ - + - + - + - + - + - + - + - + - + - - + + - - + + - - + + - - + + - - + + @@ -34543,12 +35082,12 @@ - + - + - + @@ -34603,12 +35142,12 @@ - + - + - + @@ -34686,7 +35225,7 @@ - + @@ -34768,7 +35307,7 @@ - + @@ -34880,26 +35419,26 @@ - + - + - + - + - + - + - + @@ -34944,36 +35483,36 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -35022,47 +35561,50 @@ - - - - + - + - - + + + + + - + - + + + + - + - + - + - + - - + + - + - + - + @@ -35371,123 +35913,123 @@ - + - - - - - - - + - + - + + + + - - - - - - - - - - + - + + + + - + + + + - + - - + + - - + + - - + + - - + + - - + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - - + + - - + + - - + + @@ -35527,15 +36069,15 @@ - + - + - + - + @@ -35576,38 +36118,38 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -35628,15 +36170,15 @@ - + - + - + - + @@ -35653,7 +36195,7 @@ - + @@ -35684,22 +36226,22 @@ - + - + - + - + - + - + @@ -36002,7 +36544,7 @@ - + @@ -36084,15 +36626,15 @@ - + - + - + - + @@ -36150,7 +36692,7 @@ - + @@ -36396,18 +36938,18 @@ - + - + - + - + - + @@ -36427,7 +36969,7 @@ - + @@ -36629,36 +37171,39 @@ - + - + - + - + - + - + - + - + - + - + - + + + + @@ -36713,7 +37258,7 @@ - + @@ -36723,10 +37268,10 @@ - + - + @@ -36853,7 +37398,7 @@ - + @@ -36938,81 +37483,81 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -37021,42 +37566,42 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -37211,126 +37756,132 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - + - + - + + + + + + + + + + + + + @@ -37343,33 +37894,33 @@ - + - + - + - + - + - + - + - + - + - + @@ -37404,6 +37955,14 @@ + + + + + + + + @@ -37425,12 +37984,12 @@ - + - + - + @@ -37591,7 +38150,7 @@ - + @@ -37940,82 +38499,85 @@ - + - + - + - + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -38099,18 +38661,24 @@ - + - + - - + + - - + + - - + + + + + + + + @@ -38184,7 +38752,7 @@ - + @@ -38230,22 +38798,22 @@ - + - + - + - + - + - + @@ -38300,27 +38868,27 @@ - + - + - + - + - + - + - + - + @@ -38371,111 +38939,114 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -38520,21 +39091,21 @@ - + - + - + - + - + - + @@ -38572,7 +39143,7 @@ - + @@ -38732,16 +39303,16 @@ - + - + - + - + @@ -38852,70 +39423,70 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -38960,39 +39531,42 @@ - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -39080,7 +39654,7 @@ - + @@ -39099,7 +39673,7 @@ - + @@ -39133,12 +39707,12 @@ - + - + - + @@ -39153,12 +39727,12 @@ - + - + - + @@ -39323,7 +39897,7 @@ - + @@ -39367,51 +39941,51 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -39426,60 +40000,60 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -39561,24 +40135,24 @@ - + - + - + - + - + - + - + @@ -39599,15 +40173,15 @@ - + - + - + - + @@ -39676,117 +40250,123 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - + - + - + + + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -39871,69 +40451,81 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + @@ -40016,7 +40608,7 @@ - + @@ -40034,7 +40626,7 @@ - + @@ -40143,12 +40735,12 @@ - + - + - + @@ -40206,15 +40798,15 @@ - + - + - + - + @@ -40547,7 +41139,7 @@ - + @@ -40747,45 +41339,48 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -41120,9 +41715,9 @@ - + - + @@ -41427,24 +42022,27 @@ - + - + - + - + - + - + - + + + + @@ -41495,6 +42093,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -41663,96 +42305,99 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -41787,24 +42432,24 @@ - + - + - + - + - + - + - + @@ -41817,21 +42462,21 @@ - + - + - + - + - + - + @@ -41939,7 +42584,7 @@ - + @@ -42097,12 +42742,12 @@ - + - + - + @@ -42412,7 +43057,7 @@ - + @@ -42437,16 +43082,16 @@ - + - + - + - + @@ -42479,7 +43124,7 @@ - + @@ -42635,18 +43280,18 @@ - + - + - + - + - + @@ -42658,138 +43303,162 @@ - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - + - + + + + - + - + - - - - + - + - + - + + + + - + - + - - - - - - - + - - - - + - + - + + + + + + + - + + + + - + - - - - + - + + + + + + + + + + + + + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -42802,22 +43471,22 @@ - + - + - + - + - + - + @@ -42829,76 +43498,88 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + - + @@ -42950,115 +43631,115 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -43158,21 +43839,24 @@ - + - + - + - + - + - + + + + @@ -43291,7 +43975,7 @@ - + @@ -43351,79 +44035,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + + + + - + - + - + @@ -43448,249 +44135,252 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - + - - - - + - + - - - - - + + - + - - + + + + + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -43777,6 +44467,9 @@ + + + @@ -43914,9 +44607,9 @@ - + - + @@ -44012,7 +44705,7 @@ - + @@ -44048,15 +44741,15 @@ - + - + - + - + @@ -44097,7 +44790,7 @@ - + @@ -44382,45 +45075,45 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -44465,23 +45158,37 @@ - + - + - + - + - + + + + + + + + + + + + + + + @@ -44491,33 +45198,39 @@ - + - + - + - + - + - + - + - + - + - + + + + + + + @@ -44642,38 +45355,38 @@ - + - + - + - - + + - - + + - - - - - - - - - - - + + - + + + + + + + + + + - + - + @@ -44844,7 +45557,7 @@ - + @@ -44884,40 +45597,40 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -44961,7 +45674,7 @@ - + @@ -45048,114 +45761,114 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -45169,17 +45882,17 @@ - + - + - + - + @@ -45328,12 +46041,12 @@ - + - + - + @@ -45405,45 +46118,48 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -45545,9 +46261,9 @@ - + - + @@ -45701,7 +46417,7 @@ - + @@ -45768,32 +46484,32 @@ - + - + - + - + - + - + - + - + - + @@ -45845,46 +46561,49 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -45892,15 +46611,15 @@ - + - + - + - + @@ -46024,7 +46743,7 @@ - + @@ -46270,114 +46989,117 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + @@ -46403,24 +47125,27 @@ - + - + - + - + - + - + - + + + + @@ -46478,24 +47203,24 @@ - + - + - + - + - + - + - + @@ -46546,24 +47271,24 @@ - + - + - + - + - + - + - + @@ -46592,27 +47317,27 @@ - + - + - + - + - + - - + + - - + + - - + + @@ -46675,21 +47400,21 @@ - + - + - + - + - + - + @@ -46749,69 +47474,75 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + + + + @@ -46835,7 +47566,7 @@ - + @@ -46845,16 +47576,16 @@ - + - + - + - + @@ -46879,162 +47610,162 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -47282,7 +48013,7 @@ - + @@ -47408,57 +48139,63 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -47794,72 +48531,75 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + + + + @@ -48017,18 +48757,18 @@ - + - + - + - + - + @@ -48115,18 +48855,18 @@ - + - + - + - + - + @@ -48274,7 +49014,7 @@ - + @@ -48391,7 +49131,7 @@ - + @@ -48413,13 +49153,13 @@ - + - + - + @@ -48530,6 +49270,9 @@ + + + @@ -48588,7 +49331,7 @@ - + @@ -48619,7 +49362,7 @@ - + @@ -48753,20 +49496,23 @@ - + - + - + - + - + + + + @@ -48821,7 +49567,7 @@ - + @@ -48849,25 +49595,25 @@ - + - + - + - + - + - + - + @@ -48963,48 +49709,48 @@ - + - + - + - + - + - + - + - + - + - + - - - - - - - + - + - - + + + + + + + + @@ -49039,21 +49785,24 @@ - + - + - + - + - + - + + + + @@ -49138,59 +49887,59 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -49240,7 +49989,7 @@ - + @@ -49322,31 +50071,31 @@ - + - + - + - + - + - + - + - + - + @@ -49425,9 +50174,9 @@ - + - + @@ -49445,7 +50194,7 @@ - + @@ -49590,21 +50339,21 @@ - + - + - + - + - + - + @@ -49634,6 +50383,14 @@ + + + + + + + + @@ -49701,30 +50458,33 @@ - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + + + + @@ -49804,50 +50564,50 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -49883,12 +50643,12 @@ - + - + - + @@ -49901,12 +50661,12 @@ - + - + - + @@ -49915,188 +50675,188 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -50427,15 +51187,15 @@ - + - + - + - + @@ -50598,14 +51358,14 @@ - + - + - + @@ -50646,42 +51406,48 @@ - + - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + + + + @@ -50823,15 +51589,15 @@ - + - - - - + - + + + + @@ -50868,159 +51634,171 @@ - + - + - - + + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + - + - + + + + - + + + + - + + + + + + + - - - - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -51065,12 +51843,12 @@ - + - + - + @@ -51106,24 +51884,27 @@ - + - - - - + - + - + - + - + + + + + + + @@ -51276,7 +52057,7 @@ - + @@ -51346,19 +52127,19 @@ - + - + - + - + - + @@ -51433,6 +52214,17 @@ + + + + + + + + + + + @@ -51460,7 +52252,7 @@ - + @@ -51482,16 +52274,16 @@ - + - + - + - + @@ -51533,180 +52325,195 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + @@ -51733,72 +52540,75 @@ - + - - - - - - - + - + - + - - - - + - + - + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + - - + + - - + + - - - - + - + + + + + + + + + + + + + + + + @@ -51838,7 +52648,7 @@ - + @@ -51934,96 +52744,96 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - + - - + + - - + + - - + + - - + + @@ -52041,12 +52851,12 @@ - + - + - + @@ -52056,24 +52866,24 @@ - + - + - + - + - + - + - + @@ -52081,13 +52891,13 @@ - + - + - + @@ -52108,30 +52918,30 @@ - + - + - + - + - + - + - + - + - + @@ -52196,7 +53006,7 @@ - + @@ -52230,10 +53040,10 @@ - + - + @@ -52306,7 +53116,7 @@ - + @@ -52352,25 +53162,25 @@ - + - + - + - + - + - + - + @@ -52411,12 +53221,12 @@ - + - + - + @@ -52432,18 +53242,18 @@ - + - + - + - + - + @@ -52496,51 +53306,54 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -52554,39 +53367,39 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -52696,372 +53509,390 @@ - + - - - - - - - + - + - + - + - + - + - + - - + + - - + + - - + + - - + + - - - - - + + - + - - + + - - + + - - + + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - - - - + - + - + - + + + + + + + + + + - - - - - - - + - + - - - - + - - - - + - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + - - - - - - - - - - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + + + + + + + - - - - - - - - - - + - + - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + + + + - + + + + + + + + + + + + + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + @@ -53193,7 +54024,7 @@ - + @@ -53320,7 +54151,7 @@ - + @@ -53366,17 +54197,17 @@ - + - + - + - + @@ -53388,99 +54219,102 @@ - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + + + + - + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + - + - - + + + + + + + + + + + + + + + + + @@ -53561,7 +54395,7 @@ - + @@ -53674,18 +54508,18 @@ - + - + - + - + - + @@ -53912,51 +54746,51 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -53979,36 +54813,39 @@ - + - + - + - + - + - + - + - + - + - + - + + + + @@ -54035,234 +54872,255 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - - + + - - + + + + + @@ -54444,15 +55302,15 @@ - + - + - + - + @@ -54465,132 +55323,138 @@ - + - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + @@ -54613,23 +55477,23 @@ - + - + - + - + - + - + @@ -54968,12 +55832,12 @@ - + - + - + @@ -55046,90 +55910,93 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + @@ -55479,12 +56346,12 @@ - + - + - + @@ -55506,84 +56373,96 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + @@ -55695,7 +56574,7 @@ - + @@ -55708,37 +56587,37 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -56162,27 +57041,27 @@ - + - + - + - + - + - + - + - + @@ -56400,34 +57279,37 @@ + + + - + - + - + - + - + - + - + @@ -56514,107 +57396,110 @@ - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - - - - - - - - - - - - - - - - + + - + - - + + - - + + - - + + - - + + - - + + - - - - - - - - - - - - - - - - - + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + @@ -56637,35 +57522,35 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -56687,33 +57572,36 @@ - + - + - + - + - + - + - + - + - + - + + + + @@ -56750,15 +57638,18 @@ - + - + - + - + + + + @@ -57005,7 +57896,7 @@ - + @@ -57101,7 +57992,7 @@ - + @@ -57432,7 +58323,7 @@ - + @@ -57508,7 +58399,7 @@ - + @@ -57516,7 +58407,7 @@ - + @@ -57562,22 +58453,22 @@ - + - + - + - + - + - + @@ -57641,7 +58532,7 @@ - + @@ -57657,79 +58548,79 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -57800,14 +58691,14 @@ - + - + - + - + @@ -58350,12 +59241,12 @@ - + - + - + @@ -58399,6 +59290,20 @@ + + + + + + + + + + + + + + @@ -58420,12 +59325,12 @@ - + - + - + @@ -58770,24 +59675,24 @@ - + - - - - - - - + - + - + + + + - + + + + @@ -58886,54 +59791,57 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -58998,7 +59906,7 @@ - + @@ -59011,340 +59919,340 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -59504,39 +60412,39 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -59623,117 +60531,123 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + @@ -59986,15 +60900,15 @@ - + - + - + - + @@ -60176,33 +61090,33 @@ - + - + - + - + - + - + - + - + - + - + @@ -60375,7 +61289,7 @@ - + @@ -60386,21 +61300,24 @@ - + - + - - + + - - + + - - + + - - + + + + + @@ -60415,7 +61332,7 @@ - + @@ -60492,33 +61409,36 @@ - + - - - - + - - - - - - - - - - - - - - - - + - + + + + + + + + + + + + + + + + + + + + + + @@ -60568,12 +61488,12 @@ - + - + - + @@ -60688,6 +61608,14 @@ + + + + + + + + @@ -60707,69 +61635,72 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -60779,15 +61710,15 @@ - + - + - + - + @@ -60890,7 +61821,7 @@ - + @@ -61018,7 +61949,7 @@ - + @@ -61058,22 +61989,22 @@ - + - + - + - + - + - + @@ -61084,30 +62015,33 @@ - + - + - + - + - + - + - + - + - + + + + @@ -61209,15 +62143,18 @@ - + - + - - + + - - + + + + + @@ -61319,83 +62256,89 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + @@ -61451,6 +62394,7 @@ + @@ -61545,6 +62489,26 @@ + + + + + + + + + + + + + + + + + + + + @@ -61637,18 +62601,18 @@ - + - + - + - + - + @@ -61759,30 +62723,36 @@ - + - + - + - + - + - + - + - + - + + + + + + + @@ -61883,24 +62853,24 @@ - + - + - + - + - + - + - + @@ -61950,6 +62920,7 @@ + @@ -61961,18 +62932,18 @@ - + - + - + - + - + @@ -61986,39 +62957,39 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -62213,24 +63184,24 @@ - + - + - + - + - + - + - + @@ -62390,87 +63361,90 @@ - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + @@ -62629,7 +63603,7 @@ - + @@ -62846,9 +63820,9 @@ - + - + @@ -63162,7 +64136,20 @@ - + + + + + + + + + + + + + + @@ -63191,24 +64178,24 @@ - + - + - + - + - + - + - + @@ -63242,7 +64229,10 @@ - + + + + @@ -63305,12 +64295,12 @@ - + - + - + @@ -63429,72 +64419,78 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + @@ -63520,36 +64516,36 @@ - + - + - + - + - + - + - + - + - + - + @@ -63562,75 +64558,78 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -63969,7 +64968,7 @@ - + @@ -63986,18 +64985,18 @@ - + - + - + - + - + @@ -64015,6 +65014,7 @@ + @@ -64193,237 +65193,240 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - + - + - + + + + + + + + + + - + + + + + + + + + + + + + - + + + + + + + + + + + + + - + - - - - - + + - + - - + + - - + + - - + + - - - - - + + - + + + + - + - + - - - - + - + - + + + + + + + + + + + + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + + + + - + + + + + + + + + + + + + + + + + + + - + - + - + - + - - - - + - - - - - - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -64756,7 +65759,7 @@ - + @@ -64775,36 +65778,36 @@ - + - + - + - + - + - + - + - + - + - + @@ -64826,78 +65829,78 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + @@ -64905,16 +65908,16 @@ - + - + - + - + @@ -64933,6 +65936,9 @@ + + + @@ -64981,6 +65987,14 @@ + + + + + + + + @@ -65082,33 +66096,36 @@ - + - + - + - + - + - + - + - + - + - + + + + @@ -65348,12 +66365,12 @@ - + - + - + @@ -65382,7 +66399,7 @@ - + @@ -65432,36 +66449,36 @@ - + - + - + - + - + - + - + - + - + - + @@ -65561,6 +66578,7 @@ + @@ -65727,32 +66745,32 @@ - + - + - + - + - + - + - + - + @@ -65857,7 +66875,7 @@ - + @@ -65870,28 +66888,28 @@ - + - + - + - + - + - + - + - + @@ -65899,7 +66917,7 @@ - + @@ -66013,39 +67031,39 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -66057,7 +67075,7 @@ - + @@ -66076,308 +67094,311 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -66411,6 +67432,9 @@ + + + @@ -66439,56 +67463,56 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -66515,12 +67539,12 @@ - + - + - + @@ -66683,6 +67707,7 @@ + @@ -66847,39 +67872,42 @@ - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -66891,21 +67919,21 @@ - + - + - + - + - + - + @@ -66949,14 +67977,14 @@ - + - + - + @@ -67082,6 +68110,14 @@ + + + + + + + + @@ -67160,12 +68196,12 @@ - + - + - + @@ -67274,7 +68310,7 @@ - + @@ -67298,7 +68334,7 @@ - + @@ -67346,87 +68382,93 @@ - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - - - + - + + + + - + - + - + - - + + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -67435,7 +68477,7 @@ - + @@ -67566,12 +68608,12 @@ - + - + - + @@ -67889,15 +68931,15 @@ - + - + - - + + - - + + @@ -68235,7 +69277,7 @@ - + @@ -68395,266 +69437,272 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - + - - - - + - - - - + - + - - + + - - + + - - + + - - + + - - - - - - - - - - - - - - - - - - - - + + - - - - + - - - - + - + + + + - + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - - - - + + - - - - + - + + + + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + @@ -68868,21 +69916,21 @@ - + - + - + - + - + - + @@ -68903,7 +69951,7 @@ - + @@ -68925,22 +69973,22 @@ - + - + - + - + - + - + @@ -68987,7 +70035,7 @@ - + @@ -69139,6 +70187,9 @@ + + + @@ -69192,33 +70243,36 @@ - + - + - + - + - + - + - + - + - + - + + + + @@ -69232,39 +70286,42 @@ - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + @@ -69380,9 +70437,9 @@ - + - + @@ -69415,7 +70472,7 @@ - + @@ -69431,13 +70488,13 @@ - + - + - + @@ -69496,36 +70553,36 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -69544,27 +70601,27 @@ - + - + - + - + - + - + - + - + @@ -69592,6 +70649,10 @@ + + + + @@ -69636,15 +70697,15 @@ - + - + - + - + @@ -69683,6 +70744,20 @@ + + + + + + + + + + + + + + @@ -69693,29 +70768,29 @@ - + - + - + - + - + - + - + - + @@ -69749,15 +70824,15 @@ - + - + - + - + @@ -69801,51 +70876,54 @@ - + - + - + - + - + - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + @@ -69857,7 +70935,7 @@ - + @@ -69898,136 +70976,136 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -70132,81 +71210,108 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -70223,15 +71328,15 @@ - + - + - + - + @@ -70303,9 +71408,9 @@ - + - + @@ -70328,39 +71433,40 @@ - + - + - + - + - + - + - + - + - + - + - + + @@ -70550,7 +71656,7 @@ - + @@ -70567,18 +71673,18 @@ - + - + - + - + - + @@ -70628,6 +71734,14 @@ + + + + + + + + @@ -70651,18 +71765,18 @@ - + - + - + - + - + @@ -70768,12 +71882,12 @@ - + - + - + @@ -70988,48 +72102,48 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -71283,99 +72397,102 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - + + - + - + - + + + + - + - - + + - - + + - - - - - - - - - - - - - - + + - + + + + - + - - + + + + + + + + + + + + + + + + + @@ -71585,15 +72702,15 @@ - + - + - + - + @@ -71673,68 +72790,68 @@ - + - - - - - - - + - + - + - + + + + - + - + - + - + - - - - - - - - + + - + - + - + - - - - + - - - - + + + + + + + + + + + + + + + + @@ -71771,186 +72888,192 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + @@ -72023,7 +73146,7 @@ - + @@ -72177,200 +73300,209 @@ - + - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - - - - - - - - - - - - - - - - - - - + + - - - - + - + - + - - - - - - - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + - + - + - + @@ -72415,18 +73547,21 @@ - + - + - + - + - + + + + @@ -72912,41 +74047,41 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -73010,7 +74145,7 @@ - + @@ -73080,25 +74215,37 @@ + + + + + + + + + + + + - + - + - + - + - + - + - + @@ -73140,30 +74287,30 @@ - + - + - + - + - + - + - + - + - + @@ -73714,39 +74861,42 @@ - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -73770,72 +74920,81 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + @@ -73890,51 +75049,51 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -73949,48 +75108,48 @@ - + - + - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + @@ -74109,7 +75268,7 @@ - + @@ -74194,12 +75353,12 @@ - + - + - + @@ -74444,206 +75603,39 @@ - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -74807,12 +75799,12 @@ - + - + - + @@ -74865,45 +75857,45 @@ - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - + @@ -75251,47 +76243,22 @@ - + + - - - - - - - + - - - - + - + - - - - - - - - - - - - - - - - - - + - + @@ -75334,7 +76301,7 @@ - + @@ -75424,115 +76391,121 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + @@ -75645,30 +76618,33 @@ - + - + - + - + - + - + - + - + - + + + + @@ -75678,7 +76654,7 @@ - + @@ -75778,73 +76754,73 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -75853,52 +76829,52 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -75934,12 +76910,12 @@ - + - + - + @@ -76107,6 +77083,9 @@ + + + @@ -76184,7 +77163,7 @@ - + @@ -76258,15 +77237,15 @@ - + - + - + - + @@ -76294,12 +77273,12 @@ - + - + - + @@ -76572,7 +77551,7 @@ - + @@ -76606,10 +77585,10 @@ - + - + @@ -76641,12 +77620,12 @@ - + - + - + @@ -76685,18 +77664,18 @@ - + - + - + - + - + @@ -76810,42 +77789,45 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -76909,7 +77891,7 @@ - + @@ -76973,7 +77955,7 @@ - + @@ -77009,201 +77991,213 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + - + - - - - + - + + + + - + - + - + - + - - + + - - + + - - + + - - - - - - - - + + - + - - + + + + + + + + + + + + + + + + + + + + + + + @@ -77212,7 +78206,7 @@ - + @@ -77415,15 +78409,18 @@ - + - + - + + + + @@ -77751,57 +78748,72 @@ - + - + + + + - + - + - + - + - + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + @@ -77826,12 +78838,188 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -77852,279 +79040,291 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - - - - - - - + + - + - - + + - - - - - - - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -78309,24 +79509,24 @@ - + - + - + - + - + - + - + @@ -78343,42 +79543,45 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -78484,30 +79687,30 @@ - + - + - + - + - + - + - + - + - + @@ -78536,72 +79739,72 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -78631,51 +79834,54 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -78708,7 +79914,7 @@ - + @@ -78823,46 +80029,46 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -78881,24 +80087,24 @@ - + - + - + - + - + - + - + @@ -79479,45 +80685,45 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -79565,7 +80771,7 @@ - + @@ -79692,8 +80898,11 @@ + + + - + @@ -79703,12 +80912,12 @@ - + - + - + @@ -79743,21 +80952,24 @@ - + - + - + - + - + - - + + + + + @@ -79802,14 +81014,14 @@ - + - + @@ -79862,12 +81074,12 @@ - + - + - + @@ -79905,15 +81117,15 @@ - + - + - + - + @@ -79934,27 +81146,27 @@ - + - + - + - + - + - + - + - + @@ -79982,63 +81194,78 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + + + + + + + + + + + + + @@ -80113,16 +81340,16 @@ - + - + - + @@ -80153,7 +81380,7 @@ - + @@ -80259,56 +81486,59 @@ - + - + - + - + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + - + @@ -80436,61 +81666,67 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + @@ -80528,7 +81764,7 @@ - + @@ -80595,12 +81831,12 @@ - + - + - + @@ -80694,26 +81930,26 @@ - + - + - + - + - + - + - + @@ -80751,7 +81987,7 @@ - + @@ -81456,36 +82692,39 @@ - + - + - + - + - + - + - + - + - + - + - + + + + @@ -81506,699 +82745,711 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - - - - - - - - - - - - - - - - + + - + - - - - - + + - + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + - - + + - - + + - - - - - - - - - - - - - - - - - + + - + + + + + + + - + + + + - + - - + + - - - - - - - - - - - - - - - - - - - - + + - + - - + + + + + - - - - + - + + + + - + - - + + + + + + + + + + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -82490,7 +83741,7 @@ - + @@ -82532,10 +83783,19 @@ - + + + + + + + + + + @@ -82563,6 +83823,9 @@ + + + @@ -82878,12 +84141,12 @@ - + - + - + @@ -82976,83 +84239,83 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -83237,15 +84500,15 @@ - + - + - + - + @@ -83522,15 +84785,15 @@ - + - + - + - + @@ -83573,18 +84836,18 @@ - + - + - + - + - + @@ -83776,18 +85039,18 @@ - + - + - + - + - + @@ -83913,7 +85176,7 @@ - + @@ -83923,204 +85186,216 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - + + - - - - + - + + + + - + - - + + - - + + - - + + - - + + - - + + - - - - - + + - + - + - - + + - - + + - - + + - - - - - - - - + + - + - + - - + + - - + + + + + + + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + @@ -84192,7 +85467,7 @@ - + @@ -84458,12 +85733,12 @@ - + - + - + @@ -84546,21 +85821,24 @@ - + - + - + - + - + - + + + + @@ -84858,18 +86136,18 @@ - + - + - + - + - + @@ -85223,7 +86501,7 @@ - + @@ -85334,18 +86612,18 @@ - + - + - + - + - + @@ -85442,24 +86720,27 @@ - + - + - + - + - + - + - + + + + @@ -85491,105 +86772,108 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -85641,7 +86925,7 @@ - + @@ -85730,56 +87014,59 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + @@ -85802,54 +87089,57 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -85961,7 +87251,7 @@ - + @@ -86137,18 +87427,18 @@ - + - + - + - + - + @@ -86161,6 +87451,11 @@ + + + + + @@ -86537,7 +87832,7 @@ - + @@ -86643,21 +87938,21 @@ - + - + - + - + - + - + @@ -86665,12 +87960,12 @@ - + - + - + @@ -86892,7 +88187,7 @@ - + @@ -86906,7 +88201,7 @@ - + @@ -87111,59 +88406,59 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -87317,21 +88612,24 @@ - + - + - + - + - + - + + + + @@ -87362,21 +88660,21 @@ - + - + - + - + - + - + @@ -87735,30 +89033,30 @@ - + - + - + - + - + - + - + - + - + @@ -87846,128 +89144,128 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -87990,12 +89288,12 @@ - + - + - + @@ -88084,15 +89382,15 @@ - + - + - + - + @@ -88449,57 +89747,60 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -88513,7 +89814,33 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -88602,42 +89929,45 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -88797,27 +90127,27 @@ - + - + - + - + - + - + - + - + @@ -88856,54 +90186,60 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + @@ -89116,112 +90452,112 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -89247,12 +90583,12 @@ - + - + - + @@ -89410,12 +90746,12 @@ - + - + - + @@ -89467,24 +90803,24 @@ - + - + - + - + - + - + - + @@ -89533,15 +90869,15 @@ - + - + - + - + @@ -89578,7 +90914,7 @@ - + @@ -89662,48 +90998,51 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -89755,84 +91094,87 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -89843,29 +91185,29 @@ - + - + - + - + - + - + - + - + @@ -90027,30 +91369,30 @@ - + - + - + - + - + - + - + - + - + @@ -90273,207 +91615,213 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + + + + + + + - + - - + + - - + + - - + + - - + + - - + + + + + + + + + + + + + + - + - + - - - - - + + - + - + + + + - + - - - - - - - - - - - - - - - - - - - - - - + - - - - + - + - - - - - + + - + - - - - + - + - + + + + + + + + + + + + + + + + + + + + + + - + + + + - - - - - - - - - - - - - + - + - + - + - - - - - - - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -90487,12 +91835,12 @@ - + - + - + @@ -90581,402 +91929,405 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -90985,15 +92336,15 @@ - + - + - + - + @@ -91014,120 +92365,123 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -91143,7 +92497,7 @@ - + @@ -91198,127 +92552,136 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + @@ -91371,15 +92734,15 @@ - + - + - + - + @@ -91390,59 +92753,59 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -91451,16 +92814,16 @@ - + - + - + - + @@ -91536,24 +92899,24 @@ - + - + - + - + - + - + - + @@ -91564,43 +92927,46 @@ + + + - + - + - + - + - + - + - + - + - + - + - + @@ -91868,126 +93234,129 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -92023,42 +93392,48 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + @@ -92602,6 +93977,12 @@ + + + + + + @@ -92840,18 +94221,18 @@ - + - + - + - + - + @@ -92862,30 +94243,42 @@ - + - + - + - + - + - + - + - + - - + + + + + + + + + + + + + + @@ -93040,6 +94433,14 @@ + + + + + + + + @@ -93103,116 +94504,116 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -93308,373 +94709,385 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -93682,39 +95095,42 @@ - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -94463,48 +95879,51 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -94559,7 +95978,7 @@ - + @@ -94593,47 +96012,47 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -94685,48 +96104,51 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -94927,7 +96349,7 @@ - + @@ -94987,7 +96409,7 @@ - + @@ -95006,14 +96428,17 @@ - + - + - + + + + @@ -95027,48 +96452,60 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + @@ -95077,7 +96514,7 @@ - + @@ -95346,21 +96783,21 @@ - + - + - + - + - + - + @@ -96024,6 +97461,7 @@ + @@ -96046,15 +97484,15 @@ - + - + - + - + @@ -96078,20 +97516,20 @@ - + - + - + - + - + @@ -96193,33 +97631,39 @@ - + - + - + - + - + - + - + - + - + - + + + + + + + @@ -96240,21 +97684,21 @@ - + - + - + - + - + - + @@ -96280,7 +97724,7 @@ - + @@ -96451,7 +97895,7 @@ - + @@ -96492,30 +97936,30 @@ - + - + - + - + - + - + - + - + - + @@ -96635,7 +98079,7 @@ - + @@ -96668,7 +98112,7 @@ - + @@ -96803,7 +98247,7 @@ - + @@ -96946,7 +98390,7 @@ - + @@ -96959,27 +98403,27 @@ - + - + - + - + - + - + - + @@ -97088,22 +98532,22 @@ - + - + - + - + - + - + @@ -97127,18 +98571,18 @@ - + - + - + - + - + @@ -97148,18 +98592,18 @@ - + - + - + - + - + @@ -97274,12 +98718,12 @@ - + - + - + @@ -97490,6 +98934,7 @@ + @@ -98225,9 +99670,9 @@ - + - + @@ -98246,7 +99691,7 @@ - + @@ -98283,43 +99728,43 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -98380,7 +99825,7 @@ - + @@ -98437,7 +99882,7 @@ - + @@ -98453,7 +99898,7 @@ - + @@ -98484,31 +99929,31 @@ - + - + - + - + - + - + - + - + - + @@ -98529,9 +99974,9 @@ - + - + @@ -98544,11 +99989,11 @@ - + - + @@ -98677,27 +100122,27 @@ - + - + - + - + - + - + - + - + @@ -98804,83 +100249,83 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - + - + @@ -99107,18 +100552,18 @@ - + - + - + - + - + @@ -99170,75 +100615,87 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + @@ -99268,28 +100725,28 @@ - + - + - + - + - + - + - + - + @@ -99376,24 +100833,27 @@ - + - + - + - + - + - + - + + + + @@ -99490,33 +100950,33 @@ - + - + - + - + - + - + - + - + - + - + @@ -99701,15 +101161,21 @@ - + - + - + - + + + + + + + @@ -99745,39 +101211,42 @@ - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -100014,7 +101483,7 @@ - + @@ -100030,31 +101499,31 @@ - + - + - + - + - + - + - + - + - + @@ -100092,87 +101561,90 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -100181,83 +101653,83 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -100350,12 +101822,12 @@ - + - + - + @@ -100834,72 +102306,78 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + @@ -100929,169 +102407,175 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + - + + + + - + - + - + - + - + + + + + + + + + + + + + - + @@ -101110,16 +102594,16 @@ - + - + - + - + @@ -101194,64 +102678,72 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + @@ -101321,84 +102813,84 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -101594,108 +103086,120 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + @@ -101722,7 +103226,7 @@ - + @@ -101839,12 +103343,15 @@ + + + - + @@ -101875,55 +103382,55 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -101968,15 +103475,15 @@ - + - + - + - + @@ -102106,6 +103613,7 @@ + @@ -102169,12 +103677,12 @@ - + - + - + @@ -102665,134 +104173,137 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + - + - - + + - - + + - - - - + - + - + - + - + - + - + - + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + @@ -102809,6 +104320,11 @@ + + + + + @@ -102820,7 +104336,7 @@ - + @@ -102830,119 +104346,122 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -103004,16 +104523,17 @@ - + - + - + + @@ -103130,44 +104650,44 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -103271,27 +104791,27 @@ - + - + - + - + - + - + - + - + @@ -103300,66 +104820,66 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -103385,30 +104905,33 @@ - + - + - + - + - + - + - + - + - + + + + @@ -103416,45 +104939,48 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -103501,6 +105027,17 @@ + + + + + + + + + + + @@ -103515,7 +105052,7 @@ - + @@ -103549,6 +105086,21 @@ + + + + + + + + + + + + + + + @@ -103828,81 +105380,84 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -103995,12 +105550,12 @@ - + - + - + @@ -104041,18 +105596,18 @@ - + - + - + - + - + @@ -104109,15 +105664,15 @@ - + - + - + - + @@ -104266,33 +105821,33 @@ - + - + - + - + - + - + - + - + - + - + @@ -104355,41 +105910,47 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - + - + + + + + + + + + + + + + + + + + + + + + + + + @@ -104436,12 +105997,12 @@ - + - + - + @@ -104470,24 +106031,24 @@ - + - + - + - + - + - + - + @@ -104497,15 +106058,15 @@ - + - + - + - + @@ -104628,33 +106189,36 @@ - + - + - + - + - + - + - + - + - + - + + + + @@ -104693,39 +106257,39 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -104772,7 +106336,16 @@ - + + + + + + + + + + @@ -104934,7 +106507,7 @@ - + @@ -104992,157 +106565,187 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + + + + + + + + + + - + - + - + - - - - + - - - - + - - - - + - + + + + - + + + + - + - - + + - - - - - - - - - - - - - - + + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -105327,93 +106930,105 @@ - + - + - + - + - - - - - - - - - - + - - - - - - - - - - - - - - - - + - + - + - + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -105619,15 +107234,15 @@ - + - + - + - + @@ -105660,24 +107275,27 @@ - + - + - + - + - + - + - + + + + @@ -105894,14 +107512,14 @@ - + - + @@ -105947,24 +107565,24 @@ - + - + - + - + - + - + - + @@ -106085,9 +107703,9 @@ - - - + + + @@ -106806,8 +108424,8 @@ - - + + @@ -107028,8 +108646,8 @@ - - + + @@ -108248,6 +109866,19 @@ + + + + + + + + + + + + + @@ -108768,6 +110399,8 @@ + + @@ -109138,12 +110771,12 @@ - - - - - - + + + + + + @@ -109359,12 +110992,12 @@ - - + + - - + + @@ -109779,8 +111412,8 @@ - - + + @@ -109816,29 +111449,29 @@ - - - - + + + + - - - - - + + + + + - - + + - - + + - - + + @@ -109846,46 +111479,46 @@ - - - + + + - - - + + + - - + + - - + + - - + + - - + + - - - + + + - - + + - - - - - + + + + + @@ -109898,27 +111531,27 @@ - - + + - - - + + + - - + + - - - + + + - - - + + + @@ -109929,22 +111562,22 @@ - - + + - - - + + + - - + + - - - + + + @@ -109957,21 +111590,21 @@ - - + + - - + + - - - + + + @@ -109980,10 +111613,10 @@ - - - - + + + + @@ -110954,19 +112587,19 @@ - - - + + + - - - - + + + + @@ -113708,26 +115341,26 @@ - - - + + + - - - + + + - - - - - + + + + + - - - + + + @@ -113737,16 +115370,16 @@ - - - + + + - - - - - + + + + + @@ -113762,51 +115395,51 @@ - - - + + + - - - + + + - - - - + + + + - - + + - - + + - - - - + + + + - - + + - - + + - - - + + + @@ -116438,10 +118071,10 @@ - - - - + + + + @@ -116820,10 +118453,10 @@ - - - - + + + + @@ -117315,12 +118948,12 @@ - - + + - - + + @@ -120006,9 +121639,9 @@ - - - + + + @@ -120048,6 +121681,12 @@ + + + + + + @@ -120788,8 +122427,8 @@ - - + + @@ -122056,7 +123695,7 @@ - + @@ -123624,13 +125263,13 @@ - - - + + + - - + + @@ -124540,21 +126179,21 @@ - - - + + + - - + + - - - - - - + + + + + + @@ -124567,10 +126206,10 @@ - - - - + + + + @@ -126044,6 +127683,7 @@ + @@ -126179,16 +127819,16 @@ - - - - - - + + + + + + - - + + @@ -126283,10 +127923,10 @@ - - - - + + + + @@ -126341,9 +127981,9 @@ - - - + + + @@ -126485,9 +128125,9 @@ - - - + + + @@ -127407,11 +129047,11 @@ - - - - - + + + + + @@ -127422,61 +129062,61 @@ - - + + - - - - - + + + + + - - - + + + - - - - - + + + + + - - - + + + - - - - + + + + - - - - - - + + + + + + - - - + + + - - - + + + - - - + + + @@ -127487,20 +129127,20 @@ - - - - - - + + + + + + - - + + @@ -128747,13 +130387,13 @@ - - - + + + - - + + @@ -128774,53 +130414,53 @@ - - - + + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + @@ -128836,16 +130476,16 @@ - - + + - - + + - - + + @@ -129194,11 +130834,11 @@ - - - - - + + + + + @@ -129364,13 +131004,13 @@ - - + + - - - + + + @@ -129517,8 +131157,8 @@ - - + + @@ -129651,22 +131291,22 @@ - - + + - - - + + + - - - + + + @@ -129681,8 +131321,8 @@ - - + + @@ -129714,7 +131354,7 @@ - + @@ -129824,10 +131464,10 @@ - - - - + + + + @@ -131147,22 +132787,22 @@ - - - - + + + + - - - - + + + + - - - - + + + + @@ -131226,23 +132866,23 @@ - - - - + + + + - - - - + + + + - - - - - + + + + + diff --git a/build.config.common b/build.config.common index 778c4a7af699..b321ae20ecea 100644 --- a/build.config.common +++ b/build.config.common @@ -1,5 +1,5 @@ BRANCH=android12-5.10 -KMI_GENERATION=8 +KMI_GENERATION=9 LLVM=1 DEPMOD=depmod