From 9beaf5efd74daa8c15e50b42583264d1252a85f5 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 15 Jun 2017 22:18:08 -0400 Subject: [PATCH] messages/MOSDPing: initialize MOSDPing padding This memory must be initialized or else valgrind will be very unhappy. Avoid the cost of zeroing (or even allocating) the buffer for normal padding values by (re)using a static zero buffer. Fixes: http://tracker.ceph.com/issues/20323 Signed-off-by: Sage Weil --- src/messages/MOSDPing.h | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/messages/MOSDPing.h b/src/messages/MOSDPing.h index 7a8bf2f986f0..22d24d6aae7a 100644 --- a/src/messages/MOSDPing.h +++ b/src/messages/MOSDPing.h @@ -99,10 +99,22 @@ public: ::encode(op, payload); ::encode(peer_stat, payload); ::encode(stamp, payload); - bufferptr size_bp(MAX(min_message_size - payload.length(), 0)); - bufferlist size_bl;; - size_bl.push_back(size_bp); - ::encode(size_bl, payload); + + bufferlist pad; + size_t s = MAX(min_message_size - payload.length(), 0); + // this should be big enough for normal min_message padding sizes. since + // we are targetting jumbo ethernet frames around 9000 bytes, 16k should + // be more than sufficient! the compiler will statically zero this so + // that at runtime we are only adding a bufferptr reference to it. + static char zeros[16384] = {}; + while (s > sizeof(zeros)) { + pad.append(buffer::create_static(sizeof(zeros), zeros)); + s -= sizeof(zeros); + } + if (s) { + pad.append(buffer::create_static(s, zeros)); + } + ::encode(pad, payload); } const char *get_type_name() const override { return "osd_ping"; } -- 2.47.3