From 86250609b4358568d10c47694e88cc12d0263e77 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 30 Jan 2026 06:41:31 +0000 Subject: [PATCH 1/7] Enable required kernel features for Droidspaces on arm64 Enables the following kernel configurations in `arch/arm64/configs/gki_defconfig` to satisfy Droidspaces system requirements: - CONFIG_PID_NS: PID namespace isolation - CONFIG_UTS_NS: Hostname/domainname isolation - CONFIG_IPC_NS: Inter-process communication isolation - CONFIG_DEVTMPFS: Dynamic device filesystem - CONFIG_CGROUP_DEVICE: Device access control - CONFIG_SYSVIPC: System V IPC (required for IPC namespace utility) This fixes the "missing required features" error when checking system requirements. Co-authored-by: shedowe19 <76975113+shedowe19@users.noreply.github.com> --- arch/arm64/configs/gki_defconfig | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/arch/arm64/configs/gki_defconfig b/arch/arm64/configs/gki_defconfig index 5f6b090b93e30..d4e9f657b4c06 100644 --- a/arch/arm64/configs/gki_defconfig +++ b/arch/arm64/configs/gki_defconfig @@ -1,6 +1,7 @@ CONFIG_UAPI_HEADER_TEST=y CONFIG_AUDIT=y CONFIG_NO_HZ=y +CONFIG_SYSVIPC=y CONFIG_HIGH_RES_TIMERS=y CONFIG_BPF_SYSCALL=y CONFIG_BPF_JIT=y @@ -29,10 +30,13 @@ CONFIG_CGROUP_SCHED=y CONFIG_UCLAMP_TASK_GROUP=y CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y +CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y CONFIG_CGROUP_BPF=y CONFIG_NAMESPACES=y -# CONFIG_PID_NS is not set +CONFIG_UTS_NS=y +CONFIG_IPC_NS=y +CONFIG_PID_NS=y CONFIG_RT_SOFTIRQ_AWARE_SCHED=y # CONFIG_RD_BZIP2 is not set # CONFIG_RD_LZMA is not set @@ -310,6 +314,7 @@ CONFIG_PCIE_DW_PLAT_EP=y CONFIG_PCIE_QCOM=y CONFIG_PCIE_KIRIN=y CONFIG_PCI_ENDPOINT=y +CONFIG_DEVTMPFS=y CONFIG_FW_LOADER_USER_HELPER=y # CONFIG_FW_CACHE is not set # CONFIG_BRCMSTB_GISB_ARB is not set From 66d6849c64c5e5fbb6936cace5d7ce67e0b19c0e Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 30 Jan 2026 06:58:03 +0000 Subject: [PATCH 2/7] Enable comprehensive kernel features for Droidspaces on arm64 Enables a set of kernel configurations in `arch/arm64/configs/gki_defconfig` to fully support Droidspaces system requirements, including namespaces, IPC, and device management features. Configs added: - Namespaces: CONFIG_PID_NS, CONFIG_UTS_NS, CONFIG_IPC_NS, CONFIG_MNT_NS - IPC: CONFIG_SYSVIPC, CONFIG_POSIX_MQUEUE - Cgroups: CONFIG_CGROUP_DEVICE - Filesystem: CONFIG_DEVTMPFS - Firmware: CONFIG_FW_LOADER, CONFIG_FW_LOADER_COMPRESS - Other: CONFIG_SYSCTL This addresses both the initial missing feature errors and the expanded requirements list for minimal Droidspaces support. Co-authored-by: shedowe19 <76975113+shedowe19@users.noreply.github.com> --- arch/arm64/configs/gki_defconfig | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/arch/arm64/configs/gki_defconfig b/arch/arm64/configs/gki_defconfig index 5f6b090b93e30..268835bc8a386 100644 --- a/arch/arm64/configs/gki_defconfig +++ b/arch/arm64/configs/gki_defconfig @@ -1,6 +1,9 @@ CONFIG_UAPI_HEADER_TEST=y CONFIG_AUDIT=y CONFIG_NO_HZ=y +CONFIG_SYSCTL=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y CONFIG_HIGH_RES_TIMERS=y CONFIG_BPF_SYSCALL=y CONFIG_BPF_JIT=y @@ -29,10 +32,14 @@ CONFIG_CGROUP_SCHED=y CONFIG_UCLAMP_TASK_GROUP=y CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y +CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y CONFIG_CGROUP_BPF=y CONFIG_NAMESPACES=y -# CONFIG_PID_NS is not set +CONFIG_UTS_NS=y +CONFIG_IPC_NS=y +CONFIG_PID_NS=y +CONFIG_MNT_NS=y CONFIG_RT_SOFTIRQ_AWARE_SCHED=y # CONFIG_RD_BZIP2 is not set # CONFIG_RD_LZMA is not set @@ -310,7 +317,10 @@ CONFIG_PCIE_DW_PLAT_EP=y CONFIG_PCIE_QCOM=y CONFIG_PCIE_KIRIN=y CONFIG_PCI_ENDPOINT=y +CONFIG_DEVTMPFS=y +CONFIG_FW_LOADER=y CONFIG_FW_LOADER_USER_HELPER=y +CONFIG_FW_LOADER_COMPRESS=y # CONFIG_FW_CACHE is not set # CONFIG_BRCMSTB_GISB_ARB is not set # CONFIG_SUN50I_DE2_BUS is not set From 42a252e62fe3cd500acb561414d390e0002831e7 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 30 Jan 2026 07:36:04 +0000 Subject: [PATCH 3/7] Enable Droidspaces configs for gs201 and fix mm/vmscan.c build 1. Update `arch/arm64/configs/gs201_defconfig` (Pixel 7/Tensor G2) to enable required features for Droidspaces: - Namespaces: PID_NS, UTS_NS, IPC_NS, MNT_NS - Cgroups: MEMCG, CGROUP_DEVICE - Filesystems: DEVTMPFS - IPC: SYSVIPC, POSIX_MQUEUE - Firmware: FW_LOADER, FW_LOADER_COMPRESS - Other: SYSCTL 2. Fix build failure in `mm/vmscan.c` caused by enabling CONFIG_MEMCG: - Define `shrinker_rwsem` which was used but not declared. - Update `unregister_shrinker` to properly handle `shrinker_rwsem` when unregistering memcg-aware shrinkers. This moves the operation out of the `shrinker_rwlock` critical section (atomic context) to avoid sleeping while atomic and satisfies the `lockdep_assert_held` in `unregister_memcg_shrinker`. 3. Keep `arch/arm64/configs/gki_defconfig` changes for reference. This resolves the build errors and missing feature warnings for Droidspaces. Co-authored-by: shedowe19 <76975113+shedowe19@users.noreply.github.com> --- arch/arm64/configs/gki_defconfig | 12 +++++++++++- arch/arm64/configs/gs201_defconfig | 14 ++++++++++++-- mm/vmscan.c | 9 +++++++-- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/arch/arm64/configs/gki_defconfig b/arch/arm64/configs/gki_defconfig index 5f6b090b93e30..268835bc8a386 100644 --- a/arch/arm64/configs/gki_defconfig +++ b/arch/arm64/configs/gki_defconfig @@ -1,6 +1,9 @@ CONFIG_UAPI_HEADER_TEST=y CONFIG_AUDIT=y CONFIG_NO_HZ=y +CONFIG_SYSCTL=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y CONFIG_HIGH_RES_TIMERS=y CONFIG_BPF_SYSCALL=y CONFIG_BPF_JIT=y @@ -29,10 +32,14 @@ CONFIG_CGROUP_SCHED=y CONFIG_UCLAMP_TASK_GROUP=y CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y +CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y CONFIG_CGROUP_BPF=y CONFIG_NAMESPACES=y -# CONFIG_PID_NS is not set +CONFIG_UTS_NS=y +CONFIG_IPC_NS=y +CONFIG_PID_NS=y +CONFIG_MNT_NS=y CONFIG_RT_SOFTIRQ_AWARE_SCHED=y # CONFIG_RD_BZIP2 is not set # CONFIG_RD_LZMA is not set @@ -310,7 +317,10 @@ CONFIG_PCIE_DW_PLAT_EP=y CONFIG_PCIE_QCOM=y CONFIG_PCIE_KIRIN=y CONFIG_PCI_ENDPOINT=y +CONFIG_DEVTMPFS=y +CONFIG_FW_LOADER=y CONFIG_FW_LOADER_USER_HELPER=y +CONFIG_FW_LOADER_COMPRESS=y # CONFIG_FW_CACHE is not set # CONFIG_BRCMSTB_GISB_ARB is not set # CONFIG_SUN50I_DE2_BUS is not set diff --git a/arch/arm64/configs/gs201_defconfig b/arch/arm64/configs/gs201_defconfig index 766c6a6076585..cc81b0af233c6 100644 --- a/arch/arm64/configs/gs201_defconfig +++ b/arch/arm64/configs/gs201_defconfig @@ -3,6 +3,9 @@ CONFIG_LOCALVERSION="-Sultan" CONFIG_IRQ_SBALANCE=y CONFIG_SBALANCE_EXCLUDE_CPUS="3,5,7" CONFIG_NO_HZ=y +CONFIG_SYSCTL=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y CONFIG_HIGH_RES_TIMERS=y CONFIG_BPF_SYSCALL=y CONFIG_BPF_JIT=y @@ -29,11 +32,15 @@ CONFIG_CGROUP_SCHED=y CONFIG_UCLAMP_TASK_GROUP=y CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y +CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y +CONFIG_MEMCG=y CONFIG_CGROUP_BPF=y CONFIG_NAMESPACES=y -# CONFIG_UTS_NS is not set -# CONFIG_PID_NS is not set +CONFIG_UTS_NS=y +CONFIG_IPC_NS=y +CONFIG_PID_NS=y +CONFIG_MNT_NS=y CONFIG_SCHED_CASS=y CONFIG_RT_SOFTIRQ_AWARE_SCHED=y # CONFIG_RD_GZIP is not set @@ -321,7 +328,10 @@ CONFIG_PCI_IOV=y CONFIG_PCI_HOST_GENERIC=y CONFIG_PCIE_DW_PLAT_EP=y CONFIG_PCI_ENDPOINT=y +CONFIG_DEVTMPFS=y +CONFIG_FW_LOADER=y CONFIG_FW_LOADER_USER_HELPER=y +CONFIG_FW_LOADER_COMPRESS=y # CONFIG_FW_CACHE is not set CONFIG_ARM_SCMI_PROTOCOL=y # CONFIG_ARM_SCMI_POWER_DOMAIN is not set diff --git a/mm/vmscan.c b/mm/vmscan.c index 9dc481c588161..5ed8668b7491c 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -213,6 +213,7 @@ static void set_task_reclaim_state(struct task_struct *task, static LIST_HEAD(shrinker_list); static DEFINE_SPINLOCK(shrinker_lock); static DEFINE_RWLOCK(shrinker_rwlock); +static DECLARE_RWSEM(shrinker_rwsem); #ifdef CONFIG_MEMCG static int shrinker_nr_max; @@ -784,11 +785,15 @@ void unregister_shrinker(struct shrinker *shrinker) write_lock(&shrinker_rwlock); list_del(&shrinker->list); shrinker->flags &= ~SHRINKER_REGISTERED; - if (shrinker->flags & SHRINKER_MEMCG_AWARE) - unregister_memcg_shrinker(shrinker); debugfs_entry = shrinker_debugfs_remove(shrinker); write_unlock(&shrinker_rwlock); spin_unlock(&shrinker_lock); + + if (shrinker->flags & SHRINKER_MEMCG_AWARE) { + down_write(&shrinker_rwsem); + unregister_memcg_shrinker(shrinker); + up_write(&shrinker_rwsem); + } up_write(&shrinker->del_rwsem); debugfs_remove_recursive(debugfs_entry); From 6b6e2a7031f873cd66de6663e539234a90b3fdae Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 30 Jan 2026 07:48:29 +0000 Subject: [PATCH 4/7] Enable Droidspaces features for Pixel 7 (gs201) and Pixel 8 (zuma/zumapro) This commit enables the kernel configurations required for Droidspaces containerization support on Google Pixel 7 (gs201) and Pixel 8 series (zuma/zumapro). It enables the following kernel options: - Namespaces: PID_NS, UTS_NS, IPC_NS, MNT_NS - Cgroups: MEMCG, CGROUP_DEVICE - Filesystem: DEVTMPFS - IPC: SYSVIPC, POSIX_MQUEUE - Firmware: FW_LOADER, FW_LOADER_COMPRESS - Other: SYSCTL Additionally, it applies a fix to `mm/vmscan.c` to resolve a build failure and potential runtime crash (sleeping while atomic) when `CONFIG_MEMCG` is enabled. This involves defining `shrinker_rwsem` and using it to protect `unregister_memcg_shrinker` outside of the spinlock critical section. Configs updated: - arch/arm64/configs/gki_defconfig (GKI base) - arch/arm64/configs/gs201_defconfig (Pixel 7) - arch/arm64/configs/zuma_defconfig (Pixel 8) - arch/arm64/configs/zumapro_defconfig (Pixel 8 Pro) Co-authored-by: shedowe19 <76975113+shedowe19@users.noreply.github.com> --- arch/arm64/configs/gki_defconfig | 12 +++++++++++- arch/arm64/configs/gs201_defconfig | 14 ++++++++++++-- arch/arm64/configs/zuma_defconfig | 14 ++++++++++++-- arch/arm64/configs/zumapro_defconfig | 14 ++++++++++++-- mm/vmscan.c | 9 +++++++-- 5 files changed, 54 insertions(+), 9 deletions(-) diff --git a/arch/arm64/configs/gki_defconfig b/arch/arm64/configs/gki_defconfig index 5f6b090b93e30..268835bc8a386 100644 --- a/arch/arm64/configs/gki_defconfig +++ b/arch/arm64/configs/gki_defconfig @@ -1,6 +1,9 @@ CONFIG_UAPI_HEADER_TEST=y CONFIG_AUDIT=y CONFIG_NO_HZ=y +CONFIG_SYSCTL=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y CONFIG_HIGH_RES_TIMERS=y CONFIG_BPF_SYSCALL=y CONFIG_BPF_JIT=y @@ -29,10 +32,14 @@ CONFIG_CGROUP_SCHED=y CONFIG_UCLAMP_TASK_GROUP=y CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y +CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y CONFIG_CGROUP_BPF=y CONFIG_NAMESPACES=y -# CONFIG_PID_NS is not set +CONFIG_UTS_NS=y +CONFIG_IPC_NS=y +CONFIG_PID_NS=y +CONFIG_MNT_NS=y CONFIG_RT_SOFTIRQ_AWARE_SCHED=y # CONFIG_RD_BZIP2 is not set # CONFIG_RD_LZMA is not set @@ -310,7 +317,10 @@ CONFIG_PCIE_DW_PLAT_EP=y CONFIG_PCIE_QCOM=y CONFIG_PCIE_KIRIN=y CONFIG_PCI_ENDPOINT=y +CONFIG_DEVTMPFS=y +CONFIG_FW_LOADER=y CONFIG_FW_LOADER_USER_HELPER=y +CONFIG_FW_LOADER_COMPRESS=y # CONFIG_FW_CACHE is not set # CONFIG_BRCMSTB_GISB_ARB is not set # CONFIG_SUN50I_DE2_BUS is not set diff --git a/arch/arm64/configs/gs201_defconfig b/arch/arm64/configs/gs201_defconfig index 766c6a6076585..cc81b0af233c6 100644 --- a/arch/arm64/configs/gs201_defconfig +++ b/arch/arm64/configs/gs201_defconfig @@ -3,6 +3,9 @@ CONFIG_LOCALVERSION="-Sultan" CONFIG_IRQ_SBALANCE=y CONFIG_SBALANCE_EXCLUDE_CPUS="3,5,7" CONFIG_NO_HZ=y +CONFIG_SYSCTL=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y CONFIG_HIGH_RES_TIMERS=y CONFIG_BPF_SYSCALL=y CONFIG_BPF_JIT=y @@ -29,11 +32,15 @@ CONFIG_CGROUP_SCHED=y CONFIG_UCLAMP_TASK_GROUP=y CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y +CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y +CONFIG_MEMCG=y CONFIG_CGROUP_BPF=y CONFIG_NAMESPACES=y -# CONFIG_UTS_NS is not set -# CONFIG_PID_NS is not set +CONFIG_UTS_NS=y +CONFIG_IPC_NS=y +CONFIG_PID_NS=y +CONFIG_MNT_NS=y CONFIG_SCHED_CASS=y CONFIG_RT_SOFTIRQ_AWARE_SCHED=y # CONFIG_RD_GZIP is not set @@ -321,7 +328,10 @@ CONFIG_PCI_IOV=y CONFIG_PCI_HOST_GENERIC=y CONFIG_PCIE_DW_PLAT_EP=y CONFIG_PCI_ENDPOINT=y +CONFIG_DEVTMPFS=y +CONFIG_FW_LOADER=y CONFIG_FW_LOADER_USER_HELPER=y +CONFIG_FW_LOADER_COMPRESS=y # CONFIG_FW_CACHE is not set CONFIG_ARM_SCMI_PROTOCOL=y # CONFIG_ARM_SCMI_POWER_DOMAIN is not set diff --git a/arch/arm64/configs/zuma_defconfig b/arch/arm64/configs/zuma_defconfig index fe125724c342f..91596a5f2b9e4 100644 --- a/arch/arm64/configs/zuma_defconfig +++ b/arch/arm64/configs/zuma_defconfig @@ -3,6 +3,9 @@ CONFIG_LOCALVERSION="-Sultan" CONFIG_IRQ_SBALANCE=y CONFIG_SBALANCE_EXCLUDE_CPUS="3,7,8" CONFIG_NO_HZ=y +CONFIG_SYSCTL=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y CONFIG_HIGH_RES_TIMERS=y CONFIG_BPF_SYSCALL=y CONFIG_BPF_JIT=y @@ -30,10 +33,14 @@ CONFIG_UCLAMP_TASK_GROUP=y CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y CONFIG_CGROUP_CPUACCT=y +CONFIG_MEMCG=y +CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_BPF=y CONFIG_NAMESPACES=y -# CONFIG_UTS_NS is not set -# CONFIG_PID_NS is not set +CONFIG_UTS_NS=y +CONFIG_IPC_NS=y +CONFIG_PID_NS=y +CONFIG_MNT_NS=y CONFIG_SCHED_CASS=y CONFIG_RT_SOFTIRQ_AWARE_SCHED=y # CONFIG_RD_GZIP is not set @@ -314,7 +321,10 @@ CONFIG_PCI_IOV=y CONFIG_PCI_HOST_GENERIC=y CONFIG_PCIE_DW_PLAT_EP=y CONFIG_PCI_ENDPOINT=y +CONFIG_DEVTMPFS=y +CONFIG_FW_LOADER=y CONFIG_FW_LOADER_USER_HELPER=y +CONFIG_FW_LOADER_COMPRESS=y # CONFIG_FW_CACHE is not set CONFIG_ARM_SCMI_PROTOCOL=y # CONFIG_ARM_SCMI_POWER_DOMAIN is not set diff --git a/arch/arm64/configs/zumapro_defconfig b/arch/arm64/configs/zumapro_defconfig index 87af8eae236e2..c911f51e6a7e1 100644 --- a/arch/arm64/configs/zumapro_defconfig +++ b/arch/arm64/configs/zumapro_defconfig @@ -3,6 +3,9 @@ CONFIG_LOCALVERSION="-Sultan" CONFIG_IRQ_SBALANCE=y CONFIG_SBALANCE_EXCLUDE_CPUS="3,6,7" CONFIG_NO_HZ=y +CONFIG_SYSCTL=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y CONFIG_HIGH_RES_TIMERS=y CONFIG_BPF_SYSCALL=y CONFIG_BPF_JIT=y @@ -29,10 +32,14 @@ CONFIG_UCLAMP_TASK_GROUP=y CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y CONFIG_CGROUP_CPUACCT=y +CONFIG_MEMCG=y +CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_BPF=y CONFIG_NAMESPACES=y -# CONFIG_UTS_NS is not set -# CONFIG_PID_NS is not set +CONFIG_UTS_NS=y +CONFIG_IPC_NS=y +CONFIG_PID_NS=y +CONFIG_MNT_NS=y CONFIG_SCHED_CASS=y CONFIG_RT_SOFTIRQ_AWARE_SCHED=y # CONFIG_RD_GZIP is not set @@ -315,7 +322,10 @@ CONFIG_PCI_IOV=y CONFIG_PCI_HOST_GENERIC=y CONFIG_PCIE_DW_PLAT_EP=y CONFIG_PCI_ENDPOINT=y +CONFIG_DEVTMPFS=y +CONFIG_FW_LOADER=y CONFIG_FW_LOADER_USER_HELPER=y +CONFIG_FW_LOADER_COMPRESS=y # CONFIG_FW_CACHE is not set CONFIG_ARM_SCMI_PROTOCOL=y # CONFIG_ARM_SCMI_POWER_DOMAIN is not set diff --git a/mm/vmscan.c b/mm/vmscan.c index 9dc481c588161..5ed8668b7491c 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -213,6 +213,7 @@ static void set_task_reclaim_state(struct task_struct *task, static LIST_HEAD(shrinker_list); static DEFINE_SPINLOCK(shrinker_lock); static DEFINE_RWLOCK(shrinker_rwlock); +static DECLARE_RWSEM(shrinker_rwsem); #ifdef CONFIG_MEMCG static int shrinker_nr_max; @@ -784,11 +785,15 @@ void unregister_shrinker(struct shrinker *shrinker) write_lock(&shrinker_rwlock); list_del(&shrinker->list); shrinker->flags &= ~SHRINKER_REGISTERED; - if (shrinker->flags & SHRINKER_MEMCG_AWARE) - unregister_memcg_shrinker(shrinker); debugfs_entry = shrinker_debugfs_remove(shrinker); write_unlock(&shrinker_rwlock); spin_unlock(&shrinker_lock); + + if (shrinker->flags & SHRINKER_MEMCG_AWARE) { + down_write(&shrinker_rwsem); + unregister_memcg_shrinker(shrinker); + up_write(&shrinker_rwsem); + } up_write(&shrinker->del_rwsem); debugfs_remove_recursive(debugfs_entry); From f1ffc5cf80df403171a5fbbd7a8a61a3137b7c64 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 30 Jan 2026 10:24:22 +0000 Subject: [PATCH 5/7] Enable Droidspaces features and fix boot hang on Pixel devices This commit enables the kernel configurations required for Droidspaces containerization support on Google Pixel 7 (gs201) and Pixel 8 series (zuma/zumapro) and fixes a critical boot hang issue. 1. **Configuration Changes:** - Enables `CONFIG_PID_NS`, `CONFIG_UTS_NS`, `CONFIG_IPC_NS`, `CONFIG_MNT_NS` for namespace support. - Enables `CONFIG_MEMCG` and `CONFIG_CGROUP_DEVICE` for resource control. - Enables `CONFIG_DEVTMPFS` for device management. - Enables `CONFIG_SYSVIPC`, `CONFIG_POSIX_MQUEUE`, `CONFIG_FW_LOADER`, `CONFIG_FW_LOADER_COMPRESS`, `CONFIG_SYSCTL`. - Applied to: `gki_defconfig`, `gs201_defconfig`, `zuma_defconfig`, `zumapro_defconfig`. 2. **Boot Hang Fix (`mm/vmscan.c`):** - Enabling `CONFIG_MEMCG` activated code paths in `mm/vmscan.c` that relied on `shrinker_rwsem`, while the rest of the file used `shrinker_rwlock` and `shrinker_lock`. This mixed locking scheme caused a deadlock/boot hang. - **Fix:** Converted `shrinker_lock` (spinlock) and `shrinker_rwlock` (rwlock) to `shrinker_rwsem` (rwsem) globally in `mm/vmscan.c`. This ensures consistent locking, allows sleeping in shrinker registration/unregistration paths (preventing "sleeping in atomic" bugs), and resolves the lock inversion deadlock. This restores boot stability while providing full Droidspaces support. Co-authored-by: shedowe19 <76975113+shedowe19@users.noreply.github.com> --- arch/arm64/configs/gki_defconfig | 12 ++++++- arch/arm64/configs/gs201_defconfig | 14 ++++++-- arch/arm64/configs/zuma_defconfig | 14 ++++++-- arch/arm64/configs/zumapro_defconfig | 14 ++++++-- mm/vmscan.c | 53 ++++++++++++++-------------- 5 files changed, 73 insertions(+), 34 deletions(-) diff --git a/arch/arm64/configs/gki_defconfig b/arch/arm64/configs/gki_defconfig index 5f6b090b93e30..268835bc8a386 100644 --- a/arch/arm64/configs/gki_defconfig +++ b/arch/arm64/configs/gki_defconfig @@ -1,6 +1,9 @@ CONFIG_UAPI_HEADER_TEST=y CONFIG_AUDIT=y CONFIG_NO_HZ=y +CONFIG_SYSCTL=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y CONFIG_HIGH_RES_TIMERS=y CONFIG_BPF_SYSCALL=y CONFIG_BPF_JIT=y @@ -29,10 +32,14 @@ CONFIG_CGROUP_SCHED=y CONFIG_UCLAMP_TASK_GROUP=y CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y +CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y CONFIG_CGROUP_BPF=y CONFIG_NAMESPACES=y -# CONFIG_PID_NS is not set +CONFIG_UTS_NS=y +CONFIG_IPC_NS=y +CONFIG_PID_NS=y +CONFIG_MNT_NS=y CONFIG_RT_SOFTIRQ_AWARE_SCHED=y # CONFIG_RD_BZIP2 is not set # CONFIG_RD_LZMA is not set @@ -310,7 +317,10 @@ CONFIG_PCIE_DW_PLAT_EP=y CONFIG_PCIE_QCOM=y CONFIG_PCIE_KIRIN=y CONFIG_PCI_ENDPOINT=y +CONFIG_DEVTMPFS=y +CONFIG_FW_LOADER=y CONFIG_FW_LOADER_USER_HELPER=y +CONFIG_FW_LOADER_COMPRESS=y # CONFIG_FW_CACHE is not set # CONFIG_BRCMSTB_GISB_ARB is not set # CONFIG_SUN50I_DE2_BUS is not set diff --git a/arch/arm64/configs/gs201_defconfig b/arch/arm64/configs/gs201_defconfig index 766c6a6076585..cc81b0af233c6 100644 --- a/arch/arm64/configs/gs201_defconfig +++ b/arch/arm64/configs/gs201_defconfig @@ -3,6 +3,9 @@ CONFIG_LOCALVERSION="-Sultan" CONFIG_IRQ_SBALANCE=y CONFIG_SBALANCE_EXCLUDE_CPUS="3,5,7" CONFIG_NO_HZ=y +CONFIG_SYSCTL=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y CONFIG_HIGH_RES_TIMERS=y CONFIG_BPF_SYSCALL=y CONFIG_BPF_JIT=y @@ -29,11 +32,15 @@ CONFIG_CGROUP_SCHED=y CONFIG_UCLAMP_TASK_GROUP=y CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y +CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y +CONFIG_MEMCG=y CONFIG_CGROUP_BPF=y CONFIG_NAMESPACES=y -# CONFIG_UTS_NS is not set -# CONFIG_PID_NS is not set +CONFIG_UTS_NS=y +CONFIG_IPC_NS=y +CONFIG_PID_NS=y +CONFIG_MNT_NS=y CONFIG_SCHED_CASS=y CONFIG_RT_SOFTIRQ_AWARE_SCHED=y # CONFIG_RD_GZIP is not set @@ -321,7 +328,10 @@ CONFIG_PCI_IOV=y CONFIG_PCI_HOST_GENERIC=y CONFIG_PCIE_DW_PLAT_EP=y CONFIG_PCI_ENDPOINT=y +CONFIG_DEVTMPFS=y +CONFIG_FW_LOADER=y CONFIG_FW_LOADER_USER_HELPER=y +CONFIG_FW_LOADER_COMPRESS=y # CONFIG_FW_CACHE is not set CONFIG_ARM_SCMI_PROTOCOL=y # CONFIG_ARM_SCMI_POWER_DOMAIN is not set diff --git a/arch/arm64/configs/zuma_defconfig b/arch/arm64/configs/zuma_defconfig index fe125724c342f..91596a5f2b9e4 100644 --- a/arch/arm64/configs/zuma_defconfig +++ b/arch/arm64/configs/zuma_defconfig @@ -3,6 +3,9 @@ CONFIG_LOCALVERSION="-Sultan" CONFIG_IRQ_SBALANCE=y CONFIG_SBALANCE_EXCLUDE_CPUS="3,7,8" CONFIG_NO_HZ=y +CONFIG_SYSCTL=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y CONFIG_HIGH_RES_TIMERS=y CONFIG_BPF_SYSCALL=y CONFIG_BPF_JIT=y @@ -30,10 +33,14 @@ CONFIG_UCLAMP_TASK_GROUP=y CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y CONFIG_CGROUP_CPUACCT=y +CONFIG_MEMCG=y +CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_BPF=y CONFIG_NAMESPACES=y -# CONFIG_UTS_NS is not set -# CONFIG_PID_NS is not set +CONFIG_UTS_NS=y +CONFIG_IPC_NS=y +CONFIG_PID_NS=y +CONFIG_MNT_NS=y CONFIG_SCHED_CASS=y CONFIG_RT_SOFTIRQ_AWARE_SCHED=y # CONFIG_RD_GZIP is not set @@ -314,7 +321,10 @@ CONFIG_PCI_IOV=y CONFIG_PCI_HOST_GENERIC=y CONFIG_PCIE_DW_PLAT_EP=y CONFIG_PCI_ENDPOINT=y +CONFIG_DEVTMPFS=y +CONFIG_FW_LOADER=y CONFIG_FW_LOADER_USER_HELPER=y +CONFIG_FW_LOADER_COMPRESS=y # CONFIG_FW_CACHE is not set CONFIG_ARM_SCMI_PROTOCOL=y # CONFIG_ARM_SCMI_POWER_DOMAIN is not set diff --git a/arch/arm64/configs/zumapro_defconfig b/arch/arm64/configs/zumapro_defconfig index 87af8eae236e2..c911f51e6a7e1 100644 --- a/arch/arm64/configs/zumapro_defconfig +++ b/arch/arm64/configs/zumapro_defconfig @@ -3,6 +3,9 @@ CONFIG_LOCALVERSION="-Sultan" CONFIG_IRQ_SBALANCE=y CONFIG_SBALANCE_EXCLUDE_CPUS="3,6,7" CONFIG_NO_HZ=y +CONFIG_SYSCTL=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y CONFIG_HIGH_RES_TIMERS=y CONFIG_BPF_SYSCALL=y CONFIG_BPF_JIT=y @@ -29,10 +32,14 @@ CONFIG_UCLAMP_TASK_GROUP=y CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y CONFIG_CGROUP_CPUACCT=y +CONFIG_MEMCG=y +CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_BPF=y CONFIG_NAMESPACES=y -# CONFIG_UTS_NS is not set -# CONFIG_PID_NS is not set +CONFIG_UTS_NS=y +CONFIG_IPC_NS=y +CONFIG_PID_NS=y +CONFIG_MNT_NS=y CONFIG_SCHED_CASS=y CONFIG_RT_SOFTIRQ_AWARE_SCHED=y # CONFIG_RD_GZIP is not set @@ -315,7 +322,10 @@ CONFIG_PCI_IOV=y CONFIG_PCI_HOST_GENERIC=y CONFIG_PCIE_DW_PLAT_EP=y CONFIG_PCI_ENDPOINT=y +CONFIG_DEVTMPFS=y +CONFIG_FW_LOADER=y CONFIG_FW_LOADER_USER_HELPER=y +CONFIG_FW_LOADER_COMPRESS=y # CONFIG_FW_CACHE is not set CONFIG_ARM_SCMI_PROTOCOL=y # CONFIG_ARM_SCMI_POWER_DOMAIN is not set diff --git a/mm/vmscan.c b/mm/vmscan.c index 9dc481c588161..5c83691a18c9c 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -211,8 +211,7 @@ static void set_task_reclaim_state(struct task_struct *task, } static LIST_HEAD(shrinker_list); -static DEFINE_SPINLOCK(shrinker_lock); -static DEFINE_RWLOCK(shrinker_rwlock); +static DECLARE_RWSEM(shrinker_rwsem); #ifdef CONFIG_MEMCG static int shrinker_nr_max; @@ -719,12 +718,12 @@ void free_prealloced_shrinker(struct shrinker *shrinker) void register_shrinker_prepared(struct shrinker *shrinker) { init_rwsem(&shrinker->del_rwsem); - spin_lock(&shrinker_lock); + down_write(&shrinker_rwsem); /* Use the RCU list mutation primitive to allow concurrent iteration */ list_add_tail_rcu(&shrinker->list, &shrinker_list); shrinker->flags |= SHRINKER_REGISTERED; shrinker_debugfs_add(shrinker); - spin_unlock(&shrinker_lock); + up_write(&shrinker_rwsem); } static int __register_shrinker(struct shrinker *shrinker) @@ -780,15 +779,13 @@ void unregister_shrinker(struct shrinker *shrinker) * Wait until the shrinker list is no longer in use (shrinker_rwlock) */ down_write(&shrinker->del_rwsem); - spin_lock(&shrinker_lock); - write_lock(&shrinker_rwlock); - list_del(&shrinker->list); + down_write(&shrinker_rwsem); + list_del_rcu(&shrinker->list); shrinker->flags &= ~SHRINKER_REGISTERED; if (shrinker->flags & SHRINKER_MEMCG_AWARE) unregister_memcg_shrinker(shrinker); debugfs_entry = shrinker_debugfs_remove(shrinker); - write_unlock(&shrinker_rwlock); - spin_unlock(&shrinker_lock); + up_write(&shrinker_rwsem); up_write(&shrinker->del_rwsem); debugfs_remove_recursive(debugfs_entry); @@ -1040,28 +1037,30 @@ unsigned long shrink_slab(gfp_t gfp_mask, int nid, if (!mem_cgroup_disabled() && !mem_cgroup_is_root(memcg)) return shrink_slab_memcg(gfp_mask, nid, memcg, priority); - read_lock(&shrinker_rwlock); - /* Use the RCU list iteration primitive to allow concurrent additions */ - list_for_each_entry_rcu(shrinker, &shrinker_list, list) { - struct shrink_control sc = { - .gfp_mask = gfp_mask, - .nid = nid, - .memcg = memcg, - }; + if (down_read_trylock(&shrinker_rwsem)) { + /* Use the RCU list iteration primitive to allow concurrent additions */ + list_for_each_entry_rcu(shrinker, &shrinker_list, list) { + struct shrink_control sc = { + .gfp_mask = gfp_mask, + .nid = nid, + .memcg = memcg, + }; - if (!down_read_trylock(&shrinker->del_rwsem)) - continue; - read_unlock(&shrinker_rwlock); + if (!down_read_trylock(&shrinker->del_rwsem)) + continue; + up_read(&shrinker_rwsem); - ret = do_shrink_slab(&sc, shrinker, priority); - if (ret == SHRINK_EMPTY) - ret = 0; - freed += ret; + ret = do_shrink_slab(&sc, shrinker, priority); + if (ret == SHRINK_EMPTY) + ret = 0; + freed += ret; + + down_read(&shrinker_rwsem); + up_read(&shrinker->del_rwsem); + } - read_lock(&shrinker_rwlock); - up_read(&shrinker->del_rwsem); + up_read(&shrinker_rwsem); } - read_unlock(&shrinker_rwlock); cond_resched(); return freed; From 5795aba641394452bcc41e7444da7d52df51128d Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 30 Jan 2026 16:31:33 +0000 Subject: [PATCH 6/7] mm: vmscan: Fix potential deadlock in shrink_slab The system was hanging at boot, likely due to a deadlock in shrink_slab where it tries to re-acquire the global shrinker_rwsem (read) while holding a per-shrinker del_rwsem (read), potentially blocked by a writer (e.g., unregister_shrinker) waiting for the per-shrinker lock. This patch replaces the blocking down_read() with down_read_trylock(). If the lock cannot be acquired, we release the per-shrinker lock and abort the shrinker loop for this pass, avoiding the deadlock. This pattern is consistent with avoiding deadlocks when re-acquiring global locks after dropping them inside a loop. Co-authored-by: shedowe19 <76975113+shedowe19@users.noreply.github.com> --- mm/vmscan.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mm/vmscan.c b/mm/vmscan.c index 1f9133f891a94..520cda8abd589 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -1053,13 +1053,17 @@ unsigned long shrink_slab(gfp_t gfp_mask, int nid, ret = 0; freed += ret; - down_read(&shrinker_rwsem); + if (!down_read_trylock(&shrinker_rwsem)) { + up_read(&shrinker->del_rwsem); + goto out; + } up_read(&shrinker->del_rwsem); } up_read(&shrinker_rwsem); } +out: cond_resched(); return freed; } From 15257829e96129edbe19b6d2b4365ae2baa1dbed Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sat, 31 Jan 2026 04:41:54 +0000 Subject: [PATCH 7/7] arch: arm64: Enable CONFIG_PSI for Pixel platforms and add fw paths Enable `CONFIG_PSI=y` in `gs201_defconfig`, `zuma_defconfig`, and `zumapro_defconfig`. This is required by the Android Low Memory Killer Daemon (LMKD) to monitor memory pressure. Without it, LMKD crashes with "No kernel psi monitor support". Also, add standard Android firmware paths (`/vendor/firmware`, `/odm/firmware`, etc.) to `drivers/base/firmware_loader/main.c`. This resolves `ENOENT` errors when loading drivers like Mali GPU that store firmware in vendor partitions. Fixes: LMKD crash and GPU initialization failure. Co-authored-by: shedowe19 <76975113+shedowe19@users.noreply.github.com> --- arch/arm64/configs/gs201_defconfig | 1 + arch/arm64/configs/zuma_defconfig | 1 + arch/arm64/configs/zumapro_defconfig | 1 + drivers/base/firmware_loader/main.c | 7 ++++++- 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/arch/arm64/configs/gs201_defconfig b/arch/arm64/configs/gs201_defconfig index cc81b0af233c6..b891d7f857c27 100644 --- a/arch/arm64/configs/gs201_defconfig +++ b/arch/arm64/configs/gs201_defconfig @@ -855,3 +855,4 @@ CONFIG_TRUSTY=m # CONFIG_TRUSTY_TEST is not set CONFIG_TRUSTY_DMA_BUF_FFA_TAG=y CONFIG_TRUSTY_CRASH_IS_PANIC=y +CONFIG_PSI=y diff --git a/arch/arm64/configs/zuma_defconfig b/arch/arm64/configs/zuma_defconfig index 91596a5f2b9e4..cb4f723432c47 100644 --- a/arch/arm64/configs/zuma_defconfig +++ b/arch/arm64/configs/zuma_defconfig @@ -856,3 +856,4 @@ CONFIG_TRUSTY=m # CONFIG_TRUSTY_TEST is not set CONFIG_TRUSTY_DMA_BUF_FFA_TAG=y CONFIG_TRUSTY_CRASH_IS_PANIC=y +CONFIG_PSI=y diff --git a/arch/arm64/configs/zumapro_defconfig b/arch/arm64/configs/zumapro_defconfig index c911f51e6a7e1..2479bde916afd 100644 --- a/arch/arm64/configs/zumapro_defconfig +++ b/arch/arm64/configs/zumapro_defconfig @@ -860,3 +860,4 @@ CONFIG_BACKLIGHT_RT4539_GS=m CONFIG_QCOM_QBT_HANDLER=m CONFIG_LINK_DEVICE_PCIE_SOC_EXYNOS=y CONFIG_CP_PMIC=m +CONFIG_PSI=y diff --git a/drivers/base/firmware_loader/main.c b/drivers/base/firmware_loader/main.c index ec4d0ec3c810b..96b1e315468b6 100644 --- a/drivers/base/firmware_loader/main.c +++ b/drivers/base/firmware_loader/main.c @@ -485,7 +485,12 @@ static const char * const fw_path[] = { "/lib/firmware/updates/" UTS_RELEASE, "/lib/firmware/updates", "/lib/firmware/" UTS_RELEASE, - "/lib/firmware" + "/lib/firmware", + "/image", + "/vendor/firmware", + "/vendor/firmware/image", + "/odm/firmware", + "/odm/firmware/image" }; static char strpath[PATH_SIZE * CUSTOM_FW_PATH_COUNT];