1
0
mirror of https://github.com/facebookincubator/mvfst.git synced 2025-08-06 22:22:38 +03:00

Inline getPacketSequenceNum and getPacketNumSpace

Summary: As it turns out these end up being hot functions. Most of the hotness is it taking the cache miss, but we're able to reduce it from .9% exclusive each to .1-.3% exclusive each by inlining it (which eliminates a `callq` instruction for each).

Reviewed By: yangchi

Differential Revision: D19069685

fbshipit-source-id: c971a4d1c26a7e48008c36a129e0a842a27ca87f
This commit is contained in:
Matt Joras
2019-12-14 20:16:01 -08:00
committed by Facebook Github Bot
parent 6cccefa164
commit a2b6dc5453
4 changed files with 57 additions and 67 deletions

View File

@@ -570,7 +570,7 @@ uint64_t writeCryptoAndAckDataToSocket(
std::move(FrameScheduler::Builder( std::move(FrameScheduler::Builder(
connection, connection,
encryptionLevel, encryptionLevel,
longHeaderTypeToPacketNumberSpace(packetType), LongHeader::typeToPacketNumberSpace(packetType),
"CryptoAndAcksScheduler") "CryptoAndAcksScheduler")
.ackFrames() .ackFrames()
.cryptoFrames()) .cryptoFrames())
@@ -583,7 +583,7 @@ uint64_t writeCryptoAndAckDataToSocket(
srcConnId, srcConnId,
dstConnId, dstConnId,
std::move(builder), std::move(builder),
longHeaderTypeToPacketNumberSpace(packetType), LongHeader::typeToPacketNumberSpace(packetType),
scheduler, scheduler,
congestionControlWritableBytes, congestionControlWritableBytes,
packetLimit, packetLimit,
@@ -686,7 +686,7 @@ uint64_t writeZeroRttDataToSocket(
std::move(FrameScheduler::Builder( std::move(FrameScheduler::Builder(
connection, connection,
encryptionLevel, encryptionLevel,
longHeaderTypeToPacketNumberSpace(type), LongHeader::typeToPacketNumberSpace(type),
"ZeroRttScheduler") "ZeroRttScheduler")
.streamFrames() .streamFrames()
.streamRetransmissions() .streamRetransmissions()
@@ -701,7 +701,7 @@ uint64_t writeZeroRttDataToSocket(
srcConnId, srcConnId,
dstConnId, dstConnId,
std::move(builder), std::move(builder),
longHeaderTypeToPacketNumberSpace(type), LongHeader::typeToPacketNumberSpace(type),
scheduler, scheduler,
congestionControlWritableBytes, congestionControlWritableBytes,
packetLimit, packetLimit,
@@ -827,7 +827,7 @@ void writeLongClose(
srcConnId, srcConnId,
dstConnId, dstConnId,
getNextPacketNum( getNextPacketNum(
connection, longHeaderTypeToPacketNumberSpace(headerType)), connection, LongHeader::typeToPacketNumberSpace(headerType)),
version); version);
writeCloseCommon( writeCloseCommon(
sock, sock,

View File

@@ -64,7 +64,7 @@ void writeCryptoDataProbesToSocketForTest(
LongHeader::Types type = LongHeader::Types::Initial) { LongHeader::Types type = LongHeader::Types::Initial) {
auto encryptionLevel = auto encryptionLevel =
protectionTypeToEncryptionLevel(longHeaderTypeToProtectionType(type)); protectionTypeToEncryptionLevel(longHeaderTypeToProtectionType(type));
auto pnSpace = longHeaderTypeToPacketNumberSpace(type); auto pnSpace = LongHeader::typeToPacketNumberSpace(type);
auto scheduler = std::move(FrameScheduler::Builder( auto scheduler = std::move(FrameScheduler::Builder(
conn, encryptionLevel, pnSpace, "Crypto") conn, encryptionLevel, pnSpace, "Crypto")
.cryptoFrames()) .cryptoFrames())
@@ -75,7 +75,7 @@ void writeCryptoDataProbesToSocketForTest(
*conn.clientConnectionId, *conn.clientConnectionId,
*conn.serverConnectionId, *conn.serverConnectionId,
LongHeaderBuilder(type), LongHeaderBuilder(type),
longHeaderTypeToPacketNumberSpace(type), LongHeader::typeToPacketNumberSpace(type),
scheduler, scheduler,
probesToSend, probesToSend,
aead, aead,

View File

@@ -145,17 +145,6 @@ const ShortHeader* PacketHeader::asShort() const {
} }
} }
PacketNum PacketHeader::getPacketSequenceNum() const {
switch (headerForm_) {
case HeaderForm::Long:
return longHeader.getPacketSequenceNum();
case HeaderForm::Short:
return shortHeader.getPacketSequenceNum();
default:
folly::assume_unreachable();
}
}
HeaderForm PacketHeader::getHeaderForm() const { HeaderForm PacketHeader::getHeaderForm() const {
return headerForm_; return headerForm_;
} }
@@ -171,17 +160,6 @@ ProtectionType PacketHeader::getProtectionType() const {
} }
} }
PacketNumberSpace PacketHeader::getPacketNumberSpace() const {
switch (headerForm_) {
case HeaderForm::Long:
return longHeader.getPacketNumberSpace();
case HeaderForm::Short:
return shortHeader.getPacketNumberSpace();
default:
folly::assume_unreachable();
}
}
LongHeader::LongHeader( LongHeader::LongHeader(
Types type, Types type,
LongHeaderInvariant invariant, LongHeaderInvariant invariant,
@@ -235,10 +213,6 @@ const std::string& LongHeader::getToken() const {
return token_; return token_;
} }
PacketNum LongHeader::getPacketSequenceNum() const {
return packetSequenceNum_;
}
void LongHeader::setPacketNumber(PacketNum packetNum) { void LongHeader::setPacketNumber(PacketNum packetNum) {
packetSequenceNum_ = packetNum; packetSequenceNum_ = packetNum;
} }
@@ -247,10 +221,6 @@ ProtectionType LongHeader::getProtectionType() const {
return longHeaderTypeToProtectionType(getHeaderType()); return longHeaderTypeToProtectionType(getHeaderType());
} }
PacketNumberSpace LongHeader::getPacketNumberSpace() const {
return longHeaderTypeToPacketNumberSpace(getHeaderType());
}
ProtectionType longHeaderTypeToProtectionType( ProtectionType longHeaderTypeToProtectionType(
LongHeader::Types longHeaderType) { LongHeader::Types longHeaderType) {
switch (longHeaderType) { switch (longHeaderType) {
@@ -268,20 +238,6 @@ ProtectionType longHeaderTypeToProtectionType(
ShortHeaderInvariant::ShortHeaderInvariant(ConnectionId dcid) ShortHeaderInvariant::ShortHeaderInvariant(ConnectionId dcid)
: destinationConnId(std::move(dcid)) {} : destinationConnId(std::move(dcid)) {}
PacketNumberSpace longHeaderTypeToPacketNumberSpace(
LongHeader::Types longHeaderType) {
switch (longHeaderType) {
case LongHeader::Types::Initial:
case LongHeader::Types::Retry:
return PacketNumberSpace::Initial;
case LongHeader::Types::Handshake:
return PacketNumberSpace::Handshake;
case LongHeader::Types::ZeroRtt:
return PacketNumberSpace::AppData;
}
folly::assume_unreachable();
}
ShortHeader::ShortHeader( ShortHeader::ShortHeader(
ProtectionType protectionType, ProtectionType protectionType,
ConnectionId connId, ConnectionId connId,
@@ -308,18 +264,10 @@ ProtectionType ShortHeader::getProtectionType() const {
return protectionType_; return protectionType_;
} }
PacketNumberSpace ShortHeader::getPacketNumberSpace() const {
return PacketNumberSpace::AppData;
}
const ConnectionId& ShortHeader::getConnectionId() const { const ConnectionId& ShortHeader::getConnectionId() const {
return connectionId_; return connectionId_;
} }
PacketNum ShortHeader::getPacketSequenceNum() const {
return packetSequenceNum_;
}
void ShortHeader::setPacketNumber(PacketNum packetNum) { void ShortHeader::setPacketNumber(PacketNum packetNum) {
packetSequenceNum_ = packetNum; packetSequenceNum_ = packetNum;
} }

View File

@@ -645,6 +645,20 @@ struct LongHeader {
Retry = 0x3, Retry = 0x3,
}; };
// Note this is defined in the header so it is inlined for performance.
static PacketNumberSpace typeToPacketNumberSpace(Types longHeaderType) {
switch (longHeaderType) {
case LongHeader::Types::Initial:
case LongHeader::Types::Retry:
return PacketNumberSpace::Initial;
case LongHeader::Types::Handshake:
return PacketNumberSpace::Handshake;
case LongHeader::Types::ZeroRtt:
return PacketNumberSpace::AppData;
}
folly::assume_unreachable();
}
LongHeader( LongHeader(
Types type, Types type,
const ConnectionId& srcConnId, const ConnectionId& srcConnId,
@@ -670,11 +684,17 @@ struct LongHeader {
const ConnectionId& getDestinationConnId() const; const ConnectionId& getDestinationConnId() const;
const folly::Optional<ConnectionId>& getOriginalDstConnId() const; const folly::Optional<ConnectionId>& getOriginalDstConnId() const;
QuicVersion getVersion() const; QuicVersion getVersion() const;
PacketNumberSpace getPacketNumberSpace() const; // Note this is defined in the header so it is inlined for performance.
PacketNumberSpace getPacketNumberSpace() const {
return typeToPacketNumberSpace(longHeaderType_);
}
ProtectionType getProtectionType() const; ProtectionType getProtectionType() const;
bool hasToken() const; bool hasToken() const;
const std::string& getToken() const; const std::string& getToken() const;
PacketNum getPacketSequenceNum() const; // Note this is defined in the header so it is inlined for performance.
PacketNum getPacketSequenceNum() const {
return packetSequenceNum_;
}
void setPacketNumber(PacketNum packetNum); void setPacketNumber(PacketNum packetNum);
@@ -717,8 +737,12 @@ struct ShortHeader {
PacketNum packetNum); PacketNum packetNum);
ProtectionType getProtectionType() const; ProtectionType getProtectionType() const;
PacketNumberSpace getPacketNumberSpace() const; PacketNumberSpace getPacketNumberSpace() const {
PacketNum getPacketSequenceNum() const; return PacketNumberSpace::AppData;
}
PacketNum getPacketSequenceNum() const {
return packetSequenceNum_;
}
const ConnectionId& getConnectionId() const; const ConnectionId& getConnectionId() const;
void setPacketNumber(PacketNum packetNum); void setPacketNumber(PacketNum packetNum);
@@ -755,10 +779,30 @@ struct PacketHeader {
const LongHeader* asLong() const; const LongHeader* asLong() const;
const ShortHeader* asShort() const; const ShortHeader* asShort() const;
PacketNum getPacketSequenceNum() const; // Note this is defined in the header so it is inlined for performance.
PacketNum getPacketSequenceNum() const {
switch (headerForm_) {
case HeaderForm::Long:
return longHeader.getPacketSequenceNum();
case HeaderForm::Short:
return shortHeader.getPacketSequenceNum();
default:
folly::assume_unreachable();
}
}
HeaderForm getHeaderForm() const; HeaderForm getHeaderForm() const;
ProtectionType getProtectionType() const; ProtectionType getProtectionType() const;
PacketNumberSpace getPacketNumberSpace() const; // Note this is defined in the header so it is inlined for performance.
PacketNumberSpace getPacketNumberSpace() const {
switch (headerForm_) {
case HeaderForm::Long:
return longHeader.getPacketNumberSpace();
case HeaderForm::Short:
return shortHeader.getPacketNumberSpace();
default:
folly::assume_unreachable();
}
}
private: private:
void destroyHeader(); void destroyHeader();
@@ -773,8 +817,6 @@ struct PacketHeader {
ProtectionType longHeaderTypeToProtectionType(LongHeader::Types type); ProtectionType longHeaderTypeToProtectionType(LongHeader::Types type);
PacketNumberSpace longHeaderTypeToPacketNumberSpace(LongHeader::Types type);
struct StreamTypeField { struct StreamTypeField {
public: public:
explicit StreamTypeField(uint8_t field) : field_(field) {} explicit StreamTypeField(uint8_t field) : field_(field) {}