[dpdk-dev] [PATCH] Fixed spam from kni_allocate_mbufs() when no mbufs are free. If mbufs exhausted, 'out of memory' message logged at EXTREMELY high rates. Now logs no more than once per 10 mins
Jay Rolette
rolette at infiniteio.com
Wed Dec 17 14:57:02 CET 2014
Signed-off-by: Jay Rolette <rolette at infiniteio.com>
---
lib/librte_kni/rte_kni.c | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/lib/librte_kni/rte_kni.c b/lib/librte_kni/rte_kni.c
index fdb7509..f89319c 100644
--- a/lib/librte_kni/rte_kni.c
+++ b/lib/librte_kni/rte_kni.c
@@ -40,6 +40,7 @@
#include <unistd.h>
#include <sys/ioctl.h>
+#include <rte_cycles.h>
#include <rte_spinlock.h>
#include <rte_string_fns.h>
#include <rte_ethdev.h>
@@ -61,6 +62,9 @@
#define KNI_MEM_CHECK(cond) do { if (cond) goto kni_fail; } while (0)
+// Configure how often we log "out of memory" messages (in seconds)
+#define KNI_SPAM_SUPPRESSION_PERIOD 60*10
+
/**
* KNI context
*/
@@ -592,6 +596,10 @@ kni_free_mbufs(struct rte_kni *kni)
static void
kni_allocate_mbufs(struct rte_kni *kni)
{
+ static uint64_t no_mbufs = 0;
+ static uint64_t spam_filter = 0;
+ static uint64_t delayPeriod = 0;
+
int i, ret;
struct rte_mbuf *pkts[MAX_MBUF_BURST_NUM];
@@ -620,7 +628,18 @@ kni_allocate_mbufs(struct rte_kni *kni)
pkts[i] = rte_pktmbuf_alloc(kni->pktmbuf_pool);
if (unlikely(pkts[i] == NULL)) {
/* Out of memory */
- RTE_LOG(ERR, KNI, "Out of memory\n");
+ no_mbufs++;
+
+ // Memory leak or need to tune? Regardless, if we get here once,
+ // we will get here a *lot*. Don't spam the logs!
+ now = rte_get_tsc_cycles();
+ if (!delayPeriod)
+ delayPeriod = rte_get_tsc_hz() * KNI_SPAM_SUPPRESSION_PERIOD;
+
+ if (!spam_filter || (now - spam_filter) > delayPeriod) {
+ RTE_LOG(ERR, KNI, "No mbufs available (%llu)\n", (unsigned long long)no_mbufs);
+ spam_filter = now;
+ }
break;
}
}
--
1.9.3 (Apple Git-50)
More information about the dev
mailing list