From ff89b8d8c28ee19dd94df239018c7142394c5082 Mon Sep 17 00:00:00 2001 From: Tri Vo Date: Tue, 24 Sep 2019 13:00:43 -0700 Subject: [PATCH] ueventd: duplicate /dev/ashmem We want ashmem to only be used via libcutils API, with long-term goal being deprecation of ashmem with memfd. To do that we route libcutils to a new source of ashmem fds. We then phase out uses of /dev/ashmem that doesn't go through libcutils using SELinux. In Q, we introduced ashmemd as the source of ashmem fds to libcutils. However, having a separate process and, consequently, binder hops to handle /dev/ashmem results in performance/memory overhead. To address the overhead, replace ashmemd with a duplicate of /dev/ashmem. Name it /dev/ashmem, where boot_id is a random number generated on each boot. This way we make sure that developers don't accidentally depend on /dev/ashmem, as that name can't be hardcoded. Bug: 139855428 Test: writing "add"/"remove" to /sys/class/misc/ashmem/uevent correctly adds/removes /dev/ashmem and /dev/ashmem/boot_id Change-Id: I36d23116048bfcd99903ba46cc133161835a2cfa --- init/devices.cpp | 21 +++++++++++++++++++++ init/devices.h | 1 + rootdir/ueventd.rc | 2 +- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/init/devices.cpp b/init/devices.cpp index f6e453aa6..9fbec641b 100644 --- a/init/devices.cpp +++ b/init/devices.cpp @@ -441,6 +441,23 @@ void DeviceHandler::HandleDevice(const std::string& action, const std::string& d } } +void DeviceHandler::HandleAshmemUevent(const Uevent& uevent) { + if (uevent.device_name == "ashmem") { + static const std::string boot_id_path = "/proc/sys/kernel/random/boot_id"; + std::string boot_id; + if (!ReadFileToString(boot_id_path, &boot_id)) { + PLOG(ERROR) << "Cannot duplicate ashmem device node. Failed to read " << boot_id_path; + return; + }; + boot_id = Trim(boot_id); + + Uevent dup_ashmem_uevent = uevent; + dup_ashmem_uevent.device_name += boot_id; + dup_ashmem_uevent.path += boot_id; + HandleUevent(dup_ashmem_uevent); + } +} + void DeviceHandler::HandleUevent(const Uevent& uevent) { if (uevent.action == "add" || uevent.action == "change" || uevent.action == "online") { FixupSysPermissions(uevent.path, uevent.subsystem); @@ -485,6 +502,10 @@ void DeviceHandler::HandleUevent(const Uevent& uevent) { mkdir_recursive(Dirname(devpath), 0755); HandleDevice(uevent.action, devpath, block, uevent.major, uevent.minor, links); + + // Duplicate /dev/ashmem device and name it /dev/ashmem. + // TODO(b/111903542): remove once all users of /dev/ashmem are migrated to libcutils API. + HandleAshmemUevent(uevent); } void DeviceHandler::ColdbootDone() { diff --git a/init/devices.h b/init/devices.h index 442c53f95..05d64da6e 100644 --- a/init/devices.h +++ b/init/devices.h @@ -130,6 +130,7 @@ class DeviceHandler : public UeventHandler { void HandleDevice(const std::string& action, const std::string& devpath, bool block, int major, int minor, const std::vector& links) const; void FixupSysPermissions(const std::string& upath, const std::string& subsystem) const; + void HandleAshmemUevent(const Uevent& uevent); std::vector dev_permissions_; std::vector sysfs_permissions_; diff --git a/rootdir/ueventd.rc b/rootdir/ueventd.rc index 451f5adf3..9c2cdf27f 100644 --- a/rootdir/ueventd.rc +++ b/rootdir/ueventd.rc @@ -33,7 +33,7 @@ subsystem sound /dev/urandom 0666 root root # Make HW RNG readable by group system to let EntropyMixer read it. /dev/hw_random 0440 root system -/dev/ashmem 0666 root root +/dev/ashmem* 0666 root root /dev/binder 0666 root root /dev/hwbinder 0666 root root /dev/vndbinder 0666 root root