From b7a6c15a6f06cc7e324c8d63b87cdd06b5597851 Mon Sep 17 00:00:00 2001 From: Qingqing Zhou Date: Tue, 30 Nov 2021 10:20:40 +0800 Subject: [PATCH] ANDROID: Configure out the macros in android_kabi and android_vendor Add one CONFIG to control removing the macros or not. On some platform, configureing out the macros removes the associated members from the structs, this reduces the object size of the slabs related with the structs, therefore reduces the total slab memory consumption of system. Besides, this also reduces vmlinux size a bit, therefore the total kernel memory size increses a bit. The macros are ANDROID_KABI_RESERVE, ANDROID_VENDOR_DATA, ANDROID_VENDOR_DATA_ARRAY, ANDROID_OEM_DATA, ANDROID_OEM_DATA_ARRAY. Bug: 206561931 Signed-off-by: Qingqing Zhou Change-Id: I0868d299ccce3c4b39f42af17916828500be6cc4 --- drivers/android/Kconfig | 17 +++++++++++++++++ include/linux/android_kabi.h | 4 ++++ include/linux/android_vendor.h | 15 +++++++++++++++ init/init_task.c | 2 ++ kernel/fork.c | 6 ++++-- 5 files changed, 42 insertions(+), 2 deletions(-) diff --git a/drivers/android/Kconfig b/drivers/android/Kconfig index a99ff854a2ed..c9636c3c6dbd 100644 --- a/drivers/android/Kconfig +++ b/drivers/android/Kconfig @@ -74,6 +74,23 @@ config ANDROID_VENDOR_HOOKS Allow vendor modules to attach to tracepoint "hooks" defined via DECLARE_HOOK or DECLARE_RESTRICTED_HOOK. +config ANDROID_STRUCT_PADDING + bool "Android Struct Padding" + default y + help + This option enables the padding that the Android GKI kernel adds + to many different kernel structures to support an in-kernel stable ABI + over the lifespan of support for the kernel as well as OEM additional + fields that are needed by some of the Android kernel tracepoints. + + Only disable this option if you have a system that needs the Android + kernel drivers, but is NOT an Android GKI kernel image and you do NOT + use the Android kernel tracepoints. If disabled it has the possibility + to make the kernel static and runtime image slightly smaller but will + NOT be supported by the Google Android kernel team. + + If even slightly unsure, say Y. + endif # if ANDROID endmenu diff --git a/include/linux/android_kabi.h b/include/linux/android_kabi.h index 9c7b6c035ad3..dc0da1ab45d6 100644 --- a/include/linux/android_kabi.h +++ b/include/linux/android_kabi.h @@ -83,7 +83,11 @@ * number: the "number" of the padding variable in the structure. Start with * 1 and go up. */ +#ifdef CONFIG_ANDROID_STRUCT_PADDING #define ANDROID_KABI_RESERVE(number) _ANDROID_KABI_RESERVE(number) +#else +#define ANDROID_KABI_RESERVE(number) +#endif /* diff --git a/include/linux/android_vendor.h b/include/linux/android_vendor.h index 59fc5734bca2..ab3dca23966a 100644 --- a/include/linux/android_vendor.h +++ b/include/linux/android_vendor.h @@ -26,10 +26,25 @@ * Same as ANDROID_VENDOR_DATA but allocates an array of u64 with * the specified size */ +#ifdef CONFIG_ANDROID_STRUCT_PADDING #define ANDROID_VENDOR_DATA(n) u64 android_vendor_data##n #define ANDROID_VENDOR_DATA_ARRAY(n, s) u64 android_vendor_data##n[s] #define ANDROID_OEM_DATA(n) u64 android_oem_data##n #define ANDROID_OEM_DATA_ARRAY(n, s) u64 android_oem_data##n[s] +#define android_init_vendor_data(p, n) \ + memset(&p->android_vendor_data##n, 0, sizeof(p->android_vendor_data##n)) +#define android_init_oem_data(p, n) \ + memset(&p->android_oem_data##n, 0, sizeof(p->android_oem_data##n)) +#else +#define ANDROID_VENDOR_DATA(n) +#define ANDROID_VENDOR_DATA_ARRAY(n, s) +#define ANDROID_OEM_DATA(n) +#define ANDROID_OEM_DATA_ARRAY(n, s) + +#define android_init_vendor_data(p, n) +#define android_init_oem_data(p, n) +#endif + #endif /* _ANDROID_VENDOR_H */ diff --git a/init/init_task.c b/init/init_task.c index fba7fbed71dc..26e018fbbf78 100644 --- a/init/init_task.c +++ b/init/init_task.c @@ -213,8 +213,10 @@ struct task_struct init_task #ifdef CONFIG_SECCOMP_FILTER .seccomp = { .filter_count = ATOMIC_INIT(0) }, #endif +#ifdef CONFIG_ANDROID_STRUCT_PADDING .android_vendor_data1 = {0, }, .android_oem_data1 = {0, }, +#endif }; EXPORT_SYMBOL(init_task); diff --git a/kernel/fork.c b/kernel/fork.c index c4252e61e313..79f8221d286b 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -978,8 +978,10 @@ static struct task_struct *dup_task_struct(struct task_struct *orig, int node) #ifdef CONFIG_MEMCG tsk->active_memcg = NULL; #endif - memset(&tsk->android_vendor_data1, 0, sizeof(tsk->android_vendor_data1)); - memset(&tsk->android_oem_data1, 0, sizeof(tsk->android_oem_data1)); + + android_init_vendor_data(tsk, 1); + android_init_oem_data(tsk, 1); + trace_android_vh_dup_task_struct(tsk, orig); return tsk;