Merge "ueventd: allow configuring SO_RCVBUF(FORCE) for the ueventd socket"
This commit is contained in:
commit
a64e9e843d
8 changed files with 63 additions and 25 deletions
|
|
@ -132,7 +132,9 @@ static bool IsRecoveryMode() {
|
||||||
// Class Definitions
|
// Class Definitions
|
||||||
// -----------------
|
// -----------------
|
||||||
FirstStageMount::FirstStageMount()
|
FirstStageMount::FirstStageMount()
|
||||||
: need_dm_verity_(false), fstab_(fs_mgr_read_fstab_dt(), fs_mgr_free_fstab) {
|
: need_dm_verity_(false),
|
||||||
|
fstab_(fs_mgr_read_fstab_dt(), fs_mgr_free_fstab),
|
||||||
|
uevent_listener_(16 * 1024 * 1024) {
|
||||||
// Stores fstab_->recs[] into mount_fstab_recs_ (vector<fstab_rec*>)
|
// Stores fstab_->recs[] into mount_fstab_recs_ (vector<fstab_rec*>)
|
||||||
// for easier manipulation later, e.g., range-base for loop.
|
// for easier manipulation later, e.g., range-base for loop.
|
||||||
if (fstab_) {
|
if (fstab_) {
|
||||||
|
|
|
||||||
|
|
@ -86,9 +86,8 @@ static void ParseEvent(const char* msg, Uevent* uevent) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
UeventListener::UeventListener() {
|
UeventListener::UeventListener(size_t uevent_socket_rcvbuf_size) {
|
||||||
// is 16MB enough? udev uses 128MB!
|
device_fd_.reset(uevent_open_socket(uevent_socket_rcvbuf_size, true));
|
||||||
device_fd_.reset(uevent_open_socket(16 * 1024 * 1024, true));
|
|
||||||
if (device_fd_ == -1) {
|
if (device_fd_ == -1) {
|
||||||
LOG(FATAL) << "Could not open uevent socket";
|
LOG(FATAL) << "Could not open uevent socket";
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ using ListenerCallback = std::function<ListenerAction(const Uevent&)>;
|
||||||
|
|
||||||
class UeventListener {
|
class UeventListener {
|
||||||
public:
|
public:
|
||||||
UeventListener();
|
UeventListener(size_t uevent_socket_rcvbuf_size);
|
||||||
|
|
||||||
void RegenerateUevents(const ListenerCallback& callback) const;
|
void RegenerateUevents(const ListenerCallback& callback) const;
|
||||||
ListenerAction RegenerateUeventsForPath(const std::string& path,
|
ListenerAction RegenerateUeventsForPath(const std::string& path,
|
||||||
|
|
|
||||||
|
|
@ -233,29 +233,26 @@ int ueventd_main(int argc, char** argv) {
|
||||||
SelabelInitialize();
|
SelabelInitialize();
|
||||||
|
|
||||||
std::vector<std::unique_ptr<UeventHandler>> uevent_handlers;
|
std::vector<std::unique_ptr<UeventHandler>> uevent_handlers;
|
||||||
UeventListener uevent_listener;
|
|
||||||
|
|
||||||
{
|
// Keep the current product name base configuration so we remain backwards compatible and
|
||||||
// Keep the current product name base configuration so we remain backwards compatible and
|
// allow it to override everything.
|
||||||
// allow it to override everything.
|
// TODO: cleanup platform ueventd.rc to remove vendor specific device node entries (b/34968103)
|
||||||
// TODO: cleanup platform ueventd.rc to remove vendor specific device node entries (b/34968103)
|
auto hardware = android::base::GetProperty("ro.hardware", "");
|
||||||
auto hardware = android::base::GetProperty("ro.hardware", "");
|
|
||||||
|
|
||||||
auto ueventd_configuration =
|
auto ueventd_configuration = ParseConfig({"/ueventd.rc", "/vendor/ueventd.rc",
|
||||||
ParseConfig({"/ueventd.rc", "/vendor/ueventd.rc", "/odm/ueventd.rc",
|
"/odm/ueventd.rc", "/ueventd." + hardware + ".rc"});
|
||||||
"/ueventd." + hardware + ".rc"});
|
|
||||||
|
|
||||||
uevent_handlers.emplace_back(std::make_unique<DeviceHandler>(
|
uevent_handlers.emplace_back(std::make_unique<DeviceHandler>(
|
||||||
std::move(ueventd_configuration.dev_permissions),
|
std::move(ueventd_configuration.dev_permissions),
|
||||||
std::move(ueventd_configuration.sysfs_permissions),
|
std::move(ueventd_configuration.sysfs_permissions),
|
||||||
std::move(ueventd_configuration.subsystems), fs_mgr_get_boot_devices(), true));
|
std::move(ueventd_configuration.subsystems), fs_mgr_get_boot_devices(), true));
|
||||||
uevent_handlers.emplace_back(std::make_unique<FirmwareHandler>(
|
uevent_handlers.emplace_back(std::make_unique<FirmwareHandler>(
|
||||||
std::move(ueventd_configuration.firmware_directories)));
|
std::move(ueventd_configuration.firmware_directories)));
|
||||||
|
|
||||||
if (ueventd_configuration.enable_modalias_handling) {
|
if (ueventd_configuration.enable_modalias_handling) {
|
||||||
uevent_handlers.emplace_back(std::make_unique<ModaliasHandler>());
|
uevent_handlers.emplace_back(std::make_unique<ModaliasHandler>());
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
UeventListener uevent_listener(ueventd_configuration.uevent_socket_rcvbuf_size);
|
||||||
|
|
||||||
if (access(COLDBOOT_DONE, F_OK) != 0) {
|
if (access(COLDBOOT_DONE, F_OK) != 0) {
|
||||||
ColdBoot cold_boot(uevent_listener, uevent_handlers);
|
ColdBoot cold_boot(uevent_listener, uevent_handlers);
|
||||||
|
|
|
||||||
|
|
@ -19,9 +19,13 @@
|
||||||
#include <grp.h>
|
#include <grp.h>
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
|
|
||||||
|
#include <android-base/parseint.h>
|
||||||
|
|
||||||
#include "keyword_map.h"
|
#include "keyword_map.h"
|
||||||
#include "parser.h"
|
#include "parser.h"
|
||||||
|
|
||||||
|
using android::base::ParseByteCount;
|
||||||
|
|
||||||
namespace android {
|
namespace android {
|
||||||
namespace init {
|
namespace init {
|
||||||
|
|
||||||
|
|
@ -101,6 +105,22 @@ Result<Success> ParseModaliasHandlingLine(std::vector<std::string>&& args,
|
||||||
return Success();
|
return Success();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Result<Success> ParseUeventSocketRcvbufSizeLine(std::vector<std::string>&& args,
|
||||||
|
size_t* uevent_socket_rcvbuf_size) {
|
||||||
|
if (args.size() != 2) {
|
||||||
|
return Error() << "uevent_socket_rcvbuf_size lines take exactly one parameter";
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t parsed_size;
|
||||||
|
if (!ParseByteCount(args[1], &parsed_size)) {
|
||||||
|
return Error() << "could not parse size '" << args[1] << "' for uevent_socket_rcvbuf_line";
|
||||||
|
}
|
||||||
|
|
||||||
|
*uevent_socket_rcvbuf_size = parsed_size;
|
||||||
|
|
||||||
|
return Success();
|
||||||
|
}
|
||||||
|
|
||||||
class SubsystemParser : public SectionParser {
|
class SubsystemParser : public SectionParser {
|
||||||
public:
|
public:
|
||||||
SubsystemParser(std::vector<Subsystem>* subsystems) : subsystems_(subsystems) {}
|
SubsystemParser(std::vector<Subsystem>* subsystems) : subsystems_(subsystems) {}
|
||||||
|
|
@ -202,6 +222,9 @@ UeventdConfiguration ParseConfig(const std::vector<std::string>& configs) {
|
||||||
parser.AddSingleLineParser("modalias_handling",
|
parser.AddSingleLineParser("modalias_handling",
|
||||||
std::bind(ParseModaliasHandlingLine, _1,
|
std::bind(ParseModaliasHandlingLine, _1,
|
||||||
&ueventd_configuration.enable_modalias_handling));
|
&ueventd_configuration.enable_modalias_handling));
|
||||||
|
parser.AddSingleLineParser("uevent_socket_rcvbuf_size",
|
||||||
|
std::bind(ParseUeventSocketRcvbufSizeLine, _1,
|
||||||
|
&ueventd_configuration.uevent_socket_rcvbuf_size));
|
||||||
|
|
||||||
for (const auto& config : configs) {
|
for (const auto& config : configs) {
|
||||||
parser.ParseConfig(config);
|
parser.ParseConfig(config);
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@ struct UeventdConfiguration {
|
||||||
std::vector<Permissions> dev_permissions;
|
std::vector<Permissions> dev_permissions;
|
||||||
std::vector<std::string> firmware_directories;
|
std::vector<std::string> firmware_directories;
|
||||||
bool enable_modalias_handling = false;
|
bool enable_modalias_handling = false;
|
||||||
|
size_t uevent_socket_rcvbuf_size = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
UeventdConfiguration ParseConfig(const std::vector<std::string>& configs);
|
UeventdConfiguration ParseConfig(const std::vector<std::string>& configs);
|
||||||
|
|
|
||||||
|
|
@ -138,6 +138,15 @@ firmware_directories /more
|
||||||
TestUeventdFile(ueventd_file, {{}, {}, {}, firmware_directories});
|
TestUeventdFile(ueventd_file, {{}, {}, {}, firmware_directories});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(ueventd_parser, UeventSocketRcvbufSize) {
|
||||||
|
auto ueventd_file = R"(
|
||||||
|
uevent_socket_rcvbuf_size 8k
|
||||||
|
uevent_socket_rcvbuf_size 8M
|
||||||
|
)";
|
||||||
|
|
||||||
|
TestUeventdFile(ueventd_file, {{}, {}, {}, {}, false, 8 * 1024 * 1024});
|
||||||
|
}
|
||||||
|
|
||||||
TEST(ueventd_parser, AllTogether) {
|
TEST(ueventd_parser, AllTogether) {
|
||||||
auto ueventd_file = R"(
|
auto ueventd_file = R"(
|
||||||
|
|
||||||
|
|
@ -169,6 +178,8 @@ subsystem test_devpath_dirname
|
||||||
/sys/devices/virtual/*/input poll_delay 0660 root input
|
/sys/devices/virtual/*/input poll_delay 0660 root input
|
||||||
firmware_directories /more
|
firmware_directories /more
|
||||||
|
|
||||||
|
uevent_socket_rcvbuf_size 6M
|
||||||
|
|
||||||
#ending comment
|
#ending comment
|
||||||
)";
|
)";
|
||||||
|
|
||||||
|
|
@ -197,8 +208,10 @@ firmware_directories /more
|
||||||
"/more",
|
"/more",
|
||||||
};
|
};
|
||||||
|
|
||||||
TestUeventdFile(ueventd_file,
|
size_t uevent_socket_rcvbuf_size = 6 * 1024 * 1024;
|
||||||
{subsystems, sysfs_permissions, permissions, firmware_directories});
|
|
||||||
|
TestUeventdFile(ueventd_file, {subsystems, sysfs_permissions, permissions, firmware_directories,
|
||||||
|
false, uevent_socket_rcvbuf_size});
|
||||||
}
|
}
|
||||||
|
|
||||||
// All of these lines are ill-formed, so test that there is 0 output.
|
// All of these lines are ill-formed, so test that there is 0 output.
|
||||||
|
|
@ -213,6 +226,8 @@ firmware_directories #no directory listed
|
||||||
/sys/devices/platform/trusty.* trusty_version 0440 baduidbad log
|
/sys/devices/platform/trusty.* trusty_version 0440 baduidbad log
|
||||||
/sys/devices/platform/trusty.* trusty_version 0440 root baduidbad
|
/sys/devices/platform/trusty.* trusty_version 0440 root baduidbad
|
||||||
|
|
||||||
|
uevent_socket_rcvbuf_size blah
|
||||||
|
|
||||||
subsystem #no name
|
subsystem #no name
|
||||||
|
|
||||||
)";
|
)";
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
firmware_directories /etc/firmware/ /odm/firmware/ /vendor/firmware/ /firmware/image/
|
firmware_directories /etc/firmware/ /odm/firmware/ /vendor/firmware/ /firmware/image/
|
||||||
|
uevent_socket_rcvbuf_size 16M
|
||||||
|
|
||||||
subsystem adf
|
subsystem adf
|
||||||
devname uevent_devname
|
devname uevent_devname
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue