Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c8ab4055 authored by Daniel Mentz's avatar Daniel Mentz Committed by android-build-merger
Browse files

Merge "Increase netlink uevent rcvbuf size to 16M" am: 9cb7704a

am: bf7eea63

Change-Id: If2361ba43be7b4e32e2a6bf9b45cb865aa10e3cb
parents 793d0ea4 bf7eea63
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -87,8 +87,8 @@ static void ParseEvent(const char* msg, Uevent* uevent) {
}

UeventListener::UeventListener() {
    // is 2MB enough? udev uses 128MB!
    device_fd_.reset(uevent_open_socket(2 * 1024 * 1024, true));
    // is 16MB enough? udev uses 128MB!
    device_fd_.reset(uevent_open_socket(16 * 1024 * 1024, true));
    if (device_fd_ == -1) {
        LOG(FATAL) << "Could not open uevent socket";
    }
+14 −2
Original line number Diff line number Diff line
@@ -95,6 +95,8 @@ out:
int uevent_open_socket(int buf_sz, bool passcred) {
    struct sockaddr_nl addr;
    int on = passcred;
    int buf_sz_readback = 0;
    socklen_t optlen = sizeof(buf_sz_readback);
    int s;

    memset(&addr, 0, sizeof(addr));
@@ -105,11 +107,21 @@ int uevent_open_socket(int buf_sz, bool passcred) {
    s = socket(PF_NETLINK, SOCK_DGRAM | SOCK_CLOEXEC, NETLINK_KOBJECT_UEVENT);
    if (s < 0) return -1;

    /* buf_sz should be less than net.core.rmem_max for this to succeed */
    if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, &buf_sz, sizeof(buf_sz)) < 0) {
    if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, &buf_sz, sizeof(buf_sz)) < 0 ||
          getsockopt(s, SOL_SOCKET, SO_RCVBUF, &buf_sz_readback, &optlen) < 0) {
        close(s);
        return -1;
    }
    /* Only if SO_RCVBUF was not effective, try SO_RCVBUFFORCE. Generally, we
     * want to avoid SO_RCVBUFFORCE, because it generates SELinux denials in
     * case we don't have CAP_NET_ADMIN. This is the case, for example, for
     * healthd. */
    if (buf_sz_readback < 2 * buf_sz) {
        if (setsockopt(s, SOL_SOCKET, SO_RCVBUFFORCE, &buf_sz, sizeof(buf_sz)) < 0) {
            close(s);
            return -1;
        }
    }

    setsockopt(s, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on));