blob: d9f84e64386beb37192b7310aa176de57fa95cee [file]
From: Ben Gray <ben.gray@sky.uk>
Date: Fri Aug 6 2021
Source: COMCAST
Upstream-Status: Pending
Signed-off-by: Nikita Poltorapavlo <npoltorapavlo@productengine.com>
Subject: [PATCH] LLAMA-2254: High %CPU observed for WPEFramework
--- a/Source/core/SocketPort.h 2021-07-30 10:51:54.160807999 +0000
+++ b/Source/core/SocketPort.h 2021-08-06 09:18:11.889410000 +0000
@@ -113,6 +113,10 @@
{
return (m_SocketType);
}
+ inline SOCKET Socket() const
+ {
+ return m_Socket;
+ }
inline bool IsListening() const
{
return ((m_State & (SocketPort::SHUTDOWN | SocketPort::EXCEPTION | SocketPort::OPEN | SocketPort::LINK | SocketPort::ACCEPT)) == (SocketPort::OPEN | SocketPort::ACCEPT));
--- a/Source/core/Netlink.cpp 2021-07-30 10:51:54.156806000 +0000
+++ b/Source/core/Netlink.cpp 2021-08-06 09:19:19.090994000 +0000
@@ -236,6 +237,34 @@
return (result);
}
+ // Called right after socket is created
+ /* virtual */ bool SocketNetlink::Initialize()
+ {
+ if (!SocketDatagram::Initialize())
+ return false;
+
+ // For netlink sockets set decent sized kernel buffers, the default SocketPort code shrinks
+ // the kernel buffers to the same size as local buffers (for some reason), and this can
+ // cause ENOBUFS errors when reading the socket.
+ const SOCKET socket = Socket();
+ if (socket != INVALID_SOCKET)
+ {
+ int val = 80 * 1024;
+ if (::setsockopt(socket, SOL_SOCKET, SO_RCVBUF, &val, sizeof(int)) != 0)
+ TRACE_L1("Error setting SO_RCVBUF buffer size on netlink socket. Error %d", errno);
+
+ val = 80 * 1024;
+ if (::setsockopt(socket, SOL_SOCKET, SO_SNDBUF, &val, sizeof(int)) != 0)
+ TRACE_L1("Error setting SO_SNDBUF buffer size on netlink socket. Error %d", errno);
+
+ val = 1;
+ if (::setsockopt(socket, SOL_NETLINK, NETLINK_NO_ENOBUFS, &val, sizeof(int)) != 0)
+ TRACE_L1("Error setting NETLINK_NO_ENOBUFS flag on netlink socket. Error %d", errno);
+ }
+
+ return true;
+ }
+
// Signal a state change, Opened, Closed or Accepted
/* virtual */ void SocketNetlink::StateChange()
{
--- a/Source/core/Netlink.h 2021-07-30 10:51:54.156806000 +0000
+++ b/Source/core/Netlink.h 2021-08-06 09:40:53.589919997 +0000
@@ -394,6 +394,9 @@
virtual uint16_t Deserialize(const uint8_t dataFrame[], const uint16_t receivedSize) = 0;
+ protected:
+ virtual bool Initialize() override;
+
private:
// Methods to extract and insert data into the socket buffers
virtual uint16_t SendData(uint8_t* dataFrame, const uint16_t maxSendSize) override;