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:
committed by
Facebook Github Bot
parent
6cccefa164
commit
a2b6dc5453
@@ -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,
|
||||||
|
@@ -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,
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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) {}
|
||||||
|
Reference in New Issue
Block a user