Skip to content

Commit 702d8ff

Browse files
author
Pavel Siska
committed
dpdk: add rss argument to set user specific rss offload
1 parent c0c73b2 commit 702d8ff

File tree

4 files changed

+45
-10
lines changed

4 files changed

+45
-10
lines changed

src/plugins/input/dpdk/src/dpdk.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,13 @@ void DpdkCore::configure(const char* params)
8686
uint16_t rxQueueCount = parser.rx_queues();
8787
m_mBufsCount = parser.pkt_buffer_size();
8888
uint16_t mtuSize = parser.mtu_size();
89+
uint64_t rssOffload = parser.rss_offload();
8990

9091
configureEal(parser.eal_params());
9192

9293
m_dpdkDevices.reserve(parser.port_numbers().size());
9394
for (auto portID : parser.port_numbers()) {
94-
m_dpdkDevices.emplace_back(portID, rxQueueCount, mempoolSize, m_mBufsCount, mtuSize);
95+
m_dpdkDevices.emplace_back(portID, rxQueueCount, mempoolSize, m_mBufsCount, mtuSize, rssOffload);
9596
}
9697

9798
isConfigured = true;

src/plugins/input/dpdk/src/dpdk.hpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class DpdkOptParser : public OptionsParser {
3434
uint16_t rx_queues_ = 1;
3535
std::string eal_;
3636
uint16_t mtu_;
37+
uint64_t rss_offload_ = 0;
3738

3839
std::vector<uint16_t> parsePortNumbers(std::string arg)
3940
{
@@ -123,6 +124,20 @@ class DpdkOptParser : public OptionsParser {
123124
return true;
124125
},
125126
RequiredArgument);
127+
register_option(
128+
"r",
129+
"rss",
130+
"VALUE",
131+
"RSS offload value. Default: 0",
132+
[this](const char* arg) {
133+
try {
134+
rss_offload_ = str2num<decltype(rss_offload_)>(arg);
135+
} catch (std::invalid_argument&) {
136+
return false;
137+
}
138+
return true;
139+
},
140+
RequiredArgument);
126141
register_option(
127142
"e",
128143
"eal",
@@ -160,6 +175,8 @@ class DpdkOptParser : public OptionsParser {
160175
uint16_t rx_queues() const { return rx_queues_; }
161176

162177
uint16_t mtu_size() const { return mtu_; }
178+
179+
uint64_t rss_offload() const { return rss_offload_; }
163180
};
164181

165182
class DpdkCore {

src/plugins/input/dpdk/src/dpdkDevice.cpp

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@ DpdkDevice::DpdkDevice(
4242
uint16_t rxQueueCount,
4343
uint16_t memPoolSize,
4444
uint16_t mbufsCount,
45-
uint16_t mtuSize)
45+
uint16_t mtuSize,
46+
uint64_t rssOffload
47+
)
4648
: m_portID(portID)
4749
, m_rxQueueCount(rxQueueCount)
4850
, m_txQueueCount(0)
@@ -51,6 +53,7 @@ DpdkDevice::DpdkDevice(
5153
, m_supportedRSS(false)
5254
, m_supportedHWTimestamp(false)
5355
, m_mtuSize(mtuSize)
56+
, m_rssOffload(rssOffload)
5457
{
5558
validatePort();
5659
recognizeDriver();
@@ -94,9 +97,13 @@ void DpdkDevice::recognizeDriver()
9497
std::cerr << "\tflow type RSS offloads: " << rteDevInfo.flow_type_rss_offloads << std::endl;
9598

9699
/* Check if RSS hashing is supported in NIC */
97-
m_supportedRSS = (rteDevInfo.flow_type_rss_offloads & RTE_ETH_RSS_IP) != 0;
98-
std::cerr << "\tDetected RSS offload capability: " << (m_supportedRSS ? "yes" : "no")
99-
<< std::endl;
100+
if (m_rxQueueCount > 1) {
101+
m_supportedRSS = (rteDevInfo.flow_type_rss_offloads & RTE_ETH_RSS_IP) != 0;
102+
std::cerr << "\tDetected RSS offload capability: " << (m_supportedRSS ? "yes" : "no")
103+
<< std::endl;
104+
} else {
105+
m_supportedRSS = false;
106+
}
100107

101108
/* Check if HW timestamps are supported, we support NFB cards only */
102109
if (m_isNfbDpdkDriver) {
@@ -241,12 +248,19 @@ rte_eth_rss_conf DpdkDevice::createRSSConfig()
241248
return hashKey[idx++ % sizeof(hashKey)];
242249
});
243250

244-
const uint64_t rssOffloads = rteDevInfo.flow_type_rss_offloads & RTE_ETH_RSS_IP;
245-
if (rssOffloads != RTE_ETH_RSS_IP) {
246-
std::cerr << "RTE_ETH_RSS_IP is not supported by the card. Used subset: " << rssOffloads
247-
<< std::endl;
251+
uint64_t rssOffloads = 0;
252+
if (m_rssOffload) {
253+
rssOffloads = m_rssOffload;
254+
} else {
255+
rssOffloads = rteDevInfo.flow_type_rss_offloads & RTE_ETH_RSS_IP;
256+
if (rssOffloads != RTE_ETH_RSS_IP) {
257+
std::cerr << "RTE_ETH_RSS_IP is not supported by the card. Used subset: " << rssOffloads
258+
<< std::endl;
259+
}
248260
}
249261

262+
std::cerr << "RSS offloads: " << rssOffloads << std::endl;
263+
250264
rssConfig.rss_key = m_hashKey.data();
251265
rssConfig.rss_key_len = rssHashKeySize;
252266
rssConfig.rss_hf = rssOffloads;

src/plugins/input/dpdk/src/dpdkDevice.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,15 @@ class DpdkDevice {
4848
* @param memPoolSize The size of the memory pool for packet buffers.
4949
* @param mbufsCount The number of mbufs (packet buffers) to be allocated.
5050
* @param mtuSize Maximum transmission unit of input interface.
51+
* @param rssOffload RSS offload value. 0 for subset of RTE_ETH_RSS_IP.
5152
*/
5253
DpdkDevice(
5354
uint16_t portID,
5455
uint16_t rxQueueCount,
5556
uint16_t memPoolSize,
5657
uint16_t mbufsCount,
57-
uint16_t mtuSize);
58+
uint16_t mtuSize,
59+
uint64_t rssOffload);
5860

5961
/**
6062
* @brief Receives packets from the specified receive queue of the DPDK device.
@@ -102,6 +104,7 @@ class DpdkDevice {
102104
int m_rxTimestampOffset;
103105
int m_rxTimestampDynflag;
104106
uint16_t m_mtuSize;
107+
uint64_t m_rssOffload = 0;
105108
};
106109

107110
} // namespace ipxp

0 commit comments

Comments
 (0)