From a39e4edeaa1635a6d6246bb9de470f046e4856e9 Mon Sep 17 00:00:00 2001 From: Andrei Homescu Date: Fri, 10 Dec 2021 08:41:54 +0000 Subject: binder: Eliminate a data copy in RPC transport operations Switch RpcTransportRaw to use sendmsg() and recvmsg() over iovecs to send data from multiple buffers to avoid having to copy all data into a single large buffer. Bug: 202878542 Test: atest binderRpcTest Change-Id: I8ba7fa815040555503160ae41888a0b0efe9e5d2 --- libs/binder/RpcServer.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'libs/binder/RpcServer.cpp') diff --git a/libs/binder/RpcServer.cpp b/libs/binder/RpcServer.cpp index 93ed50e986..ace5cd5052 100644 --- a/libs/binder/RpcServer.cpp +++ b/libs/binder/RpcServer.cpp @@ -287,8 +287,8 @@ void RpcServer::establishConnection(sp&& server, base::unique_fd clie RpcConnectionHeader header; if (status == OK) { - status = client->interruptableReadFully(server->mShutdownTrigger.get(), &header, - sizeof(header), {}); + iovec iov{&header, sizeof(header)}; + status = client->interruptableReadFully(server->mShutdownTrigger.get(), &iov, 1, {}); if (status != OK) { ALOGE("Failed to read ID for client connecting to RPC server: %s", statusToString(status).c_str()); @@ -301,8 +301,9 @@ void RpcServer::establishConnection(sp&& server, base::unique_fd clie if (header.sessionIdSize > 0) { if (header.sessionIdSize == kSessionIdBytes) { sessionId.resize(header.sessionIdSize); - status = client->interruptableReadFully(server->mShutdownTrigger.get(), - sessionId.data(), sessionId.size(), {}); + iovec iov{sessionId.data(), sessionId.size()}; + status = + client->interruptableReadFully(server->mShutdownTrigger.get(), &iov, 1, {}); if (status != OK) { ALOGE("Failed to read session ID for client connecting to RPC server: %s", statusToString(status).c_str()); @@ -331,8 +332,8 @@ void RpcServer::establishConnection(sp&& server, base::unique_fd clie .version = protocolVersion, }; - status = client->interruptableWriteFully(server->mShutdownTrigger.get(), &response, - sizeof(response), {}); + iovec iov{&response, sizeof(response)}; + status = client->interruptableWriteFully(server->mShutdownTrigger.get(), &iov, 1, {}); if (status != OK) { ALOGE("Failed to send new session response: %s", statusToString(status).c_str()); // still need to cleanup before we can return -- cgit v1.2.3-59-g8ed1b