[ovs-dev] [PATCH] ofproto-dpif-xlate: Log flow in XLATE_REPORT().
Joe Stringer
joe at ovn.org
Thu Aug 4 21:58:38 UTC 2016
To assist debugging pipelines when resubmit resource checks fail, print
the base_flow from the translation context. This base flow can then be
used from ofproto/trace to figure out which parts of the pipeline lead
to this translation error.
As far as I can see, the "## __VA_ARGS__" trick is a GCC thing rather
than part of the C standard, but it successfully compiles on GCC 6.1.1,
Clang 3.8.1, and the compiler that Appveyor CI uses so it seems like it
is widely supported.
Signed-off-by: Joe Stringer <joe at ovn.org>
---
ofproto/ofproto-dpif-xlate.c | 21 ++++++++++++++-------
1 file changed, 14 insertions(+), 7 deletions(-)
diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
index 393854e4bfc7..73ab3e558f9d 100644
--- a/ofproto/ofproto-dpif-xlate.c
+++ b/ofproto/ofproto-dpif-xlate.c
@@ -627,13 +627,20 @@ xlate_report(struct xlate_ctx *ctx, const char *format, ...)
static struct vlog_rate_limit error_report_rl = VLOG_RATE_LIMIT_INIT(1, 5);
-#define XLATE_REPORT_ERROR(CTX, ...) \
- do { \
- if (OVS_UNLIKELY((CTX)->xin->report_hook)) { \
- xlate_report(CTX, __VA_ARGS__); \
- } else { \
- VLOG_ERR_RL(&error_report_rl, __VA_ARGS__); \
- } \
+#define XLATE_REORDER(LAST, DUMMY, ...) __VA_ARGS__, LAST
+#define XLATE_REPORT_ERROR(CTX, FMT, ...) \
+ do { \
+ if (OVS_UNLIKELY((CTX)->xin->report_hook)) { \
+ xlate_report(CTX, FMT, ## __VA_ARGS__); \
+ } else { \
+ struct ds ds = DS_EMPTY_INITIALIZER; \
+ \
+ flow_format(&ds, &ctx->base_flow); \
+ VLOG_ERR_RL(&error_report_rl, \
+ XLATE_REORDER(ds_cstr(&ds), dummy, \
+ FMT": %s", ## __VA_ARGS__)); \
+ ds_destroy(&ds); \
+ } \
} while (0)
static inline void
--
2.9.2
More information about the dev
mailing list