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;