Skip to content

Commit 05b23ca

Browse files
committed
[pda] Improve logging & add SGL stats
1 parent 482ce08 commit 05b23ca

File tree

4 files changed

+36
-20
lines changed

4 files changed

+36
-20
lines changed

src/DmaBufferProvider/PdaDmaBufferProvider.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ class PdaDmaBufferProvider : public DmaBufferProviderInterface
3434
{
3535
public:
3636
PdaDmaBufferProvider(PciDevice* pciDevice, void* userBufferAddress, size_t userBufferSize,
37-
int dmaBufferId, bool requireHugepage)
38-
: mAddress(userBufferAddress), mSize(userBufferSize), mPdaBuffer(pciDevice, userBufferAddress, userBufferSize, dmaBufferId, requireHugepage)
37+
int dmaBufferId, SerialId serialId, bool requireHugepage)
38+
: mAddress(userBufferAddress), mSize(userBufferSize), mPdaBuffer(pciDevice, userBufferAddress, userBufferSize, dmaBufferId, serialId, requireHugepage)
3939
{
4040
}
4141

src/DmaChannelPdaBase.cxx

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "DmaBufferProvider/PdaDmaBufferProvider.h"
2525
#include "DmaBufferProvider/FilePdaDmaBufferProvider.h"
2626
#include "DmaBufferProvider/NullDmaBufferProvider.h"
27+
#include "ReadoutCard/ParameterTypes/SerialId.h"
2728
#include "Visitor.h"
2829

2930
namespace o2
@@ -56,7 +57,7 @@ DmaChannelPdaBase::DmaChannelPdaBase(const Parameters& parameters,
5657
[&](buffer_parameters::Memory parameters) {
5758
log("Initializing with DMA buffer from memory region", LogDebugDevel);
5859
return std::make_unique<PdaDmaBufferProvider>(mRocPciDevice->getPciDevice(), parameters.address,
59-
parameters.size, bufferId, true);
60+
parameters.size, bufferId, mRocPciDevice->getSerialId(), true);
6061
},
6162
[&](buffer_parameters::File parameters) {
6263
log("Initializing with DMA buffer from memory-mapped file", LogDebugDevel);
@@ -78,12 +79,11 @@ DmaChannelPdaBase::DmaChannelPdaBase(const Parameters& parameters,
7879
auto listSize = mBufferProvider->getScatterGatherListSize();
7980
auto hugePageMinSize = 1024 * 1024 * 2; // 2 MiB, the smallest hugepage size
8081
auto bufferSize = getBufferProvider().getSize();
81-
//log(std::string("Scatter-gather list size: ") + std::to_string(listSize));
8282
if (listSize > (bufferSize / hugePageMinSize)) {
8383
std::string message =
8484
"Scatter-gather list size greater than buffer size divided by 2MiB (minimum hugepage size)."
8585
" This means the IOMMU is off and the buffer is not backed by hugepages - an unsupported buffer configuration.";
86-
log(message, LogErrorDevel); //TODO: Why log + throw?
86+
log(message, LogErrorDevel);
8787
BOOST_THROW_EXCEPTION(Exception() << ErrorInfo::Message(message));
8888
}
8989
}
@@ -92,20 +92,22 @@ DmaChannelPdaBase::DmaChannelPdaBase(const Parameters& parameters,
9292
if (getBufferProvider().getSize() > 0) {
9393
// Non-null buffer
9494
bool checked = false;
95+
// Get the memory mappings from linux
9596
const auto maps = Utilities::getMemoryMaps();
97+
const auto bufferAddress = reinterpret_cast<uintptr_t>(getBufferProvider().getAddress());
9698
for (const auto& map : maps) {
97-
const auto bufferAddress = reinterpret_cast<uintptr_t>(getBufferProvider().getAddress());
99+
// Match the map address with the provided buffer address
98100
if (map.addressStart == bufferAddress) {
99101
if (map.pageSizeKiB > 4) {
100-
log("Buffer is hugepage-backed", LogDebugDevel);
102+
log("Buffer is hugepage-backed", LogDebugTrace);
101103
} else {
102104
if (AliceO2::Common::Iommu::isEnabled()) {
103-
log("Buffer is NOT hugepage-backed, but IOMMU is enabled", LogWarningDevel);
105+
log("Buffer is NOT hugepage-backed, but IOMMU is enabled", LogWarningTrace);
104106
} else {
105107
std::string message =
106108
"Buffer is NOT hugepage-backed and IOMMU is disabled - unsupported buffer "
107109
"configuration";
108-
log(message, LogErrorDevel); //TODO: Why log + throw?
110+
log(message, LogWarningDevel);
109111
BOOST_THROW_EXCEPTION(Exception() << ErrorInfo::Message(message)
110112
<< ErrorInfo::PossibleCauses({ "roc-setup-hugetlbfs was not run" }));
111113
}
@@ -115,7 +117,7 @@ DmaChannelPdaBase::DmaChannelPdaBase(const Parameters& parameters,
115117
}
116118
}
117119
if (!checked) {
118-
log("Failed to check if buffer is hugepage-backed", LogWarningDevel);
120+
log("Failed to check if buffer is hugepage-backed", LogDebugTrace);
119121
}
120122
}
121123
}

src/Pda/PdaDmaBuffer.cxx

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
/// \author Pascal Boeschoten ([email protected])
1616
/// \author Kostas Alexopoulos ([email protected])
1717

18+
#include <numeric>
1819
#include "PdaDmaBuffer.h"
1920
#include <pda.h>
2021
#include "ExceptionInternal.h"
@@ -30,7 +31,7 @@ namespace Pda
3031
{
3132

3233
PdaDmaBuffer::PdaDmaBuffer(PciDevice* pciDevice, void* userBufferAddress, size_t userBufferSize,
33-
int dmaBufferId, bool requireHugepage) : mPciDevice(pciDevice)
34+
int dmaBufferId, SerialId serialId, bool requireHugepage) : mPciDevice(pciDevice)
3435
{
3536
// Safeguard against PDA kernel module deadlocks, since it does not like parallel buffer registration
3637
try {
@@ -83,15 +84,13 @@ PdaDmaBuffer::PdaDmaBuffer(PciDevice* pciDevice, void* userBufferAddress, size_t
8384
}
8485

8586
auto node = sgList;
87+
std::vector<size_t> nodeSizes;
8688
while (node != nullptr) {
87-
if (requireHugepage) {
88-
size_t hugePageMinSize = 1024 * 1024 * 2; // 2 MiB, the smallest hugepage size
89-
if (node->length < hugePageMinSize) {
90-
BOOST_THROW_EXCEPTION(
91-
PdaException() << ErrorInfo::Message("Scatter-gather node smaller than 2 MiB (minimum hugepage"
92-
" size. This means the IOMMU is off and the buffer is not backed by hugepages - an unsupported buffer "
93-
"configuration."));
94-
}
89+
nodeSizes.emplace_back(node->length);
90+
size_t hugePageMinSize = 1024 * 1024 * 2; // 2 MiB, the smallest hugepage size
91+
if (requireHugepage && node->length < hugePageMinSize) {
92+
BOOST_THROW_EXCEPTION(
93+
PdaException() << ErrorInfo::Message("SGL node smaller than 2 MiB. IOMMU off and buffer not backed by hugapages - unsupported buffer configuration"));
9594
}
9695

9796
ScatterGatherEntry e;
@@ -107,6 +106,20 @@ PdaDmaBuffer::PdaDmaBuffer(PciDevice* pciDevice, void* userBufferAddress, size_t
107106
BOOST_THROW_EXCEPTION(PdaException() << ErrorInfo::Message(
108107
"Failed to initialize scatter-gather list, was empty"));
109108
}
109+
110+
// Print some stats regarding the Scatter-Gather list
111+
std::sort(nodeSizes.begin(), nodeSizes.end());
112+
int n = nodeSizes.size();
113+
int minSize = nodeSizes[0];
114+
int maxSize = nodeSizes[n - 1];
115+
double median = nodeSizes[n / 2];
116+
if (n % 2 == 0) {
117+
median = (median + nodeSizes[n / 2 - 1]) / 2;
118+
}
119+
int totalSize = std::accumulate(nodeSizes.begin(), nodeSizes.end(), 0);
120+
121+
Logger::get() << "[" << serialId << " |"
122+
<< " PDA buffer SGL stats] #nodes: " << n << " | total: " << totalSize << " | min: " << minSize << " | max: " << maxSize << " | median: " << median << LogInfoDevel << endm;
110123
} catch (const PdaException&) {
111124
PciDevice_deleteDMABuffer(mPciDevice, mDmaBuffer);
112125
throw;

src/Pda/PdaDmaBuffer.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include <vector>
2121
#include <pda.h>
2222
#include "Pda/PdaDevice.h"
23+
#include "ReadoutCard/ParameterTypes/SerialId.h"
2324

2425
namespace o2
2526
{
@@ -40,7 +41,7 @@ class PdaDmaBuffer
4041
/// \param dmaBufferId Unique ID to use for registering the buffer (uniqueness must be card-wide)
4142
/// \param requireHugepage Require the buffer to have hugepage-sized scatter-gather list nodes
4243
PdaDmaBuffer(PciDevice* pciDevice, void* userBufferAddress, size_t userBufferSize,
43-
int dmaBufferId, bool requireHugepage = true);
44+
int dmaBufferId, SerialId serialId, bool requireHugepage = true);
4445

4546
~PdaDmaBuffer();
4647

0 commit comments

Comments
 (0)