aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Hajnoczi <stefanha@linux.vnet.ibm.com>2012-01-09 11:30:39 +0000
committerSteven Rostedt <rostedt@goodmis.org>2012-10-01 22:01:31 -0400
commit73b31e96a43d1a6b9bd334457696d538cf2e3f09 (patch)
tree792873c57f3a27be13c4f0769d70464063c844c6
parent8d655f3f18edf519f1da0a248684de0bbcc11e2e (diff)
downloadtrace-cmd-73b31e96a43d1a6b9bd334457696d538cf2e3f09.tar.gz
blk plugin: replace BLK_TC_BARRIER with BLK_TC_FLUSH/BLK_TC_FUA
The BLK_TC_BARRIER flag was dropped in Linux commit c09c47caedc in August 2011. The blk plugin fails to build against recent kernel headers. Since no flag bits were left, the new BLK_TC_FLUSH flag reused the BLK_TC_BARRIER bit. The new BLK_TC_FUA flag was also added. This patch updates fill_rwbs() to reflect the new BLK_TC_FLUSH/BLK_TC_FUA flags. This allows plugin_blk.c to build successfully on recent kernels. Most of the patch deals with detecting old vs new kernel headers so we can build successfully on both. (Namhyung Kim recommended using the makefile check used by perf and other tools) Link: http://lkml.kernel.org/r/1326108639-13904-1-git-send-email-stefanha@linux.vnet.ibm.com Signed-off-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com> Cc: Namhyung Kim <namhyung@gmail.com> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r--Makefile14
-rw-r--r--plugin_blk.c11
2 files changed, 22 insertions, 3 deletions
diff --git a/Makefile b/Makefile
index c1fa9067..f430c849 100644
--- a/Makefile
+++ b/Makefile
@@ -89,12 +89,20 @@ endif
# $(call test-build, snippet, ret) -> ret if snippet compiles
# -> empty otherwise
-test-build = $(if $(shell $(CC) -o /dev/null -c -x c - > /dev/null 2>&1 \
- <<<'$1' && echo y), $2)
+test-build = $(if $(shell sh -c 'echo "$(1)" | \
+ $(CC) -o /dev/null -c -x c - > /dev/null 2>&1 && echo y'), $2)
# have udis86 disassembler library?
udis86-flags := $(call test-build,\#include <udis86.h>,-DHAVE_UDIS86 -ludis86)
+define BLK_TC_FLUSH_SOURCE
+#include <linux/blktrace_api.h>
+int main(void) { return BLK_TC_FLUSH; }
+endef
+
+# have flush/fua block layer instead of barriers?
+blk-flags := $(call test-build,$(BLK_TC_FLUSH_SOURCE),-DHAVE_BLK_TC_FLUSH)
+
ifeq ("$(origin O)", "command line")
BUILD_OUTPUT := $(O)
endif
@@ -222,7 +230,7 @@ endif
# Append required CFLAGS
override CFLAGS += $(CONFIG_FLAGS) $(INCLUDES) $(PLUGIN_DIR_SQ)
-override CFLAGS += $(udis86-flags)
+override CFLAGS += $(udis86-flags) $(blk-flags)
ifeq ($(VERBOSE),1)
Q =
diff --git a/plugin_blk.c b/plugin_blk.c
index 9327b171..c0ecef92 100644
--- a/plugin_blk.c
+++ b/plugin_blk.c
@@ -54,6 +54,11 @@ static void fill_rwbs(char *rwbs, int action, unsigned int bytes)
goto out;
}
+#if defined(HAVE_BLK_TC_FLUSH)
+ if (tc & BLK_TC_FLUSH)
+ rwbs[i++] = 'F';
+#endif
+
if (tc & BLK_TC_DISCARD)
rwbs[i++] = 'D';
else if (tc & BLK_TC_WRITE)
@@ -63,10 +68,16 @@ static void fill_rwbs(char *rwbs, int action, unsigned int bytes)
else
rwbs[i++] = 'N';
+#if defined(HAVE_BLK_TC_FLUSH)
+ if (tc & BLK_TC_FUA)
+ rwbs[i++] = 'F';
+#endif
if (tc & BLK_TC_AHEAD)
rwbs[i++] = 'A';
+#if !defined(HAVE_BLK_TC_FLUSH)
if (tc & BLK_TC_BARRIER)
rwbs[i++] = 'B';
+#endif
if (tc & BLK_TC_SYNC)
rwbs[i++] = 'S';
if (tc & BLK_TC_META)